Java/EffectiveJava 7

Effective Java Item26. 로 타입은 사용하지 말라.

제네릭이란? 제네릭 클래스 or 제네릭 인터페이스 : 클래스와 인터페이스 선언에 타입 매개변수가 쓰인 것제네릭 타입 : 제네릭 클래스와 제네릭 인터페이스를 통틀어 정의List제네릭 타입의 구성 List : 로 타입(raw type)로 타입은 타입 선언에서 제네릭 타입 정보가 전부 지워진 것처럼 동작한다.E : 매개변수화 타입(parameterized type)List 인 경우 정규 타입 매개변수 E에 해당하는 실제 타입 매개변수이다.주제로 넘어가 로 타입을 사용하지 말라는 것은 무엇?이러한 제네릭에 대해 매개변수화 타입을 생략하여 사용하는 경우가 있는데, 이를 로 타입으로만 사용하는 것이다. ex) List, Collection 으로만 사용로 타입으로만 사용하면 제네릭이 안겨주는 안정성과 표현력을 모두..

Java/EffectiveJava 2025.01.24

Effective Java Item24. 멤버 클래스는 되도록 static으로 만들라.

https://www.infoworld.com/article/2255920/avoid-memory-leaks-in-inner-classes.html중첩 클래스(nested class)?다른 클래스 안에 정의된 클래스를 말한다.자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다.public class EnclosingClass { // 바깥 클래스 public class EnclosedClass // 중첩 클래스}중첩 클래스의 종류 정적 멤버 클래스(비정적)멤버 클래스익명 클래스지역 클래스정적 멤버 클래스?클래스에 static을 붙인다.다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점만 제외하고 일반 클래스와 같다...

Java/EffectiveJava 2025.01.23

Effective Java Item20. 추상 클래스보다는 인터페이스를 우선하라.

자바가 제공하는 다중 구현 메카니즘인터페이스(Interface) : 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규악을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다.추상 클래스(abstract class) : 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야한다. 자바는 단일 상속만 지원한다. 인터페이스를 사용하면 얻을 수 있는 것기존 클래스에도 손쉽게 새로운 인페이스를 구현해넣을 수 있다.인터페이스는 믹스인 정의에 안성맞춤이다.인터페이스로는 계층구조가 없는 타입 프로엠워크를 만들 수 있다.래퍼 클래스 관용구(아이템18)와 함께 사용하면 인터페이스 기능을 향상시키는 강력한 수단이 된다.인터페이스와 추상 클래스를 적절히 사용하여 구현..

Java/EffectiveJava 2025.01.18

Effective Java Item18. 상속보다는 컴포지션을 사용하라.

상속은 코드를 재사용하는 강력한 수단이다. 하지만 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 한다.메서드 상속과 달리 상속은 캡슐화를 깨트린다. - 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다. - 상위 클래스는 릴리스마다 내부 구현이 달라질 수 있으며, 그 여파로 코드 한 줄 건드리지 않은 하위 클래스가 오동작할 수 있다.상속의 단점을 피하기 위해 새로운 메서드를 통해 재정의하는 것은 상위 클래스의 메서드가 요구하는 규약을 만족하지 못할 가능성이 크다.위 문제점을 해결하기 위해서는 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조하게 하는 컴포지션(composition)을 사용하자.컴포지션을 사용하면, 기존 클래스의 내부 구현 방식..

Java/EffectiveJava 2025.01.15

Effective Java Item8. finalizer와 cleaner 사용을 피하라

자바는 finalizer와 cleaner 두 가지 객체 소멸자를 제공한다.finalizer : 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다.cleaner : finalizer보다는 더 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다.finalizer와 cleaner는 하나의 자원의 소유자가 close 메서드를 호출하지 않는 것에 대비한 안전망 역할이다.FileInputStream, FileOutputStream, ThreadPoolExecutro가 대표적이다.cleaner와 finalizer는 안정망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자. 물론 이런 경우라도 불확실성과 성능 저하에 주의해야한다.네이티브 피어(native peer)와 연결된 ..

Java/EffectiveJava 2025.01.12

Effective Java Item5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스(static class)나 싱글턴(singleton) 방식이 적합하지 않다.그러기 위해서는 여러 자원 인스턴스를 지원해야하며, 클라이언트가 원하는 자원을 사용하기 위해서는 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식인 의존 객체 주입 방식(Dependency Injection) 을 사용한다.public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Lexicon dictionary) { this.dictionary = Objects.requireNonNull(dictionary); } public bo..

Java/EffectiveJava 2025.01.12

EffectiveJava Question Series -1- (Item. 1 ~ Item. 7)

이펙티브 자바를 읽고 궁금한 점에 대한 시리즈물입니다. item 1. 생성자 대신 정적 팩토리 메서드를 고려하라. Java8에서 interface는 어떻게 변경이 되었고, 왜 변경하였을까요? Java8부터 Defualt Method와 Static Method가 추가됨. Java8 이전까지는 추상메서드와 상수 정의만 가능하였음. Default Method : 기본 구현을 가지는 Method Static Method : Class의 Static Method와 같음. 재정의 불가능 Default Method : 기존 인터페이스가 변경이 되면, 인터페이스를 구현하는 모든 클래스들이 해당 메소드를 구현해야 하는 문제가 있어, 해당 문제를 해결하기 위하여 인터페이스에 메소드를 구현해 놓을 수 있도록 함. Stati..

Java/EffectiveJava 2021.05.09