일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Spring Boot
- 플라이웨이트
- Effetive Java
- Item04
- @MockBean
- NotEmpty
- @Valid
- deleteById
- multi module
- JPA
- java
- 이펙티브 자바
- db
- FCM
- Service Locator
- NotBlank
- Firebase
- @ControllerAdvice
- @SpyBean
- springboot
- SQL 삽입 공격
- Proxy Patter
- Service Locator 패턴
- Effective Java
- 디자인 패턴
- 트랜잭션
- restTemplate
- 데이터베이스
- Web
- Connection Pool
- Today
- Total
목록Effective Java (7)
NoTimeForDawdling
GC는 다 쓴 객체를 알아서 회수해 가기 때문에 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 오해할 수 있다. GC가 처리할 수 없는 자원이 생기지 않게 주의해야 한다. 메모리 직접 관리 예제 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { this.elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { this.ensureCapacity(); this.elements[size++] = e; } public O..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/m7j78/btq5GdueSpO/DWyQThFho4YuM0MUSpNOV1/img.png)
똑같은 기능의 객체를 매번 생성하는 것 보다 객체 하나를 재사용하는 편이 나을 때가 많습니다. 만약 똑같은 기능의 객체를 매번 생성하게 된다면 쓸데없는 인스턴스가 수백만 개 만들어 질 수 있고, 이는 GC의 대상이 될 수 있습니다. 정적 팩토리 메서드 Boolean(String) 생성자 대신 Boolean.valueOf(String) 팩토리 메서드를 사용하는 것이 좋습니다. 생성자는 호출할 때마다 새로운 객체를 만들지만, 팩토리 메서드는 그렇지 않습니다. boolean bad = new Boolean("TRUE"); // 생성자 호출 boolean good = Boolean.valueOf("TRUE"); // 팩토리 메서드 사용 생성비용이 비싼 객체 생성 비용이 '비싼 객체'가 반복해서 필요하다면 캐싱하..
많은 클래스는 하나 이상의 자원에 의존합니다. 하나의 자원에 의존한다면 정적 유틸리티 클래스나, 싱글톤 방식을 써도 괜찮을 수 있습니다. 하지만 사용하는 자원에 따라 동작이 달라지는 클래스라면 정적 유틸리티 클래스나 싱글톤 방식이 적합하지 않습니다. 정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private static final Lexicon dictionary = new Lexicon(); // 특정 자원 명시 private SpellChecker() {} // 인스턴스화 방지 public static boolean isValid(String word) {...} public static List suggestions(String typo) {...} } 싱글톤을..
정적 메서드와 정적 필드만을 담은 클래스를 쓸 때가 있습니다. 예를들어 java.lang.Math와 java.util.Arrays 처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓거나, java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을 수도 있습니다. 정적 멤버만 담은 유틸리티 클래스의 인스턴스화? 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아닙니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어줍니다. public class RandomNumberGenerateUtil { private static final Random random = new Random(); private stati..
싱글턴(Singleton) 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말합니다. 단순히 함수를 사용하기 위한 유틸, 로깅, 설계상 유일해야 하는 시스템 컴포넌트를 보통 싱글턴 인스턴스로 관리합니다. 클래스를 싱글톤으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있습니다. 싱글턴 만드는 방법 1. public static final 필드 방식 public class Elvis1 { public static final Elvis1 INSTANCE = new Elvis1(); private Elvis1() { } } public static final Elvis1 INSTANCE = new Elvis1() 은 static 영역이 로딩될 때 딱 1번만 호출됩니다. 해당 클래스가 ..
클래스는 몇몇의 반드시 필요한 부가적인 필드를 가질 수 있습니다. 그런 경우에 필수적인 매개변수를 가진 생성자에 부가적인 필드를 하나씩 추가하며 어려 생성자를 만들 수 있습니다. 필수 매개변수만 받는 생성자 필수 매개변수만 받는 생성자 + 선택 매개변수 1개를 받는 생성자 필수 매개변수만 받는 생성자 + 선택 매개변수 2개를 받는 생성자 등등 위와 같은 형태로 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식을 점층적 생성자 패턴(telescoping constructor pattern)이라 합니다. 점층적 생성자 패턴(Telescoping Constructor Pattern) 점층적 생성자 패턴은 설정하고 싶은 매개변수를 최소한으로 사용하는 생성자를 사용해서 인스턴스를 만들 수 있습니다. (필수 ..
정적 팩토리 메서드란? 정적 팩토리 메서드는 객체 생성을 캡슐화하는 기법입니다. 객체를 생성하는 메서드를 만들고, static으로 선언합니다. 정적 팩토리 장점 1. 이름을 가질 수 있다. public class Foo1 { String name; public Foo1(String name) { this.name = name; } public static Foo1 withName(String name) { return new Foo1(name); } } 위와 같이 이름을 가질 수 있습니다. withName이라는 이름을 갖게 되어 가독성이 좋아졌습니다. Foo1 foo1 = new Foo1("bang"); // 클라이언트는 "bang"이 무엇을 의미하는지 이해하기 힘들다. Foo1 foo1 = Foo1.w..