책/Effective Java20 lambda(람다) 사용법 자바 8에서의 추가 - 함수형 인터페이스 , 람다, 메서드 참조 : 함수 객체를 더욱 쉽게 만들기 - 스트림 API : 데이터 원소의 시퀀스 처리를 라이브러리 차원에서 지원 1997년 이전 : 기존에는 자바에서 함수 타입을 표현하기 위해 추상 메서드를 하나만 담은 인터페이스(추상 클래스)를 사용 이러한 인터페이스의 인스턴스 : 함수 객체(function object)라고 하여, 특정 함수나 동작을 나타내는 데 썼다. 1997년 이후 : JDK 1.1 등장과 함께 함수 객체 생성(표현) 방법 - 익명 클래스(아이템 24)를 통해서 충분히 표현했다. //익명 클래스의 인스턴스를 통해 함수 객체 사용하는 방법 Collection.sort(words, new Comparator() { //Comparator -.. 2022. 3. 20. 마커 인터페이스(Marker Interface) 마커 인터페이스 : 아무 메서드도 선언되어있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시하는 인터페이스 ex) Serializable : 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 Write(Serialization)이 가능하다는 것을 알려줌 마커 어노테이션이 등장하면서 마커 인터페이스는 구식이 되었다고들 얘기하지만, 사실은 그렇지 않다. # 마커 인터페이스의 장점 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 어노테이션은 그렇지 않다. 마커 인터페이스는 어엿한 타입이므로, 마커 어노테이션을 사용했다면 런타임 때 발견될 오류를 컴파일 타임에 잡을 수 있다. ObjectOutputStream.writeObjec.. 2022. 3. 20. @Override 어노테이션 사용법 @Override - 메서드 선언에만 달 수 있으며, 이 어노테이션의 의미는 상위 타입(부모 타입)의 메서드를 재정의했음을 의미한다. @Override 어노테이션을 일관되게 사용한다면 여러 악명 높은 버그들을 예방할 수 있는 아주 좋은 습관이라고 말할 수 있다. Ex) 영어 알파벳 2개로 구성된 문자열을 표현하는 클래스 //버그를 찾아보자 public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Bigram bigram) { return b.. 2022. 3. 18. 클래스 계층 구조를 활용하기 # 태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있고, 그 중 현재 표현하는 의미를 태그 값으로 알려주는 클래스 class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드는 모양이 원(CIRCLE)일 때만 쓰인다. double radius; // 원용 생성자 Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } // 사각형용 생성자 Figure(double length, double wi.. 2022. 2. 9. 인터페이스 - 타입을 정의하는 용도로만 사용하기 인터페이스의 역할 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. → 클래스가 인터페이스를 구현한다는 것 : 자신의 인스턴스로 무엇을 할 수 있는 지 의미를 전달 인터페이스는 위에서 언급한 용도로만 사용되어야 한다. 잘못된 인터페이스의 용도 상수 인터페이스 상수 인터페이스 : 메서드 없이, 상수를 뜻하는 static final 필드로 구성된 인터페이스 public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 (J/K) static final double BOLTZMANN_CONSTANT = 1.380_648_52e.. 2022. 2. 7. 인터페이스 설계 - 구현하는 개발자를 생각하자 # default Method 자바 8 이전 기존 구현체를 깨뜨리지 않고, 인터페이스에 메서드 추가 방법 전무후무 - 인터페이스에 메서드 추가하면 대부분 컴파일 오류 발생 - 추가된 메서드가 기존 구현체에 존재할 가능성 희박 자바 8 이후 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드 추가 핵심 컬렉션 인터페이스들에 많은 디폴트 메서드 추가 for lambda 활용 디폴트 메서드 선언시, 그 인터페이스를 구현한 후에 디폴트 메서드를 재정의하지 않은 모든 클래스에서는 디폴트 구현이 사용 단, 디폴트 메서드는 구현 클래스에 대한 정보 없이 무작정 삽입(추가) 된 것이므로 주의해야 한다. 자바 라이브러리의 디폴트 매서드는 코드 품질이 높고 범용적이므로 대부분의 상황에서 잘 작동 하지만, 생각할 수.. 2022. 2. 7. 이전 1 2 3 4 다음