본문 바로가기
728x90

effectivejava6

[Java] Raw 타입은 사용하지 말기 1. 개념 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이는 제네릭 클래스나 제네릭 인터페이스라 함. List 를 말하며, 제네릭 클래스와 제네릭 인터페이스를 제네릭 타입이라고 함. 제네릭 타입은 매개변수화 타입을 정의함. 제네릭을 지원하기 전에는 컬렉션을 직접 선언함 2. 잘못된 코드 private final Collection stamps = ...; 위 코드를 사용하면 다른 타입을 넣어도 오류가 없음. stamps.add(new Coin(...)); coin을 꺼내기 전에는 오류를 뱉지 않음. 3. 올바른 코드 private final Collectiom stamps = '...'; stamps에 Coin 타입을 넣을 경우 incompatible types: Coin cannot be con.. 2023. 1. 23.
[Java] 클래스와 멤버는 접근 권한 최소화하기 1. 개념 - 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 클래스의 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는지. - 잘 설계된 컴포넌트는 구현과 API를 깔끔히 분리. - API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않음. -> 이는 정보 은닉, 캡슐화 2. 정보 은닉의 장점 시스템 개발 속도를 높임. -> 여러 컴포넌트를 병렬로 개발할 수 있기 때문. 시스템 관리 비용을 낮춤. -> 각 컴포넌트를 더 빨리 파악하여 디버깅 가능하고, 다른 컴포넌트로 교체하는 부담도 적음. 성능 최적화에 도움을 줌. 재사용성을 높여줌. 큰 시스템 제작의 난이도를 낮춰줌. -> 시스템 전체가 완성되지 않은 상태에서도 개별 컴포넌트의 테스트.. 2023. 1. 16.
[Java] try-with-resources 사용하기 자바에는 close() 메소드를 사용해 직접 닫아야 하는 자원이 많음. ex) - InputStream - OutputStream - java.sql.Connection ... 이를 방지하기 위해 try-finally가 많이 쓰였다. static String firstLineOfFile(String path) throws IOExceiption { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } 사용해야할 자원이 많아지면 static void copy(String src, String dst) throws IOException { InputSt.. 2023. 1. 12.
[Java] private 생성자로 인스턴스화 막기, 의존 객체 주입 사용하기 1. 인스턴스화 막기 - 단순히 정적 메소드와 정적 필드만을 담은 클래스를 만들 때가 있음 *예시 java.lang.Math java.util.Arrays java.util.Collections final 클래스와 관련된 메소드들을 모을 때. - 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아님. - 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만듦. -> 매개변수가 없는 public 생성자가 만들어짐. -> 사용자는 생성자가 자동 생성된 것인지 아닌지 구분할 수 없음. - 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없음. -> 하위 클래스를 만들어 인스턴스화하면 됨. - 이를 막기 위해서는 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수.. 2023. 1. 9.
[Java] private 생성자나 열거 타입으로 싱글턴 보증하기 - 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말함. - 싱글턴의 예로는 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트. - 클래스를 싱글턴으로 만들면 테스트가 어려워 질 수 있음. -> 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 Mock 구현으로 대체할 수 없기 때문. - 싱글턴을 만드는 방식은 2가지. - 두 방식 모두 생성자는 privated으로 생성 - 유일한 인스턴스에 접근할 수 있는 수단으로 public staitic 멤버를 생성해둔다. 1. public static 멤버가 final 필드인 방식 public class Member { public static final Member INSTANCE = new Memb.. 2023. 1. 7.
[Java] 생성자 대신 정적 팩토리 메소드 사용하기 - 예시 코드 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } - 장점 1. 이름을 가질 수 있다. 생성자와 매개변수만으로는 리턴될 객체의 특성을 제대로 설명하기 어렵다. 예를들면 // 생성자 public class Person { public Person() {} } // 정적 팩토리 메소드 public class Person { private static Person PERSON = new Person(); private Person() {} public static final Person getInstance() { return PERSON; } } 정적 팩토리 메소드는 Person 클래스의 인.. 2023. 1. 1.
728x90