Study/이펙티브 자바

Study/이펙티브 자바

[Effective Java 3E] 로 타입은 사용하지 말라

💥 개요 한글 용어 영문 용어 예시 매개변수화 타입 parameterized type List 실제 타입 매개변수 actual type parameter String 제네릭 타입 generic type List 정규 타입 매개변수 formal type parameter E 비한정적 와일드카드 타입 unbounded wildcard typ List 로 타입 raw type List 한정적 타입 매개변수 bounded type parameter 재귀적 타입 한정 recursive type bound 한정적 와일드카드 타입 bounded wildcard type List에는 (null 외에는) 어떤 원소도 넣을 수 없다. 다른 원소를 넣으려 하면 컴파일 시점에 오류가 발생한다. @Test void 와일드카드타..

Study/이펙티브 자바

[Effective Java 3E] 멤버 클래스는 되도록 static으로 만들라

💥 개요 중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다. 🔍 중첩 클래스의 종류 정적 멤버 클래스 멤버 클래스(비정적) 익명 클래스 지역 클래스 정적 멤버 클래스 다른 클래스 안에 선언, 바깥 클래스의 private 멤버에도 접근이 가능하다. 정적 멤버 클래스는 정적 멤버와 똑같은 접근 규칙을 적용 받는다.(private이면 바깥 클래스에서만 사용 가능) 흔히 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스로 쓰인다. public class Calculator { //static을 명시하지 않아도 nested enum은 static으로 선언..

Study/이펙티브 자바

[Effective Java 3E] 태그달린 클래스보다는 클래스 계층구조를 활용하라

💥 개요 두 가지 이상의 의미를 표현할 수 있으며, 현재 표현하는 의미를 태그값으로 알려주는 클래스를 본 적이 있을 것이다. package effectivejava.chapter4.item23.taggedclass; 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 =..

Study/이펙티브 자바

[Effective Java 3E] 인터페이스는 타입을 정의하는 용도로만 사용하라

💥 개요 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 합니다. 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인터페이스로 무엇을 할 수 있는지를 얘기해주는 것 입니다. 인터페이스는 오직 이 용도로만 사용해야 합니다. ☠️ 상수 인터페이스 (안티패턴 - 사용금지) public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 (J/K) static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // 전자 질량 (kg) static final double ELECTRON_MAS..

Study/이펙티브 자바

[Effective Java 3E] 인터페이스는 구현하는 쪽을 생각해 설계하라

💥 개요 자바 8 전에는 기존 구현체를 깨뜨리지 않고 인터페이스에 메서드를 추가하는 방법은 없었습니다. 인터페이스에 메서드를 추가하면 대부분 컴파일 오류가 발생하는데 추가된 메서드가 우연히 기존 구현체에 이미 존재할 가능성은 아주 낮기 때문입니다. 자바 8부터 default method가 추가 되어 인터페이스에 메서드를 추가할 수 있게 되었지만 위험이 완전히 사라진 것은 아닙니다. 🔍 default method 디폴트 메서드(default method)를 선언하면, 그 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 됩니다. 이처럼 기존 인터페이스에 메서드를 추가할 수 있게 되었지만, 모든 기존 구현체가 매끄럽게 연동되라는 보장은 없습니다. 디폴트 메서드는 구..

Study/이펙티브 자바

[Effective Java 3E] 추상 클래스보다는 인터페이스를 우선하라

💥 개요 자바에서 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두가지 입니다. JAVA 8부터 인터페이스도 default method를 제공할 수 있게 되어, 현재 두 방법 모두 인스턴스 메서드를 구현 형태로 제공할 수 있게 되었습니다. 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점 입니다. 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는데 커다란 제약이 있습니다. 반면 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급합니다. 🔍 인터페이스를 사용해야 하는 이유 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해..

Study/이펙티브 자바

[Effective Java 3E] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라

💥 개요 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 합니다. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야 합니다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있씁니다. 그런데 마침 호출되는 메서드가 재정의 가능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야 합니다. 어떤 순서로 호출하는지, 각각의 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담아야 합니다. 즉 모든 상황을 문서로 남겨야 합니다. 상속이 캡슐화를 해친다. API문서 메서드 설명 끝에 종종 "Implementation Requirements"로 시작하는 절을 볼 수 있는데 내부 동작방식을 설명하는 곳..

Study/이펙티브 자바

[Effective Java 3E] 상속보다는 컴포지션을 사용하라

💥 개요 상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아닙니다. 패키지 안에서라면 상속도 안전하지만 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 됩니다. 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있습니다. 상위 클래스는 내부 구현이 달라지게 되면 하위 클래스에 이상이 생길 수 있습니다. HashSet을 사용하는 프로그램이 있고, 성능을 높이려면 이 HashSet은 처음 생성된 이후 몇개의 원소가 더해졌는지 알 수 있어야 한다고 가정하여 아래 코드와 같이 변수와 접근자 메서드를 추가하고 add와 addAll을 재정의 한 경우를 확인해 보겠습니다. // 코드 18-1 잘못된 예 - 상속을 잘못 사용했다! (..

mntdev
'Study/이펙티브 자바' 카테고리의 글 목록 (3 Page)