[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 라이센스를 따릅니다.