no image
[이펙티브자바 - 아이템24] 멤버 클래스는 되도록 static으로 만들라
4장. 클래스와 인터페이스 - GOAL 추상화의 기본 단위인 클래스와 인터페이스는 자바의 심장이다. 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만들어보자 아이템24. 멤버 클래스는 되도록 static으로 만들라 중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다. 증첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다. 중첩 클래스의 종류 정적 멤버 클래스 비정적 멤버 클래스 (내부(inner) 클래스) 익명 클래스 (내부(inner) 클래스) 지역 클래스 (내부(inner) 클래스) 이번 아이템에서는 각각의 중첩 클래스를 언제 그리고 왜 사용해야 하는지 이야기한다. 1. 정적 멤버 클래스 다른 클래스 안..
2021. 10. 10. 03:01
no image
[이펙티브자바 - 아이템23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라
4장. 클래스와 인터페이스 - GOAL 추상화의 기본 단위인 클래스와 인터페이스는 자바의 심장이다. 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만들어보자 아이템23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 두 가지 이상의 의미를 표현할 수 있으며, 그중 현재 표현하는 의미를 태그 값으로 알려주는 클래스를 본 적이 있을 것이다. 태그 달린 클래스 - 클래스 계층구조보다 훨씬 나쁘다! class Figure { enum Shape { RECTANGLE, CIRCLE }; final Shape shape; // 태그 필드 - 현재 모양을 나타낸다. // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드는 ..
2021. 10. 10. 02:22
no image
[이펙티브자바 - 아이템22] 인터페이스는 타입을 정의하는 용도로만 사용하라
4장. 클래스와 인터페이스 - GOAL 추상화의 기본 단위인 클래스와 인터페이스는 자바의 심장이다. 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만들어보자 아이템22. 인터페이스는 타입을 정의하는 용도로만 사용하라 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다. 인터페이스는 오직 이 용도로만 사용해야 한다. /** 상수 인터페이스 안티패턴 - 사용금지! */ public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = 6.022_140_857..
2021. 10. 10. 01:59
no image
[이펙티브자바 - 아이템21] 인터페이스는 구현하는 쪽을 생각해 설계하라
4장. 클래스와 인터페이스 - GOAL 추상화의 기본 단위인 클래스와 인터페이스는 자바의 심장이다. 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만들어보자 아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라 자바 8전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 인터페이스에 메서드를 추가하면 보통은 컴파일 오류가 나는데, 추가된 메서드가 기존 구현체에 존재할 가능성이 낮기 때문이다. 자바 8에 와서, 이를 해결할 수 있는 디폴트 메서드가 등장했지만 위험이 완전히 사라진 것은 아니다. 디폴트 메서드 디폴트 메서드를 선언하면, 그 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 된다. 하지만 모든 기존 구현체들과 매..
2021. 10. 10. 01:45
no image
[이펙티브자바 - 아이템20] 추상 클래스보다는 인터페이스를 우선하라
4장. 클래스와 인터페이스 - GOAL 추상화의 기본 단위인 클래스와 인터페이스는 자바의 심장이다. 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만들어보자 아이템20. 추상 클래스보다는 인터페이스를 우선하라 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는데 커다란 제약을 안게 된다. 반면 인터페이스가 선언한 메서드를 모두 정의하고, 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. 인터페이스의 장점 1. 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다. 인터페이스가 요구하는 메서드를 추가하고, 클래스 선언에 implements 구문만 추가하면 끝이다. 반면, 기존 클래스 위에 새로운 추상 클래스를 끼워넣기는 어려운게 ..
2021. 10. 10. 01:07
no image
[이펙티브자바 - 아이템19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라
4장. 클래스와 인터페이스 - GOAL 추상화의 기본 단위인 클래스와 인터페이스는 자바의 심장이다. 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만들어보자 아이템19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 상속을 허용하는 클래스가 지켜야 할 제약 1. 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 한다. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야 한다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있다. 호출되는 메서드가 재정의 기능 메서드라면, 그 사실을 호출하는 메서드의 API 설명에 적시해야 한다. 어떤 순서로 호출하는지, 각각의 호출 결과가..
2021. 10. 10. 00:06
no image
[이펙티브자바 - 아이템18] 상속보다는 컴포지션을 사용하라
4장. 클래스와 인터페이스 - GOAL 추상화의 기본 단위인 클래스와 인터페이스는 자바의 심장이다. 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만들어보자 아이템18. 상속보다는 컴포지션을 사용하라 상속은 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다. 일반적인 구체 클래스를 패키지 경계를 넘어, 즉 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 이 책에서의 '상속'은 (클래스가 다른 클래스를 확장하는) 구현 상속을 말한다. 번외. 상속(Inheritance) vs 컴포지션(Composition) 상속 캡슐화를 위반한다. 설계가 유연하지 못하다. (컴파일 시점에 객체의 type이 정해지기 떄문이다.) 다중상속이 자바는 불가능하다. 컴포지션 다른 객체의 인스턴스를 자신의 인스턴..
2021. 10. 9. 16:59
no image
[이펙티브자바 - 아이템17] 변경 가능성을 최소화하라
4장. 클래스와 인터페이스 - GOAL 추상화의 기본 단위인 클래스와 인터페이스는 자바의 심장이다. 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만들어보자 아이템17. 변경 가능성을 최소화하라 불변 클래스란 인스턴스의 내부 값을 수정할 수 없는 클래스다. 불변 인스턴스에 간직된 정보는 고정되어, 객체가 파괴되는 순간까지 절대 달라지지 않는다. String, 기본타입의 박싱된 클래스들, BigInteger, BigDecimal 이 예시로 있다. 불변 클래스는 가변 클래스보다 설계하고, 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. 클래스를 불변으로 만들기 위한 규칙 5개 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. 하위 클래스..
2021. 10. 9. 16:04
no image
[이펙티브자바 - 아이템16] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
4장. 클래스와 인터페이스 - GOAL 추상화의 기본 단위인 클래스와 인터페이스는 자바의 심장이다. 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만들어보자 아이템16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 이따금 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있다. 퇴보한 클래스 class Point { public double x; public double y; } 이런 클래스는 데이터 필드에 직접 접근할 수 있으니, 캡슐화의 이점을 제공하지 못한다. API를 수정하지 않고는 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없으며, 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없다. 철저한 객체 지향 프로..
2021. 10. 5. 20:26