09009
[Java] 참조변수와 인스턴스의 연결 본문
이전 게시물
[Java] 참조변수의 형변환
참조변수의 형변환 • 서로 상속관계에 있는 타입간의 형변환만 가능 • 자손 타입에서 조상 타입으로 형변환하는 경우, 형변환 생략 가능 자손 타입 → 조상 타입 (up-casting) : 형변환 생략 가능
haaland09009.tistory.com
메서드의 경우 조상 클래스의 메서드를 자손 클래스에서 오버라이딩하였을 때에도 참조변수의 타입에 관계없이
항상 실제 인스턴스의 메서드(오버라이딩된 메서드)가 호출된다.
!!! 하지만, 멤버변수의 경우에는 참조타입에 따라 달라진다.
멤버변수가 조상 클래스와 자손 클래스에 중복으로 정의되었을 때,
조상 타입의 참조변수를 사용하였을 때는 조상 클래스에 선언된 멤버변수가 사용된다.
자손 타입의 참조변수를 사용하였을 때는 자손 클래스에 선언된 멤버변수가 사용된다. !!!
아래의 소스코드를 통해 한 번 확인해보자.
✍ 입력
class Parent {
int x = 1;
void method() {
System.out.println("부모 메서드입니다");
}
}
class Child extends Parent {
int x = 2;
void method() {
System.out.println("자식 메서드입니다");
}
}
public class JavaStudy {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println("p.x = " + p.x);
p.method();
System.out.println("c.x = " + c.x);
c.method();
}
}
참조변수 p와 c 모두 Child 인스턴스를 참조하고 있다.
💻 출력
p.x = 1
자식 메서드입니다
c.x = 2
자식 메서드입니다
메서드 method()의 경우 참조변수의 타입에 관계없이 항상 실제 인스턴스인 child 클래스에 정의된 메서드가 호출되는 것을 확인할 수 있다.
하지만 인스턴스 변수인 x는 참조변수의 타입에 따라 결과가 다르게 출력되는 것을 확인할 수 있다.
다음으로 멤버변수와 메서드가 중복 정의되지 않았을 때의 경우를 살펴보자.
✍ 입력
class Parent {
int x = 1;
void method() {
System.out.println("부모 메서드입니다");
}
}
class Child extends Parent {
}
public class JavaStudy {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println("p.x = " + p.x);
p.method();
System.out.println("c.x = " + c.x);
c.method();
}
Child 클래스에는 아무런 멤버가 정의되지 않았고 단순히 조상 Parent 클래스로부터 멤버를 상속받는다.
그러므로 참조변수 타입에 관계없이 조상의 멤버변수와 메서드를 사용하게 된다.
💻 출력
p.x = 1
부모 메서드입니다
c.x = 1
부모 메서드입니다
자손 클래스에서 조상 클래스의 멤버를 중복 정의하지 않았을 경우에는 참조변수의 타입에 따른 변화는 없다.
참조변수의 타입에 따라 결과가 달라지는 경우는 조상클래스의 멤버변수와 같은 이름의 멤버변수를 자손 클래스에 중복 정의한 경우뿐이다.
/
5/7
'Back-End > JAVA' 카테고리의 다른 글
[Java] 다형성을 고려한 인터페이스 설계 (인터페이스를 사용하는 이유) (0) | 2023.05.07 |
---|---|
[Java] 매개변수의 다형성 (0) | 2023.05.07 |
[Java] 참조변수의 형변환 (1) | 2023.05.07 |
[Java] SRP 원칙 (0) | 2023.05.03 |
[Java] Singleton (1) | 2023.05.03 |