Java

    인터페이스의 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...

    [Java] 배열 (Array)

    자바에서 배열의 선언 // 배열의 선언 방식 int[] arr; int arr2[]; type, 변수명 구분 없이 [] 키워드를 넣을 수 있다. 배열의 생성, 초기화 int arr[] = new int[5]; // 크기 5의 int 배열 선언 및 생성 arr[0] = 1; // 배열의 초기화 arr[1] = 2; arr[2] = 3; int arr2[] = new int[]{1, 2, 3} // 크기 3의 int 배열 선언, 생성 및 초기화 int arr3[] = {1, 2, 3} // 위와 같은 배열을 가짐. new 키워드를 통해 배열 객체를 생성한다. 이 때 대괄호([]) 안에 배열의 사이즈를 넣는다. 값의 초기화, 변경은 일반적인 배열의 형태와 같이 arr[index] = value 형태로 가능하다..

    [Java] 자바의 특징

    Java의 특징 1. 운영체제에 독립적으로 동작 *자바가상머신(JVM, Java Virtual Machine)을 통해 JVM이 설치되어 있는 OS에서는 모두 자바로 작성된 프로그램이 실행 가능하다. 그래서 자바 언어를 Write once, run anywhere (한 번 작성하면, 어디서나 실행된다.)로 표현하기도 한다. * 자바로 작성된 프로그램을 실행 할 수 있는 가상의 컴퓨터이다. JVM의 경우는 기존의 하드웨어로 구성된 컴퓨터를 소프트웨어적으로 구현한 것으로, 자바로 작성된 프로그램은 모두 이 JVM을 통해 실행되므로 자바 프로그램을 실행하기 위해서는 JVM이 설치되어 있어야 한다. (JVM에 대한 내용은 추후 자세히 다뤄보도록 하자.) 2. 객체지향언어 (OOP, Object - Oriented..