본문 바로가기

JAVA/Effective Java

item 61) 박싱된 기본 타입보다 기본 타입을 사용하라 자바 데이터 타입 : 1) 기본 타입 int, double, boolean ...) 2) 참조타입(String, List , 사용자 정의 클래스 ...) - 각각의 기본 타입마다 대응하는 참조 타입을 가지고 있으며 이를 박싱된 기본 타입이라고 한다. int -> Integer, double -> Double, boolean -> Boolean - 오토 박싱, 오토 언박싱으로 두 타입을 구분하지 않고 사용할수 있다. ex) Integer a = 42; (42가 오토박싱된다. 기본 타입 vs 박싱 타입 - 기본타입은 값만 가지고 있으나, 박싱된 기본타입은 식별성을 가지고 있다. 값이 같더라도 다르다고 판별할수 있다. (Object의 하위 클래스다.) - 박싱된 기본타입은 null 값을 가질수 있다. - 기본.. 더보기
item 50) 적시에 방어적 복사본을 만들라 클라이언트가 악의적으로 불변식을 깨드리려 한다고 가정하고 방어적으로 프로그래밍 하라 - 악의를 가진 프로그래머 - 평범한 프로그래머의 실수로 인한 오작동 - 어떤 객체든 그 객체의 허락 없이 외부에서 내부를 수정하지 못하도록 하라. 기간을 나타내는 Period 객체를 만들어봤다. import java.util.Date; public final class Period { private final Date start; //Period의 멤버변수인 Date가 불변 객체가 아니므로 Period가 불변이 아니게 된다. private final Date end; public Period(Date start, Date end) { if (start.compareTo(end) > 0) throw new IllegalA.. 더보기
item 46) 스트림에서는 부작용 없는 함수를 사용하라 스트림 : 함수형 스타일 오퍼레이션을 지원하는 클래스 스트림의 특징 No storage : 저장을 위한 자료구조가 아니라 소스(자료구조, 배열, I/O 채널 등)로부터 자료를 받아서 계산을 위한 파이프라인 함수형 : 스트림의 연산(operation) 은 결과를 생산만 하지, 소스를 수정하지 않음 ex) 스트림을 필터링한다고 해서 기존 리스트의 원소를 제거 하지는 않음 Laziness-Seeking : 대부분의 스트림 연산(filter, map, 중복 제거 등) 은 lazy 하게 작동한다. (스트림 연산이 최종 연산이 호출되는 시점까지 지연됨) List strings = List.of(1,2,3,4,5); strings.stream() .map(x->{ System.out.println(x); return.. 더보기
item 42) 익명 클래스보다는 람다를 사용하라 public class LamdaIsBetter { public static void main(String[] args) { List words = new ArrayList(); Collections.sort(words, new Comparator() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); // 익명 클래스 Collections.sort(words, (s1,s2)-> -s1.compareTo(s2)); //람다 Collections.sort(words, comparingInt(String::length)); //메소드 참조 words.sort(comparingInt(String::length.. 더보기
item 64) 객체는 인터페이스를 사용해 참조하라. 적합한 인터페이스만 있다면 매개변수 뿐만 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라. 인터페이스 타입을 사용할 경우 프로그램이 더 유연해짐(구현 클래스만 교체하면됨 원래의 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하며 주변 코드가 이 기능에 기대어 동작하다면 새로운 클래스도 반드시 같은 기능을 제공해야한다. 선언 타입과 구현타입을 동시에 바꿀수 있으니 괜찮을 수 있을거라고생각가능 X 클라이언트에서 기존 타입의 메소드를 사용할 경우 컴파일 에러 발생 가능 //좋은 예 Set sonSet = new LinkedHashSet(); Set sonSet = new HashSet(); //구현체 변경 //나쁜 예 LinkedHashSet sonSet = new LinkedHas.. 더보기
item 36) 비트 필드 대신 EnumSet을 사용하라 비트 필드 : 비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있는 집합 public class Text{ public static final int STYLE_BOLD = 1 더보기
item 35) ordinal 메소드 대신에 인스턴스 필드를 사용하라. ordinal => 해당 상수가 열거타입에서 몇 번째 위치인지를 반환하는 메서드 /* 연주자가 1명(SOLO) ~ 10aud (DECTET)를 표현한 열거 타입 */ public enum Ensemble { SOLO, DUET, TRIO , QUARTET, QUINTET , SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians(){ return ordinal() + 1; } } ordinal 메서드의 문제점 상수 선언 순서에 의존성을 가지게됨 => 상수 선언 순서를 바꿀 경우 numberOfMusicians는 오동작함(순서에 의존성을 가짐), 값이 같은 상수는 추가할 방법이 없음 (8중추가 이미 있으므로, 복4중주(DOUBLE_QUARTE.. 더보기
item28) 배열보다는 리스트를 사용하라 불공변성(Invariant) 무공변성이란 상속 관계에 상관없이, 자기 타입만 허용하는 것 공변성(covariant) 공변성은 자기 자신과 자신을 상속한 하위 객체의 타입을 허용하는 것 반공변성(contravariant) 공변성의 반대 개념 자기 자신과 자신이 상속한 부모 객체만 허용하는 것 제네릭은 불공변, 배열은 공변이다. public static void main(String[] args) { Object [] objects = new Long[10]; objects[0] = "boo"; // ArrayStoreException 발생 List objectList = new ArrayList(); // List 는 제네릭 타입으로 무공변이다. 컴파일 에러 발생 objectList.add("boo"); .. 더보기