Item 34. Int 상수 대신 열거 타입을 사용하라
서론자바에서는 상수(Costants)라는 개념이 있다.변하지 않는 값을 공통적으로 선언하고 한 군데에서 관리하고자 사용한다.Java 1.5 버전부터 enum (enumeration) 타입을 제공하였고, C/C++에서 처럼 단순한 정수값을 제공하는 수준을 넘어완 ...
Read more
Item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라
서론가변인수(varargs) 메서드와 제네릭은 Java 5버전에 함께 추가되었다.서로 잘 어우러지리라 생각하겠지만, 그렇지 않다. 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는데, 구현방식에 헛점이 있다.가변인수 메서드를 호출하면, 가변인 ...
Read more
Item 31. 한정적 와일드 카드(Bounded Wildcard Type)를 사용해 API 유연성을 높여라
서론Generic에서 매개변수화 타입(Parameterize Type - List)는 불공변이다. 공변 vs 불공변Java에서 배열은 공변(variant), Generic은 불공변(invariant)이라 한다.배열의 경우 Object[]과 String[] 간에는 부모 ...
Read more
Item 17. 변경 가능성을 최소화하라
불변 클래스(immutable class)란? 인스턴스의 내부 값을 수정할 수 없는 클래스를 말한다. 불변 클래스의 인스턴스는 객체가 생성되는 시점에 초기화되고 소멸이 될 때까지 값이 변경되지 않는다. 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉽 ...
Read more
Item 16. Public 클래스에서는 Public 필드가 아닌 접근자 메서드를 사용하라
퇴보한 클래스1234class Point { public double x; public double y;} 이런 클래스는 데이터 필드에 직접 접근하여 수정이 가능하다. 따라서 캡슐화의 이점을 제공하지 못한다. API를 수정하지 않고는 내부 표현 ...
Read more
Item 15. 클래스와 멤버의 접근 권한을 최소화하라
서론잘 설계된 컴포넌트는 클래스는 모든 내부구현을 완벽히 숨겨, 구현과 API를 깔끔하게 분리 해놨다.오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다.정보은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 ...
Read more
Item 14. Comparable을 구현할지 고려하라
서론Comparable을 구현하는 이유는 클래스의 인스턴스들간의 Ordering을 목적으로 구현하는 클래스이다.따라서 Comparable을 구현한 클래스에 대한 배열은 다음처럼 손쉽게 정렬 할 수 있다. 1Arrays.sort(arr); 사실상 자바 플랫폼 라이브러리 ...
Read more
Shallow Copy와 Deep Copy
객체의 복사(Copy)객체 지향 프로그래밍에서 객체를 복사하는 방법은 크게 두가지로 나뉜다.얇은 복사(Shallow Copy)와 깊은 복사(Deep Copy)가 있다.두가지 개념 모두 원본 객체를 바탕으로 새로운 객체를 만들어 낸다는 점에서는 같지만 미묘한 차이가 있다 ...
Read more
Item 13. Clone 재정의는 주의해서 진행하라
서론Cloneable은 복제해도 되는 인터페이스 임을 명시하는 용도의 믹스인 인터페이스이다.하지만 아쉽게도 의도한 목적을 제대로 이루지 못했다. 가장 큰 문제는 clone메서드가 선언된 곳이 Cloneable이 아닌 Object이고, 그마저도 protected라는데 있 ...
Read more
Item 12. toString을 항상 재정의하라
서론Object의 기본 toString 메서드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다.이 메서드는 PhoneNumber@adbbd처럼 단순히 클래스이름@16진수로_표현한_해시코드를 반환할 뿐이다.toString의 일반 규약에 따르면, 간결하 ...
Read more