본문 바로가기
Software/Java

클래스의 상속 - super문 및 생성자 상속

by [방울] 2014. 12. 16.

 

 

 

 

 

super(인자); // 상위클래스 호출

 

 

예시 :

 

class Base
{
	public Base(String par1, int par2)
	{
		System.out.println(par1 + " & " + par2);
	}
}

class SubClass extends Base
{
	public SubClass(String par1, int par2, int par3)
	{
		super(par1, par2); // 상위클래스(Base) 호출!
	}
}

 

 

 

이 정도의 예시면 충분히 이해하실 것 같네요.

메인 메소드에서 SubClass를 호출(SubClass sc = new SubClass();)하시면 Super(par1, par2);문으로 상위클래스가 호출됩니다.

이때 상위클래스가 무엇이냐!

 

상속을 하실경우 클래스가 최소 2개 연결됩니다.

위 예시를 이용하자면, Base 클래스가 상위클래스, SubClass가 하위클래스입니다.

즉, 상속을 하는(extends를 추가한) 클래스가 하위클래스입니다.

 

3개의 클래스를 예시로 들자면,

각각 A, B, C 클래스가 있으면 C는 B를 상속, B는 A를 상속할 경우, A is a B, B is a C 형태로 상속이 되며, A is a C로도 상속이 됩니다.

이때 A는 B, C의 상위클래스이며, B는 A의 하위클래스임과 동시에 C의 상위클래스가 되며, C는 A, B의 하위클래스가 됩니다.

하위클래스가 호출되면 상위클래스 생성이 완료된 후 하위클래스를 생성하며, 상위클래스 생성시 default 값으로 초기화됩니다.

 

자바에서의 상속은 단일상속만 지원하며, 접근제어 지시자중 protected 지시자를 이용하면 동일패키지내, 클래스내부, 상속받은 클래스에서의 접근이 가능합니다.

(default 지시자는 동일패키지내, 클래스내부에서 접근이 가능합니다.)

지시자

클래스 내부

동일 패키지 내부

상속받은 클래스

이외의 모든 영역

private

가능

불가능

불가능

불가능

default

가능

가능

불가능

불가능

protected

가능

가능

가능

불가능

public

가능

가능

가능

가능

표 : 접근제어 지시자

 

그러나, private도 상속이 가능합니다.

다만, 직접적인 접근은 불가능합니다.

만약 private로 선언된 int형 변수 A가 있다고 하면, 해당 변수가 있는 클래스에 protected지시자 또는 public지시자로 선언된 메서드를 통하여 간접적인 접근이 가능합니다.

 

 

또한 생성자는 상속이 되지 않습니다.

생성자가 상속이 된다는게 무슨말이냐 하면,

 

class A
{
	public A(int par1)
	{
		System.out.println(par1);
	}
}

class B extends A
{
	public B()
	{
		super(10); // 상위클래스에 10 전달
	}
}

 

 

위 소스에서 아래와같은 인스턴스 생성중 어느것이 가능할까요?

 

B b1 = new B();
B b2 = new B(5);

 

 

정답은 b1입니다.

B 클래스에는 B(int) 형 메소드가 존재하지 않기때문에 인스턴스 생성시 값을 전달하면 에러가 발생하게됩니다.

 

만약 생성자가 상속된다면, 위 소스에서 B클래스에 아래와 같은 메서드가 추가된다는 뜻입니다.

 

public B(int par1)
{
	System.out.println(par1);
}

 

 

 

 

 

충분한 예시가 없어서 어렵게 설명된것같네요.

궁금한 점 있으면 덧글로 질문해주세요!

댓글