상속(inheritance)
상속은 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다.
상속을 이용하여 기존에 정의한 클래스의 필드와 메서드를 물려받고, 새로운 클래스를 생성할 수 있다.
구현된 클래스보다 구체적인 기능을 가진 클래스를 구현해야 할 때, 기존의 클래스를 상속하여 구현한다.
기존의 클래스를 부모 클래스(parent class)나 상위 클래스(super class) 또는 기초 클래스(basic class)라고 한다.
상속받은 클래스를 자식 클래스(child class)나 하위 클래스(sub class) 또는 파생 클래스(derived class)라고 한다.
하위 클래스 생성 과정
하위 클래스를 생성하면 상위 클래스가 먼저 생성된다.
상위 클래스가 먼저 호출되고, 이후 하위 클래스가 호출된다.
문법
class CHILD extends PARENT{
}
extends 키워드 뒤에는 단 하나의 클래스만 올 수 있다.
c++의 경우, 다중 상속(multiple inheritance)이 가능하지만,
자바는 단일 상속(single inheritance) 만을 지원한다.
접근 제어자
한정자 | 클래스 내부 | 동일 패키지 | 하위 클래스 | 그 외의 영역 |
public | O | O | O | O |
protected | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
부모 클래스의 접근 제어자가 아래와 같은 경우,
public
접근 가능하다.
다른 패키지라도 접근할 수 있다.
protected
같은 패키지 내의 클래스에서 접근할 수 있다.
외부 클래스에서는 접근할 수 없지만, 하위 클래스에서 접근할 수 있다.
default
같은 패키지 내의 클래스에서 접근할 수 있다.
자식 클래스에서 상속받지만 접근할 수 없다.
private
자식 클래스에서 상속받지만 접근할 수 없다. 클래스 내부에서만 접근할 수 있다.
상속의 관계
IS-A 관계(inheritance)
is a relationship : inheritance
일반적이 개념과 구체적인 개념의 관계
상위 클래스의 수정이 하위 클래스에 영향을 미칠 수 있다.
예: 직원 - 엔지니어, 매니저, ... / 멤버십 - vip, dia, ...
HAS-A 관계(composition)
클래스가 다른 클래스를 포함하는 관계
에: 학생 - 수업
상속하지 않는다.
Object 클래스
자바에서 object 클래스는 모든 클래스의 부모 클래스가 되는 클래스이다.
모든 클래스는 자동으로 object 클래스의 필드와 메서드를 상속받는다.
toString(), equals(), clone(), ...
super 키워드
super는 부모 클래스에서 상속받은 필드나 메서드를 자식 클래스에서 참조하는 데 사용하는 참조 변수이다.
상위 클래스의 기본 생성자를 호출한다.
부모 클래스의 멤버 변수와 자식 클래스의 멤버 변수의 이름이 같은 경우, this 키워드를 사용하여 구별할 수 있다.
class parent {
int a = 10;
}
class child extends parent{
int a = 20;
void display(){
System.out.pirntln(a);
System.out.pirntln(this.a);
System.out.pirntln(super.a);
}
}
public class test{
public static void main(String[] args){
child ch = new child();
ch.display();
}
}
//결과
//20
//20
//10
super()는 상위 클래스의 기본 생성자를 호출하게 된다.
기본 생성자가 아닌 다른 생성자를 호출하는 경우, 괄호 안에 변수 값을 넣어서 호출할 수 있다.
업 캐스팅
upcasting
업 캐스팅은 하위 클래스의 상위 클래스로의 형 변환을 의미한다.
하위 클래스는 상위 클래스를 내포하고 있으므로 묵시적 형 변환이 가능하다.
하위 클래스 생성자에 의해 하위 클래스의 메모리가 생성되지만, 변수의 타임은 상위 클래스이므로 실제 접근 가능한 범위는 상위 클래스의 범위이다.
Parent parent = new Child(); //possible
add(child); //possible
int add(Parent parent){
}
반대로, 상위 클래스를 하위 클래스로 변환하는 것은 성립하지 않는다!
다운 캐스팅
downcasting
업 캐스팅된 클래스를 다시 원래의 타입으로 형 변환한다.
하위 클래스로의 형 변환은 명시적으로 해야 한다.
Parent parent = new Child(); //묵시적 형 변환 - 업 캐스팅
Child child = (Child)parent; //명시적 형 변환 - 다운 캐스팅
instanceof
참조변수 instanceof 클래스 이름
왼쪽의 참조 변수가 실제로 참조하고 있는 인스턴스의 타입이 오른쪽의 클래스 타입인 지 확인하는 키워드이다.
맞으면 true, 틀리면 false를 반환한다.
Parent parent = new Child(); //possible
if (parent instanceof Child){
System.out.println("True");
}
else{
System.out.println("False");
}
//result
//True
메서드 오버라이딩
함수 재정의
오버라이딩은 상속 관계에 있는 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 다시 정의하는 것을 말한다.
재정의 하려면,
- 부모 클래스의 메소드 선언부와 자식 클래스의 메소드 선언부가 동일해야 한다.
- 부모 클래스의 메서드보다 접근 제어자를 좁은 범위로 변경할 수 없다.
- 부모 클래스의 메소드보다 큰 범위의 예외 선언을 할 수 없다.
class Parent{
void display(){
System.out.println("parent");
}
}
class Child extends Parent{
void display(){
System.out.println("child");
}
}
메소드 오버로딩
함수 다중 정의
같은 이름의 메서드를 중복하여 정의하는 것을 의미한다.
한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없지만,
매개변수의 개수나 타임을 다르게 하면, 하나의 이름으로 메소드를 작성할 수 있다.
class Parent{
void display(){
System.out.println("parent");
}
}
class Child extends Parent{
void display(String str){
System.out.println(str);
}
}
가상 메소드
메서드의 이름은 주소값을 나타낸다.
가상 메소드 테이블에서 해당 메서드에 대한 주소 값을 가지고 있다.
재정의 된 경우, 재정의 된 메서드의 주소를 가리킨다.
즉, 상속을 받은 자식 클래스에서 재정의 되지 않은 메서드는 부모 클래스의 메소드 주소 값과 동일한 값을 가리킨다.
'Java' 카테고리의 다른 글
[JAVA] 자바의 배열 (0) | 2022.02.17 |
---|---|
[JAVA] 정적 변수와 정적 메서드 (0) | 2022.02.17 |
[JAVA] 객체와 객체지향 프로그래밍 (0) | 2022.02.08 |
[JAVA] 반복문 ~ while ~ for (0) | 2022.02.07 |
[JAVA] 조건문 ~ if (0) | 2022.02.07 |