본문 바로가기

이펙티브 자바

(51)
[이펙티브 자바] 아이템 27. 비검사 경고를 제거하라 비검사 경고(Unchecked Warning) : 컴파일러가 코드에서 타입 안전성을 검사하지 못하는 상황을 감지하여 발생하는 경고 메시지이다. 이 경고는 제네릭을 사용하는 코드에서 발생할 수 있는데, 일반적으로 제네릭을 사용하면서 발생하는 타입 캐스팅이나 원시 타입 사용 등의 상황에서 발생한다. 할 수 있는 한 모든 비검사 경고를 제거해야 한다. 비검사 경고를 제거할 수는 없지만 타입 안전하다고 확실할 수 있다면 @SuppressWarning("unchecked") 애너테이션을 달아 경고를 숨기자. 단 타입 안전함을 반드시 검증해야만 한다. 이 에너테이션을 사용했다면 그 경고를 무시해도 안전한 이유를 항상 주석으로 남겨야만 한다. 이 애너테이션은 보통은 변수 선언, 아주 짧은 메서드, 혹은 생성자 등 가..
[이펙티브 자바] 아이템 26. 로 타입은 사용하지 말라 로 타입(raw type) : 제네릭 클래스나 인터페이스에서 타입 매개변수를 명시하지 않고 raw 타입으로 사용하는 것을 의미 제네릭 : 자바에서 컬렉션 클래스 및 메서드, 인터페이스 등을 작성할 때 타입을 파라미터화하는 기능 컬렉션 클래스 : 자바에서 데이터를 모으고 관리하는 데 사용되는 클래스들의 집합 //잘못된 예 List list = new ArrayList(); // 로 타입 사용 list.add("hello"); list.add(123); String str = (String) list.get(0); // 형변환 필요 int num = (int) list.get(1); // 형변환 필요 //옳은 예 List list = new ArrayList(); // 제네릭 사용 list.add("hell..
[이펙티브 자바] 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라 톱 레벨 클래스 : 다른 클래스의 내부에 정의되지 않고, 자체 파일에 독립적으로 존재하는 클래스. 즉, 톱 레벨 클래스는 패키지 내에서 최상위에 위치하는 클래스이며, 다른 클래스의 멤버가 아닌 독립된 클래스. 아래 예시는 한 파일에 두 개의 클래스가 정의된것이다. 절대 따라하면 안되는 코드이다. class Utensil { static final String NAME = "pan"; } class Dessert { stattic final String NAME = "cake"; } 위와 같은 코드로 작성할 경우 오류가 발생 할 수 있다. 이를 해결하려면 단순히 톱 레벨 클래스들을 서로 다른 소스 파일로 분리해주면 된다. 굳이 여러 톱 레벨 클래스를 한 파일에 담고 싶다면 정적 멤버 클래스로 만들 수 있다..
[이펙티브 자바] 아이템 24. 멤버 클래스는 되도록 static으로 만들라 중첩 클래스(nested class) : 다른 클래스 내부에 선언된 클래스. 중첩 클래스의 종류 4가지 : 정적 멤버 클래스 정적 멤버 클래스는 바깥 클래스의 인스턴스와 독립적으로 존재할 수 있는 클래스다. 즉, 바깥 클래스의 인스턴스 없이도 생성하고 사용할 수 있다. 정적 멤버 클래스는 바깥 클래스의 정적 멤버에만 접근할 수 있으며, 바깥 클래스의 인스턴스 멤버에는 접근할 수 없다. 비정적 멤버 클래스 비정적 멤버 클래스는 바깥 클래스의 인스턴스와 연관되어 있는 클래스다. 이러한 클래스의 객체는 바깥 클래스의 객체와 연결되어 있으며, 바깥 클래스의 인스턴스 멤버와 메서드에 접근할 수 있다. 비정적 내부 클래스는 바깥 클래스의 인스턴스를 통해서만 생성할 수 있다. 정적 클래스와 의 구문적 차이는 단지 s..
[이펙티브 자바] 아이템 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 태그 달린 클래스(tagged class): 클래스 내부에 특정 "태그" 필드를 두어 객체의 유형을 나타내는 방식. 이러한 클래스는 보통 여러 유형의 객체를 하나의 클래스로 표현하고자 할 때 사용되며, 태그 값에 따라 다른 동작을 수행하도록 메서드들이 조건문(예: if-else, switch)을 사용해 구현된다. // 태그 달린 클래스 public class Shape { enum ShapeType { CIRCLE, RECTANGLE } final ShapeType shapeType; double radius; // 원일 경우 사용 double width; // 직사각형일 경우 사용 double height; // 직사각형일 경우 사용 // 원을 위한 생성자 Shape(double radius) { sh..
[이펙티브 자바] 아이템 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 인터페이스 : 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할. 즉, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다. 인터페이스는 위의 지침에 맞지 않는 예로 상수 인터페이스라는 것이 있다. 상수 인터페이스란 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다. 상수 인터페이스 안티패턴의 예시 // 상수 인터페이스 예시 public interface CarConstants { int MAX_SPEED = 240; String ERROR_MESSAGE = "Operation not allowed"; } // 위의 상수 인터페이스는 이런식으로 사용될 수 있다. public class Spor..
[이펙티브 자바] 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 디폴트 메서드 : 인터페이스 내에서 구현 코드를 가진 메서드 추상 메서드 : 선언만 있고 구현이 없는 메서드 예시 : interface MyInterface { // 추상 메서드 void abstractMethod(); // 디폴트 메서드 default void defaultMethod() { System.out.println("This is a default method."); } } // MyInterface를 구현하는 클래스 class MyClass implements MyInterface { @Override public void abstractMethod() { System.out.println("Abstract method implementation."); } } public class Mai..
[이펙티브 자바] 아이템 20. 추상 클래스보다는 인터페이스를 우선하라 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스 두가지이다. 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는데 큰 제약을 안게되는 셈이다. 반면 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. 다중 구현 메커니즘 : 한 클래스가 둘 이상의 인터페이스를 구현할 수 있는 기능 인터페이스의 장점 : - 인터페이스는 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다. - 인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다. - 인터페이스는 ..