본문 바로가기

728x90

자바☕

(14)
이펙티브 자바 읽고 정리해보기 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 인터페이스의 메서드만 접근 가능. 왜 다..
다형성(Polymorphism)과 오버라이딩(Overriding) 0. 오버라이딩과 오버로딩 오버라이딩 : 올라타기 오버로딩 : 적재하기 pakage polymorphism01; public class Animal { public String name; public void showName() { System.out.println("안녕 나는 %s야. 반가워/n", name); } } =============================================================================================== pakage polymorphism01; public class Penguin extends Animal { public String habitat; public void showHabitat() { System.out..

728x90