일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 |
- ORA-00922
- 무료 오라클 데이터베이스
- Oracle Express Edition
- 서평단
- oracle 18c
- Oracle 18c 설치
- ora-01722
- Oracle 18c HR schema
- Oracle 초기 사용자
- Oracle 테이블 대소문자
- 무료 오라클 설치
- 비전공자를 위한 데이터베이스 입문
- Oracle 사용자명
- ORA-12899
- Oracle 사용자명 입력
- Oracle 18c HR
- oracle
- Oracle 윈도우 설치
- 오라클 캐릭터셋 조회
- 오라클 캐릭터셋 변경
- 윈도우 Oracle
- 오라클 캐릭터셋 확인
- Orace 18c
- Oracle 테이블 띄어쓰기
- Today
- Total
The Nirsa Way
[Effective Java 3/E - 객체 생성과 파괴] Item 6-2. 불필요한 객체 생성을 피하라 - 생성자 대신 정적 팩터리 메서드를 활용하라 본문
[Effective Java 3/E - 객체 생성과 파괴] Item 6-2. 불필요한 객체 생성을 피하라 - 생성자 대신 정적 팩터리 메서드를 활용하라
KoreaNirsa 2025. 6. 23. 20:16
※ 정적 팩터리 메서드란 : https://nirsa.tistory.com/428
생성자 대신 정적 팩터리 메서드를 활용하라
Java9 부터는 Boolean(String) 생성자를 사용하면 deprecated(사용 자제, 향후 제거 예정) 되어있는 것을 확인할 수 있는데 항상 새 인스턴스를 반환하므로 비효율적이고, 문자열이 true 외의 값이면 모두 false를 반환하는데 직관적이지 않은 이유가 있습니다.
※ Boolean(String) 생성자는 deprecated 되었지만 예전부터 존재했기에 호환성에 대한 문제와 valueOf(String)으로 바꾸게 되면 내부에서 TRUE / FALSE를 참조할 때 순환 참조 이슈가 발생할 가능성 등이 많아 현실적으로 제거 되기엔 힘들지 않을까 싶습니다.
불필요한 객체 생성을 피할 땐 생성자 대신 정적 팩터리 메서드를 사용할 수 있습니다. 대표적인 예시로 new Boolean(String)과 Boolean.valueOf(String)의 차이가 있습니다. 아래 코드에서 확인할 수 있듯이 새로운 객체를 생성하면 비교했을 때 false가 출력되고 valueOf를 사용하면 서로 같은 객체를 반환하므로 true가 나오는것을 알 수 있습니다.
public static void main(String[] args) {
// 생성자 사용
Boolean b1 = new Boolean("true");
Boolean b2 = new Boolean("true");
System.out.println("b1 == b2 (생성자): " + (b1 == b2)); // false
// 정적 팩터리 메서드 사용
Boolean b3 = Boolean.valueOf("true");
Boolean b4 = Boolean.valueOf("true");
System.out.println("b3 == b4 (valueOf): " + (b3 == b4)); // true
}
Boolean.valueOf(String)을 확인하면 아래와 같이 된 것을 볼 수 있는데, 대소문자를 상관 없이 전달받은 문자열이 true라면 TRUE 인스턴스 반환, 그 외에는 FALSE 인스턴스를 반환하는 메서드 입니다. 내부적으로 클래스 로딩 시점에 TRUE, FALSE 상수(인스턴스)가 생성되어 이후 Boolean.valueOf(String)을 통해 해당 상수(인스턴스)를 반환하여 재사용하는 방식 입니다.
즉, TRUE 또는 FALSE는 동일한 결과값을 지속적으로 반환하므로 이러한 경우 정적 팩터리 메서드(해당 글의 예시에선 valueOf)를 사용하여 불필요한 객체 생성을 피할 수 있습니다.