자바☕ (23) 썸네일형 리스트형 이펙티브 자바 읽고 정리해보기 2. 아이템 2 : 생성자에 매개변수가 많다면 빌더를 고려하라정적 팩터리와 생성자 방식은 선택적 매개변수에 관련해 동일한 제약을 공유한다. 선택 매개변수가 많아질 수록 대응이 어렵다는 점이다. 이 경우 점층적 생성자 패턴을 통해 모든 경우의 수에 해당하는 생성자를 만들어 이 경우에 대비할 수 있으나, 이는 매개변수가 많아질 수록 코드 가독성과 작성 난이도가 올라가는 것은 똑같다다른 대안으로 자바 빈즈 패턴을 이용해 매개변수가 없는 생성자로 객체를 만든 후, 설정자를 이용해 원하는 매개변수의 값을 설정하는 것이다public class A { // 기본값이 있는 경우, 매개변수는 초기화된다 private int a = -1; // 필수; 기본값 없음 private int b = -1; // 필수; 기본값 없.. 이펙티브 자바 읽고 정리해보기 1. 아이템 1 : 생성자 대신 정적 팩토리 메서드를 고려하라 클래스의 인스턴스를 얻을 때 일반적으로 public 생성자를 활용한다. 이 때 정적 팩터리 메서드를 활용하는 방법도 있다 예시) public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 기본 타입인 boolean 값을 받아 Boolean 객체 참조로 값을 반환한다 정적 팩터리 메서드 방식의 장점 1. 이름을 가질 수 있다 생성자는 그 자체로는 어떤 이유로 생성하는 지, 무엇이 반환되는 지를 제대로 설명할 수 없다. 정적 팩터리 메서드는 이를 잘 설명할 수 있다 하나의 메서드 시그니처로는 하나의 생성자를 만들 수 있기 때문에, 생성자만을 사용해 인스턴스를.. 자바 옵셔널(Optional<T>) Optional이란? NPE(Null Poiter Exception)에 Optional 클래스에서 제공하는 메서드로 대응할 수 있다. Optional 제공 메서드 : 생성 1. empty() : "비어있는" 객체 생성 Optional empty = Optional.empty(); // "비어있는" Optional 타입 객체를 생성 System.out.println(empty.isPresent()); // false, 객체생성은 되었지만 값이 없으므로 false 2. of() : 값이 있는 객체 생성. Null 값이 입력되는 경우 NPE 발생 ~ Null이 확실히 발생하지 않을 경우 사용 Optional empty = Optional.of("assert NotNull"); System.out.println.. 스트림 API class Product { private int age; private String name; public Product(int age, String name) { this.age = age; this.name = name; } public int getAge() { return age; } public String getName() { return name; } } 주로 배열이나 컬렉션에 담긴 데이터를 다룰 때 사용한다. 특징 : 스트림은 데이터를 변경하지 않는다. ~ Immutable 재사용이 불가능하다. ~ 최종 연산이 실행된 후 재사용 불가능. 스트림 생성 - 중간 연산 - 최종 연산 => 클래스타입.스트림생성().중개연산().최종연산(); ~ 파이프라인 연산 방식 대표 스트림 중개 연산자 필터.. 함수형 인터페이스와 람다 표현식 1. 함수형 인터페이스 - 추상메서드를 하나만 가지고 있는 인터페이스 - @FunctionalInterface 어노테이션을 인터페이스에 선언하면 컴파일 시점에서 추상메서드가 하나만 있는지 체크 - 부작용을 최대한 배제하는, 함수형 프로그래밍의 일환 2. 람다 표현식 메서드를 하나의 식으로 표현 : 메서드 이름과 리턴값의 표시가 없어지기 때문에 익명 함수라고도 한다. 익명 클래스의 객체와 동등하다 interface Calculator { int sum(int a, int b); } class MyCalculator implements Calculator { public int sum(int a, int b) { return a+b; } } public class Sample { public static v.. Lombok 거의 비슷하게 반복되는 코드(ex: getter setter) == 보일러 플레이트 코드 이를 쉽게 작성해주는 라이브러리가 Lombok이다. 사용 준비 1. Build.gradle - dependencies에 추가 2. 플러그인에서 설치 3. (설치 후) 설정 - 어노테이션 프로세서에서 어노테이션 처리 활성화 체크 @Getter // getter() @Setter // setter() @Builder // 빌더 패턴의 보일러플레이트 구현 @NoArgsConstructor // 기본 생성자 @RequiredArgsConstructor // 필수 arguments가 있는 생성자 @AllArgsConstructor // 모든 arguments 가 있는 생성자 // @NoArgsConstructor 예시 pub.. 자바 표준 Annotation 1. Overriding - 오버라이딩을 올바르게 했는지 컴파일러의 체크 요구 ex) class Parent { void parentMethod() {} } class Child extends Parent { void parentmethod() {} // 컴파일러 : 오버라이딩이 아닌 새로운 메서드를 추가하는 것으로 인식 } 2. Deprecated - 사용하지 않는 것을 권장하는 필드나 메서드에 사용 ex) Date 클래스의 getDate() 3. FuntionalInterface - 함수형 인터페이스에 붙이면 컴파일러가 올바르게 작성했는지 체크 - 함수형 인터페이스는 하나의 추상메서드만 가져야 한다 4. SuppressWarnings - 컴파일러의 경고메세지를 나타나지 않게 하고 싶을 때 ex) @S.. Dynamic Dispatch : 다형성의 일부 자바는 프로모션으로 업캐스팅된 객체의 메소드를 런타임 시점에서 오버라이딩된 메소드에 대한 호출이 확인된다. -> 프로그램을 실행할 때 형변환된(오버라이딩된, 업캐스팅한) 객체의 메소드를 호출한다 -> 인터페이스를 타입으로 선언한 클래스의 생성자를 호출했더니, 그 클래스에 있는 오버라이딩된 메서드가 실행된다. Service service = new DefaultService(); DefaultService serviceExtend = new DefaultServiceExtend(); Service serviceExtend = new DefaultServiceExtend(); // 컴파일 시점에서, Service 타입을 선언한 serviceExtend는 Service 인터페이스의 메서드만 접근 가능. 왜 다.. 이전 1 2 3 다음