본문 바로가기

📚Study Note/JAVA

[ JAVA ] 클래스 고급 - 상속 (Inheritance) ④

※ 메소드 오버라이딩 (Method Overriding)의 특징
- 메소드 이름, 리턴 타임, 파라미터 수나 타입이 완전히 일치해야 한다.
- 반드시 상속 관계가 있어야 한다.
- 재정의된 하위 클래스의 메소드 접근제어지시자는 상위 클레스의 메소드 접근제어지시자
보다 범위가 크거나 같아야 한다. 예를 들어 상위 클래스 메소드의 접근제어지시자가 
『protected 인 경우 하위 클래스가 이 메소드를 오버라이딩(Overriding) 하는 경우 
접근 제어 지시자는 『protected』 또는 『public』 이어야 한다. 
- 『static』 『final』 『private』 메소드는 오버라이딩(Overriding) 할 수 없다.
- Exception 의 추가가 불가능하다
즉 , 상위클래스의 메소드가 가지고 있는 기존의 예외 사항에
새로운 Exception을 추가하는 것은 불가능하다.

class SuperTest019  -- 상위 클래스 부모클래스 superclass
{

}

class SubTest109
{
}
public class Test109
{
     public static void main(String[] args)
     { 

     }
}

class SuperTest109
{
	private int a= 5;
	protected int b=10;
	public int c=20;

	public void write()
	{
		System.out.println("Super write() 메소드 : " + a+ " : " + b+ "  : "+ c);
	}
	

}

class SubTest109 extends SuperTest109
 {
/*
	private int a= 5; //상속안됨
	protected int b=10;
	public int c=20;

	public void write()
	{
		System.out.println("Super write() 메소드 : " + a+ " : " + b+ "  : "+ c)
	}*/
	
	protected int b=100;
	public void print()
	{
		//System.out.println("Sub print() 메소드 : " + a + " : " + b + "  : " + c);
		//에러발생 컴파일 에러 슈퍼클래스에서 선언된 변수 a는 접근할수없다. private이니까

		System.out.println("Sub print() 메소드 : " + b + "  : " + c);

		System.out.println("Sub print() 메소드 : " +super.b + " : " + c);
		// 수퍼클래스에서 선언된 변수 b에 접근하기 위해서는 super 키워드를 사용하면 된다.
		//아니라면 지금 메소드에서 정의된 변수인 100이 출력된다.

		System.out.println("Sub print() 메소드 : " + c);
		System.out.println("Sub print() 메소드 : " + this.c);
		System.out.println("Sub print() 메소드 : " + super.c);

		/*
		Sub print() 메소드 : 20
		Sub print() 메소드 : 20
		Sub print() 메소드 : 20

		--슈퍼 클래스(SuperTest109)에서 선언된 변수 c에 
		접근하는 데에는 아무런 제약과 제한이 없다.
		
		*/



		
	}
	@Override
	public void write()
	 {
		System.out.println("Sub write() 메소드 :  "+ " : " + b+ "  : "+ c); //오류나기에 a는 뺏다.
		//※ 
	 }
}
public class Test109
{
	public static void main(String[] args)
	{
		SubTest109 ob = new SubTest109();
		ob.print();
		ob.write(); //Super write() 메소드 : 5 : 10  : 20
		//여기서 어떻게 a에 5가 나오지? write() 메소드 입장에서는
		//a는 멤버변수이기때문에 
		//sub write() 메소드 오버라이딩후에는 b=10 c=20
/*
		슈퍼클래스에서 선언된 변수 a 에 접근할 수 없다. 
		privateㅇ 변수이기 때문이다,
		또한, 이때 접근 가능한 변수 b는 부모로부터 불려받은 b가 아닌
		자신의 변수 b인것을 확인할 수 있다.
*/      

		



	 //----------------------------------------------------------------

		System.out.println("------------------------------------------------구분선");
		
		ob.write();		
		((SuperTest109)ob).write();

		System.out.println(ob.b);

		System.out.println(((SuperTest109)ob).b); //수퍼클래스 타입의 객체형태로 형변환 했다 -- 슈퍼부름했다

		/*
		Sub write() 메소드 :   : 100  : 20
		Sub write() 메소드 :   : 100  : 20
		100
		10
		
		
		※ 슈퍼 부름

		위에서 write()은 오버라이딩해서 물려받은 차를 엄청 튜닝해논 꼴 그래서 ob.write() 와 같은것임
		그런데 아래의 경우 슈퍼부름해서 ob의 b가아니라 슈퍼클래스의 b를 불러와서
		위와 아래의 컴파일 결과가 다른 것이다. 
		메소드는 슈퍼부름 할수없다 ??/근데왜...다시한번,,,
		
		
		
		*/


	}
}