책/이펙티브자바
-
아이템25. 톱레벨 클래스는 한 파일에 하나만 담으라책/이펙티브자바 2021. 8. 24. 11:52
소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 컴파일러는 불평하지 않지만 아무런 득이 없을 뿐더러 심각한 위험을 감수하는 행위다. 한 클래스를 여러가지로 정의할 수 있으며, 그 중 어느것을 사용할지는 어느 소스 파일을 먼저 컴파일 하느냐에 따라 달라지기 때문이다. 컴파일러에 어느 소스 파일을 먼저 건네느냐에 따라 동작이 달라진다. 결론 소스 파일 하나에는 반드시 톱레벨 클래스를 하나만 담자. 굳이 한 파일에 담고 싶다면 정적 멤버 클래스를 사용하자. (Item24)
-
아이템23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라책/이펙티브자바 2021. 8. 24. 11:51
태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있으며, 그 중 현재 표현하는 의미를 태그 값으로 알려주는 클래스를 태그 달린 클래스라고 한다. // 23-1. 태그 달린 클래스 public class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // RECTANGLE 일때만 쓰인다. double length; double width; // CIRCLE 일때만 쓰인다. double radius; // 원용 생성자 Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } // 사각형용 생성자 Figure(double length..
-
아이템22. 인터페이스는 타입을 정의하는 용도로만 사용하라책/이펙티브자바 2021. 8. 24. 11:50
클래스가 어떤 인터페이스를 구현한다 → 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해준다. 인터페이스는 오직 이 용도로만 사용해야 한다. 안티패턴 이 사용 용도에 맞지 않는 잘못된 예로 상수 인터페이스라는 것이 있다. public interface PhysicalConstants { static final double AVOGADROS_NUMBER = 6.022_140_857e23; static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; static final double ELECTRON_MASS = 9.109_383_56e-31; } 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당하는데 상수 인터페이스를 구현하는..
-
아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라책/이펙티브자바 2021. 8. 24. 11:50
인터페이스에 새로운 메서드를 추가하는 방법 자바 8 이전 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드 추가할 방법이 없다. 자바 8 이후 디폴트 메서드가 추가되어 기존 인터페이스에 메서드 추가할 방법이 생겼다. 하지만 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어렵다. 디폴트 메서드의 문제점 디폴트 메서드는 (컴파일에 성공하더라도) 기존 구현체에 런타임 오류를 일으킬 수 있다. 디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도로 사용한다면 반드시 기존 클라이언트를 망가뜨리게 된다. 결론 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니면 피해야 한다. 디폴트 메서드라는 도구가 생겼더라도 인..
-
아이템20. 추상 클래스보다는 인터페이스를 우선하라책/이펙티브자바 2021. 8. 18. 17:35
추상클래스와 인터페이스의 차이점 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 자바는 단일 상속만 지원하는데, 추상 클래스 방식을 사용한다면 새로운 타입을 정의하는 데 커다란 제약을 안게 된다. 반면 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. 믹스인 인터페이스는 믹스인 정의에 안성맞춤이다. 믹스인이란 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 '주된 타입'외에도 특정 선택적 행위를 제공한다고 선언하는 효과를 준다. ex. Comparable 은 자신을 구현한 클래스의 인스턴스들끼리는 순서를 정할 수 있다고 선언하는 믹스인 인터페이스이..
-
아이템19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라책/이펙티브자바 2021. 8. 17. 13:38
상속을 고려한 설계와 문서화가 무엇일까 ? 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 한다. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수 도 있다. 그런데 마침 호출되는 메서드가 재정의 가능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야 한다. 어떤 순서로 호출하는지, 각각의 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담는다. (재정의 가능이란 public과 protected 메서드 중 final 이 아닌 모든 메서드를 뜻한다.) 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야 한다. 문서화 "Implemen..
-
아이템18. 상속보다는 컴포지션을 사용하라책/이펙티브자바 2021. 8. 15. 13:03
들어가기 상속보다는 컴포지션을 사용해래 컴포지션이 상속받을 클래스를 필드로 넣어서 사용하는걸 컴포지션이라고 부르는거 같던데 맞나 ? 일단 상속보다 컴포지션이 좋은점이 있으니까 그러라고 하는거겠지 ? 왜 그런지 알아보자. 상속의 단점 상속은 캡슐화를 깨뜨린다. 상위 클래스가 어떻게 구현하느냐에 따라 하위클래스의 동작에 이상이 생길 수 있다. 상위 클래스는 릴리스마다 내부 구현이 달라질 수 있는데, 그 여파로 코드를 안건드린 하위 클래스가 오동작 할 수 있다는 것이다. 예를들어 HashSet 을 사용하는 프로그램이 있는데 여기서 추가적으로 처음 생성된 이후 원소가 몇 개 더해져있는지 알수있어야 하는 클래스가 필요하다고 할게. 그래서 HashSet을 상속받은 InstrumentedHashSet 을 만들어서 사..
-
아이템17. 변경 가능성을 최소화하라책/이펙티브자바 2021. 7. 27. 12:55
불변클래스 간단히 말해 그 인스턴스 내부 값을 수정할 수 없는 클래스이다. 불변 인스턴스의 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다. 대표적인 불변 클래스 ex. String, Wrapper class, BigInteger, BigDecimal 불변클래스의 장점 가변 클래스보다 설계하고 구현하고 사용하기 쉽다. 오류가 생길 여지가 적다. 안전하다. 생성된 시점의 상태를 파괴될 때까지 그대로 간직한다. 근본적으로 스레드 안전하여 따로 동기화 할 필요가 없다. 안심하고 공유할 수 있다. 불변클래스를 만드는 법 객체의 상태를 변경하는 메소드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. 하위클래스에서 객체의 상태를 변경하는 사태를 막아준다. 대표적인 방법은 클래스를 fin..