본문 바로가기

Java

Java 참조변수 super 와 조상의 생성자 super()

 

참조변수 super
- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재 // static 메서드내에서는 사용 불가
- 조상의 멤버를 자신의 멤버와 구별할 때 사용

 


복습) this: lv와 iv구별에 사용

 

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

class Parent { int x=10; }

class Child extends Parent {
	int x=20;

	void method() {
		System.out.println("x=" + x); // x=20
		System.out.println("this.x=" + this.x); // this.x=20
		System.out.println("super.x="+ super.x); // super.x=10
	}
}

 

 


조상의 생성자 super()
// 참조변수 super와 관련X(this랑 같은 느낌)
cf) 상속에서 배운 것: 생성자, 초기화 블럭은 상속되지 않음 
- 조상의 생성자를 호출할 때 사용, 상속이 안되기 때문에 호출해서 사용해야함
- 조상의 멤버는 조상의 생성자를 호출해서 초기화, 조상의 멤버를 자손이 초기화 할수 있지만 조상의 멤버는 조상이 초기화 하는게 바람직

 

public class Ex7_4 {
	public static void main(String[] args) {
		Point3D p = new Point3D(1, 2, 3);
		System.out.println("x=" + p.x + ",y=" + p.y + ",z=" + p.z);
	}
}

class Point {
	int x, y;

	Point(int x, int y) {
					// 컴파일하면 super()==object(); 자동호출됨 <- 생성자 첫 줄에 반드시 생성자 호출한다는 조건
		this.x = x;
		this.y = y;
	}
}

class Point3D extends Point {
	int z;

	Point3D(int x, int y, int z) {
		super(x, y); // 조상의 생성자 Point(int x, int y)를 호출, 만약 super(); 이렇게 호출하면 에러발생!! 왜냐면 Point 클래스에 기본생성자를 만들지 않았기 때
		this.z = z;
	}
}

 


생성자의 조건
// 추가조건
- 생성자의 첫 줄에 반드시 생성자를 호출해야 한다. // this() 또는 super()
그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입 // 따로 조상클래스를 지정하지 않았으면 object();를 호출하는것과 같음

 

public class Ex7_4 {
	public static void main(String[] args) {
		Point3D p = new Point3D(1, 2, 3);
		System.out.println("x=" + p.x + ",y=" + p.y + ",z=" + p.z);
	}
}

class Point {
	int x, y;

	Point(int x, int y) {
		// 컴파일하면 super()==object(); 자동호출됨 <- 생성자 첫 줄에 반드시 생성자 호출한다는 조건
		this.x = x;
		this.y = y;
	}
}

class Point3D extends Point {
	int z;

	Point3D(int x, int y, int z) {
		super(x, y); // 조상의 생성자 Point(int x, int y)를 호출, 만약 super(); 이렇게 호출하면 에러발생!! 왜냐면 Point 클래스에 기본생성자를 만들지 않았기 때문
		this.z = z;
	}
}