본문 바로가기

개발 공부125

이펙티브 자바 아이템 32 - 제네릭과 가변인수를 함께 쓸 때는 신중하라 - 핵심 정리 아이템 32 - 제네릭과 가변인수를 함께 쓸 때는 신중하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 가변인수 ... 는 매서드를 사용하는 클라이언트에서 파라미터를 몇개 보낼지 선택하는 것이다. // 제네릭 varargs 배열 매개변수에 값을 저장하는 것은 안전하지 않다. (191-192쪽) public class Dangerous { // 코드 32-1 제네릭과 varargs를 혼용하면 타입 안전성이 깨진다! (191-192쪽) static void dangerous(List... stringLists) { List intList = List.of(42); Object[] objects = stringLists; objects[0] .. 2022. 12. 19.
이펙티브 자바 아이템 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라 - 완벽 공략 아이템 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 타입 추론 타입 추론은 타입을 추론하는 컴파일러의 기능이다. 자바에서는 타입 추론을 여러가지 형태로 지원하고 버전이 올라가면서 지원하는 범위와 용도가 늘고 있다. public class BoxExample { private static void addBox(U u, List boxes) { Box box = new Box(); box.set(u); boxes.add(box); } private static void outputBoxes(List boxes) { int counter = 0; for (Box box: boxes) .. 2022. 12. 17.
이펙티브 자바 아이템 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라 - 핵심 정리 아이템 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. Chooser 와 Union API 개선 // 와일드카드 타입을 이용해 대량 작업을 수행하는 메서드를 포함한 제네릭 스택 (181-183쪽) public class Stack { private E[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; // 코드 29-3 배열을 사용한 코드를 제네릭으로 만드는 방법 1 (172쪽) // 배열 elements는 push(E)로 넘어온 E 인스턴스만 담는다. // 따라서 타입 안.. 2022. 12. 17.
이펙티브 자바 아이템 30 - 이왕이면 제네릭 메서드로 만들라 - 핵심 정리 아이템 30 - 이왕이면 제네릭 메서드로 만들라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 매개변수화 타입을 배개변수로 받는 메서드 자바에서 지원하는 모든 컬렉션들을 사용하는 메서드들의 경우에는 제네릭한 유틸리티 메서드로 만드는 경우가 많다. 실제로 자바에서 제공하는 Collections 같은 클래스는 모든 유틸리티성 메서드가 전부 제네릭 메서드이다. 제네릭 메서드로 만들면 제네릭을 활용하는 장점과 일치한다. 컴파일 타임에 타입 안정성을 보장 할 수 있다. // 제네릭 union 메서드와 테스트 프로그램 (177쪽) public class Union { // 코드 30-2 제네릭 메서드 (177쪽) public static Set un.. 2022. 12. 15.
이펙티브 자바 아이템 29 - 이왕이면 제네릭 타입으로 만들라 - 완벽 공략 아이템 29 - 이왕이면 제네릭 타입으로 만들라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 한정적 타입 매개변수 한정적 타입 매개변수는 제네릭 타입을 특정 타입으로 한정지을 수 있는 기능이다. public class Stack { private E[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; // 코드 29-3 배열을 사용한 코드를 제네릭으로 만드는 방법 1 (172쪽) // 배열 elements는 push(E)로 넘어온 E 인스턴스만 담는다. // 따라서 타입 안전성을 보장하지만, // 이 배열의 런타임 타입은 E[]가.. 2022. 12. 14.
이펙티브 자바 아이템 29 - 이왕이면 제네릭 타입으로 만들라 - 핵심 정리 아이템 29 - 이왕이면 제네릭 타입으로 만들라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 어떤 클래스들을 만들다보면 그 클래스 안에 다른 객체들을 담는 역활을 하는 클래스를 만드는 경우가 많다. 대표적으로 Stack 같이 자료구조 안에 다른 객체들을 담는 역활을 하는 클래스를 작성하는 경우이다. 무언가 다른것들을 담는 역활을 하는 클래스들은 제네릭 타입 으로 만들면 유용하다. 특히 그 안에 Object 타입으로 무언가를 담고있다면 더더욱 명확하게 제네릭 타입 을 사용하도록 유도하면 런 타임 시에 ClassCastException 이 발생하는 것을 많이 줄일 수 있다. public class Stack { private Object[].. 2022. 12. 13.
이펙티브 자바 아이템 28 - 배열보다는 리스트를 사용하라 - 완벽 공략 아이템 28 - 배열보다는 리스트를 사용하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. @SafeVarags Varags 는 가변인자이다. 매서드 매개변수로 불특정 다수를 받을 수 있는 인자이다. 여기에 제네릭을 썻을 때 복잡한 문제가 생기게 된다. 제네릭과 배열 은 잘 어울리지 않지만 같이 사용할 수 있는 유일한 경우의 수가 가변 인자 이다. class Main { public static void main(String[] args) { List[] stringLists = new ArrayList[1]; // 컴파일 에러 } } 위의 코드처럼 제네릭 타입의 배열을 만들 수 없다. public class SafeVaragsExampl.. 2022. 12. 12.
이펙티브 자바 아이템 28 - 배열보다는 리스트를 사용하라 - 핵심 정리 아이템 28 - 배열보다는 리스트를 사용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 배열과 리스트는 잘 어울리지 않는다. 배열은 공변(covariant), 제네릭은 불공변 공변은 같이 변한다 라는 뜻이다. public class IntegerToString { public static void main(String[] args) { // 공변 Object[] anything = new String[10]; anything[0] = 1; // 컴파일러가 못잡는 버그, 런타임 에러 발생 } } 배열은 상속 관계 에 따라 같이 변한다. 위의 코드에서 String 은 Object 를 상속하고 있다. 때문에 String 의 타입을 Objec.. 2022. 12. 12.
이펙티브 자바 아이템 27 - 비검사 경고를 제거하라 - 완벽 공략 아이템 27 - 비검사 경고를 제거하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 에너테이션 @Documented public @interface MyAnnotation { } @Documented 을 붙여주면 해당 애노테이션을 사용한 자바 코드의 javadoc 을 만들 때 해당 애노테이션 정보가 포함된다. @Retention @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { } @Retention 은 해당 애노테이션의 정보를 언제까지 참조할 수 있게 할 것이냐에 대한 설정이다. 총 3가지가 있다. Runtime 기본값이며 가장 폭이 넓다. 애노테이션을 사용한 코.. 2022. 12. 9.
이펙티브 자바 아이템 27 - 비검사 경고를 제거하라 - 핵심 정리 아이템 27 - 비검사 경고를 제거하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 컴파일러가 컴파일 할 때 에러 와 경고 두가지로 나누어진다. 에러 는 컴파일이 실패하는 것이고, 경고 는 컴파일에 실패하지는 않지만 권장하지 않고, 위험성이 있을 때 나타난다. 경고 는 컴파일러시 경고 메세지 를 출력할 수 있다. 이 경고 중에서도 비검사 (unchecked) 란 컴파일러가 타입 안정성을 확인하는데 필요한 정보가 충분치 않을 때 발생하는 경고이다. public class SetExample { public static void main(String[] args) { Set names = new HashSet(); Set strings = .. 2022. 12. 8.
이펙티브 자바 아이템 26 - 로 타입은 사용하지 말라 - 완벽 공략 아이템 26 - 로 타입은 사용하지 말라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. Generic DAO 만들기 public interface Entity { Long getId(); } public class Account implements Entity { private Long id; private String username; public Account(Long id, String username) { this.id = id; this.username = username; } @Override public Long getId() { return this.id; } public String getUsername() { return.. 2022. 12. 7.
이펙티브 자바 아이템 26 - 로 타입은 사용하지 말라 - 핵심 정리 아이템 26 - 로 타입은 사용하지 말라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 제네릭은 자바 5 버전 부터 들어온 기능이다. public class GenericBasic { public static void main(String[] args) { // Generic 사용하기 전 List numbers = new ArrayList(); numbers.add(10); numbers.add("whiteship"); for (Object number: numbers) { System.out.println((Integer)number); // 오류 발생 } } } 제네릭이 도입되기 전에는 위와같이 List 를 타입없이 정의를 했다. 이렇.. 2022. 12. 7.