* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 22. 멤버 클래스는 가능하면 static으로 선언하라 중첩 클래스(nested class)는 다른 클래스 안에 정의된 클래스이다. - 중첩 클래스는 해당 클래스를 보조하는 용도로만 사용되어야 한다. - 이외의 용도라면 중첩 클래스로 만들면 안된다. - 총 4가지 종류가 있다. 1. 정적 멤버 클래스(static member class) 2. 비정적 멤버 클래스(nonstatic member class) 3. 익명 클래스(anonymous class) 4. 지역 클래스(local class) 1번을 제외한 나머지는 전부 내부 클래스(inner class)로 사용된다. = "정적 멤버 클래스는 내부 클래스가 아니다" (외부 클래스의 객체가..
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 21. 전략을 표현하고 싶을때는 함수 객체를 사용하라 프로그래밍 언어 중에는 함수 포인터, 람다식, 대리자와 같이 특정 함수를 호출할 수 있는 능력을 저장하고 전달할 수 있도록 하는 것들이 있다. 이런 기능은 보통 함수의 인자로 함수를 전달하기 위해 널리 사용되는데, 이때 인자로 전달되는 함수는 호출된 함수의 기능을 변경하는 구실을 한다. -> 어떤 함수를 인자로 전달하느냐에 따라 여러가지 기능을 만들어낼 수 있다. 이는 대표적인 "전략 패턴" [전략 패턴, Strategy Pattern] 자신의 기능 컨텍스트에서 필요에 따라 변경이 필요한 알고리즘을 인터페이스를 통해 통째로 외부로 분리시키고, 이를 구현한 구체적인 알고리즘 클래스를 필..
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 18. 추상 클래스 대신 인터페이스를 사용하라 자바에는 여러가지 구현을 허용하는 자료형을 만드는 두 가지 방법이 있다. 바로 인터페이스와 추상 클래스 추상 클래스(abstract class)는 구현된 메서드를 포함할 수 있지만 인터페이스는 그럴 수 없다. * 자바 1.8부터 인터페이스도 default / static 메서드를 통해 미리 메서드를 구현해둘 수 있게 되었다. (default 메서드는 재정의가 가능하고, static 메서드는 재정의가 불가능하다.) 인터페이스는 인터페이스에 포함된 모든 메서드를 정의하고 인터페이스가 규정하는 일반 규약을 지키기만 하면 되고, 또한 인터페이스를 통한 다중 상속도 가능하다. 반면 추상 클래스가 규정..
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 시간 관계상 모든 규칙들을 정독하기에는 곤란한 점이 많아 중요도가 좀 떨어져 보이고 하는것들은 빨리빨리 넘기기로 함. 17. 계승을 위한 설계와 문서를 갖추거나, 그럴 수 없다면 계승을 금지하라 계승을 위한 설계와 문서를 갖춘다는 것은 무슨 뜻일까? - 메서드를 재정의할 때 무슨 일이 생기는지를 정확하게 문서화 해야한다. 재정의 가능 메서드를 내부적으로 어떻게 사용하는지를 반드시 남기라는 뜻. -> public이나 protecterd로 선언된 모든 메서드와 생성자에 대해, 어떤 재정의 가능 메서드를 어떤 순서로 호출하는지, 호출 결과가 어떤 영향을 미치는지 문서로 남기라는 것. (재정의 가능하다는 것은 public 또는 protected..
★ 어려움! * 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. * 여기서 말하는 계승(Inheritance, 상속)은 구현 계승이란 의미로, 한 클래스가 다른 클래스를 "extends" 한다는 것을 뜻함. (인터페이스 계승 - 한 클래스가 어떤 인터페이스를 implements 하는 경우, 인터페이스가 인터페이스를 extends 하는 경우는 포함하지 않는다.) 16. 계승(상속)하는 대신 구성하라 계승은 재사용을 돕는 강력한 도구이지만, 항상 최선의 선택인 것은 아니다. - 계승을 적절하게 사용하지 못한 소프트웨어는 깨지기 쉽다. - 상위 클래스와 하위 클래스 구현을 같은 개발자가 통제하는 단일 패키지 안에서 사용하는 것은 안전하다 - 계승을 고려해 설계되고, 그에 맞는 문서를 갖춘 클래..
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 15. 변경 가능성을 최소화하라 변경 불가능(immutable) 클래스는 그 객체를 수정할 수 없는 클래스이다. - 대표적으로 String 클래스, Wrapper 클래스, BigInteger 클래스 등등... - 객체 내부의 정보는 객체가 생성될 때 주어지며, 객체가 살아있는 동안 변경되지 않고 그대로 보존된다. -> 변경 가능 클래스에 비해 설계하기 쉽고, 구현하기 쉬우며 오류 가능성도 적고 안전하다. 1. 객체 상태를 변경하는 메서드(수정자, setter 등)를 제공하지 마라 2. 계승(상속)할 수 없도록 해라 - 잘못 작성되거나, 악의적인 하위 클래스가 객체상태가 변경된 것 처럼 동작해서 불변성을 깨뜨리는 일을 방지할 수 있다. -..
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 14. public 클래스 안에는 public 필드를 두지말고 접근자 메서드를 사용하라 데이터 필드를 외부에서 직접 조작할 수 있는 클래스는 캡슐화의 이점을 누릴 수 없다. - API를 변경하지 않고서는 내부 표현을 변경할 수 없고, 불변식도 강제할 수 없고, 필드를 사용하는 순간에 어떤 동작이 실행되도록 만들 수도 없다. -> private 필드와 public 접근자 메서드(getter)로 변경하라! (변경 가능 클래스라면 수정자 메서드(setter)도 같이..) = 꼭 getter/setter 메서드가 아니더라도, 메서드를 통해서만 필드에 접근/변경이 가능하도록 만들어라!! @Getter @Setter public class Poin..
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 13. 클래스와 멤버의 접근 권한은 최소화하라 잘 설계된 모듈과 그렇지 못한 모듈을 구별짓는 가장 중요한 속성 중 하나는, 모듈 내부의 데이터를 비롯한 구현 세부사항을 다른 모듈에게 잘 감추느냐의 여부이다 - 잘 설계된 모듈은 구현 세부사항을 전부 API 뒤에 감춘다. 모듈들은 서로 API를 통해서만 통신하며, 각자 내부적으로는 무슨 일을 하는지 신경 쓸 필요가없다. (캡슐화, 은닉화) -- 소프트웨어 설계의 기본 원칙. 정보 은닉이 중요한 이유는 정보 은닉이 시스템을 구성하는 모듈 사이의 의존성을 낮춰서 각자 개별적으로 개발/시험/최적화/이해/변경이 가능하도록 해주기 때문이다. 병렬적 개발을 가능하게 만들어 주고, 시스템이 완성된 다음..