-
[live-study] 6주차 :: 상속JAVA/라이브 스터디 | whiteship 2021. 1. 9. 13:14
참고도서 : Java의 정석, Java in a Nutshell
0. 상속
상속이란
- 상속이란 현실에서는 부모가 자식에게 물려주는 행위를 말한다. 마찬가지로 부모 클래스(기존의 클래스)를 재사용하여 자식 클래스(새로운 클래스)를 작성하는 것을 프로그래밍에서 상속이라고 부른다.
- 상속을 통해 확장을 보다 쉽게 할 수 있고, 코드의 중복도 제거하여 프로그램의 생산성을 높일 수 있다.
- 상속은 키워드 'extends'를 이용하여 나타낼 수 있다.
- 코드 / 상속 관계도 / 상속 후 자식클래스의 범위를 나타내면 다음과 같다.
- 그림에서 알 수 있듯이 자식클래스가 부모클래스보다 더 넓은 범위이다. 즉, 자식클래스는 부모클래스 안의 멤버(변수, 메소드) 등을 다 상속 받을 수 있으므로, 자식클래스가 부모클래스보다 같거나 더 많은 멤버를 갖을 수 있다.
- 생성자나 초기화 블럭은 상속되지 않는다.
포함이란
- 포함(Composite)이란 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 의미한다.
is-a / has-a
- is-a는 상속관계로 '~은(는) ~이다.' 라고 해석할 수 있다.
- has-a는 포함관계로 '~은(는) ~을 가지고 있다.' 라고 해석할 수 있다.
1. 자바 상속의 특징자바 상속의 특징 - 단일 상속
- 다른 대표적인 객체지향 언어인 C++ 같은 경우 여러 부모 클래스에서 상속 받을 수 있는 다중상속(multiple inheritance)를 혀용한다.
- 하지만 자바에서는 오직 단일상속(single inheritance)만 지원한다. 즉, 둘 이상의 부모 클래스로부터 상속 받을 수 없다.
자바 상속의 특징 - Object클래스
- Object 클래스는 모든 클래스의 최상위에 위치한 부모클래스이다. 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스를 상속 받는다.
자바 상속의 특징 - super
- 부모클래스로부터 상속받은 멤버를 참조하는데 사용된다.
2. super 키워드
super - 참조변수
- super는 부모클래스로부터 상속받은 멤버를 자식클래스에서 참조하는데 사용된다. this키워드가 생성자의 매개변수 이름과 인스턴스변수 이름이 같은 경우 사용했다면, super도 마찬가지로 상속받은 멤버와 자신의 멤버 이름이 같은 경우 사용된다.
- 부모클래스로부터 상속받은 멤버는 자식클래스의 멤버이기도 하므로 super 대신 this를 사용할 수도 있다.
- super는 this와 마찬가지로 인스턴스메서드에서만 사용할 수 있고, static 메서드에서는 사용할 수 없다.
super() - 생성자
- super()는 부모클래스의 생성자를 호출하는데 사용된다. this()가 같은 클래스의 다른 생성자를 호출한다면, super()는 부모 클래스의 생성자를 호출하는데 사용된다.
- 자식 클래스에서 부모클래스의 멤버를 사용할 수 있는 이유는, 자식 클래스에서 인스턴스를 생성하면 자식의 멤버와 부모의 멤버가 합쳐진 하나의 인스턴스가 생성되기 때문이다.
- 이 때, 부모 클래스 멤버의 초기화 작업이 먼저 수행되어야 하므로, 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출해야한다. 이는 클래스가 상속관계를 타고 올라가면서, Object 클래스의 생성자인 Object()까지 까지 가서야 끝이 난다.
- 즉, Object 클래스를 제외한 모든 클래스의 생성자는 반드시 자신의 다른 생성자 또는 부모의 생성자를 호출해야한다.
- 만약, 추가하지 않으면 컴파일러는 생성자의 첫 줄에 super(); 를 자동으로 추가한다.
- 하지만, 컴파일러가 super();를 자동적으로 추가하지 않는 경우도 있다. 만약 생성자가 정의되어 있는 클래스라면 수동으로 추가를 해주어야한다.
- 그래서 부모클래스에 생성자 Vehicle()을 추가해주거나, 자식클래스 생성자의 첫 줄에서 Vehicle(String name, int yaer)를 호출하도록 해야한다.
3. 메소드 오버라이딩
오버라이딩
- 부모 클래스로부터 상속받은 메서드의 내용을 자식 클래스에서 자신에 맞게 재정의(변경)하는 것을 오버라이딩(overriding)이라고 한다.
오버라이딩의 조건
- 오버라이딩은 메소드 내부의 내용만을 새로 작성하는 것이므로, 선언부(이름, 반환타입, 매개변수)는 부모클래스와 일치해야만 한다. (JDK1.5부터는 '공변 반환타입(convariant return type)'이 추가되어, 반환타입을 자식클래스의 타입으로 변경이 가능하다.)
- 접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경 할 수 없다. 부모클래스 메서드의 접근 제어자가 protected라면, 오버라이딩하는 자식 클래스 메서드의 접근 범위가 더 넓거나 같은 protected나 public이어야한다.
- 부모 클래스의 메서드보다 더 많은 수의 예외를 선언 할 수 없다. 또한, 자식 클래스의 수가 적더라도, 예외의 최고 조상격인 Exception만 쓰는것도 불가능하다.
오버로딩? 오버라이딩?
- 오버로딩(overloading)이란 기존에 없던 새로운 메서드를 정의하는 것이다.
4. 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
다이나믹 메소드 디스패치
- 다이나믹 메소드 디스패치란 컴파일 타임이 아닌 런타임에 오버라이드 된 메소드가 실행되는 메커니즘을 의미한다.
- 즉, 호출될 메서드가 컴파일 시 결정되는 것이 아니라 런타임시점에서 결정된다.
- 아래 예제처럼, 부모 클래스를 참조하여 자식 객체를 생성하고 있지만, 부모 클래스가 아닌 자식 클래스에서 재정의 된 메서드가 실행된다.
@ 제어자
제어자(modifier)
- 제어자란 변수, 클래스, 메서드의 선언시 함께 사용되어 부가적인 의미를 부여한다. 크게 접근 제어자와 그 외의 제어자로 나뉜다.
접근 제어자
- 접근 제어자는 멤버 또는 클래스(public, default)에서 사용되며, 해당 멤버나 클래스를 외부에서 접근하는데 제한을 줄 수 있는 역할을 한다. 접근 제어자는 public, protected, default, private 4가지 종류가 있으며, 한 가지만 선택해서 사용 할 수 있다.
- default는 말 그대로 default 이므로, 접근 제어자가 지정되어 있지 않다면 default로 간주하고 실제로 default를 붙이지 않는다.
- 접근 제어자는 외부에 공개될 필요가 없는 부분을 감추기 위해서 사용된다.
그 외 제어자
- 그 외 제어자로는 static, final, abstract, native, .. 등이 있으며, 여러 제어자를 조합해서 사용할 수 있다.
5. 추상 클래스
abstract
- abstract는 메서드의 선언부만 작성하고, 블록 내 실제 내용은 구현하지 않은 메서드를 선언할 때 사용한다. 클래스와 메서드에 사용할 수 있다.
- abstract 클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
- abstract 메서드 : 메서드의 선언부만 작성하고, 구현부는 아무것도 작성하지 않은 메서드를 의미한다.
추상 클래스 (abstract class)
- 우리가 상속을 한다는 것은 비슷한 기능끼리 묶을 수 있다라는 의미이다. 그렇게 되면 자식 클래스에서는 부모 클래스에 정의된 메서드를 재정의하게 되는데, 이 때 부모 클래스에서는 그 재정의 된 함수는 실행되지 않는다. 즉, 구현부 없이 선언부가 있어도, 프로그램을 실행하는데 전혀 문제가 되지 않는다는 뜻이다.
- 이런 경우 메서드에 abstract 키워드를 붙여 추상메서드로 만들고, 이러한 추상 메서드가 선언되어 있는 클래스에도 abstarct 키워드를 붙여 추상 클래스라고 한다.
6. final 키워드
final
- 클래스, 메서드, 변수에 사용될 수 있으며, final 키워드를 사용하면 변경 할 수 없게 된다.
- final 클래스 : 변경될 수 없는 클래스로 확장을 할 수가 없다. 즉, 부모 클래스가 될 수 없다.
- final 메서드 : 변경될 수 없는 메서드로 재정의를 할 수 없다. 즉, 오버라이딩(overriding)이 불가능하다.
- final 변수 : 변경될 수 없는 상수가 된다.
7. Object 클래스
Object 클래스
- 앞서 말한 것처럼, Object 클래스는 모든 클래스의 최상위에 위치한 부모클래스이며, 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스를 상속 받는다.
- 따라서 자바의 모든 클래스들은 Object 클래스의 멤버들을 상속 받기 때문에, Object 클래스에 정의된 멤버들(toString(), equals(), ... ) 을 사용할 수도 있다.
참고자료
'JAVA > 라이브 스터디 | whiteship' 카테고리의 다른 글
[live-study] 8주차 :: 인터페이스 (0) 2021.01.30 [live-study] 7주차 :: 패키지 (0) 2021.01.24 [live-study] 5주차 :: 클래스 (0) 2021.01.01 [live-study] 4주차 :: 제어문 (0) 2020.12.31 [live-study] 3주차 :: 연산자 (0) 2020.12.28 - 상속이란 현실에서는 부모가 자식에게 물려주는 행위를 말한다. 마찬가지로 부모 클래스(기존의 클래스)를 재사용하여 자식 클래스(새로운 클래스)를 작성하는 것을 프로그래밍에서 상속이라고 부른다.