유블로그

[Java] 상속과 접근제한자 본문

Java

[Java] 상속과 접근제한자

yujeong kang 2020. 8. 10. 14:27
  • class A extends B : A(자식)가 B(부모)를 상속받는다.
  • 하나의 부모는 여러 자식을 가질 수 있고, 부모는 또 다른 자식이 될 수도 있다.
  • extends를 명시하지 않을 경우 자동으로 extends java.lang.object 가 부모로 설정됨
  • 한 개의 class만 extends 가능하다.
  • 다중 상속 대신 interface 기능을 활용할 수 있다. (implements 는 다중 가능)
  • 상속을 해도 접근제한자가 우선적으로 적용된다. 예로 들어 부모 variables 가 private 인데 자식이 super.variable 이렇게 접근할 수 없다는 것.
  • 클래스 호출 시 무조건 부모 클래스 먼저 호출 하고 자식 클래스 호출됨

자식 클래스 생성자 첫 줄에 super(); 안해주면 자동으로 super() 호출됨.

이 때 this(); 해주면 자식 클래스의 디폴트 생성자 호출에서 super() 한다.

class A{
	int a, b;
    public A() {}
    public A(int a; int b){
    	this.a = a;
        this.b = b;
    }
    public void setA(int a) {
		this.a = a;
	}
     public void setB(int b) {
		this.b = b;
	}
 }
 
 class B extends A {
	 int c;
    B(int a, int b, int c){
    	super(a, b);
        // 밑 두 줄이 위 super(a, b)와 같음. super()는 무조건 생성자 첫 줄에 나와야 함.
        // super.setA(a);
        // super.setB(b);
        this.c = c;
    }
 
 }

< 접근제한자 >

public > protected > default > private

 

public : 어떤 클래스든 사용 가능(다른 패키지도 가능)

protected : 같은 패키지 안에서 접근 가능, 다른 패키지에서는 상속 관계에서만 접근 가능

default : 같은 패키지 안에서 접근 가능

private : 자신 클래스만 사용 가능

 

package a;

public class AAA {
	protected int a = 100;
}


package b;
import a.*;

public class Test extends AAA {
	Test(){
		System.out.println(a);		// 다른 패키지라도 protected는 변수이름으로 접근 가능
	}
	public static void main(String[] args) {
		
		AAA aaa = new AAA();
//		System.out.println(aaa.a);	// 오류남...
//		System.out.println(a); 		// 이것도 static 때문에 불가능
	}
}

 

  • 부모 클래스에 생성자가 없으면 자식 클래스에서 오류남
  • super()로 부모 class 생성자를 호출할 때는 항상 첫번째 라인에 와야 한다. (부모 먼저 생성)

 


+ final class : 자식 클래스를 만들지 않고 싶을 때 사용