c23 [Java] 상속 (상속성)
본문 바로가기
[Java]

[Java] 상속 (상속성)

by Jarvis2304 2022. 12. 30.

 

▶ 상속

● 객체 지향 상속

- 자식이 부모 유전자를 물려 받는 것과 유사한 개념

 

 

상속의 필요성 (클래스·코드 간결화)

- 만일 '말하기' 기능에 오류가 있어 수정하게 되면, 4개의 클래스를 모두 수정, 이 처럼 동일한 코드가 여러 클래스에 중복되면 클래스의 유지 보수에 번거로운 일 발생 

→ 상속을 이용하여 중복을 제거하고 간결하게 클래스를 선언하여 문제해결

 

● 객체 지향에서 상속의 장점

1) 클래스·코드 간결화 (멤버의 중복 작성 불필요)

2) 클래스 관리 용이(클래스들의 계층적 분류)

3) 소프트웨어의 생산성 향샹(클래스 재사용과 확장 용이, 새로운 클래스의 작성 속도 빠름)

 

 

▶ 클래스 상속과 객체

● 상속 선언

- extends 키워드로 선언 (부모 클래스를 물려받아 확장한다는 의미 · 슈퍼 클래스를 확장한다는 개념)

 

● 부모 클래스 → 슈퍼 클래스(super class)

● 자식 클래스 서브 클래스(sub class)

- ColorPoint는 Point를 물려 받으므로, Point에 선언된 필드메소드 선언 필요없음

 

 

 

예제 1) 클래스 상속 만들기

 

 

 

 

▶ 서브 클래스 객체의 모양

- 슈퍼 클래스 객체와 서브 클래스의 객체는 별개

- 서브 클래스 객체는 슈퍼 클래스 멤버 포함

 

 

▷ 서브 클래스에서 슈퍼클래스 멤버 접근

 

 

 

 

 

 

▶ 자바 상속의 특징

●  클래스의 다중 상속을 지원하지 않음

- C++는 다중 상속가능(다중 상속으로멤버가 중복 생성되는 문제 있음  링크: [C++] 상속)

- 자바는 인테페이스(interface)의 다중 상속 허용

 

 

● 상속의 횟수에 제한을 두지 않음

 

● 계층 구조의 최상위에 java.lang.Object 클래스가 있음

- 모든 클래스는 자동으로 java.lang.Object를 상속받음

- 자바 컴파이럴에 의해 자동으로 이루어짐

 

 

 

 

 

 

▶ 상속과 접근 지정자

▷ 슈퍼 클래스에 대한 접근 지정

● 자바의 접근 지정자 4가지  -  public, protected, private, 디폴트

 

● 슈퍼 클래스의 private 멤버

- 슈퍼 클래스의 private 멤버는 다른 모든 클래스에 접근불허

- 클래스내의 멤버들에게만 접근허용

 

● 슈퍼 클래스의 public 멤버

- 슈퍼 클래스의 public 멤버는 다른 모든 클래스에 접근 허용

 

● 슈퍼 클래스의 protected 멤버

- 같은 패키지 내의 모든 클래스 접근 허용

- 다른 패키지에 있어도 서브 클래스는 슈퍼 클래스의 protected 멤버 접근가능

 

● 슈퍼 클래스의 디폴트 멤버

- 슈퍼 클래스의 디폴트 멤버는 패키지내 모든 클래스에 접근 허용

 

 

 

▷ protected 멤버에 대한 접근

- 같은 패키지의 모든 클래스에게 허용

- 상속되는 서브 클래스(같은 패키지든 다른 패키지든 상관 없음)에게 허용

 

 

 

 

 

 

 

 

▶ 서브 클래스/슈퍼 클래스의 생성자 호출과 실행

● 서브 클래스의 객체가 생성될 때, 서브 클래스의 생성자와 슈퍼 클래스의 생성자는 모두 실행됨

- 생성자의 목적은 객체 초기화에 있으므로, 서브 클래스의 생성자는 서브 클래스의 멤버나 필요한 초기화를 수행하고, 슈퍼 클래스의 생성자는 슈퍼 클래스의 멤버나 필요한 초기화를 각각 실행함

 

● 서브 클래스의 생성자보다 슈퍼 클래스의 생성자가 먼저 실행됨

서브 클래스의 생성자 호출 → 서브 클래스의 생성자는 실행 전 슈퍼 클래스 생성자 호출

 

 

▷ 슈퍼 클래스와 서브 클래스의 생성자 호출 및 실행 관계

 

 

▶ 서브 클래스와 슈퍼 클래스의 생정자 선택

- 슈퍼 클래스와 서브 클래스는 각각 여러 생성자 작성 가능

- 서브 클래스의 객체가 생성될 때, 슈퍼 클래스 생성자 1개와 서브 클래스 생성자 1개가 실행

 

● 서브 클래스의 생성자와 슈퍼 클래스의 생성자가 결정되는 방식

(1) 개발자의 명시적 선택

- 서브 클래스 개발자가 슈퍼 클래스의 생성자 명시적 선택

- super() 키워드를 이용하여 선택

 

 

(2) 컴파일러가 기본 생성자 선택

- 서브 클래스 개발자가 슈퍼 클래스의 생성자를 선택하지 않는 경우

- 컴파일러가 자동으로 슈퍼 클래스의 기본 생성자 선택

 

 

 

 

(1) 컴파일러에 의해 슈퍼 클래스의 기본 생성자가 묵시적 선택

 

※ 슈퍼 클래스에 기본 생성자가 없어 오류 난 경우 ※

 

 

● 서브 클래스의 매개 변수를 가진 생성자에 대해서도 슈퍼 클래스의 기본 생성자가 자동 선택

 

 

 

 

 

 

(2) super()로 슈퍼 클래스의 생성자 명시적 선택

● super(parameter);

- 서브 클래스에서 명시적으로 슈퍼 클래스의 생성자 선택 호출

- 인자를 이용하여 슈퍼 클래스의 적당한 생성자 호출

- 반드시 서브 클래스 생성자 코드의 제일 첫 라인에 와야함

 

 

예제) super()를 활용한 ColorPoint 작성

'[Java]' 카테고리의 다른 글

[Java] 메소드 오버라이딩 (다형성)  (0) 2023.01.01
[Java] 업캐스팅, 다운캐스팅  (0) 2022.12.31
[Java] static, final  (0) 2022.12.29
[Java] 접근 지정자  (0) 2022.12.28
[Java] 생성자, 가비지  (0) 2022.12.28

댓글