자바의 정석 chapter 7-2

inho ha·2022년 3월 2일
0

자바의 정석

목록 보기
8/18

다형성 (polymorphism)

여러 가지 형태를 가질 수 있는 능력

조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있음
이때 조상클래스 타입의 참조변수는 조상클래스의 멤버들만 사용할 수 있다.

참조변수의 형변환

상속관계에 있는 클래스사이에서 참조변수 형변환이 가능하다.
조상에서 자손타입으로 형변환하는 경우 형변환을 생략할 수 있다.

Down-casting : 자손 -> 조상 형변환
Up-casting : 조상 -> 자손 형변환

참조변수가 참조하고 있는 인스턴스의 자손타입으로 형변환하는 것은 혀용되지 않는다.
참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요하다.

instanceof연산자

참조변수가 참조하고 있는 인스턴스의 실제 타입을 확인하는 연산자

a instanceof b : 인스턴스 b의 타입이 a타입 이거나 a의 조상 타입이면 true, 아니면 false
true 라는 건 b 타입으로 형변환 가능하는 것을 의미

참조변수와 인스턴스

멤버변수가 조상 클래스와 자손 클래스에 중복으로 정의된 경우
조상 참조 변수로 자손 인스턴스를 참조하는 경우 조상 멤버변수를
자손 참조 변수로 자손 인스턴스를 참조하는 경우 자손 멤버변수를 사용하게된다.
메서드는 오버라이딩 된 경우 오버라이딩 된 메서드를 사용하게 된다.

매개변수의 다형성

메서드의 매개변수 타입을 조상 클래스 타입으로 하면 자손클래스 타입의 참조변수도 매개변수로 받을 수 있다.

추상클래스

추상메서드(미완성된 메서드)를 가지고 있는 클래스
추상 메서드가 없어도 abstract 사용 가능

추상메서드

메서드의 선언부만 작성하고 구현부는 작성하지 않은 메서드

자손 클래스에서 오버라이딩한 뒤 사용 가능

추상화 : 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
구체화 : 상속을 통해 클래스를 구현, 확장하는 작업

조상으로 올라갈수록 추상화의 정도가 심해지고
자손으로 내려갈수록 구체화의 정도가 심해진다

인터페이스

추상메서드와 상수만을 멤버로 가지는 일종의 추상클래스

모든 멤버변수는 public static final, 생략가능
모든 메서드는 public abstract, 생략가능

JDK 1.8 부터는 static 메서드와 default 메서드는 추가 가능

인터페이스는 인터페이스로부터만 상속받을 수 있다.
인터페이스는 다중상속이 가능하다.

인터페이스는 다른 클래스에 implements 키워드를 사용하여 구현(상속)가능하다.

상속과 구현을 동시에 가능함

오버라이딩시 조상의 메서드보다 넓은 범위에 접근 제어자를 지정해야 하므로 인터페이스의 메서드를 구현할때는 public 으로 지정해야한다.

인터페이스를 이용한 다중상속

다중상속이 필요한 경우 한 클래스를 포함시키거나 인터페이스로 작성하여 implements 하여 다중상속을 할 수 있다.

인터페이스를 이용한 다형성

인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있다.
인터페이스 타입을 매개변수로 사용하여 자손클래스들을 매개변수로 받을 수 있다.
리턴 타입으로토 인터페이스 타입을 지정할 수 있다.

인터페이스의 장점

  1. 개발시간 단축
    인터페이스가 작성되면 이를 구현하는 여러 클래스를 동시에 개발을 진행할 수 있다.

  2. 표준화 가능
    기본 틀을 인터페이스로 작성한 다음 이를 구현하여 프로그램을 작성하도록 하여 일관되고 정형화된 프로그램의 개발이 가능하다.

  3. 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
    서로 상속관계도 아니고 같은 조상을 가지지도 않아도 인터페이스를 공통적으로 구현하도록 하여 관계를 맺어줄 수 있다.

  4. 독립적인 프로그래밍이 가능하다.
    인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있다.
    클래스와 클래스간의 관계를 인터페이스를 이용해 간접적인 관계로 변경하면 클래스끼리 서로 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.

디폴트 메서드

인터페이스에 메서드를 추가하면 이 인터페이스를 구현만 모든 클래스에서 메서드를 구현해야한다.
디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드로 디폴트 메서드가 추가되어도 이를 구현한 클래스를 변경하지 않아도 된다.

새로 추가된 디폴트 메서드가 기존의 메서드와의 이름이 중복되어 충돌하는 경우 해결 방법

  1. 여러 인터페이스의 디폴트 메서드 간의 충돌
    인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야한다.

  2. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
    조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

내부 클래스(inner class)

클래스 내에 선언된 클래스

장점

  1. 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
  2. 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.

종류

  1. 인스턴스 클래스
    외부 클래스의 멤버변수 선언위치에 선언
    외부 클래스의 인스턴스 멤버처럼 다루어진다.
    주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다.

  2. static 클래스
    외부 클래스의 멤버변수 선언위치에 선언
    외부 클래스의 static 멤버처럼 다루어진다.
    주로 외부 클래스의 static 멤버, 특히 static 메서드에서 사용될 목적으로 선언된다.

  3. local 클래스
    외부 클래스의 메서드나 초기화블럭 안에 선언
    선언된 영역 내부에서만 사용될 수 있다.

  4. 익명 클래스
    클래스의 선언과 객체의 생성을 동시에 하는 이름 없는 클래스(일회용)
    이름이 없어 생성자를 가질 수 없다.
    하나만 상속받거나 구현할 수 있다.

profile
inho ha / ian(swatchon) / iha(42seoul)

0개의 댓글