JAVA :: Note#6 상속(Inheritance)
○ 상속이란?
: 새로 설계(생성)하고자 하는 클래스가
이미 설계되어 있는 다른 클래스의 기능과 중복되는 경우
이미 설계된 클래스의 일부분이나 전체 구조를 공유할 수 있도록 하는 기능
즉, 상속은 객체를 좀 더 쉽게 만들 수 있는 고수준의 재사용성 (reusablility) 을 확보하고
객체 간의 관계를 구성함으로써 객체 지향의 또 다른 특징인 『다형성』의 문법적 토대가 된다.
상속은 기존 프로그램의 클래스 내용을 공유함으로써
중복된 코드들을 재작성할 필요 없이 반복적으로 세부적인 작업을 처리하지 않기 때문에
프로그램 작성 시간 절약, 편리한 유지보수, 프로그램 길이가 짧아지는 등의 이점이 있다.
또한, 이미 작성된 프로그램들은 앞서 테스트 되었기 때문에
오류를 줄일 수 있어 현재 작성 중인 프로그램에만 전념할 수 있다.
※ 주의할 점
- 자바는 『다중상속』을 지원하지 않기 때문에
두개 이상의 클래스로부터 상속 받을 수 없다.
즉, 자바는 『단일상속』만 지원한다.
○ super
: static 으로 선언되지 않은 메소드에서 사용되며
현재 클래스가 상속받은 상위 클래스의 객체를 가리킨다.
super는 상위 클래스의 생성자를 호출하거나
상위 클래스의 멤버 변수 또는 메소드를 호출할 때 사용할 수 있다.
하위 클래스의 생성자에서 상위 클래스의 생성자를 호출할 때에는
하위 클래스의 생성자 정의 구문에서 맨 처음에만 위치할 수 있다.
○ 생성자와 클래스 상속 간의 관계
: 하위 클래스는 상위 클래스의 멤버를 상속받지만, 생성자는 상속 대상에서 제외된다.
그리고, 하위 클래스의 생성자를 호출할 때 자동으로 상위 클래스의 생성자를 호출하게 된다.
이 때, 상위 클래스의 생성자는 인수가 없는 생성자 (default 생성자 형태)가 호출된다.
상위 클래스 및 하위 클래스 (즉, 상속관계에 있는 클래스)를 설계하는 과정에서
상위 클래스의 생성자를 정의하지(작성하지) 않거나
인수가 없는 생성자만을 정의한(작성한) 경우
명시적으로 하위 클래스에서 상위 클래스의 생성자를 호출하지 않아도
아무런 문제가 발생하지 않지만
상위 클래스에서 인자가 있는 생성자만 존재하는 경우 주의해야 한다.
상위 클래스 | 하위 클래스 | 결과 |
생성자를 정의하지 않음 |
생성자 정의 안함 | → 가능하다. |
인수가 없는 생성자 | → 가능하다. | |
인수가 있는 생성자 | → 가능하다. | |
인수가 없는 생성자만 정의 |
생성자 정의 안함 | → 가능하다. |
인수가 없는 생성자 | → 가능하다. | |
인수가 있는 생성자 | → 가능하다. | |
인수가 있는 생성자만 정의 |
생성자 정의 안함 | → 에러 발생 |
인수가 없는 생성자 | → 상위 클래스의 해당 생성자를 호출하지 않으면 에러 발생 | |
인수가 있는 생성자 | → 상위 클래스의 해당 생성자를 호출하지 않으면 에러 발생 |
○ 메소드 오버라이딩 (Method Overriding)
: 상위 클래스를 상속받은 하위 클래스에서
상위 클래스에 정의된 메소드를 다시 정의하는 것으로
객체 지향 프로그래밍의 특징인 다형성을 나타낸다.
○ 메소드 오버라이딩의 특징
1. 반드시 상속 관계가 있어야 한다.
2. 재정의된 하위 클래스의 메소드 접근제어지시자는 상위 클래스 메소드 접근제어지시자보다 범위가 크거나 같아야 한다
ex) 상위 클래스의 메소드의 접근제어지시자가 『protected』 인 경우,
하위 클래스가 이 메소드를 오버라이딩 하는 경우 접근제어지시자는 『public』 또는 『protected』이어야 한다.
3. 『static』, 『final』, 『private』 메소드는 오버라이딩 할 수 없다.
4. Exception 의 추가가 불가능하다.
즉, 상위 메소드가 가지고 있는 기존의 예외 사항에 새로운 Exception을 추가하는 것은 불가능하다.