[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends
글 작성자: _rian
Contents
1. 상속의 개념
2. 클래스 상속 (extends)
3. 메소드 재정의 (override)
4. 패키지
5. 자식 클래스와 부모 생성자 호출
6. 상속과 접근 제어
7. final 클래스와 final 메소드
8. 타입 변환과 다형성
상속의 개념
객체 지향 프로그램에서 상속이란..
- 자식(하위, 파생) 클래스가 부모(상위) 클래스의 멤버를 물려받는 것
- 자식이 부모를 선택해 물려받음
- 상속 대상 : 부모의 필드와 메소드
상속의 효과
- 부모 클래스를 재사용해 자식 클래스를 빨리 개발 가능
- 반복된 코드 중복을 줄임
- 유지 보수 편리성 제공
- 객체 다형성 구현 가능
상속 대상 제한
- 부모 클래스의 private 접근 제한을 가지는 필드와 메소드 제외
- 부모 클래스가 다른 패키지에 있을 경우, default 접근을 가지는 필드와 메소드도 제외
클래스 상속 (extends)
부모 - 자식 클래스는 is-a 관계이다.
ex) is-a 관계 예시
- 원은 도형이다
- 사과는 과일이다
- Tandem은 Bike다
상속의 선언
- extends 키워드 사용한다.
- 자바는 단일 상속! 다중 상속은 허용되지 않는다.
ex) 상속의 예 - Animal 클래스와 자식 클래스들 (Eagle, Tiger, Goldfish)
메서드 재정의 (Overriding)
부모 클래스에서 상속받은 메소드를 수정해 자식 클래스에서 재정의하는 것
메소드 오버라이딩 조건
- 부모 클래스의 메소드와 동일한 시그니처 (리턴타입, 메소드 이름, 매개변수 리스트)를 가져야 함
- 접근 제한을 더 좁게 수정 불가
- public이나 default나 private로 수정 불가
- 반대로 default는 public으로 수정 가능
- 추가적인 예외 (Exception)가 발생할 수 있음을 나타낼 수 없음.
오버라이딩이 불가능한 경우
- private 메소드
- 부모 클래스 전용이므로 자식 클래스에 상속되지 않음
- 정적 메소드
- 클래스 소속이므로 자식 클래스에 상속되지 않음
- final 메소드
- final 메소드는 더 이상 수정할 수 없으므로 자식 클래스가 오버라이딩 할 수 없음
@Override 어노테이션
- 컴파일러에게 부모 클래스의 메소드 선언부와 동일한지 검사 지시
- 정확한 메소드 재정의 위해 붙여주면 OK
- 오버라이딩 규칙에 어긋나면 컴파일 오류를 발생시킴
부모 클래스의 멤버 접근
- 자식 클래스가 메소드를 오버라이딩하면 자식 객체는 부모 클래스의 오버라이딩 된 메소드를 숨김
- 그 숨겨진 메소드를 호출하려면 super 키워드를 사용
- Super는 현재 객체에서 부모 클래스를 참조한다는 것을 의미함.
메소드 오버라이딩 vs. 메소드 오버로딩
비교 요소 | 메서드 오버라이딩 | 메소드 오버로딩 |
메서드 이름 | 동일 | 동일 |
매개변수 | 동일 | 다르다 |
반환 타입 | 동일 | 관계 없음 |
상속 관계 | 필요 | 필요 없다 |
예외와 접근 범위 | 제약이 있다 | 제약이 없다 |
바인딩 | 호출할 메소드를 실행 중 결정하는 동적 바인딩이다. | 호출할 메서드를 컴파일 할 때 결정하는 정적 바인딩이다. |
패키지
패키지란?
- 파일 시스템의 폴더를 이용하여 클래스 파일을 묶어서 관리하기 위한 수단
- 패키지에 의한 장점
- 패키지마다 별도의 이름 공간 (Namespace)이 생기기 때문에 클래스 이름의 유일성을 보장
- 클래스를 패키지 단위로도 제어할 수 있기 때문에 좀 더 세밀하게 접근 제어
대표적인 패키지
- java.lang 패키지 : import 문을 선언하지 않아도 자동으로 임포트되는 자바의 기본 클래스를 모아둔 것
- java.awt 패키지 : 그래픽 프로그래밍에 관련된 클래스를 모아둔 것
- java.io 패키지 : 입출력과 관련된 클래스를 모아둔 것
패키지의 선언
- 주석문을 제외하고 반드시 첫 라인에 위치
- 패키지 이름은 모두 소문자로 명명하는 것이 관례. 일반적으로 패키지 이름이 중복되지 않도록 회사의 도메인 이름을 역순으로 사용
- (예) 회사 도메인 이름이 hankuk.com이고 프로젝트 이름이 people이라면
package com.hankuk.people
(예 : 소스 코드와 컴파일 (명령창))
(예 : 실행 결과 (명령창))
(예 : 작업 폴더가 D:\workspace, 프로젝트 이름이 chap06, 자바 소스 파일 이름이 Yona.java라면)
다른 패키지에 있는 공개된 클래스를 사용하려면 패키지 경로를 컴파일러에게 알려줘야한다.!
import 문
- 패키지의 경로를 미리 컴파일러에게 알려주는 문장
- import 문은 소스파일에서 package문과 첫 번째 클래스 선언부 사이에 위치
- 주의 사항
(예시)
자식 클래스와 부모 생성자
1. 자식 객체 생성하면 부모 객체도 생성되는가?
- 부모 없는 자식 없음
- 자식 객체를 생성할 때는 부모 객체로부터 생성 후 자식 객체 생성
- 부모 생성자 호출 완료 후 자식 생성자 호출
2. Super() 메소드
- 자식 생성자는 첫 행에 부모 생성자 호출 코드가 있다.
- 자식 생성자의 첫 행에 부모 생성자를 호출하는 코드가 없다면 컴파일러는 기본 부모 생성자인 super() 메소드를 추가한다.
- 부모 클래스가 디폴트(매개변수가 없는) 생성자를 선언하지 않는다면 오류 발생
3. 자식 생성자의 첫 행에 인위적 부모 생성자 호출
- 자식 클래스가 매개변수가 있는 부모 생성자를 호출하지만, 부모 클래스에 매개변수가 있는 생성자가 없어 오류 발생
- super(매개값, ...) : 매개값과 동일한 타입, 개수, 순서 맞는 부모 생성자 호출
4. 부모 생성자 super()를 명시적으로 호출하려면 this()와 마찬가지로 생성자 내부의 첫 행에 위치해야 함
'Computer Engineering > Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map (0) | 2019.12.16 |
---|---|
[Java] 제네릭 프로그래밍 (0) | 2019.12.16 |
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류 (0) | 2019.12.15 |
[Java] 중첩 클래스와 람다식 (0) | 2019.12.11 |
[Java] 추상클래스와 인터페이스 (0) | 2019.11.22 |
댓글
이 글 공유하기
다른 글
-
[Java] 제네릭 프로그래밍
[Java] 제네릭 프로그래밍
2019.12.16 -
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류
2019.12.15 -
[Java] 중첩 클래스와 람다식
[Java] 중첩 클래스와 람다식
2019.12.11 -
[Java] 추상클래스와 인터페이스
[Java] 추상클래스와 인터페이스
2019.11.22