상속(Inheritance)
상속(Inheritance) 이란?
- 하위 클래스가 상위 클래스를 확장(extend) 하는 것.
- 자바에서 상속은 extends 키워드를 이용하여 상속한다.
- 자바에서는 상속을 받지 않은 경우, 기본적으로 java.lang.Object 클래스를 상속 받는다.
- 자바에서는 원칙적으로 단일 상속만 지원한다.
다중 상속이 필요한 경우 Interface 키워드를 이용한다.
- 상속 받은 여러 클래스 중 같은 이름을 가진 멤버, 메소드가 있는 경우 어떠한 것을 실행해야 하는지 모호하다.
상속 방법
- 자식 클래스는 extends 키워드를 통해 부모 클래스를 상속 받을 수 있다.
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
child1 c=new child1();
c.pMethod();
c.cMethod();
}
}
class parent{
public String name;
public void pMethod() {
System.out.println("parent Method");
}
}
class child1 extends parent{
public child1() {
this.name="child1";
}
public void cMethod() {
System.out.println(name+" Method");
}
}
올바른 상속
- IS-A 관계를 살펴본다.
올바른 상속이 되는 경우 "A is a B" 라는 관계가 성립 된다.
예를 들어 "Dog is a Animal" 이라는 관계는 성립되지만, "Animal is a Dog" 라는 관계는 성립되지 않는다.
즉, 상속에서 IS-A 관계는 한 방향으로만 작동한다.
- IS-A 관계는 부모, 자식 관계 뿐만 아니라 그 이하, 그 이상과의 관계에도 성립된다.
A is a B 이고 B is a C 인 경우 A is a C도 성립한다.
상속의 장점
- 부모 클래스는 자식 클래스의 공통적으로 필요한 행동을 상속한다. 그러므로 코드 중복을 방지할 수 있다.
- 부모 클래스를 수정하면 자식 클래스는 자동으로 수정되기 때문에 자식 클래스를 따로 수정할 필요가 없다.
- 일련의 클래스를 위한 공통적인 규약을 정의할 수 있다.
생성자
- 자식 클래스에서 생성자를 호출하는 경우 부모 생성자를 호출해야 한다.
- 자식 클래스 생성자에서 부모 클래스 생성자를 호출하지 않는 경우 자동으로 부모 클래스의 기본 생성자가 추가된다.
이때 부모 클래스의 기본 생성자가 없는 경우, 에러가 발생한다.
- 부모 클래스의 생성자는 super 키워드를 이용하여 임의로 호출이 가능하다.
이때 반드시 자식 클래스 생성자 부분 제일 위에서 호출해야 한다.
- 생성자 관련 자세한 내용 참고
super와 this
- 클래스에서 자기 자신 객체를 참조하기 위해서 this 키워드를 사용한 것 처럼,
부모 클래스 객체를 참조하기 위한 super 키워드가 존재한다.
- 생성자 : super();
멤버 변수 : super.member;
메소드 : super.method();
자식 인스턴스 생성과 부모 인스턴스
- 자식 클래스가 생성될 때, 부모 클래스의 생성자도 실행된다.
- 즉, 자식 인스턴스가 생성되어 힙에 저장되면, 부모 인스턴스도 생성되어 저장된다.
- 그래서 자식 인스턴스가 부모 클래스의 멤버 변수, 메소드를 사용할 수 있다.
- instanceof 를 이용하여 살펴보면, 자식 인스턴스에 부모, 자식 클래스 모두 있다는 것을 알 수 있다.
public class start {
public static void main(String[] args) {
parent p = new child();
/*
부모 타입으로 선언해도 참조 값이 가리키는 메모리에는
자식 인스턴스가 있다.
자식 인스턴스에는 부모 + 자식 모두 생성되어 있다.
*/
if(p instanceof child)
System.out.println("현재 자식 클래스 참조중입니다.");
if(p instanceof parent)
System.out.println("현재 부모 클래스 참조중입니다.");
}
}
class parent{
;
}
class child extends parent{
;
}
상속 접근 제한
- 자식 클래스에서 부모 클래스의 멤버 변수나 메소드에 접근할 수 있는 권한을 조정할 수 있다.
- 접근 제어자를 이용하여 접근이 가능한 경우, 접근이 불가능한 경우를 나누어 용도에 따라 사용할 수 있다.
접근 제어자 |
속성 |
public |
모든 접근 허용 |
protected |
해당 패키지 내의 클래스나 상속 받은 클래스에서만 접근 가능 |
default |
해당 패키지 내에서만 접근 가능 |
private |
해당 클래스 내에서만 접근 가능(상속 불가) |
final
- final 키워드를 이용하여 클래스, 메소드를 선언하면 상속과정에서 제한을 만들 수 잇따.
- final 클래스는 상속이 불가능해진다.
- final 메소드는 상속 시 오버라이딩이 불가능하게 된다.
package com.test;
public final class parent {
int aaa=3;
}
package com.test;
public class child extends parent {
int aaa=6;
public child(){
//aaa=666;
}
public void cc(){
System.out.println(super.aaa);
}
}
기타 상속 관련 질문
Q. 상위 클래스에서 하위 클래스의 메소드는 사용할 수 있는가?
A. 상위 클래스에서 하위 클래스의 메소드는 사용할 수 없다.
Q. 하위 클래스에서 상위 클래스 버전의 메소드와 오버라이드 버전의 메소드 모두 사용하는 방법이 있는가?
A. 오버라이드 된 버전은 해당 메소드를 사용하면 되고, 상위 클래스 버전의 메소드는 super 키워드를 이용하면 된다.
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
child1 c=new child1();
c.Method();
}
}
class parent{
public String name;
public void Method() {
System.out.println("parent Method");
}
}
class child1 extends parent{
public child1() {
this.name="child1";
}
public void Method() {
// super 키워드를 이용하여 부모 클래스의 메소드 실행
super.Method();
System.out.println(name+" Method");
}
}
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] 추상 클래스(Abstract Class) & 추상 메소드(Abstract Method) (0) | 2021.01.20 |
---|---|
[JAVA] 오버라이딩(Overriding) 과 오버로딩(Overloading) // 다형성 (0) | 2021.01.20 |
[JAVA] 객체의 생성, 생성자 (0) | 2021.01.20 |
[JAVA] 클래스 & 패키지 (0) | 2021.01.20 |
[JAVA] 자료형, 배열, 상수, 형변환 (0) | 2021.01.20 |
댓글