Home
Youngho's Devlog
Cancel

[이펙티브자바] 아이템29-이왕이면 제네릭 타입으로 만들라

클라이언트에서 직접 형변환해야 하는 타입보단 제네릭 타입이 더 안전하고 쓰기 편하다. 클라이언트에서 불필요한 형변환 없음 훨씬 더 안정적으로 타입을 관리할 수 있다. (런타임 에러가 발생할 확률을 줄일 수 있다.) 사실 제네릭 타입 안에서 리스트를 사욯아는게 항상 가능하지도, 꼭 더 좋은 거도 아니다. 자바가 리스트를 기본 타입으로 ...

[이펙티브자바] 아이템28-배열보다는 리스트를 사용하라

배열과 제네릭 타입의 중요한 두 가지 차이 1) 배열은 공변(covariant)이다. 어려워보이지만 뜻은 간단하다. Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다.(공변, 즉 함께 변한다는 뜻이다) 반면 제네릭은 불공변(invariant)이다. 즉, 서로 다른 타입 Type1과 Type2가...

[이펙티브자바] 아이템27-비검사 경고를 제거하라

할 수 있는 한 모든 비검사 경고를 제거하라. 모두 제거한다면 그 코드는 타입 안정성이 보장된다. 즉, 런타임에 ClassCastException이 발생할 일이 없고, 개발자가 의도한 대로 잘 동작하리라 확신할 수 있다. 경고를 제거할 순 없지만 타입 안전하다고 확신할 수 있다면 @SupressWarnins(“unchecked”) 애너테이...

[이펙티브자바] 아이템26-로 타입은 사용하지 말라

로 타입 로 타입이란 제네릭 타입 매개변수를 전혀 사용하지 않을 때를 말한다. 예컨대 List<E> 의 로 타입은 List다. 로 타입(타입 매개변수가 없는 제네릭 타입)을 쓰는 걸 언어 차원에서 막아 놓진 않았지만 절대로 써선 안된다. 로 타입을 쓰면 제네릭을 안겨주는 안정성과...

[이펙티브자바] 아이템25-톱레벨 클래스는 한 파일에 하나만 담으라

소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 문제 없이 컴파일 한다. 하지만 심각한 위험을 감수해야 하는 행위다. 이렇게 하면 한 클래스를 여러 가지로 정의할 수 잇으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하느냐에 따라 달라지기 때문이다. public cla...

[이펙티브자바] 아이템24-멤버 클래스는 되도록 static으로 만들어라

중첩 클래스 중첩 클래스에는 정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스 이렇게 네 가지 종류가 있다. 정적(static) 멤버 클래스 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점만 제외하곤 일반 클래스와 똑같다. 정적 멤버 클래스는 다른 정적 멤버와 똑같은 접근 ...

[이펙티브자바] 아이템23-태그 달린 클래스보다는 클래스 계층구조를 활용하라

// 코드 23-1 태그 달린 클래스 - 클래스 계층구조보다 훨씬 나쁘다! (142-143쪽) class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 ...

[이펙티브자바] 아이템22-인터페이스는 타입을 정의하는 용도로만 사용하라

인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 거이다. 인터페이스는 오직 이 용도로만 사용해야 한다. 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예다. // 코드 22-1 상수 인터페이스...

[이펙티브자바] 아이템21-인터페이스는 구현하는 쪽을 생각해 설계하라

자바 8전에는 기존 구현체를 깨드리지 않고는 인터페이스에 메서들르 추가할 방법이 없었다. 자바 8에 와서 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드를 소개했지만 위험이 완전히 사라진 것은 아니다. 모든 기존 구현체들과 매끄럽게 연동되리라는 보장이 없다. 디폴트 메서드는 구현 클래스에 대해 아무것도...

[이펙티브자바] 아이템20-추상 클래스보다는 인터페이스를 우선하라

자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두 가지다. 자바8부터 인터페이스도 디폴트 메서드(default method)를 제공할 수 있다.(참고) 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 자바는 단일 상속만 지원하기에, 추상...