부모 생성자 호출
메모리에서 보면 부모생성자가 먼저 호출이 된다.
부모의 특정 생성자를 호출하고 싶을 때 매개값의 타임과 일치하는 부모 생성자를 호출한다.
기본 생성자 호출방식
자식클래스(매개변수선언, ``) {
Super(매개값, ``);
}
super
현재 사용중인 객체의 부모영역을 호출할 때 사용한다.
this. 현재 사용중인 객체를 말하는데 그것이 부모 영역일때 super가 된다.
public class Student extends People{
public int studentNo;
public Student(String name, String ssn, int studentNo){
super(name,ssn); //1. new people(name,ssn);
//2. super(name,ssn);
this.studentNo = studentNo;
}
}
1번과 2번의 다른점을 보자면 호출되는 것은 같으나 메모리가 전혀 달라진다.
1번은 새로운 people 타입객체를 만든다. 2번은 Student 타입 안에 people이 들어가있다. 즉 자기 객체내의 부모영역을 찾아서 호출한다.
this
상위클래스(부모클래스)
//상위클래스
class Shape{
protected double area; //자식 클래스가 접근가능하게 protected를 사용함
// void makeArea() {
//
// }
void printInfo() {
System.out.println("면적은 " + area + "입니다");
}
}
area 변수를 protected로 지정하여 자식 클래스가 접근 가능하도록 한다.
void printInfo() 메서드는 아래의 자식 클래스에서도 오버라이딩하여 나온다. 오버라이딩은 아래에 더 살펴보도록 하겠다.
하위클래스(자식클래스)
class Circle extends Shape {
private int radius;
//private double area;
Circle(int radius) {
this.radius = radius;
}
void makeArea() {
area = Math.pow(radius, 2) * Math.PI;
}
void printInfo() {
System.out.print("반지름이 " + radius + "인 원의 ");
super.printInfo();
}
}
그림으로 메모리를 경로를 보면 Shap 클래스 안에 area()메서드로 이동하는 것을 알 수 있다.
makeArea() 메서드를 보면 area 앞에는 사실 this가 생략된 것이다. this.area라고 할 수 있으며 this. 은 앞서 공부한 것과 같이 현재 사용중인 객체를 가리킨다. 여기서this. 은 super. area와 같은 의미가 된다.
중복될 수 있는 것을 방지하기 위해 상위클래스에 있는 것은 super()로 표현을 하며 자신의 클래스는 this. 으로 표현을 하는 것이다.
오버라이딩
앞서 코드를 살펴보면 printInfo() 메서드가 두개가 있는 것을 알 수 있다. 상위메서드와 하위메서드에 각각 있다.
이럴 경우에는 하위 메서드를 우선으로 출력을 한다.
오버라이딩은 상위클래스에 있는 메서드를 재정의 하는 것으로 상위 printInfo() 메서드는 사용자가 직접 호출하지 않는 이상 하위메서드로 덮어 씌어진다.
오버라이딩의 예제를 보면
Shape s;
s = c; // s 는 Shape의 부모영역만 참조한다. upcasting
이 코드는 s 변수가 c와 같은 메모리를 참조한다. 그렇지만 전부 참조하는 것이 아니라 Shape영역만 가능하다.
빨강색 박스에 있는 Shape 클래스만 s변수는 참조한다.
여기서 의문이 드는 것은
c.printInfo(); //1
s.printInfo(); //2
두개가 호출되었을때 결과값이다.
1번은 c의 printInfo 로 출력이 되고 2번은 s의 printInfo가 출력이 될까??
답은 그렇지 않다.
둘다 자식 메서드에 있는 printInfo() 메서드에서 호출이 된다. 그 이유는 앞서 설명한 것처럼
오버라이딩 개념으로 하위메서드가 상위메서드를 덮어 씌워 재정의 하였음으로 이러한 결과값이 나타난다.
'java' 카테고리의 다른 글
java_9_ 다형성과 Overriding (0) | 2021.10.20 |
---|---|
java_8_상속(문제) (0) | 2021.10.19 |
java_7_ 상속(Inheritance) & 다형성 (0) | 2021.10.18 |
java_7_싱글톤 (0) | 2021.10.18 |
java_7_예약어 (접근제어자) & 캡슐화 (0) | 2021.10.18 |