본문 바로가기

개인 공부/Java (이펙티브 자바)11

[이펙티브 자바] 아이템 18 : 상속보다 컴포지션을 사용하라 🎯 학습 목표 상속과 캡슐화 컴포지션이란? (feat. DI) 📌 상속보단 컴포지션 이번 아이템에서 상속의 문제점과 왜 컴포지션을 사용해야 하는지 이야기하고 있다. 우선 상속을 지양해야하는 이유를 알아보자. 🧐 상속과 캡슐화 책에서는 상속이 캡슐화를 깨뜨린다고 말한다. 하지만 나는 '상속이 캡슐화를 깰 수도 있다'라는 말이 맞다고 생각한다. 상속의 문제점은 다음과 같다. 상속은 결합도를 크게 높여 유연성을 떨어트린다. Java에서는 모호성 때문에 다중상속을 지원하지 않는다. (다이아몬드 문제) 이런 문제들이 존재함에도 코드의 중복을 줄이는 강력한 수단임은 틀림없다. 따라서, 정말로 'is - a" 관계일 때만 상속을 사용해야 한다. 👀 컴포지션이란? (feat. DI) 한 객체에서 다른 객체를 포함하는 .. 2023. 2. 14.
[이펙티브 자바] 아이템 15 : 클래스와 멤버의 접근 권한을 최소화하라 🎯 학습 목표 접근 권한을 최소화 (feat. 캡슐화) package-private @NoArgsConstructor와 접근 범위 📌 접근 권한을 최소화? Java를 공부한 사람이라면 접근 권한을 보자마자 접근 지정자를 떠올렸을 것이다. 그냥 읽으면 다 흡수하지 못할 내용들이다. 이번 아이템을 통해서 캡슐화를 다시 공부해 보자. 😎 캡슐화? 그거 알긴 알지 우리가 공부하는 Java가 OOP란 사실은 누구나 안다. 또한, 캡슐화가 무엇인지도 알고 있다. 잘 공부한 사람이라면 이번 내용을 읽고 한 번에 이해가 되거나 와닿았을 것이다. 근데 나는 아니니까 다시 공부했다. 🥲🥲 💊 캡슐화 캡슐화란? 연관된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 말한다. 객체지향에선 "묻지 말고 시.. 2023. 2. 8.
[이펙티브 자바] 아이템 13 : clone 재정의는 주의해서 진행하라 🎯 학습 목표 Cloneable 인터페이스란? 재정의 시 문제점 변환 생성자, 변환 팩토리 📌 clone 재정의 시 주의하기! 이번 아이템은 clone()을 사용할 때 주의점을 다룬다. 그러기에 앞서 Cloneable이 뭔지 알아보자! 💡 Cloneable 인터페이스 Cloneable Interface란? 일종의 maker interface로 'cloen에 의해 복제할 수 있다'를 표시하는 인터페이스이다. Java에서는 인스턴스의 복제를 위해 clone() 메서드가 구현되어 있다. 신기하게도 이 메서드는 Cloneable 내부에 구현되어 있을 거란 예상을 깨고 java.lang.Object 클래스에 protected 접근 지정자로 구현되어 있다. 내부에는 구현해야 할 메서드가 하나도 없다! 사용법과 주의.. 2023. 2. 1.
[이펙티브 자바] 아이템 10 : equals는 일반 규약을 지켜 재정의하라 🎯 학습 목표 Equals의 재정의 고려할 규약들 📌 Equals의 재정의 equals를 오버라이딩하는 것은 NPE를 던지거나 원하는 대로 작동하지 않을 가능성이 높다. 재정의를하지 않고 그대로 equals를 사용하게 된다면 인스턴스는 자기 자신만 같다고 표현한다. ✍️ 동일성 vs 동등성 : 동일성은 같은 참조인지 동등성은 같은 값을 가지는지 판단 🤔 언제 하지 말아야 할까? 1️⃣ 각 인스턴스가 본질적으로 고유 값이 아닌 동작을 나타내는 인스턴스는 같은 인스턴스가 애초에 없다. (Ex. Thread) Object의 equals로 충분하다. 2️⃣ 인스턴스의 논리적 동치성을 검사할 일이 없다. 논리적 동치성을 검사할 일이 없다는 것은 단순 동일성을 검사한다는 의미이다. Object의 equals로 충분.. 2023. 1. 31.
[이펙티브 자바] 아이템 7 : 다 쓴 객체 참조를 해제하라 🎯 학습 목표 GC(Garbage Collector)의 동작 메모리를 관리하는 객체 📌 객체 참조를 해제하라! C 계열 개발자가 부러워하는 GC는 개발자가 직접적으로 메모리를 관리하지 않아도 되게 해준다. 하지만 GC가 있다고 절대적으로 메모리 누수가 발생하지 않는 것은 아니다. 책에는 다음과 같은 예시를 제공한다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e).. 2023. 1. 31.
[이펙티브 자바] 아이템 6 : 불필요한 객체 생성을 피하라 🎯 학습 목표 Why?? String Constant Pool Wrapper 클래스 📌 불필요한 객체 생성 피하기 불필요한 객체 생성에 대한 이야기는 아이템 1에서 잠깐이나마 엿볼 수 있었다. 인스턴스를 캐싱해 두면 불필요한 객체 생성을 피할 수 있다고 했다. 🤔 왜 피해야 할까? Java를 조금이라도 공부했다면 GC(Gabage Collection)의 존재를 알 것이다. 메모리를 하나하나 관리해야하는 C언어와 다르게 이 GC가 알아서 메모리의 누수를 방지해 주기 때문이다. 하지만 GC이 아무리 좋아져도 무분별한 객체 생성은 성능을 저하시킨다. 즉, 성능 때문에 피해야한다. 👀 언제 그럴까? 책에서 제시하는 예시와 함께 언제 불필요한 객체가 생성되는지 알아보자. 1️⃣ String String s = n.. 2023. 1. 15.