본문 바로가기

Java62

[이펙티브 자바] 아이템 6 : 불필요한 객체 생성을 피하라 🎯 학습 목표 Why?? String Constant Pool Wrapper 클래스 📌 불필요한 객체 생성 피하기 불필요한 객체 생성에 대한 이야기는 아이템 1에서 잠깐이나마 엿볼 수 있었다. 인스턴스를 캐싱해 두면 불필요한 객체 생성을 피할 수 있다고 했다. 🤔 왜 피해야 할까? Java를 조금이라도 공부했다면 GC(Gabage Collection)의 존재를 알 것이다. 메모리를 하나하나 관리해야하는 C언어와 다르게 이 GC가 알아서 메모리의 누수를 방지해 주기 때문이다. 하지만 GC이 아무리 좋아져도 무분별한 객체 생성은 성능을 저하시킨다. 즉, 성능 때문에 피해야한다. 👀 언제 그럴까? 책에서 제시하는 예시와 함께 언제 불필요한 객체가 생성되는지 알아보자. 1️⃣ String String s = n.. 2023. 1. 15.
[이펙티브 자바] 아이템 5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 ✍️ 학습 목표 의존 객체 주입 패턴 📌 의존 객체 주입 패턴 일반적으로 객체는 여러 자원들과 의존한다. 예를 들어, 자동차라는 객체는 부품들에 의존하고 책의 예시는 맞춤법 검사기는 사전에 의존한다. 의존한다는 말은 관계를 가진다, 즉 서로가 서로에게 영향을 주는 것을 말한다. 🤔 왜 필요하지? 책에서 제시된 예시들을 보면 금방 이해할 수 있다. 1️⃣ 정적 클래스를 사용 public class SpellChecker { private static final Dictionary dictionary = new Dictionary(); private SpellChecker() { } public static boolean isValid(String word) { return false; }; public s.. 2023. 1. 15.
[Java] Reflection 🎇 Java Java를 사용하다 보면 리플렉션(Reflection)이라는 용어를 자주 접한다. 대충 무엇인지는 알겠는데 설명해 주세요! 하면 못 할 것 같아서 정리해 본다😋😋 🪞 리플렉션, Reflection 리플렉션이란? 단어의 의미를 떠올려서, 거울에 반사된 어떤 대상을 제약 없이 사용하는 기술이다. 자세하게 설명하면, 힙 영역에 로드된 Class 타입의 객체를 통해서 인스턴스를 생성하고, 접근 지정자의 제약 없이 인스턴스의 메소드와 필드를 사용할 수 있게 하는 Java API이다. 😮 힙 영역에서 Class 타입 가져오기 힙 영역에 로드된 Class 타입은 다음 3가지 방법으로 가져올 수 있다. 클래스.class 인스턴스.getClass() Class.forName(클래스명) public class.. 2023. 1. 11.
[이펙티브 자바] 아이템 4 : 인스턴스화를 막으려거든 private 생성자를 사용하라 ✍️ 학습 목표 정적 클래스 인스턴스화 방지 📌 정적 클래스 정적 메서드와 정적 필드만 담은 클래스를 정적 클래스라고 한다. 객체 지향성을 살리지 못하는 방법이지만 나름 쓰임새가 존재한다. 🤔 정적 클래스의 쓰임새 대표적인 쓰임새로는 java.lang.Math, java.util.Arrays 그리고 java.util.Collections 등이 있다. 또, final 클래스와 관련된 메서드들을 모아놓기도 한다. 모두 특정 기능을 모아둔 도구 꾸러미 같은 느낌이다. 그래서 유틸리티 클래스라고도 하나보다. 📌 인스턴스화 방지 애초에 유틸리티 클래스는 인스턴스로 만들어 쓰라고 설계한 게 아니다. 따라서, private 생성자를 선언해서 인스턴스화를 방지해야 한다. 🧐 왜 private 생성자? private 지.. 2023. 1. 2.
[이펙티브 자바] 아이템 3 : private 생성자나 열거 타입으로 싱글턴임을 보증하라 ✍️ 학습 목표 싱글턴 이해하기 싱글턴 vs 정적 클래스 📌 싱글턴 이해하기 싱글턴이란, 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 🛠️ 싱글턴 만들기 1️⃣ private static final 필드 방식 class Pokemon { public static final Pokemon INSTANCE = new Pokemon(); private Pokemon() { } } 싱글턴임을 확실하게 알 수 있고 간결하다. 하지만 리플랙션 API를 사용해서 private 생성자에 접근하면 제 2의 인스턴스가 만들어질 수도 있다. 추가적인 인스턴스가 생성되려고 할 때 예외를 던지는 방식으로 이런 공격을 방어할 수 있다. 2️⃣ 정적 팩토리 메서드 방식 class Pokemon { private sta.. 2022. 12. 21.
[이펙티브 자바] 아이템 2 : 생성자에 매개변수가 많다면 빌더를 고려하라 ✍️ 학습 목표 객체 생성하기 (feat. 생성자) 각각의 장단점 이해하기 📌 객체 생성하기 (feat. 생성자) 생성자를 사용해서 객체를 사용하는 방법은 3가지가 존재한다. 각 방식의 사용법들은 다음과 같다. 1️⃣ 점층적 생성자 매개변수가 다른 생성자를 여러 개 구현하는 방식이다. 필수 매개변수가 들어가는 생성자부터 선택 매개변수를 하나하나 추가되는 생성자를 점층적으로 구현하는 방식이다. class Pokemon { private final int attack, defense, hp; public Pokemon(int attack) { this(attack, 0, 0); } public Pokemon(int attack, int defense) { this(attack, defense, 0); } p.. 2022. 12. 21.