Java

    [Java 16, 17] record class, sealed class

    자바 16 - record class데이터 전달을 위해 등장한 클래스 (DTO, Data Transfer Object)AS-ISDTO 클래스의 상속을 막기 위해 final class로 정의캡슐화, 변경 제한을 위해 필드에 private final 선언최초 값 초기화를 위해 매개변수를 가진 생성자 정의필드값에 접근하기 위한 getter 생성비교를 위한 equals(), hashcode() 재정의데이터 출력(로깅 등)을 위한 toString() 재정의public final class AsIsDto { // 상속을 막기위한 final class private final String username; // 캡슐화, 변경 방지를 위한 private final 필드 private final in..

    [Java 16] Switch Expression, instanceof Pattern Matching

    Switch Expression AS-IS기존 Switch 문법의 경우 Statement(문) 형식Statement: 변수에 할당 불가능. 하나의 값으로 표현 불가능각 case를 case 값: 형태로 사용(colon case label)각 분기가 끝날 때마다 break;를 붙여야함여러 분기를 한번에 처리하고 싶다면 colon case label을 연이어 적어야함public String calcGrade(int score) { String grade = ""; // 변수 할당 불가능. 먼저 선언 switch (score) { case 5: // colon case label grade = "A"; break;..

    [Java 9] 주요 변경내용 : Collection / Optional / Stream 관련 기능, 내부 문자열 처리방식, G1 GC

    Collection 정적 팩토리 메서드 추가자바 9 이전에는 List를 만들기 위해 Arrays.asList(1, 2) 사용Set, Map 등의 타입에 대해서도 new 키워드를 통해 생성 및 초기화 필요했음자바 9부터는 Collection 관련 인터페이스에 정적 팩토리 메서드 of 추가되어 간결하게 생성 및 초기화 가능// AS-IS (Java 9 미만)List list = Arrays.asList(1, 2);Set set = new HastSet(Arrays.asList(1, 2));Map map = new HashMap();map.put("A", 1);map.put("B", 2);// TO-BE (Java 9)List list = List.of(1, 2);Set set = Set.of(1, 2);Ma..

    [Java 9] 언어적 변경 : try-with-resources, @SafeVarargs, inner class + diamond Syntax, Interface + private method

    확장된 try-with-resources 자바 7부터 생긴 try-with-resources 구문을 통해 생성한 자원을 정리하지 않는 실수를 막을 수 있고, 코드가 간단해짐// AS-IS (Java 7 미만)Resource resource = new Resource();try { ...} finally { resource.close(); // finally 구문으로 인한 코드 복잡도 증가 + 실수로 빼먹을 수 있음}// TO-BE (Java 7)try (Resource resource = new Resource()) { // 자동으로 리소스 close ...} 그러나 자바 7의 try-with-resources 구문은 try 외부에서 선언한 자원에 대해서는 적용이 불가했음자바 9는 try 외부에서 ..

    [Java 9] 자바 플랫폼 모듈 시스템 (JPMS)

    자바 9 - 자바 플랫폼 모듈 시스템 (JPMS) (vs 빌드툴 Module)자바 9에서는 모듈 시스템이 등장모듈 (Module) : 여러 코드가 모인 독립적인 구성요소비슷한 역할을 하는 코드끼리 모아 유지보수성 높일 수 있음 / 역할 간 의존성 제어 = 안전성 증대자바 9 이전에도 Maven, Gradle과 같은 빌드툴을 활용해 모듈 시스템이 구성되어 있긴 했음한 프로젝트 내에 여러 모듈을 만들어 의존성 관리 (멀티모듈)JPMS vs 빌드툴 Module?JPMS는 빌드툴 없이 모듈 구성이 가능 이를 통해 JDK에서 필요한 일부 코드(모듈)만 다운로드 가능 (성능,용량 측면 유지보수성 증대, Modular run time image)JPMS와 빌드툴 Module 함께 사용 가능JPMS는 특정 패키지 기준..

    인터페이스의 default method와 다이아몬드 문제

    1. 알고자 하는 것 - default method란 무엇인지 - 자바의 인터페이스에 default method가 고안된 이유는 무엇인지 - default method가 가능해짐에 따라 발생할 수 있는 다이아몬드 문제 (Diamond Problem)를 자바는 어떻게 해결하는지 2. 알게된 것 Default Method - 원래 자바에서 인터페이스(Interface)에는 오직 상수와 추상 메서드만을 가질 수 있었다. - 이로 인해 다음 사례와 같은 개발자들의 불편함이 생겼다. 1. A 인터페이스를 구현한 n개의 클래스가 있다. 2. 설계의 변경으로 A 인터페이스를 구현한 n개의 클래스에 대해 공통 메서드가 하나 추가되었다. 3. 이 때, A 인터페이스에 추상 메서드를 추가하고, n개의 클래스에 대해 추상 ..

    참조변수와 인스턴스에 따른 method, 변수, static method 참조 결과 비교

    1. 알고자 하는 것 - 자바는 객체지향언어로써 다형성을 적용할 수 있다. - 다형성 : 한 타입의 참조변수로 여러 타입(상속, 구현관계)의 객체를 참조할 수 있도록 하는 것 - Parent와 Child 클래스 관계에서 참조변수와 해당 변수에 할당된 인스턴스의 타입에 따라 호출하는 method, 변수, static method의 참조 결과는 어떻게 되는가? 2. 알게된 것 class Parent { String name = "Parent"; public void method() { System.out.println("Parent Method"); } public void methodOverriding() { System.out.println("Parent methodOverriding()"); } pub..

    [Effective Java] Item20. 추상 클래스보다는 인터페이스를 우선하라

    Item20. 추상 클래스보다는 인터페이스를 우선하라 자바는 단일 상속, 다중 구현 메커니즘을 가진다. 즉, 클래스는 하나만 상속할 수 있지만 인터페이스는 여러 개를 구현할 수 있다. ! 클래스, 인터페이스의 차이 클래스 : 추상 클래스를 상속받는 클래스는 반드시 추상 클래스의 하위 클래스가 된다. 인터페이스 : 어떤 클래스를 상속하든 하위 타입이 아닌 같은 타입으로 취급된다. ! 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다 기존 클래스에 손쉽게 인터페이스를 구현할 수 있다. 반면, 기존 클래스에 추상 클래스를 끼워 넣기는 어렵다. 계층구조상 상위하위의 구조를 가지므로 클래스 계층구조에 혼란을 야기한다. 이러한 이유로, 인터페이스는 *믹스인(mixin) 정의에 안성맞춤이다. *믹스인(mixin) ..

    [Effective Java] Item06. 불필요한 객체 생성을 피하라

    Item06. 불필요한 객체 생성을 피하라 같은 기능을 수행하는 객체를 매번 생성하는 것보다 하나를 재사용하는 편이 나을 때가 많다. 특히, 불변 객체는 언제든 재사용 할 수 있다. ! 객체의 재사용에 대한 극단적인 예 로 String type을 들 수 있다. // 실행될 때마다 새로운 String 인스턴스가 생성됨 String s = new String("hunseong"); // String Constant Pool 영역에서 해당 리터럴을 찾음 // 리터럴이 존재한다면 재사용, 없다면 해당 영역에 리터럴 추가 String s = "hunseong"; ! 정적 팩터리 메서드를 제공하는 불변 클래스에서는 정적 팩터리 메서드를 사용해 불필요한 객체 생성을 피할 수 있다. // 생성자 - 매번 새로운 인..

    [Effective Java] Item03. private 생성자나 열거 타입으로 싱글턴임을 보증하라

    Item03. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴(singleton) : 인스턴스를 오직 하나만 생성할 수 있는 클래스. 보통 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트 등에 사용. ! public static final 필드 방식의 싱글턴 - 생성자를 private으로 설정하여 외부에서 인스턴스를 생성할 수 없게 한다. - public static final 필드로 new 키워드를 통해 인스턴스를 하나만 생성한다. - 외부에서는 SingletonClass.INSTANCE를 통해 인스턴스에 접근한다. public class Singleton1 { // public static 멤버 변수를 통해 싱글턴 인스턴스 생성 public static fina..