추상 클래스보다는 인터페이스를 우선하라
이펙티브 자바 2022. 2. 2. 21:44

자바가 제공하는 다중 구현 매커니즘은 인터페이스와 추상 클래스이다 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두 가지다. 다만 둘 사이엔 아주 중요한 차이점이 존재한다. 추상 클래스의 경우 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다 인터페이스가 선언한 메서드를 모두 정의하고 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. 클래스는 여러 개의 인터페이스를 동시에 구현할 수 있다. 기존 클래스에 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다 인터페이스는 상속의 관계가 아니고, 여러개를 구현할 수 있기 때문에 만약 새로운 기능이 추가된다면 기존 클래스에 손쉽게 추가할 수 있다. 인퍼테이스가 요구하는 메서드가 아직 없다..

접근 지정자 - Java
이펙티브 자바 2022. 1. 24. 20:11

어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API 를 깔끔히 분리한다. 정보 은닉, 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다. 정보 은닉의 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 비용도 적다. 소프트웨어 재사용성을 높인다. 외부에 거의 의존하지 않고 독자적으로 동작할 수 있는 컴포넌트라면 그 컴포넌트와 함께 개발되지 않은 낯선 환경에서도 유용하게 쓰일 가능성이 크기 때문이다...

toString() 을 항상 재정의하자
이펙티브 자바 2022. 1. 23. 22:07

우리가 클래스를 작성할 때, Object 의 기본 toString() 메서드가 우리가 작성한 클래스의 유의미한 정보를 제공해주는 경우는 거의 없다. 이 메소드는 PhoneNumber@adbbd 처럼 단순히 클래스_이름 @ 16진수로 표현한 해시코드 를 반환할 뿐이다. 잘 정의된 toString 은 디버깅을 손쉽게 만들어준다 Java에서 toString 의 규약은 모든 하위 클래스에서 이 메서드를 재정의하라고 한다. toString 을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 그 클래스를 사용한 시스템은 디버깅하기 쉽다. toString 메서드는 객체를 println, printf, 문자열 연결 연산자, assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 불린다. 예컨대 우리가 작성..

자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
이펙티브 자바 2022. 1. 22. 11:52

많은 클래스가 하나 이상의 자원에 의존한다. 가령 맞춤법 검사기는 사전에 의존하는데, 이런 클래스를 정적 유틸리티 클래스로 구현한 모습을 드물지 않게 볼 수 있다. public class SpellChecker { private static final Lexicon dictionary = new Lexicon(); private SpellChecker() { } //객체 생성 방지 public static boolean isValid(String word) {...} public static List suggestion(String typo) {...} } 위 방식을 사용하면 다른 사전을 사용하지 못한다는 점에서 잘못된 설계 방법이라고 할 수 있다. 실전에서는 사전이 언어별로 따로 있고, 특수 어휘용 사..

private 생성자 사용하기 - Effective java
이펙티브 자바 2022. 1. 21. 18:44

우리는 보통 public 생성자를 사용해서 클래스의 인스턴스를 얻는다. 그러나 생성자를 private 으로 지정한다면, 해당 클래스 외부에서 생성자를 사용해 인스턴스를 생성할 수 없다. 그렇다면 private 생성자를 어떤 경우에 사용하면 좋을지 알아보도록 하자 private 생성자나 열거 타입으로 싱글턴임을 보장하기 싱글톤 (Singleton) 클래스란 인스턴스가 오직 하나만 존재하는 클래스를 말한다. 그런데 클래스를 싱글톤으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워진다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글톤이 아니라면 싱글톤 인스턴스를 가짜(mock) 구현으로 대체할 수 없다. 싱글톤을 만드는 방식은 보통 두 가지가 존재한다. 일단 두 방식 모두 생성자를..

생성자 대신 정적 팩터리 메서드를 사용하기 - java
이펙티브 자바 2022. 1. 20. 15:18

클래스 인스턴스 얻기 우리가 클래스의 인스턴스를 얻는 기본적인 방법은 바로 public 생성자를 이용하는 것이다. 하지만 클래스는 생성자와 별도로, 정적 팩터리 메서드 (static factory method) 를 사용해서 제공할 수 있다. 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드이다. 아래 코드는 boolean primitive type 의 래퍼 클래스인 Boolean에서 발췌한 예시이다. public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } 위와 같은 방식으로 우리는 클래스의 인스턴스를 생성자말고도 다양한 방법으로 제공할 수 있다. 정적 팩토리 메소드의 장점 이름을 가질 수 있다. 생성자에 넘기는 변수명과 생성자 자..