본문 바로가기

IT일반과목/java

자바 상속에 대하여3(this와 super)의 의미

this와 super에 대해 보겠다.


this일경우 지금 있는 클래스의 것을 가리키고

super일경우 부모 클래스의 것을 가리킨다고 생각하면 쉽다.


그럴경우 만약 오버라이드 된상태에서는 어떻게 부모클래스의 값을 갖고올수 있을까?


super()나 this()는 생성자 안쪽의 제일 첫줄에 반드시 하나만 사용되어야 한다는 것이다.

만약 상속을 받았는데 this(), super() 둘중 하나도 입력되어있지 않다면 JVM은 매개변수가 없는 [super()]가 있다고 인식하게 된다.


생성자는 상속을 받을 수 없다.


= = 접근제어자 = =

구분 

 modifier

설명 

 접근권한

public 

모든 클래스에서 접근이 가능하다. ->모든경우

protected 

동일 패키지에 속하는 클래스와 하위 클래스 관계의 클래스에 의해 접근이 가능하다. ->상속

private

클래스 내에서만 접근이 가능하다.->정보은닉 


package jongkyu.pratice;


public class Aaa {

protected int x=10;//private값을 쓰지않는다면 public로 기본값이 설정되어있다.

//이때 왜 protected를 썻냐면 protected는 동일 패키지에 속하는 클래스와 하위 클래스 관계의 클래스에 의해 접근이 가능하다.

//private를 쓴다면 여기 클래스에서만 쓸수 있기때문에 자식클래스에서 접근을 못하게 되서 오류가 뜬다.

public void disp() {

System.out.println("x="+this.x);

}

private void overr() {

System.out.println("부모클래스!!!!!!!!");

}

public void overr1() {

overr();

//앞에 this를붙여도 값은 같다. 다만 super은 쓸수 없는게 여기보다 상위클래스는 없기 때문에 못쓴다.

//overr을 public로바꿔줄경우엔 자식클래스의 overr이 오버로딩된상태라서 그게 뜬다.

}

/*

* 자식클래스에 호출을 한다해도 private일경우 여기 클래스에서만 쓰는거기 때문이다.

*/

}



=================================================================================

package jongkyu.pratice;


public class Bbb extends Aaa {//Aaa라는걸 상속받은 Bbb 클래스이다.

private int y=100;//y=100이라는 값을 주었다.

private int x=50;

public void disp() {

System.out.println("부모클래스에서 x="+super.x);//부모클래스의 x를 호출했다.

System.out.println("자식클래스에서 x="+this.x);//지긐 클래스의 x를 호출했다.

System.out.println("y="+this.y);//지금 클래스의 y를 호출했다.

}

public void overr() {

System.out.println("자식클래스!!!!!!");

}

}


==============================================================================

package jongkyu.pratice;


public class Main {

public static void main(String[] args) {

Bbb b = new Bbb();//자식클래스를 호출했다.

b.disp();//자식클래스의 disp를 호출했다.

b.overr();

/*

* 당연히 자식클래스에서 overr을 호출하니 그 오버로딩된것을 가져오는 것이다.

*/

System.out.println("==============================");

b.overr1();

/*

* 이같은 경우는 자식클래스에서 오버로딩이된것이 아니다. 부모클래스와 자식클래스의 overr의이름만 같을뿐 오버로딩이 된것이 아니니 

* 부모클래스의  메소드를 호출한다.

* 이치를 따져 봐도 private 메소드이면, 자식 클래스에서도 접근 불가이므로 이를 overriding 한다는 것이 맞지 않는 것이다.

*/

}

}