개발지식 먹는 하마 님의 블로그
Java - 상속 본문
[ Superclass와 Subclass ]
수퍼클래스 : 먼저 정의하는 일반 클래스를 말한다. (부모)
서브클래스 : 나중에 정의하는 특수 클래스를 말한다. (자식)
< 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 |