메서드 참조 (Method Reference)

    람다가 익명 클래스보다 나은 점 - 간결함 자바에서는 함수 객체를 람다보다 더 간결하게 만드는 방법이 존재 - 메서드 참조 메서드 참조 아래는 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부 코드이다. 이 때 값이, 키의 인스턴스 개수로 해석될 때 해당 프로그램은 multiset을 구현한게 되는데, 키가 맵안에 없다면 key를 1로 매핑하고 이미 있다면 기존 매핑 값을 증가시키는 코드이다. map.merge(key, 1, (count, incr)->count+incr); 해당 코드에서는 각 변수의 이름이 중요하지 않고, 더불어 코드 공간을 차지하게 된다. 이 때 count와 incr의 타입이 Integer일 때 다음과 같은 코드로 간결하게 할 수 있다. map.merge(key, 1, I..

    lambda(람다) 사용법

    자바 8에서의 추가 - 함수형 인터페이스 , 람다, 메서드 참조 : 함수 객체를 더욱 쉽게 만들기 - 스트림 API : 데이터 원소의 시퀀스 처리를 라이브러리 차원에서 지원 1997년 이전 : 기존에는 자바에서 함수 타입을 표현하기 위해 추상 메서드를 하나만 담은 인터페이스(추상 클래스)를 사용 이러한 인터페이스의 인스턴스 : 함수 객체(function object)라고 하여, 특정 함수나 동작을 나타내는 데 썼다. 1997년 이후 : JDK 1.1 등장과 함께 함수 객체 생성(표현) 방법 - 익명 클래스(아이템 24)를 통해서 충분히 표현했다. //익명 클래스의 인스턴스를 통해 함수 객체 사용하는 방법 Collection.sort(words, new Comparator() { //Comparator -..

    마커 인터페이스(Marker Interface)

    마커 인터페이스 : 아무 메서드도 선언되어있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시하는 인터페이스 ex) Serializable : 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 Write(Serialization)이 가능하다는 것을 알려줌 마커 어노테이션이 등장하면서 마커 인터페이스는 구식이 되었다고들 얘기하지만, 사실은 그렇지 않다. # 마커 인터페이스의 장점 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 어노테이션은 그렇지 않다. 마커 인터페이스는 어엿한 타입이므로, 마커 어노테이션을 사용했다면 런타임 때 발견될 오류를 컴파일 타임에 잡을 수 있다. ObjectOutputStream.writeObjec..

    @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..

    CleanCode - Chapter 11. System

    서론 : 도시 만들기 거대한 도시가 돌아가는 이유 : 각각의 전원, 교통 등이 모듈로 모듈화되어 관리 / 일정 수준의 추상화를 통해 큰 도시 전체에 대한 이해 없이 개인과 개인이 관리하는 구성요소를 통해 효율적으로 동작 SW = 하나의 도시 - 하나의 도시의 모듈화만큼의 추상화를 이루지 못하는 것이 클린코드답지 못한 문제 낮은 단계의 추상화를 통해 관심사(Concern)을 분리하고 높은 추상화 수준(시스템 수준)에서도 클린 코드를 유지해보자 # 시스템의 생성(제작)과 사용을 분리 public Service getService() { if (service == null) service = new MyServiceImpl(...); // Good enough default for most cases? ret..

    클래스 계층 구조를 활용하기

    # 태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있고, 그 중 현재 표현하는 의미를 태그 값으로 알려주는 클래스 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..

    인터페이스 - 타입을 정의하는 용도로만 사용하기

    인터페이스의 역할 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. → 클래스가 인터페이스를 구현한다는 것 : 자신의 인스턴스로 무엇을 할 수 있는 지 의미를 전달 인터페이스는 위에서 언급한 용도로만 사용되어야 한다. 잘못된 인터페이스의 용도 상수 인터페이스 상수 인터페이스 : 메서드 없이, 상수를 뜻하는 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..

    인터페이스 설계 - 구현하는 개발자를 생각하자

    # default Method 자바 8 이전 기존 구현체를 깨뜨리지 않고, 인터페이스에 메서드 추가 방법 전무후무 - 인터페이스에 메서드 추가하면 대부분 컴파일 오류 발생 - 추가된 메서드가 기존 구현체에 존재할 가능성 희박 자바 8 이후 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드 추가 핵심 컬렉션 인터페이스들에 많은 디폴트 메서드 추가 for lambda 활용 디폴트 메서드 선언시, 그 인터페이스를 구현한 후에 디폴트 메서드를 재정의하지 않은 모든 클래스에서는 디폴트 구현이 사용 단, 디폴트 메서드는 구현 클래스에 대한 정보 없이 무작정 삽입(추가) 된 것이므로 주의해야 한다. 자바 라이브러리의 디폴트 매서드는 코드 품질이 높고 범용적이므로 대부분의 상황에서 잘 작동 하지만, 생각할 수..