hrming
[Java/복습] 객체지향 프로그래밍 2 본문
1. 오버라이딩
조상 클래스로부터 상속받은 메서드의 내용을 자손 클래스에 맞게 변경하는 것
① 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스에 맞게 변경해야 하는경우 조상의 메서드를 오버라이딩 한다. (override 의 사전적 의미는 '~위에 덮어쓰다 (overwrite)' 이다)
class Point {
int x;
int y;
String getLocation() { // 선언부
return "x :" +x+ ", y:" +y; // 구현부 (구현부, 즉 내용만 수정 가능)
}
}
class Point3D extends Point {
int z;
String getLocation() {
return "x : " +x+ ", y : " +y+ ", z : " +z;
}
}
2. 오버라이딩의 조건
① 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드의 이름이 같아야 한다. - getLocation
② 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드의 매개변수가 같아야 한다. - 없음
③ 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드의 반환타입이 같아야 한다. - String
즉, 선언부가 서로 일치해야 한다.
다만, 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다.
④ 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
⑤ 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
⑥ 인스턴스메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.
3. 오버로딩 과 오버라이딩
오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것 (new)
오버라이딩 : 상속받은 메서드의 내용을 변경하는 것 (change, modify)
- 오버 로딩 : 한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것을 '메서드 오버로딩' 또는 '오버로딩'이라고 한다.
- 오버로딩의 조건
① 메서드 이름이 같아야 한다.
② 매개변수의 개수 또는 타입이 달라야 한다.
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} // 오버라이딩
void parentMethod(int i) {} // 오버로딩
void childMethod() {} // 메서드 정의
void childMethod(int i) {} // 오버로딩
void childMehtod() {} // 에러. 중복 정의되었음. already defined in Child
}
4. super
자손클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수
① 멤버변수와 지역변수의 이름이 같을 때, this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여서 구분할 수 있다.
② 조상 클래스로부터 상속받은 멤버도 자손 클래스 자신의 멤버이므로 super대신 this를 사용할 수 있다. 그래도 조상 클래스의 멤버와 자손 클래스의 멤버가 중복 정의되어 서로 구별해야 하는 경우에만 super를 사용하는 것이 좋다.
(조상의 멤버와 자신의 멤버를 구분하는데 사용된다는 점을 제외하고 super와 this는 근본적으로 같다. 모든 인스턴스 메서드는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이된다.)
③ static 메서드(클래스메서드)는 인스턴스와 관련이 없다. 그래서 this와 마찬가지로 super역시 static 메서드에서는 사용할 수 없고, 인스턴스 메서드에서만 사용할 수 있다.
5. super()
조상 클래스의 생성자
① super()는 조상 클래스의 생성자를 호출하는데 사용된다.
② 자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 모두 합쳐진 하나의 인스턴스가 생성된다. 그래서 자손 클래스의 인스턴스가 조상 클래스의 멤버들을 사용할 수 있는 것이다. 이 때 조상 클래스 멤버의 초기화 작업이 수행되어야 하기 때문에 자손 클래스의 생성자에서 조상 클래스의 생성자가 호출되어야 한다.
③ 생성자의 첫 줄에서 조상 클래스의 생성자를 호출해야 하는 이유는 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야 하기 때문이다.
④ Object 클래스를 제외한 모든 클래스의 생성자는 첫 줄에 반드시 자신의 다른 생성자 또는 조상의 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫 줄에 삽입한다.
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
// this.x = x; // 자손 클래스가, 조상 클래스의 멤버를 초기화하면 안됨.
// this.y = y; // 본인이 가지고 있는 z멤버만 초기화 가능하고, x,y는 조상클래스의 생성자로 초기화해야함.
super(x, y);
this.z = z;
}
}
참고: 생성자와 기본생성자
참고 😎
1. 자바의 정석
'Java > 복습' 카테고리의 다른 글
[Java/복습] 객체지향 프로그래밍 6 (0) | 2023.07.16 |
---|---|
[Java/복습] 객체지향 프로그래밍 5 (0) | 2023.06.26 |
[Java/복습] 객체지향 프로그래밍 4 (0) | 2023.06.24 |
[Java/복습] 객체지향 프로그래밍 3 (0) | 2023.06.23 |
[Java/복습] 객체지향 프로그래밍 1 (0) | 2023.05.28 |