본문 바로가기

이펙티브 자바

(51)
[이펙티브 자바] 아이템 43. 람다보다는 메서드 참조를 사용하라 메서드 참조(Method Reference) : 자바에서 메서드를 참조하는 방법을 말한다. 람다 표현식이나 익명 클래스에서 메서드를 호출하는 것 대신에, 이미 존재하는 메서드의 이름을 사용하여 해당 메서드를 참조하는 방식이다. 정적 메서드 참조(Static Method Reference): 클래스이름::정적메서드이름 형태로 사용된다. 인스턴스 메서드 참조(Instance Method Reference): 참조변수::인스턴스메서드이름 형태로 사용된다. 클래스 생성자 참조(Constructor Method Reference): 클래스이름::new 형태로 사용되며, 인스턴스를 생성하는 데 사용된다. // 람다 표현식 Function toInteger = s -> Integer.parseInt(s); // 메서..
[이펙티브 자바] 아이템 42. 익명 클래스보다는 람다를 사용하라 익명 클래스(Anonymous Class) : 이름이 없는 클래스로, 주로 인터페이스의 구현체를 생성할 때 사용된다. 익명 클래스는 일회성으로 사용되며, 클래스 정의와 동시에 인스턴스를 생성하여 사용할 수 있다. Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); 람다 표현식 : 간결하고 명확한 방식으로 익명 함수를 나타내는 것. 주로 함수형 인터페이스(하나의 추상 메서드를 가지는 인터페이스)의 구현체를 생성하는 데 사용된다. Collections.sort(words, (s1, s2) -> Integer...
[이펙티브 자바] 아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 마커 인터페이스 : 아무 메서드도 담고 있지 않고, 자기 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스. // 마크 인터페이스 public interface MarkerInterface { // 메서드나 상수를 정의하지 않음 } // 위의 마크 인터페이스를 구현하는 클래스 public class MyClass implements MarkerInterface { // 클래스의 구현 } 마커 애너테이션 : 단순히 존재 여부로 정보를 제공하는 애너테이션. 마커 인터페이스가 마커 애너테이션보다 나은점 : 1. 마커 인터페이스는 타입이기 때문에 애너테이션을 사용했다면 런타임에야 발견될 오류를 컴파일타임에 잡을 수 있다. 2. 적용 대상을 더 정밀하게 지정할 수 있다. @Target : 해당 애..
[이펙티브 자바] 아이템 40. @Override 애너테이션을 일관되게 사용하라 @Override 애너테이션은 메서드가 부모 클래스나 인터페이스의 메서드를 재정의하고 있는지를 컴파일러에게 알려주는 역할을 한다. 이를 통해 재정의한 메서드의 오타나 잘못된 시그니처 등을 빠르게 찾을 수 있습니다. 상위 클래스의 메서드를 재정의하려는 모든 메서드에 @Override 애너테이션을 달아주자. @Override 애너테이션을 코드를 깔끔하게 보기위해 생략하지 말고 모두 달아주자. 핵심 정리 : 재정의한 모든 메서드에 @Override 애너테이션을 의식적으로 달면 여러분이 실수했을 때 컴파일러가 바로 알려줄 것이다. 예외는 한 가지 뿐이다. 구체 클래스에서 상위 클래스의 추상 메서드를 재정의한 경우엔 이 애너테이션을 달지 않아도 된다(단다고 해서 해로울 것도 없다).
[이펙티브 자바] 아이템 39. 명명 패턴보다 애너테이션을 사용하라 명명 패턴 : 변수, 메서드, 클래스 등의 이름을 일정한 패턴에 따라 지정하는 방법. 이는 주로 코드의 가독성을 높이고 일관성을 유지하기 위해 사용된다. 예를 들어, 다음과 같은 명명 패턴이 있을 수 있습니다: 변수 이름에는 camelCase를 사용: myVariable, totalAmount, userName 등 메서드 이름에는 동사로 시작하여 동작을 나타냄: calculateTotal(), getUserInfo(), sendMessage() 클래스 이름은 대문자로 시작하는 CamelCase를 사용: MyClass, UserInfo, HttpRequest 등 import java.lang.annotation.*; // 애너테이션 정의 @Retention(RetentionPolicy.RUNTIME) @T..
[이펙티브 자바] 아이템 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 // 확장 가능한 열거 타입을 위한 인터페이스 interface Animal { void sound(); } // 기본 열거 타입 구현 enum DefaultAnimal implements Animal { DOG { @Override public void sound() { System.out.println("Woof"); } }, CAT { @Override public void sound() { System.out.println("Meow"); } }, BIRD { @Override public void sound() { System.out.println("Tweet"); } } } // 새로운 열거 타입을 추가하기 위해 Animal을 구현하는 열거 타입 정의 enum CustomAnimal imple..
[이펙티브 자바] 아이템 37. ordinal 인덱싱 대신 EnumMap을 사용하라 ordinal 인덱싱 : 열거형 상수가 선언된 순서에 따라 숫자를 매기는 것을 말한다. 열거형의 첫 번째 상수는 0부터 시작하여 상수가 선언된 순서대로 1씩 증가하는 값을 가지게 된다. EnumMap : 열거형을 키로 사용하는 맵이다. 이 맵은 열거형의 모든 상수를 키로 사용할 수 있으며, 각 상수에 대한 값에 접근하기 위해 배열을 사용한다. 열거형을 키로 사용하기 때문에 EnumMap은 해시 테이블 대신 배열을 사용하여 효율적으로 구현된다. 배열의 인덱스를 얻기위해 EnumMap을 사용한 예시 코드 : import java.util.EnumMap; // 예시 Enum 타입 enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY } public clas..
[이펙티브 자바] 아이템 36. 비트 필드 대신 EnumSet을 사용하라 비트 필드 : 정수 상수의 집합을 표현하는 방법 중 하나로, 각 비트를 특정 상수에 대응시키는 방식. 하지만 비트 필드는 가독성이 낮고, 오류가 발생하기 쉽다. public class FontExample { // 글꼴 종류를 비트 필드로 표현 public static final int PLAIN = 1