본문 바로가기

자바 JAVA

생성자 매개변수 다 넘겼는데 객체 만들 때 오류? super() 예약어!

상속을 공부하면서 생성자에 필요한 매개변수를 다 넘겼는데도 객체 생성시 오류가 나는 것을 봤다.

 

package sample;

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

class Point
{
	int x, y;

	Point(int x, int y)
	{
		this.x = x;
		this.y = y;
	}

	void pMethod()
	{

	}
}

class Point3D extends Point
{
	int z;

	Point3D(int x, int y, int z)
	{
		this.x = x;
		this.y = y;
		this.z = z;
	}

	void p3DMethod()
	{

	}
}

 

Point3D클래스는 Point클래스의 자손클래스.

Point3D클래스의 생성자는 세 개의 정수타입 변수를 매개변수로 받는다.

그래서 main 메소드에서 1, 2, 3을 인수로 Point3D 인스턴스 p를 생성해본다. 오류가 난다.

 

이유를 설명하자면, Point3D는 Point클래스를 상속받기때문에,

Point3D 객체가 생성되기에 앞서 Point객체가 생성되어야한다.

하지만, Point객체의 생성자 Point(int x, int y)는 main메소드에서 호출되지 않았기 때문에 오류가 발생한다.

 

이 오류를 해결하기 위해 꼭 main메소드에서 Point객체를 생성할 필요는 없다.

super()를 이용하면 된다.

 

super()는 자손클래스에서 부모클래스의 생성자를 호출하는 예약어다.

자손클래스의 생성자가 호출될 때 super()에 대한 정의가 없다면, 컴파일러가 자동으로 super()를 생성한다.

 

Point3D(int x, int y, int z)
{
	super();
	this.x = x;
	this.y = y;
	this.z = z;
}

 

그런데 부모클래스인 Point 클래스를 보면 super()가 가리키는 대상인 Point()생성자는 정의되어 있지 않다!

 

결과적으로, 이 오류를 해결하기 위해선 아래 두가지 방법 중 하나를 이용하면 된다.

 

Point()
{
	this(0, 0);
}

 

1. Point클래스에서 Point() 생성자 정의하기

 

Point3D(int x, int y, int z)
{
	super(x, y);
	this.z = z;
}

 

2. Point3D(int x, int y, int z) 생성자에서 super(x, y) 정의하기