코드 그라데이션

Day23. super 보충 본문

Java/Mega

Day23. super 보충

완벽한 장면 2023. 4. 30. 12:50

예시코드

package Day23;

class Z{
	String str;
	Z(String str){
		this.str = str;
	}
}

class A{
	int k;
	String str;
	A(int a){
		this.k = a;
	}
	A(String str, int k){
		
	}
	void print() {
		System.out.println("A");
	}
}

class B extends A{
	int k;
	String str;
	B(){
		super(5);
	}
	
	void changeString() {
		super.k = 5; // 부모꺼
		this.k = 10; // 내꺼
	}
	
}
public class TestSuper {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		B b = new B();
		b.str = "hi";
	
	}

}

 

B 생성자에서는 A의 생성자를 호출하고 있다. 

=> 클래스 안에서 super 키워드는 이 클래스의 부모의 객체를 의미하니까.

=> super만 하면 객체를 의미하는데, 객체 뒤에 괄호를 열고 닫았으니까 이것은 생성자를 의미하고, 

    그럼 부모 생성자를 호출하는데, 부모 생성자를 봤더니

A(int a){
this.k = a;
}

이게 호출이 된다. 

A클래스의 생성자는 두 개지만, 매개변수와 일치하는 것은 위의 것.

 

A(int a){
this.k = a;
}

얘가 하는 일은

A가 가지고 있는 k에 a값을 설정.

 

B(){
super(5);
} B가 부모에 5를 넣어줬으면,  5가 int a 값으로 들어가서, 이 5가 k에 들어가는 과정으로 이루어짐.

결과적으로  A에 있는 k가 5.

 

 

상속에서는 두 가지가 있음

hidingoverriding

 

먼저 후자는 재정의, 덮어써짐.

전자는 나에 의해서 부모 것이 가려지는 것.

 

필드 - hiding 

메서드 - overriding

 

여기서의 k는 필드.

package Day23;

class A{
	public int k;
	String str;
	A(int a){
		this.k = a;
	}
	A(String str, int k){
		
	}
	void print() {
		System.out.println("A");
	}
}

class B extends A{
//	int k;
	String str;
	B(){
		super(5);
	}
	
	void changeString() {
		super.k = 5; // 부모꺼
		this.k = 10; // 내꺼
	}
	
}
public class TestSuper {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		B b = new B();
		b.str = "hi";
        System.out.println(b.k);
	
	}

}

 원래 b에서 k를 가지고 있지 않아도 B는 A를 상속받기 때문에

A가 k를 가지고 있었으면, B를 통해서 k를 볼 수 있다.

 

그런데

package Day23;

class A{
	public int k;
	String str;
	A(int a){
		this.k = a;
	}
	A(String str, int k){
		
	}
	void print() {
		System.out.println("A");
	}
}

class B extends A{
	int k;
	String str;
	B(){
		super(5);
	}
	
	void changeString() {
		super.k = 5; // 부모꺼
		this.k = 10; // 내꺼
	}
	
}
public class TestSuper {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		B b = new B();
		b.str = "hi";
        System.out.println(b.k);
	
	}

}

B가 또 자기 k를 가지면, 완전 다른 의미가 된다.

이 때 k는 A의 k가 아님.

A의 k는 hiding이 되고, (B에 의해서 가려지게 되고 )

이 때는 자기 것 k를 말하는 것임.

 

그런데 자기 클래스 안에서 super 키워드를 명시적으로 붙인 다음에 부르면, 부모 것을 명확하게 의미한다. 

728x90
Comments