개발지식 먹는 하마 님의 블로그

Java - 상속 본문

Java

Java - 상속

devhippo 2025. 2. 3. 12:34

[ Superclass와 Subclass ]

수퍼클래스 : 먼저 정의하는 일반 클래스를 말한다. (부모)
서브클래스 : 나중에 정의하는 특수 클래스를 말한다. (자식)

https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS8459970852

 

< extends 상속 >

extends를 사용한 상속으로 수퍼클래스의 속성을 서브클래스에서 사용하는 것이 가능해진다.
"서브클래스 extends 수퍼클래스"

class A {
    private int a;
    private int x;
    private int y;
    public A() {
    	this.a = 0;
    }
    
    public A(int x, int y){
    	this.x = x;
        this.y = y;
    }
}

class B extends A { //A를 상속받은 B
    private int b;
    public B() {
    	this.b = 1;
    }
    
    public B(int b, int x, int y){
    	super(x, y); //두 개의 매개변수를 사용하는 생성자 A(int x, int y)를 호출한다.
        this.b = b;
    }
}

B obj = new B();
B obj2 = new B(1, 2, 3);

- 인자가 없는 생성자의 경우

  • 서브클래스에서 수퍼클래스의 생성자를 호출하지 않아도 묵시적으로 수퍼클래스의 생성자가 먼저 호출된다.
  • 예시의 경우, B 생성자만 호출되었으나 A 생성자가 묵시적으로 호출되므로 A 생성 후, B가 생성된다.

- 인자가 있는 생성자의 경우

  • 명시적으로 수퍼클래스의 생성자를 호출해야 한다.
    super(인자)
    반드시 super 키워드를 써야 한다.
  • 수퍼클래스 생성자의 호출은 반드시 생성자의 첫 번째 문장이어야 한다.

 

< 접근 제어자 private & protected >

- private

class A {
    private int a;
    public A() {
    	this.a = 0;
    }
    public void setA(int a){
        this.a = a;
    }
    public int getA(){
    	return this.a;
    }
}

class B extends A { //A를 상속받은 B
    private int b;
    public B() {
    	this.b = 1;
    }
   public void save(int newA, int newB){
        a = newA; //에러
        super.setA(newA); //올바른 호출방법, super는 상황에 따라 생략 가능
        this.b = newB;
    }
    public void check(){
        System.out.println("A : " + getA());
        System.out.println("B : " + this.b);
    }
}

B obj = new B();
obj.save(17, 526);
obj.check()

서브클래스와 수퍼클래스는 엄연히 별개의 클래스이기 때문에
수퍼클래스의 변수가 private로 선언되어있다면 서브클래스가 마음대로 접근할 수 없다.
따라서 서브클래스에서 변수의 값을 변경 또는 불러오고자 한다면
setA(), getA()와 같은 별도의 함수를 만들어주어야 한다.

- protected

protected로 선언된 수퍼클래스 변수는 상속받은 서브클래스에서 제한 없이 사용할 수 있다.
상속받지 않은 클래스에 대해서는 사용이 불가능하다.

 

< 업캐스팅, 다운캐스팅 >

명찰 바꿔달기
수퍼와 서브클래스 둘 다 가능한데, 때에 따라 명찰만 바꿔 다는 것과 유사하다.

업캐스팅
: 수퍼클래스 타입의 참조 변수에 서브클래스의 객체를 대입하는 것

  • 객체가 변경되는 것은 아니다. 수퍼클래스로 취급되며 서브클래스 멤버가 숨겨진다.
  • 따라서, 서브클래스의 멤버는 사용할 수 없다.
  • 서브클래스 멤버 사용을 위해서는 다운캐스팅이 필요하다.

다운캐스팅
: 서브클래스 타입으로 되돌려서 숨겨진 멤버를 사용한다.

  • 명시적으로 클래스 타입을 지정한다.
  • 실제 객체에는 아무런 변경이 일어나지 않는다.
  • 객체를 가리키는 참조 변수의 타입이 달라질 뿐이다.
class A {
    public void foo(){}
}

class B extends A {
    public void boo(){}
}

A objA = new B(); //업스케일링 
B objB = new B();

objA.foo();
objA.boo(); //에러

B objA2 = (B)objA //objA를 다운캐스팅
objA2.boo();

 

상속 받은 클래스가 여러 개인 경우 instanceof 연산자를 사용할 수 있다.

class A { }
class B extends A{}
class C extends A{}

A objA = new C();

if(objA instanceof C){ //어떤 서브클래스인지 확인
	C objAC = (C)objA; //해당 서브클래스로 다운캐스팅
}

'Java' 카테고리의 다른 글

Java - 배열과 리스트  (1) 2025.02.06
Java - 인터페이스  (0) 2025.02.05
Java - 오버로딩, 오버라이딩  (1) 2025.02.04
Java - 예외 처리  (0) 2025.01.31
구글 Java 스타일 가이드  (1) 2025.01.21