본문 바로가기

책 공부/Effective Java

(6)
Effective Java Item 6. 불필요한 객체 생성을 피하라 불필요한 객체 생성이 필요 없는 이유 1. 같은 기능의 객체를 매번 생성하는 것보다 재사용 하는 것이 더 좋다. - 메모리 사용에 훨씬 효율적이다. (생성 비용이 아주 비싼 객체가 존재한다.) 2. 재사용 하지 않는 객체는 GC(가비지 컬렉션)의 대상이 된다. - 불변의 대상은 미리 정의해 놓고 재사용하면 처리 속도가 올라간다. 3. 오토박싱된 기본 타입보다는 기본 타입을 사용한다. - 오토박싱된 기본 타입을 사용하면 더 많은 메모리를 잡아먹는다. 오토 박싱 기본 타입의 객체를 사용하기 위해 기본 타입과 대응하는 Wrapper 클래스의 객체로 바꾸는 것 오토 언박싱 Wrapper 클래스의 객체를 사용하기 위해 대응하는 기본 타입의 객체로 바꾸는 것 기본 타입 - int, long, float, doubl..
Effective Java Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 의존성 주입을 하는 이유 1. 클래스의 유연성, 재사용성이 향상된다. - 결합도가 낮아지고 응집도가 높아진다. 2. 테스트를 더 쉽게 수행할 수 있다. - 테스트를 더 쉽게 수행하면 해당 기능에 대한 모듈화가 충분히 진행되어 디버그 시 오류를 찾기 더 쉽다. 3. 변경의 전이 - 하나의 클래스 변경으로 다른 의존 관계 클래스에 영향을 최소화 해야한다. 4. 제어의 역전 - 특정 기능을 수행하기 위해 만들어진 프레임워크 제어권을 일임한다. (관심사를 분리) 클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원에 클래스 동작에 영향을 준다면 싱글톤이나 정적 유틸리티 클래스는 사용하지 않는 것이 더 좋다. 의존 객체 주입이라는 기법을 통해 클래스의 우연성, 재사용성, 테스트 용이성을 개선해보자.
Effective Java Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 private 생성자를 사용하는 이유 인스턴스화란? 인스턴스화는 클래스로부터 객체를 만드는 과정이다. 인스턴스화를 통해 서로의 정보를 주고받기 위해 사용한다. Class(틀) Object(객체) -> ex) 붕어빵 틀과 붕어빵 1. 추상 클래스만으로는 인스턴스화를 막을 수 없다. - 함수를 선언하지 않기 때문에 인스턴스화 불가능 2. private 생성자를 추가하면 Class의 인스턴스화를 막을 수 있다. - 생성자를 갖고있지 않는 클래스가 있으면, 컴파일러가 자동적으로 만들어주기 때문에 private으로 선언하면 바깥에 서 호출이 불가능하여 인스턴스화를 막을 수 있다.
Effective Java Item 3. Private 생성자나 열거타입으로 싱글톤을 보장하라 싱글톤을 만드는 방법 3가지 싱글톤이란? 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나만을 호출한다. 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 1. Eager Initalzation (이른 초기화) - 클래스의 인스턴스를 클래스 로딩 시점에 생성하는 방법 2. Static Block Initializatuin (정적 블럭 초기화) - Eager Initalzation (이른 초기화) 방식과 동일하지만 변수 셋팅 및 에러처리를 위한 구문을 담을 수 있다. 3. Lazy Initialization (늦은 초기화) - 클래스의 인스턴스가 사용되는 시점에 생성하는 방법 - Multi Thread 방식에서 싱글톤 보장이 되지 않는 다는 단점이 있다. 5. Enum ..
Effective Java Item 2. 생성자에 매개 변수가 많다면 빌더를 고려하라 빌더를 사용하면 더 좋은 이유 1. 점층적 생성자 패턴의 단점을 회피할 수 있다. - 매개변수의 순서를 바꿔 넘겨줬을 때 컴파일러 과정에서 오류를 걸러낼 수 없고 원치 않은 데이터를 넘길 수 있다. - player1을 생성할 때 매개변수 순서를 기억해야 한다. 2. 필요한 매개변수만을 사용할 수 있다. - 매개변수가 많은 생성자를 만들 때는 불필요한 요소가 포함될 확률이 높다. - 필요한 매개변수만을 담는다면 유연성을 확보할 수 있다. 3. 코드의 가독성을 확보할 수 있다. - 코드가 좀 더 직관적으로 보이기 때문에 간결해 보이는 효과를 기대할 수 있다. 생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면 빌더 패턴을 사용하는 것이 더 낫다. 빌더는 점층적 생성자보다 가독성이 좋고, 자바빈즈 보다 안정..
Effective Java Item 1. 생성자 대신 정적 팩토리 메소드를 고려하라 정적 팩터리 메서드가 생성자 보다 좋은 이유 1. 이름을 가질 수 있다. (직관적으로 해당 메서드의 역할을 알 수 있다.) - 메서드의 이름을 직관적으로 표현 ex) public int SumNum(int a, int b) 2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다. (싱글톤) - 정적 메서드와 캐싱 구조를 함께 쓰면 매번 새로운 객체를 생성할 필요가 없다. ex) Boolean.valueof(Bolean) 3. 반환타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. - 반환 객체의 클래스를 자유롭게 선택 할 수 있다. (유연성 확보) 4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다. - 반환 타입의 하위 타입이면 어떤 클래스의 객체를 반환하든 상관없다. 5. 정적..