본문 바로가기

이펙티브 자바

(51)
[이펙티브 자바] 아이템 35. ordinal 메서드 대신 인스턴스 필드를 사용하라 ordinal() 메서드 : 열거 상수가 선언된 순서에 따라 0부터 시작하는 정수 값을 반환해준다. 그러나 이 값은 열거 상수의 순서를 나타내는 데에만 사용되며, 일반적으로 이 값을 외부에서 직접 참조하는 것은 권장되지 않는다. 대신 열거 상수마다 고유한 의미있는 값을 갖는 인스턴스 필드를 추가하는 것이 좋다. 열거 상수마다 고유한 의미있는 값을 갖는 인스턴스 필드를 추가한 예시 코드 : enum Season { SPRING("March", "April", "May"), SUMMER("June", "July", "August"), AUTUMN("September", "October", "November"), WINTER("December", "January", "February"); private fin..
[이펙티브 자바] 아이템 34. int 상수 대신 열거 타입을 사용하라 열거 타입(Enumeration Type) : 서로 관련된 상수들의 집합을 정의할 때 사용되는 특별한 종류의 클래스. 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입. 정수 열거 패턴의 예시 코드 - 취약하다!! // 정수 열거 패턴 - 안티 패턴 public class Weekdays { public static final int MONDAY = 1; public static final int TUESDAY = 2; public static final int WEDNESDAY = 3; // 나머지 요일들도 동일하게 정의 // 주어진 요일을 출력하는 메서드 public static String getDay(int day) { switch (day) { case MONDAY: ret..
[이펙티브 자바] 아이템 33. 타입 안전 이종 컨테이너를 고려하라 타입 안전 이종 컨테이너(Type-safe heterogeneous container) : 다양한 타입의 요소를 안전하게 저장하고 검색할 수 있는 컨테이너. 이를 통해 다양한 타입의 데이터를 일관된 방식으로 처리할 수 있다. 이러한 컨테이너를 고려함으로써 프로그램의 유연성과 안정성을 향상시킬 수 있다. import java.util.HashMap; import java.util.Map; // 데이터베이스의 행을 표현하는 클래스 public class DatabaseRow { // 열(Column)과 해당 열의 값을 저장하는 맵 // 타입 안전 이종컨테이너 private final Map
[이펙티브 자바] 아이템 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 가변인수(varargs) : 자바에서 메서드에 임의의 개수의 인수를 전달할 수 있도록 하는 기능. 이를 통해 메서드를 호출할 때 원하는 개수의 인수를 전달할 수 있다. 가변인수는 배열로 처리되며, 메서드 선언 시에 타입 뒤에 세 개의 점(...)을 사용하여 정의한다. 제네릭 : 자바 프로그래밍 언어의 한 기능으로, 타입 매개변수를 사용하여 클래스, 인터페이스, 메서드를 정의하는 방법. 이를 통해 컬렉션 클래스나 제네릭 메서드 등을 작성할 때 특정 타입에 의존하지 않고 일반화된 형태로 구현할 수 있다. @SafeVarargs : 자바의 애너테이션 중 하나로, 가변인수(varargs) 매개변수를 사용하는 메서드에 붙인다. 이 애너테이션은 컴파일러에게 해당 메서드가 안전하게 사용될 수 있다는 것을 알려준다. ..
[이펙티브 자바] 아이템 31. 한정적 와일드카드를 사용해 API 유연성을 높여라 와일드카드 : 제네릭 타입에서 타입 매개변수의 값을 미리 지정하지 않고 사용할 수 있는 기능. 한정적 와일드카드는 이러한 와일드카드를 특정한 타입의 하위 타입으로 제한하는 방법 중 하나이다. 이를 통해 API의 유연성을 높일 수 있다. import java.util.List; class Animal { // 동물 클래스 } class Dog extends Animal { // 개 클래스 } class Cat extends Animal { // 고양이 클래스 } public class AnimalProcessor { // 모든 동물의 리스트를 처리하는 메서드 public static void processAnimals(List
[이펙티브 자바] 아이템 30. 이왕이면 제네릭 메서드로 만들라 제네릭 메서드 : 메서드 선언 시에도 타입 매개변수를 사용하여 메서드의 매개변수 타입 또는 반환 타입을 일반화하는 방법. 제네릭 메서드를 사용하면 메서드를 호출할 때마다 타입을 명시할 필요가 없으며, 여러 종류의 타입에 대해 일반적으로 사용할 수 있는 메서드를 정의할 수 있다. public 반환타입 메서드이름(매개변수) { // 메서드 내용 } 여기서 는 타입 매개변수를 나타내며, 반환타입이나 매개변수에서 이를 사용할 수 있다. 예를 들어, 다음은 제네릭 메서드를 사용하여 배열의 요소를 출력하는 메서드의 예시이다: public class ArrayPrinter { public static void printArray(T[] array) { for (T element : array) { System.out..
[이펙티브 자바] 아이템 29. 이왕이면 제네릭 타입으로 만들라 제네릭 타입 : 제네릭 타입은 자바에서 컬렉션과 같은 클래스나 인터페이스를 정의할 때, 타입 파라미터를 사용하여 타입 안정성을 확보하는 방법이다. 즉, 클래스나 인터페이스를 선언할 때 실제 타입이 아닌 타입 매개변수를 사용하여 일반화된 형태로 선언한다. // 제네릭을 사용하지 않은 ArrayList List list = new ArrayList(); list.add("Hello"); String item = (String) list.get(0); // 형변환 필요 // 제네릭을 사용한 ArrayList List list = new ArrayList(); list.add("Hello"); String item = list.get(0); // 형변환 필요 없음 결론 : 클라이언트에서 직접 형변환해야 하는 타..
[이펙티브 자바] 아이템 28. 배열보다는 리스트를 사용하라 공변성 (Covariance): 공변성은 서브타입 관계에서 타입이 변할 때 같은 방향으로 변하는 특성을 말합니다. 즉, A가 B의 서브타입인 경우, A 타입의 객체를 B 타입으로 변환할 수 있습니다. 예를 들어, List이 List의 서브타입이라면, List 타입의 객체를 List 타입으로 변환할 수 있습니다. 이것은 배열의 공변성과 유사합니다. 불변성 (Invariance): 불변성은 서브타입 관계에서 타입이 변하지 않는 특성을 말합니다. 즉, A가 B의 서브타입이더라도 A 타입의 객체를 B 타입으로 변환할 수 없습니다. 예를 들어, List이 List의 서브타입이 아니라면, List 타입의 객체를 List 타입으로 변환할 수 없습니다. 결론 : 배열과 제네릭에는 매우 다른 타입 규칙이 적용된다. 배열..