독서/이펙티브 자바 3판6 CH6 람다와 스트림 step42: 익명 클래스보다는 람다를 사용하라 예전에는 자바에서 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스를 사용했다. 이런 인터페이스의 인스턴스를 함수 객체라고 하여, 특정 함수나 동작을 나타내는데 사용했다. JDK 1.1이 등장하며, 함수 객체를 만드는 주요 수단은 익명 클래스가 되었다. 지금은 함수형 인터페이스라 부르는 이 인터페이스들의 인스턴스를 람다식을 사용해 만들 수 있게 된 것이다. 타입을 명시해야 코드가 더 명활할 때만 제외하고는, 람다의 모든 매개변수 타입은 생략하자. 익명 클래스 : 프로그램에서 일시적으로 한번만 사용되고 버려지는 객체 사용 이유? - 프로그램 내에서 일시적으로 한번만 사용하거나 재사용성이 없고 확장성을 활용하는 것이 유지보수에서 더 불리할 때 Col.. 2023. 5. 15. CH05 열거 타입과 애너테이션 step34: int 상수 대신 열거 타입을 사용하라 열거 타입은 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입이다. 정수 열거 패턴기법에는 단점이 많은데, 타입 안전을 보자할 방법이 없으며 표현력도 좋지 않다. 정수 열거 패턴을 사용한 프로그램은 깨지기 쉽다. 평범한 상수를 나열한 것뿐이라 컴파일하면 그 값이 클라이언트 파일에 그대로 새겨진다. 따라서 상수의 값이 바뀌면 클라이언트도 반드시 다시 컴파일해야 한다. 다시 컴파일하지 않은 클라이언트는 실행이 되더라도 엉뚱하게 동작할 것이다. 정수 대신 문자열 상수를 사용하는 변형 패턴도 있다. 문자열 열거 패턴 이라 하는 이 번형은 도 나쁘다. 상수의 의미를 출력할 수 있다는 점은 좋지만, 경험이 부족한 프로그래머사 문자열 상수의 .. 2023. 5. 5. CH04 제네릭 step26: Raw 타입은 사용하지 말라 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다. 각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 먼저 클래스 이름이 나오고, 이어서 꺾쇠괄호 안에 실제 타입 매개변수들을 나열한다. List은 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입이다. 여기서 String이 정규 타입 매개변수 E에 해당하는 실제 타입 매개변수다. 마지막으로, 제네릭 타입을 하나 정의하면 그에 딸린 로 타입(raw type)도 함께 정의된다. 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않은 때를 말한다. 예로 List의 Raw type은 List다. Raw type을 쓰면 제네릭이 안겨주는 안전.. 2023. 5. 2. Ch02 모든 객체의 공통 메서드 step10: equals는 일반 규약을 지켜 재정의하라 equals를 재정의 하지 않아도 되는 경우 1st 각 인스턴스가 본질적으로 고유한 경우 - 값이 아닌 동작을 표현하는 클래스의 경우 - Thread 2nd 인스턴스의 논리적 동치성을 검사할 일이 없는 경우 3rd 상위 클래스에서 재정의한 equlas가 하위 클래스에서도 적용 되는 경우 - Set, Map, List의 경우 4th 클래스가 private 이거나, package-private여서 equals를 호출할 일이 없는 경우 5th 싱글턴을 보장하는 클래스 (인스턴스 통제 클래스, Enum인 경우) - 객체간 동등성, 동일성이 보장 equals를 재정의 하는 경우 지켜야 할 규약 equals를 재정의 해야 하는 경우는 객체 동일성을 확인해야 .. 2023. 4. 25. Ch03 클래스와 인터페이스 step15: 클래스와 멤버의 접근 권한을 최소화하라 어설프게 셜계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 얼마나 외부 컴포넌트로부터 잘 숨겼느냐다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 정보 은닉의 장점은 정말 많다. 그중 대부분은 시스템을 구성하는 컴포넌트들을 서로 독립시켜 개발, 테스트, 최적화, 적용, 분석, 수정을 개별적으로 할 수 있게 해주는 것과 연관되어 있다. 장점 1st 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 2nd 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문이다. 3.. 2023. 4. 25. Ch01 객체 생성과 파괴 step1 : 생성자 대신 정적 팩터리 메서드를 고려하자 클래스는 public 생성자 대신 정적 팩토리 메서드를 제공할 수 있다. 장점 5가지 1st 이름을 가질 수 있다. 2nd 호출 될 때마다 인스턴스를 새로 생성하지 않아도 된다. -> 이에 대한 예시는 enum이 대표적이다. 사용되는 값들의 개수가 정해져 있으면 해당 값을 미리 생성해놓고 캐싱할 수 있는 구조로 만들 수 있다. 즉 정적 팩터리 메서드와 캐싱구조를 함께 사용하면 매번 새롭게 만들어 줄 필요가 없다. 3rd 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. -> 상속을 사용할 때, 확인할 수 있다. 이때 정적 팩터리 메서드가반환값을 반환할 때, 상황에 따라 하위 클래스 타입의 객체를 반환할 수 있다는 것이다. 4th 입력 매.. 2023. 4. 5. 이전 1 다음