Java

    [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..

    [Effective Java] Item02. 생성자에 매개변수가 많다면 빌더(Builder)를 고려하라

    Item02. 생성자에 매개변수가 많다면 빌더(Builder)를 고려하라 - 정적 팩터리 메서드와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기가 어렵다. - 이를 보완하기 위해 많은 개발자들은 다음과 같은 방식을 사용했다. 1. 점층적 생성자 패턴(telescoping constructor pattern) - 필수 매개변수만 받는 생성자 / 필수 매개변수 + 선택적 매개변수 1개를 받는 생성자 / 필수 매개변수 + 선택 매개변수 2개를 받는 생성자 / ... 와 같이 점층적인 형태의 생성자를 여러 개 늘리는 방식 - 단점 : 선택적 매개변수에도 기본값을 지정해야한다, 매개변수 개수가 많아지면 코드 작성, 읽기에 어렵다(각 값의 의미가 뭔지 모름) 2. 자바빈즈 패턴(JavaBeans pattern..

    [Effective Java] Item01. 생성자 대신 정적 팩터리 메서드를 고려하라

    Item01. 생성자 대신 정적 팩터리 메서드를 고려하라 클래스가 인스턴스를 얻는 전통적인 수단은 public 생성자이다. public class Foo { private String name; // 생성자를 통한 인스턴스 생성 public Foo(String name) { this.name = name; } } 하지만 전통적인 수단인 생성자와 별도로 정적 팩터리 메서드(static factory method)를 통해서도 인스턴스를 생성할 수 있다. 해당 방식은 단점도 존재하지만, 장점이 많으므로 쓰임새에 따라 유리할 경우 사용하는 것이 좋다. public class Foo { private String name; // 생성자를 통한 인스턴스 생성 public Foo(String name) { this...