Item 61. 박싱된 기본 타입보다는 기본 타입을 사용해라 JDK 1.5버전에서는 오토박싱과 오토언박싱 덕분에 두 타입을 크게 구분하지 않고 사용할 수 있다. 하지만 두 개의 차이는 명확하게 구분된다. 기본 타입과 박싱된 기본 타입의 차이 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값 + 식별성이라는 속성을 갖는다. 다시 말하면, 값이 같은 박싱된 기본 타입의 인스턴스가 두 개 존재할 때, 이 두 개는 서로 다르다고 식별될 수 있다. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값을 가질 수 있다. 즉, null을 가질 수 있다. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 이 세 가지 차이로 인해 주의하지 않고 사용하면 문제가 발생할 ..
정보은닉과 접근제한자 정보은닉이란, 잘 설계된 컴포넌트는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐이다. 즉, 오직 API를 통해서만 다른 컴포넌트와 소통하고 서로의 내부 동작 방식에는 개의치 않는 것을 말한다. 그럼, 정보은닉의 장점을 살펴보자 시스템 개발 속도를 높여준다. 여러 컴포넌트들이 독자적이어서 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 낮춰준다. 다른 컴포넌트로 교체하는 부담이 적기 때문이다. 정보은닉 자체가 성능을 줄여주지는 않지만 성능 최적화에는 도움을 준다. 다른 컴포넌트에 영향을 주지않고 해당 컴포넌트만 최적화할 수 있는 기회가 생기기 때문이다. 소프트웨어 재사용성을 높여준다. 외부에는 거의 의존하지 않고 독자적으로 동작할 수 있는 ..
자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 많은 클래스가 하나 이상의 자원을 의존한다. 맞춤법 검사기(SpellChecker)가 사전(Dicitonary)에 의존하는 예를 확인해보자 //정적 유틸리티 활용 public class SpellChecker { private static final Lexicon dictionary = ...; //정적 유틸리티 private SpellChecker() {} //객체 생성을 방지 public static boolean isValid(String word) {...} public static List suggestions(String typo) {...} } //싱글턴 활용 public class SpellChecker { private final Le..
불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 한 코드의 예를 통해 살펴보자 String s = new String("Effective Java"); String s = "Effective Java"; 첫번 째 문장은 실행될 때마다 String 인스턴스가 새로 만들어진다. 이 문장은 매우 쓸데 없다.. 만약 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없이 해당 인스턴스가 새로 만들어질 수 있다. 그냥 재사용하면 되는데.. 두번 째 문장을 살펴보면 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다. 즉, 반복문이나 빈번히 호출되는 메서드 안에 있어도 가상 머신 안에서 재사용함이 보장되는 것이다 생성자 대신..
인스턴스화를 막으려거든 private 생성자를 사용하라 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있을 것이다. 정적 메서드와 정적 필드(static) 사용 시 클래스 인스턴스 없이 호추링 가능 다른 객체와 공유 가능 유틸리티 함수를 만드는데 유용 Math.max(); 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. 이는 하위 클래스를 만들어 인스턴스화 하면 그만인것을.. 결과적으로, private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. private UtilityClass() { throw new AssertionError(); } 명시적 생성자가 private이니 밖에서 접근 불가하다. 꼭 AssertionError를 던질 필요는 없지만, 클래스 안..
Private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴이란, 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴을 만드는 방식 두 가지 두 가지 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해둔다. 첫번째 방식 //public static final 필드 방식의 싱글턴 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis(){...}; } private 생성자는 public static final 필드인 Elvis.INSTANCE를 초기화할 때 딱 한번만 호출된다. public 이나 protected(같은..
생성자에 매개변수가 많다면 빌더를 고려하라 점층적 생성자 패턴 생성자를 매개변수 개수에 따라 계속적으로 추가하는 패턴을 말함 이 클래스의 인스턴스를 만드려면 원하는 매개변수를 모두 포함하는 생성자 중 가장 짧은 것을 골라 호출하면 되는데, 클라이언트 입장에서 매개 변수로 불필요한 변수를 삽입할 때 헷갈릴 수 있다, 결국, 클라이언트가 실수로 매개변수의 순서를 바꾸어 값이 들어오면 런타임 에러가 발생할 수 있다. 이런 단점을 해결하기 위해 자바빈즈 패턴을 활용한다. 자바빈즈 패턴 기본 생성자만을 만들고 매개변수로 필요한 값들은 set메서드를 활용해서 객체를 완성하는 특징이다. 하지만 자바빈즈 패턴에서는 객체 하나를 만들려면 메서드를 여러 개 호출해야하고, 객체가 완전히 생성되기 전까지는 일관성이 무너진 상..
생성자 대신 정적 팩토리 메서드를 고려하라 클래스 생성자와 별도로 정적 팩토리 메서드를 제공할 수 있다. public static Boolean vlueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 정적 팩토리 메서드가 생성자보다 좋은 장점 다섯가지 이름을 가질 수 있다. 생성자는 반환 시 객체의 특성을 알기 어렵지만, 정적 팩터리는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. 생성자인 BigInteger(int, int, Random)과 정적 팩토리 메서드인 BigInteger.probablePrime 중 어느 쪽이 '값이 소수인 BigInteger를 반환한다'의 의미를 더 잘 설명하는지는 확실히 확인할 수 있을 것이다. 또한..
- Total
- Today
- Yesterday
- 점층적 생성 패턴
- 스프링부트
- 정적팩터리메서드
- java
- 연관관계
- mustache
- try with resources
- effectivejava
- jdk버전
- 생성자
- junit
- try catch finally
- 이펙티브자바
- 김영한
- 빌더 패턴
- java8
- 이펙티브 자바
- ifPresent
- package-private
- 팩토리 메소드 패턴
- @Lazy
- 인프런
- flatMap
- Effective Java
- 복사 팩토리
- Spring
- springboot
- JPA
- 자바8
- 빈 순환 참조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |