▶ 상속
● 객체 지향 상속
- 자식이 부모 유전자를 물려 받는 것과 유사한 개념
▷ 상속의 필요성 (클래스·코드 간결화)
- 만일 '말하기' 기능에 오류가 있어 수정하게 되면, 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 |
댓글