본문 바로가기
프로그래밍 언어/자바의 정석 기초편

자바의 정석 기초편 ch7-10,11 참조변수 super, 생성자 super()

by life grow 2022. 8. 19.

7-10 참조변수 super

- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자) 내에서만 존재

- 조상의 멤버를 자신의 멤버와 구별할 때 사용

this와 비슷하다 (this: iv와 lv를 구별하는데 사용)

static메서드 내에 사용 불가

 

조상 멤버에 super, 자신의 멤버 this

이름이 x로 같아도, 따로 만들어진다.

("x=" + x) < 여기서 x는 가까운 20이다.

 

x가 하나밖에 없어서 다 10이다.

조상 멤버긴 한데 상속을 받아서

super.x와  this.x 둘 다 가능하다.

super, this 둘 다 같은 주소를 갖는 참조변수가 된다.

 

중복되지 않은 경우 super.x와  this.x가 같은 변수를 가리킨다.

 

super.x와  this.x는 거의 같다.

멤버를 구별할 때는 다르지만

 

7-11 super() - 조상의 생성자

-조상의 생성자를 호출할 때 사용

-조상의 멤버는 조상의 생성자를 호출해서 초기화

-생성자의 첫 줄에 반드시 생성자를 호출해야 한다.

 

super와 연관x

this()처럼 생성자다.

생성자와 초기화 블럭은 상속 X

 

자손의 생성자는 자기가 선언한 것(자신의 멤버)만 초기화해야 한다.

조상의 멤버를 초기화하면 안 된다.

맨 아래와 같이 super(x, y)로 조상 클래스의 생성자를 호출해야 된다.

 

super()는 조상의 생성자인데 자손 클래스에서 조상 생성자를 호출할 때 쓴다.

조상이 선언한 멤버들을 초기화하려면 내가 직접 하지 말고

조상의 생성자를 호출해서 조상의 생성자가 조상 멤버들을 초기화하게 해야 한다.

 

추가 조건 - 생성자의 첫 줄에 반드시 생성자를 호출해야 한다.

모든 생성자는 첫 줄에 다른 생성자를 호출해야 한다.

그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입 

super(); < 조상의 기본 생성자 호출

 

super(); 생성자 호출의 의미는

Point클래스의 조상 Object클래스의 기본 생성자를 호출하는 코드가 들어간다.

 

javac: 컴파일러 에러

 

Point3D 객체를 만드는데 왜 Point 생성자가 없다고 나오는 거지?

Point(int x, int y){} 첫 줄에 다른 생성자 호출이 없음

그래서 컴파일러가 Object클래스의 기본 생성자를 호출하는 super(); 추가해준다.

 

Point3D(int x, int y, inz ){} 첫 줄에 다른 생성자 호출이 없음

그래서 컴파일러가 Point클래스의 생성자 super(); 추가해준다.

 

이 상태에서 main메서드에서 Point3D(1, 2, 3);을 호출하면

인수가 Point3D(int x, int y, int z){}로 넘어간다.

여기서 첫 줄에 Point클래스의 생성자를 호출하는 super();가 있다.

그런데 Point클래스의 생성자 Point(){}가 없다.  (Point클래스의 기본 생성자)

 

Point클래스의 기본 생성자가 없는 이유는

이미 Point(int x, int y){}가 있어서 컴파일러가 기본 생성자를 안 넣어주는 것이다

그래서 기본 생성자 작성은 필수다.

 

에러 해결 방법

1. Point(){} 생성자 추가

2. 기본 생성자 호출 안 하게 맨 아래 그림처럼 코드 추가

Point3D(){

super(x, y);

}

(그래도 기본 생성자는 추가해주는 것이 좋다.)

 

6,7장 조건들을 무조건 암기하자

 

예제 7-2

public class Ex11 {
	public static void main(String[] args) {
		Child c = new Child();
		c.method();
	}
}

class Parent { int x = 10; /*super.x*/}

class Child extends Parent{
	int x = 20; //this.x
	
	void method() {
		System.out.println("x="+x);
		System.out.println("this.x="+this.x);
		System.out.println("super.x="+super.x);
	}
}

결과
x=20
this.x=20
super.x=10

 

예제 7-3

public class Ex11 {
	public static void main(String[] args) {
		Child c = new Child();
		c.method();
	}
}

class Parent { int x = 10; }

class Child extends Parent{
	void method() {
		System.out.println("x="+x);
		System.out.println("this.x="+this.x);
		System.out.println("super.x="+super.x);
	}
}

결과
x=10
this.x=10
super.x=10

 

7-11 조상의 생성자 코드

class Ex6 {
	public static void main(String[] args) {
		Point3D p = new Point3D(1, 2, 3);
		System.out.println(p.getLocation());
	}
}

class Point extends Object{
	int x, y;

	Point(int x, int y){
		super();
		this.x = x;
		this.y = y;
	}
	
	String getLocation() {
		return "x :" + x + ", y :"+ y;
	}
}

class Point3D extends Point{
	int z;
	
	Point3D(int x, int y, int z){
		super(x, y);
		this.z = z;
	}
	
	String getLocation() {
		return "x :" + x + ", y :"+ y + ", z :" + z;
	}
}