본문 바로가기

Java76

[이펙티브자바 3판] ITEM30. 이왕이면 제네릭 메서드로 만들어라 이번장의 핵심은... 제네릭 타입과 마찬가지로, 클라이언트에서 입력 매개변수와 반환 값을 명시적으로 반환해야 하는 메서드보다 제네릭 메서드가 더 안전하며 사용하기도 쉽다 타입과 마찬가지로, 메서드도 형변환 없이 사용할 수 있는 편이 좋으며, 많은 경우 그렇게 하려면 제네릭 메서드가 되어야 한다 역시 타입과 마찬가지로, 형변환을 해줘야 하는 기존 메서드는 제네릭하게 만들자 기존 클라이언트는 그대로 둔 채 새로운 사용자의 삶을 훨씬 편하게 만들어줄 것이다 제네릭 메서드 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭 예를 들어, Collections의 '알고리즘 메서드' (binarySearch, sort 등) 모두 제네릭 // 로 타입 사용 - 수용 불가 public static Set unio.. 2020. 10. 17.
[이펙티브자바 3판] ITEM29. 이왕이면 제네릭 타입으로 만들어라 이번장의 핵심은... 클라이언트에서 직접 형 변환해야 하는 타입보다 제네릭 타입이 더 안전하고 쓰기 편하다 그러니 새로운 타입을 설계할 때는 형 변환 없이도 사용할 수 있도록 하라 기존 타입 중 제네릭이었어야 하는 게 있다면 제네릭 타입으로 변경하자 기존 클라이언트에는 아무 영향을 주지 않으면서, 새로운 사용자를 훨씬 편하게 해주는 길이다 제네릭 타입으로 만들자 제네릭 타입을 새로 만드는 일은 조금 어렵지만 배워두면 그만한 값어치를 충분히 한다 // 제네릭이 절실한 강력 후보! (Object 기반 스택) public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CA.. 2020. 10. 15.
[이펙티브자바 3판] ITEM28. 배열보다는 리스트를 사용하라 이번장의 핵심은... 배열과 제네릭에는 매우 다른 타입 규칙이 적용된다 배열은 공변이고 실체화되는 반면, 제네릭은 불공변이고 타입 정보가 소거된다 배열은 런타임에는 타입 안전하지만 컴파일 타임에는 아니다 제네릭은 반대이다 따라서 둘을 섞어 쓰기는 쉽지 않다. 섞어 쓰다 에러가 나면 가장 먼저 배열을 리스트로 대체하는 방법을 적용해보자 배열 vs 제네릭 타입 1. 배열은 공변이다 Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다 (즉, 공변이란 함께 변한다는 뜻이다) 반면, 제네릭은 불공변이다 즉, 서로 다른 타입 Type1, Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아니다 제네릭에 문제가 있다고 생각할 수 있지만, 사실문제가.. 2020. 10. 14.
[이펙티브자바 3판] ITEM27. 비검사 경고를 제거하라 이번장의 핵심은... 비검사 경고는 중요하니 무시하지 말자 모든 비검사 경고는 런타임에 ClassCastException을 일으킬 수 있는 잠재적 가능성을 뜻하니 최선을 다해 제거하라 경고를 없앨 방법을 찾지 못하겠다면, 그 코드가 타입 안정함을 증명하고 가능한 한 범위를 좁혀 @SuppressWarnings("unchecked") 애너테이션으로 경고를 숨겨라 그런 다음 경고를 숨기기로 한 근거를 주석으로 남겨라 비검사 경고 제네릭을 사용하면 수많은 컴파일러 경고가 나온다 ex) 비검사 형변환 경고, 비검사 메서드 호출 경고.. 등등 제네릭에 익숙해질수록 경고 수가 줄어들 것이다 Set exaltation = new HashSet(); //-> 컴파일러가 알려준 타입 매개변수를 명시하지 않고 만으로 해결.. 2020. 10. 13.
[이펙티브자바 3판] ITEM26. 로(raw) 타입은 사용하지 말라 이번장의 핵심은... 로 타입을 사용하면 런타임 예외가 일어날 수 있으니 사용하면 안 된다 로 타입은 제네릭이 도입되기 이전 코드와의 호환성을 위해 제공될 뿐 Set는 어떤 타입의 객체도 저장할 수 있는 매개변수화 타입이고, Set는 모종의 타입 객체만 저장할 수 있는 와일드카드 타입이다 그리고 이들의 로 타입인 Set은 제내릭 타입 시스템에 속하지 않는다 Set와 Set은 안전하지만, 로 타입인 Set은 안전하지 않다 제네릭 타입 (제네릭 클래스, 혹은 제네릭 인터페이스) 클래스와 인터페이스 선언에 타입 매개변수를 쓰는 것 List → String인 리스트를 뜻하는 매개변수화 타입 제네릭 타입 하나 정의하면 그에 딸린 raw type도 함께 정의된다 Raw Type 제네릭 타입에서 타입 매개변수를 전혀.. 2020. 10. 8.
[이펙티브자바 3판] ITEM25. 톱레벨 클래스는 한 파일에 하나만 담으라 이번장의 핵심은... 소스 파일 하나에는 반드시 톱 레벨 클래스 (혹은 톱 레벨 인터페이스)를 하나만 담자 이 규칙만 따른다면 컴파일러가 한 클래스에 정의를 여러 개 만들어내는 일은 사라진다 소스 파일을 어떤 순서로 컴파일하든 바이너리 파일이나 프로그램의 동작이 달라지는 일은 결코 일어나지 않을 것이다 소스 파일에 하나의 톱레벨 클래스를 여러 개 선언하더라도 상관없지만, 아무런 득이 없고 심각한 위험을 감수해야 한다 한 클래스를 여러 가지로 정의할 수 있으며, 그 중 어느것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달리지기 떄문이다 예) Utensil 클래스와 Dessert 클래스가 Utensil.java라는 한 파일에 정의되어 있다고 해보자 // Utensil.java 에 2개의 클래스가 .. 2020. 10. 5.
[이펙티브자바 3판] ITEM24. 멤버 클래스는 되도록 static으로 만들라 이번장의 핵심은... 중첩 클래스에는 네 가지가 있으며, 각각의 쓰임이 다르다 메서드 밖에서도 사용해야 하거나 메서드 안에 정의하기엔 너무 길다면 멤버 클래스로 만든다 멤버 클래스의 인스턴스 각각이 바깥 인스턴스를 참조한다면 비정적으로, 그렇지 않다면 정적으로 만들자 중첩 클래스가 한 메서드 안에서만 쓰이면 그 인스턴스를 생성하는 지점을 단 한 곳이고 해당 타입으로 쓰기에 적합한 클래스나 인터페이스가 이미 있다면 익명 클래스로 만들고, 그렇지 않다면 지역 클래스로 만들자 중첩 클래스? 중첩 클래스란 다른 클래스 안에 정의된 클래스를 말한다 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외에 쓰임새가 있다면 톱 레벨 클래스로 만들어야 한다 종류 1. 정적 멤버 클래스 2. (비정적) 멤버 클래스 3. 익.. 2020. 10. 4.