목록자바 (28)
생각해보기
익명 클래스보다는 람다를 사용하라 타입을 명시해야 코드가 더 명확할 때만 제외하고는, 람다의 모든 매개변수 타입은 생략하자 동작을 명확하게 드러나는 것이 좋다 람다함수에서 만약 코드 자체로 동작이 명확이 설명이 되지 않거나 코드 줄 수가 많아지면 람다를 사용하지 말아야 한다. 람다는 한줄일 때 가장 좋고 길어야 세 줄 안에 끝내는 게 좋다 람다는 익명 클래스처럼 직렬화 형태가 구현별로 다를 수 있다. 따라서 람다를 직렬화하는 일은 삼가야 한다 람다 보다는 메서드 참조를 사용하라 메서드 참조는 람다의 간단명로한 대안이 될 수 있다. 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때 람다를 사용하라 표준 함수형 인터페이스를 사용하라 필요한 용도에 맞는 게 있다면, 직접 구현하지 말고 표..
열거 타입과 애너테이션 자바에는 특수한 목적의 참조 타입이 두 가지 있다. 하나는 클래스 일종인 열거(enum)타입이고 하나는 인터페이스 일종인 애너테이션(annotation)이다. 이 타입을 올바르게 사용하는 방법을 알자 열거 타입은 일정 개수의 상수 값을 정의한 다음, 그 외의 값을 허용하지 않는 타입이다. 열거 타입 자체는 클래스이며, 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개한다. 열거 타입은 밖에서 접근할 수 있는 생성자를 제공하지 않으므로 사실상 final이다. 따라서 클라이언트가 인스턴스를 직접 생성하거나 확장할 수 없어 열거 타입 선언으로 만들어진 인스턴스들은 딱 하나씩만 존재하는 것이 보장된다. int 상수 대신 열거 타입을 사용하라 정수..
제네릭 제네릭을 지원하기 전에는 컬렉션에서 객체를 꺼낼 때마다 형 변환해야 했다. 제네릭을 사용하면 컬렉션이 담을 수 있는 타입을 컴파일러가 알려주게 된다. 따라서 안전하고 명확한 프로그램을 할 수 있게 되었다 Raw 타입은 사용하지 말라 제네릭 타입(제네릭 클래스, 제네릭 인터페이스)는 일련의 매개변수화 타입을 정의한다. 예를 들어 List의 경우 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입이다. raw타입이란 제네릭 타입에서 매개변수를 전혀 사용하지 않을 때를 말한다. 따라서 사용자가 엉뚱한 타입의 인스턴스를 넣을려 해도 컴파일러가 오류를 내지 않는다 raw 타입을 쓰면 제네릭이 안겨주는 안전성과 표현력을 모두 잃게 된다. raw 타입을 절대 써서는 안된다 모든 원소 허용한다면 원소의..
클래스와 인터페이스 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 잘 숨긴 것이다. 구현과 API를 분리해서 오직 API를 통해서만 다른 컴포넌트와 소통한다. 이는 정보은닉, 캡슐화라고 하며 캡슐화를 통해 각 컴포넌트들은 내부 구현을 신경 쓰지 않는다. 캡슐화의 기본 원칙은 간단하다. 모든 클래스와 멤버의 접근성을 가능한 좁혀야 한다. 패키지 외부에서 쓸 이유가 없다면 접근자를 private으로 선언한다. 그러면 이들은 API가 아닌 내부 구현이 되어 언제든지 수정할 수 있다. public 클래스의 인스턴스 필드는 되도록 public이 아니어야 한다. public으로 가변 객체를 선언하게 되면, 그 필드와 관련된 모든 것은 불변식을 보장할 ..
모든 객체의 공통 메서드 equals는 일반 규약을 지켜 재정의하라 equals를 재정의 하지 않으면 그 클래스 인스턴스는 오직 자기 자신과만 같게 된다. 다음과 같은 상황이면 재정의 X 각 인스턴스가 본질적으로 고유한 객체 : 값을 표현하는 게 아닌 동작하는 클래스(ex Thread 클래스) 인스턴스의 '논리적 동치성' (논리적으로 같음)을 검사할 일 없을 때(equals 호출할 일 없을 때) 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞을 때 equals 재정의 할 때 : 객체의 식별성(두 객체가 물리적으로 같은 가)이 아니라 논리적 동치성을 확인해야 하는데 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의되지 않았을 때 equals 메서드 일반 규약 (재정의시 지켜야..
객체의 생성과 파괴 1. 생성자 대신 정적 팩터리 메서드를 고려하라 정적 팩터리 메서드란 생성자와 별도로 static 으로 객체를 반환하는 것 예시 public static Boolean ValueOf(boolean b){ return b ? Boolean.TRUE : Boolean.FALSE; } 정적 팩터리 메서드가 생성자 보다 좋은 이유 이름을 가질 수 있다 : 생성자 매개 변수와 생성자 자체만으로는 객체의 특성을 설명을 잘 못하는 데, 정적 팩터리 메서드는 이름을 가질 수 있으므로 객체의 특성을 쉽게 설명할 수 있다 호출 될 때 마다 인스턴스를 새로 생성하지 않아도 된다 : 반복되는 요청에 같은 객체를 반환하는 식으로 정적 팩터리 메서드는 인스턴스의 생성을 통제할 수 있다. 이는 객체를 효율적으로..