본문 바로가기

이펙티브 자바

(61)
[이펙티브 자바] 아이템 45. 스트림은 주의해서 사용하라 스트림 : 데이터 요소들의 연속된 시퀀스를 처리하는 데 사용된다. 스트림은 컬렉션, 배열 등의 데이터 소스로부터 데이터를 읽어들이고, 그 데이터를 변환하거나 조작할 수 있는 기능을 제공한다. 스트림을 사용한다고 무조건 더 코드가 좋아지지는 않는다. 스트림을 과도하게 사용하면 프로그램이 읽거나 유지보수하기 더 어려워진다. 특히 스트림에 익숙하지 않은 프로그래머라면 더욱 그렇다. 이를 절충하기 위해 스트림을 적당히 사용하면 명확하게 이해하기 좋아진다. 핵심 정리 : 스트림을 사용해야 멋지게 처리할 수 있는 일이 있고, 반복 방식이 더 알맞은 일도 있다. 그리고 수많은 작업이 이 둘을 조합했을 때 가장 멋지게 해결된다. 어느 쪽을 선택하는 확고부동한 규칙은 없지만 참고할 만한 지침 정도는 있다. 어느 쪽이 나..
[이펙티브 자바] 아이템44. 표준 함수형 인터페이스를 사용하라 표준 함수형 인터페이스(Standard Functional Interfaces) : 자바에서 함수형 프로그래밍을 지원하기 위해 미리 정의된 인터페이스들을 말한다. 이러한 인터페이스들은 자주 사용되는 함수형 작업을 수행하기 위해 특별히 설계되었으며, 자바에서 람다 표현식과 함께 주로 사용된다.  자바 8에서는 java.util.function 패키지에 표준 함수형 인터페이스들이 정의되어 있다. 이러한 인터페이스들은 주로 함수형 인터페이스를 사용하는 메서드의 매개변수나 반환값으로 사용된다. 주요 표준 함수형 인터페이스들은 다음과 같다:Consumer: 단일 입력 매개변수를 받고, 반환값이 없는 동작을 수행한다. (void accept(T t))import java.util.function.Consumer;p..
[이펙티브 자바] 아이템 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..