Java

자바 복습 _2 상속, 다형성

최종군 2024. 7. 13. 21:21

 

상속 : 다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서 

직접 만들지 않고 상속을 받음으로써 클래스 자신의 멤버처럼 사용할 수 있는 기능 

 

상속 목적  : 

1. 클래스의 재사용

2.연관된 일련의 클래스들에 대한 공통적인 규약 정의 

 

상속의 장점 : 

1. 보다 적은 양의 코드로 새로운 클래스 작성이 가능하다 

2. 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경이 용이하다 

3. 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다 

 

 

상속의 특징 : 

 

모든 클래스는 Object클래스의 후손이다 

Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현 가능 

 

부모클래스의 생성자, 초기화 블록은 상속이 안된다

자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행 

자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 명시하고 싶으면 

super() 활용 

 

부모의 private멤버는 상속은 되지만 직접 접근 불가능하다 

자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우 

자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입이 불가하다 

super() 이용하여 전달 받은 부모 필드 값을 부모 생성자 쪽으로 넘겨서 생성하거나 

setter, getter 메소드를 이용하여 접근한다

 

상속 클래스 간의 상속 시에는 extends 키워드를 사용한다

 

단일 상속과 다중 상속 

 

단일 상속 

클래스간의 관계가 다중 상속보다 명확하고 신뢰성 있는 코드 작성 

자바에서는 다중 상속 미지원 -> 단일 상속만 지원한다 

 

 

호출할 상위 클래스의 생성자 명시하지 않으면 기본 생성자 호출된다 

상위 클래스의 생성자 실행 후 

하위 클래스의 생성자가 실행된다. 

 

키워드 super를 통해서 상위 클래스의 생성자 호출을 명시할 수 있다. 

 

 

부모 객체의 생성자를 호출하는 메소드 : super()

기본적으로 후손 생성자에 부모 생성자 포함 

후손 객체 생성 시에는 부모부터 생성되기 때문에 후손 클래스

생성자 안에는 부모 생성자를 호출하는 super()가 첫 줄에 존재(부모 생성자가 가장 먼저

실행 되어야 하기 때문에 명시적으로 작성 시에도 반드시 첫 줄에만 작성)

super(매개변수,매개변수)

 

super. : 상속을 통한 자식 클래스 정의 시 해당 자식 클래스의 부모 객체를 가리키는 

참조 변수 자식 클래스 내에서 부모 클래스 객체에 접근하여 필드나 메소드 호출 시 사용 

 

 

class SmartPhone extends MobilePhone{}

스마트폰은 모바일폰이다 

 

SmartPhone phone = new SmartPhone()

따라서 스마트폰 참조변수로 스마트폰 참조가 가능하다 

 

Mobile phone = new SmartPhone()

모바일폰 참조변수로 스마트폰 참조도 가능하다. 

 

 

class Cake {

public void sweet() {...}

}

 

class CheeseCake extends Cake {

public void milky() {...} }

 

CheeseCake ca1 = new CheeseCake();

Cake ca2 = ca1; // 가능하다 

 

Cake ca3 = new CheeseCake();

CheeseCake ca4 = ca3; // 불가능하다 

 

케이크를 참조변수 ca3 = new CheeseCake();

를 참조하는 경우에는 

 

CheeseCake ca4 = ca3; // 불가능하다 

 

상속의 관계 가 배열 인스턴스의 참조 관계까지 이어진다 

 

오버라이딩 된 메소드를 인스턴스 외부에서 호출하는 방법은 ㅇ벗다 

그러나 인스턴스 내부에서는 super 키워드로 가능하다

 

인스턴스 변수는 오버라이딩 되지 않는다 

따라서 참조변수의 형에 따라 접근하는 멤버가 결정된다. 

 

 

업 캐스팅 : 

상속 관계에 있는 부모, 자식 클래스 간에 부모 타입의 참조형 변수가

모든 자식 타입의 객체 주소를 받을 수 있다 

 

자식 객체의 주소를 전달받은 부모타입의 참조변수를 통해서 

사용할 수 있는 후손의 정보는 원래 부모 타입이었던 멤버만 참조 가능하다 

 

다운 캐스팅 : 

자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야 할 

경우 부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형 변환하는 것 

자동으로 처리 되지 않기 때문에 반드시 후손 타입 명시해서 형 변환 해야한다

 

((Sonata)c).moveSonata();

클래스 간의 형 변환은 반드시 상속 관계에 있는 클래스끼리만 가능하다 

 

instanceof 연산자 : 

현재 참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인

할 때 사용 클래스 타입이 맞으면 true, false 반환한다 

 

표현식 레퍼런스 instanceof 클래스타입

 

추상 메소드만 담고 있는 인터페이스 

인터페이스 정의 메소드의 몸체를 갖지 않는다 

따라서 인스턴스 생성이 불가능하다 

참조변수 선언은 가능하다 

 

인터페이스를 구현하는 클래스 

구현하는 메소드와 추상 메소드 사이에도 메소드 오버라이딩 관계 성립된다 

 

다형성 시 동적 바인딩

 

인터페이스에 선언되는 메소드와 변수 

 

인터페이스에는 추상메소드가 

변수로는 

 

public static final 즉 상수가 선언된다 

 

인터페이스를 구현하는 클래스는 해당 인터페이스의 모든 추상 메소드를 

구현해야 한다. 그래야 인스턴스 생성 가능 

 

인터페이스  : 

상수형 필드추상 메소드만을 작성할 수 있는 추상 클래스의 변형체 

메소드의 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것으로 

상속 

 

[접근제한자] interface 인터페이스명 {

//상수도 멤버로 포함할 수 있음

public static final 자료형 변수명 = 초기값;

 

//추상 메소드만 선언 가능

[public abstract] 반환자료형 메소드명([자료형 매개변수]);

//오버라이딩 시 반드시 public 표기해야 함

 

인터페이스 특징 : 

 

1. 모든 인터페이스의 메소드는 묵시적으로 public이고 abstract 

2. 변수는 묵시적으로 public static final

3. 객체 생성은 안뇌나 참조형 변수로는 가능하다

 

상위 타입 역할로 다형성을 지원하여 연결 

해당 객체가 다양한 기능 제공 시에도 인터페이스에 해당하는 기능만을

 사용하게 제한 가능하다 

공통 기능 상의 일관성 제공 

공동 작업을 위한 인터페이스 제공한다 

 

public abstract class House { // 추상 클래스

예약어 자리에 abstract 예약어 사용 

 

하나 이상의 추상 메소드를 지니는 클래스를 가리켜 추상 클래스라 한다 

그리고 추상 클래스를 대상으로는 인스턴스 생성이 불가능하다 

물론  참조변수 선언은 가능하다 

 

추상 클래스 : 

몸체 없는 메소드를 포함한 클래스 

추상 클래스일 경우 클래스 선언부에 abstract 키워드를 사용한다 

 

추상 메소드 : 

몸체 없는 메소드를 추상 메소드라고한다 

추상 메소드의 선언부에 abstract 키워드를 사용한다 

상속 시 반드시 구현해야 하는 오버라이딩이 강제화되는 메소드이다 

 

추상 클래스 : 

미완성 클래스(abstract 키워드 사용) : 

자체적으로 객체 생성이 불가능하다 - > 반드시 상속하여 객체 생성 

 

 

abstract 메소드가 포함된 클래스는 반드시 abstract 클래스

abstract 메소드가 없어도 abstract 클래스 선언 가능

 

클래스 내에 일반 변수 메소드 포함 가능하다 

 

객체 생성은 안되지만 참조형 변수 타입으로는 사용이 가능하다 

 

일괄된 인터페이스 제공 

꼭 필요한 기능 강제화(공통적이나 자식클래스에서 특수화 되는 기능이다)

 

 

 

'Java' 카테고리의 다른 글

내가 잘 모르는 부분들 내용정리 JAVA  (0) 2024.07.15
자바 예외처리 ~ IO 입출력 내용 정리  (0) 2024.07.14
자바 Map  (0) 2024.07.12
자바 복습하기 _ 1  (0) 2024.07.11
자바 변수부터 콜랙션까지 내용 정리  (0) 2024.07.10