[JAVA] 객체지향 프로그래밍-OOP(상속, 오버라이딩, super 키워드)
상속(inheritance)
- 상속이란?
- 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
상속 특징
- 자식은 부모의 모든 멤버를 상속받는다.(생성자, 초기화 블록 제외)
- 자식의 멤버 개수는 부모보다 적을 수 없다.(많거나 같다)
- 상속은 단일상속만 가능하다.
1
2
3
4
5
6
class Parent {
int age; // 멤버 1개
}
class Child extends Parent {
}
포함 관계
상속이외에도 ‘포함’관계를 맺어 클래스를 재사용이 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Point {
int x;
int y;
}
// 상속
class Point extends Circle {
int y;
}
// 포함
class Circle {
Point c = new Point;
int r;
}
예시를 보여주기에 이렇게 작성하였지만 클래스 간의 관계가 상속관계를 맺을지 포함관계를 맺을지 명확한 방법이 있다.
A가 B이다.
라는 문장이 성립하면 상속
A가 B를 가지고 있다.
라는 문장이 성립하면 포함
상속은 제약이 많기 때문에 꼭 필요할 때만 사용하고, 이외에는 포함관계를 사용한다.
오버라이딩(Overriding)
오버라이딩이란?
상속받은 부모의 메소드를 자신에게 맞게 변경하는 것
오버라이딩과 오버로딩을 서로 아예 다르니 헷갈리지 말자
오버로딩 : 이름이 같을 뿐 기존에 없는 새로운 메소드를 정의한 것
오버라이딩 : 상속받은 부모의 메소드 내용을 변경한 것
오버라이딩 조건
- 선언부가 부모 클래스의 메소드와 일치해야 한다.
- 접근 제어자를 부모 클래스의 메소드보다 좁은 범위로 변경할 수 없다.
- 예외는 부모 클래스의 메소드보다 많이 선언할 수 없다.
참조변수 super 키워드
- super란?
- 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조할 때 사용되는 참조변수
- 인스턴스 메소드 내에서만 존재
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Parent {
int a = 1; // 부모 인스턴스 변수
}
class Child extends Parent {
int a = 10; // 자식 인스턴스 변수
void printVariable() {
System.out.println("a=" + a);
System.out.println("this.a=" + this.a);
System.out.println("super.a=" + super.a);
}
}
public class Main {
public static void main(String[] args) {
Child ch = new Child();
ch.printVariable();
}
}
//출력
> a=10
> this.a=10
> super.a=1
super() 메소드
이전에 this()
메소드는 같은 클래스의 다른 생성자를 호출할 때 사용된다면, super()
메소드는 부모 클래스의 생성자를 호출할 때 사용된다.
부모 클래스의 멤버를 초기화하려면 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출해서 초기화하면 된다.
생성자의 첫 줄에는 super()
메소드가 호출되어야 한다. 하지만 생략 가능
부모 클래스에 직접 생성자를 정의해 추가했다면, 부모 클래스의 디폴트 생성자는 없어진다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.