티스토리 뷰
반응형
1. super
- 부모클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 참조변수이다.
- 부모 클래스의 멤버와 자식클래스의 멤버 이름이 같을 경우 super를 통해 부모 클래스의 멤버에 접근 할 수 있다.
- 인스턴스 메소드에만 사용 가능하며 클래스 메소드에는 사용할 수 없다.
class Parent {
int num = 5;
}
class Child extends Parent {
int num = 10;
void print() {
System.out.println(num); //10
System.out.println(this.num); //10
System.out.println(super.num); //5
}
}
public class Ex01 {
public static void main(String[] args) {
Child a = new Child();
a.print();
}
}
2. super()
- super()는 부모 클래스의 생성자를 호출할 때 사용한다.
- 자식 클래스의 인스턴스를 생성하면 부모클래스의 모든 멤버까지 포함되어 있어서 부모 클래스의 멤버를 초기화하기 위해서 부모클래스의 생성자를 자식클래스의 생성자 첫줄에서 호출해야 한다.
- 이러한 호출은 Object 클래스의 생성자까지 거슬러 올라가며 수행된다.
- 자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않은 자식 클래스의 생성자 첫 줄에 자동으로 super()를 추가하여 부모클래스의 멤버를 초기화하도록 한다.
- 단 컴파일 시 클래스에 생성자가 하나도 정의되어 있지 않아야 자동으로 기본 생성자를 추가해준다.
class Parent {
int num;
public Parent() {
num = 5;
}
public Parent(int n) {
num = n;
}
}
class Child extends Parent {
int a;
public Child(int x) {
super(x); //첫줄에 와야함
a = 20;
}
public void print() {
System.out.println(num); //30
System.out.println(a); //20
}
}
public class Ex02 {
public static void main(String[] args) {
Child ch = new Child(30);
ch.print();
}
}
this, this(), suepr, super()
- this와 super는 모드 레퍼런스로 this는 현재 객체의 모든 멤버를,
super는 현재 객체 내에 있는 부모 클래스 멤버를 접근할 수 있다.
this.객체내의멤버
super.객체내의슈퍼클래스의멤버
- super로 메소드를 호출하면 정적바인딩을 실행한다.
- this()와 super()는 모드 메소드 호출이며 this()는 생성자에서 다른 생성자를 호출할때 사용하고,
super()는 자식클래스의 생성자에서 부모클래스의 생성자를 호출할 때 사용한다.
3. 메소드 오버라이딩(method overriding)
- 부모클래스에서 선언된 메소드와 같은이름, 같은 리턴타입, 같은 매개 변수 리스트를 갖는 메소드를 자식클래스에서 재작성하는 것이다.
- 즉, 메소드 오버라이딩은 상속받은 부모클래스의 메소드를 재정의하여 사용하는 것을 의미한다.
- 메소드 오버라이딩은 '부모클래스 메소드 무시하기' 혹은 '부모클래스 메소드 덮어쓰기'로 표현할 수 있다.
class Parent {
public void print() {
System.out.println("부모 클래스의 print() 메소드입니다.");
}
}
class Child extends Parent {
public void print() { //메소드오버라이딩
System.out.println("자식 클래스의 print() 메소드입니다.");
}
}
public class Ex01 {
public static void main(String[] args) {
Parent papa = new Parent();
papa.print();
Child a = new Child();
a.print();
Parent b = new Child(); //업캐스팅
b.print(); //동적바인딩
}
}
- Child클래스에서 Parent 클래스의 print()를 오버라이딩하였다.
- 어떤 경우이든 자바에서 오버라이딩된 메소드가 있다면 동적 바인딩을 통해 오버라이딩된 메소드가 무조건 실행된다.
오버라이딩 조건
- 부모클래스의 메소드와 동일한 이름, 동일한 매개변수 타입과 개수, 동일한 리턴 타입을 갖는 메소드를 작성해야한다.
- 부모클래스 메소드의 접근지정자보다 접근의 범위를 좁여 오버라이딩할 수 없다.
- 접근지정자는 public, protected, default, private 순으로 접근의 범위가 좁아진다.
- 부모클래스에 protected로 선언된 메소드는 자식클래스에서 protected나 public으로만 오버라이딩할 수 있다.
- 부모클래스에 public으로 선언도니 메소드는 자식클래스에서 public으로만 오버라이딩할 수 있다.
- static이나 private 또는 final로 선언된 메소드는 자식클래스에서 오버라이딩할 수 없다.
오버라이딩 vs 오버로딩
비교 요소 | 메소드 오버라이딩 | 메소드 오버로딩 |
선언 | 자식클래스에서 부모클래스에 있는 메소드와 동일한 이름의 메소드 재작성 | 같은 클래스나 상속 관계에서 동일한 이름의 메소드 중복 작성 |
관계 | 상속관계 | 동일한 클래스 내 혹은 상속관계 |
목적 | 부모클래스에 구현된 메소드를 무시하고 자식클래스에서 새로운 기능의 메소드를 재정의하고자함 | 이름이 같은 여러개의 메소드를 중복 작성하여 사용의 편리성 향상 |
조건 | 메소드 이름, 매개변수 타입과 개수, 리턴 타입이 모두 동일 | 메소드 이름은 반드시 동일 매개변수 타입이나 개수가 달라야 성립 |
바인딩 | 동적 바인딩 실행 시간에 오버라이딩된 메소드를 찾아 호출 |
정적 바인딩 호출될 메소드는 컴파일 시에 결정 |
반응형
'JAVA' 카테고리의 다른 글
[Java] 추상클래스, 추상메소드 (0) | 2022.04.01 |
---|---|
[Java] 다형성(polymorphism), 업캐스팅, 다운캐스팅, instanceof연산자 (0) | 2022.03.31 |
[Java] 상속(Inheritance) - (1)상속 개념, 상속 특징 (0) | 2022.03.24 |
[Java] 메소드(methond)와 생성자(constructor) (0) | 2022.03.23 |
[Java] 클래스(class)의 개념 (1) | 2022.03.22 |
댓글
반응형
공지사항