차곡차곡

#5장 상속 본문

Language/JAVA

#5장 상속

sohy 2021. 6. 28. 17:01

상속과 생성자

서브 클래스 (기본 생성자, 매개 변수를 가진 생성자) > 슈퍼 클래스 (기본 생성자)

※super()를 이용하여 명시적으로 슈퍼 클래스의 생성자 호출 (반드시 생성자 코드의 첫 라인에 와야 함)

객체의 타입 변환 : 업캐스팅과 다운캐스팅

[업캐스팅]

Person p; // 슈퍼 클래스

Stuendt s = new Student("소현"); // 서브 클래스

p = s; // 업캐스팅 발생

업캐스팅에 의해 레퍼런스 p는 Student 객체를 가리키고 있지만 Person 멤버만 접근 가능하다.

[다운캐스팅]

Student s = (Student)p; // 다운캐스팅 발생

instanceof 연산자

객체 레퍼런스 instanceof 클래스 타입

객체 레퍼런스가 가리키는 객체가 해당 클래스 타입이면 true, 아니면 false

오버라이딩

업캐스팅 되어도 가리키는 객체에 최종적으로 오버라이딩된 메소드 호출

[조건]

1. 슈퍼 클래스의 메소드와 완전히 동일한 메소드를 재정의

2. 슈퍼 클래스 메소드의 접근 지정자보다 접근의 범위가 좁아질 수 없다.

3. 메소드 오버라이딩에서 메소드 이름, 매개 변수 리스트는 같으나 리턴 타입만 다를 수 없다.

*static, private, final로 선언된 메소드는 오버라이딩될 수 없다.

동적 바인딩 : 오버라이딩된 메소드가 항상 우선적으로 호출된다.

오버라이딩과 super 키워드

super 키워드로 슈퍼 클래스 멤버 접근

super.슈퍼클래스의 멤버

this: 현재 객체의 주소(혹은 레퍼런스)

this(): 생성자에서 동일한 클래스 내의 다른 생성자 호출

super: 현재 객체 내에 있는 슈퍼 클래스 영역의 주소

super(): 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 선택 호출

추상 클래스

1. 추상 메소드를 포함하는 클래스로서 반드시 abstract로 선언되어야 함

2. 추상 메소드가 하나도 없지만 abstract로 선언한 클래스

3. 객체화 불가능

[추상 클래스의 상속]

1. 추상 클래스의 단순 상속

추상 클래스를 상속받아 추상 메소드를 구현하지 않으면 서브 클래스도 추상 클래스 >> 서브 클래스 abstract으로 선언해야 함

2. 추상 클래스 구현 상속

서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩) >> 서브 클래스 추상 클래스 아님

내장 클래스

클래스 안에 클래스 정의

외부 클래스 : 내부에 클래스를 가지고 있는 클래스

내부 클래스 : 클래스 내부에 포함되는 클래스

정적 내장 클래스 : 앞에 static이 붙어서 내장되는 클래스

비정적 내장 클래스 : static이 붙지 않은 일반적인 클래스

내부 클래스(inner class) : 클래스의 멤버처럼 선언되는 내장 클래스

외부 클래스의 인스턴스 변수와 메소드 전부 사용 가능

지역 클래스(local class) : 메소드의 몸체 안에서 선언되는 내장 클래스

무명 클래스(anonymous class) : 수식의 중간에서 선언되고 바로 객체화 되는 클래스

무명 클래스 : 상속

[상속]

class 클래스이름1 extends 부모클래스 {...}

부모클래스 변수 = new 클래스이름1();

부모클래스 변수 = new 부모클래스() {...};

[구현]

class 클래스이름2 implements 인터페이스 {...}

인터페이스 변수 = new 클래스이름2();

인터페이스 변수 = new 인터페이스() {...};

인터페이스

1. 멤버는 추상 메소드와 상수만으로 구성된다. (필드(멤버 변수) 선언 불가)

상수 (public static final 생략 가능), 메소드 (추상, default, private, static)

2. 인터페이스의 객체를 생성할 수 없다.

3. 다른 인터페이스에 상속될 수 있다. (인터페이스의 다중 상속 가능)

* 클래스는 인터페이스를 상속받을 수 없고 오직 인터페이스만이 상속이 가능하다.

4. 인터페이스 구현 (인터페이스의 추상 메소드를 클래스에서 구현하는 것) > implements 키워드로 구현

* 클래스는 인터페이스의 모든 추상 메소드를 구현해야 한다.

인터페이스 타입

인터페이스 내부에서 선언한 메소드들만 사용할 수 있다.

인터페이스와 구현 클래스 사용 방법

인터페이스 변수 = 구현객체;

interface RemoteControl rc = new Television();

람다식

이름이 없는 메소드

람다식을 사용하기 위해선 한 개의 추상 메소드만 갖고 있는 인터페이스가 필요하다.

구현해야 할 추상 메소드가 하나만 정의된 인터페이스를 함수 인터페이스라고 한다.

명시된 함수 인터페이스에 두 개 이상의 메소드가 선언되면 오류가 발생한다.

인터페이스명 변수 = (argument) -> {body}

Comments