티스토리 뷰
추상클래스를 공부하면서, "생성한 객체를 사용할 때"가 엄청 헷갈렸다.
abstract class ChessPiece {
public abstract void attack();
}
class King extends ChessPiece {
@Override
public void attack() {
System.out.println("King attacks!");
}
}
class Queen extends ChessPiece {
@Override
public void attack() {
System.out.println("Queen attacks!");
}
}
public class Main {
public static void main(String[] args) {
ChessPiece p1 = new King(); // 업캐스팅
ChessPiece p2 = new Queen(); // 업캐스팅
p1.attack();
p2.attack();
}
}
// -----------------
// 실행결과
// King attacks!
// Queen attacks!
이 포스팅에서는 이 예제를 바탕으로 설명하도록 하겠다.
나는 이 코드를 보고 이런 생각이 들었다.
ChessPiece p1 = new King();
아니, p1이라는 참조변수는 대체 타입이 뭐지?
ChessPiece인가? King인가?
▶ 이 고민을 통해서 나는 변수 타입(정적 타입)과 실제 객체 타입(동적 타입)에 대해서 좀 더 깊이 이해할 수 있었다.
이 코드에서는,
ChessPiece → 변수타입 → "정적 타입"
King → 실제 객체 타입 → "동적 타입"
이다.
각각 좀 더 자세히 부연설명을 하자면,
■ 정적 타입( ChessPiece )
- 변수를 선언할 때 정해지는 타입.
- 컴파일 시점에 결정돼서 바뀌지 않음.
■ 동적 타입 ( King )
- 실제로 참조하는 객체의 타입.
- 실행 시점에 따라 달라질 수 있음.
그리고, 이 정적 타입, 동적 타입과 완전 연결되는 개념인 동적 바인딩을 알고 나면
ChessPiece p1 = new King();
이러한 형태의 코드가 어떻게 실행이 되는지 이해할 수 있다.
( 동적 바인딩은 내일 정리하는 걸로... ) - 20250910/16:55
'Java' 카테고리의 다른 글
| 자바 - 정적 초기화 블록, 인스턴스 초기화 블록 (1) | 2025.09.11 |
|---|---|
| 자바 - super 키워드 (0) | 2025.09.10 |
| 자바 - 추상 클래스 정리 (1) | 2025.09.10 |
| 자바 - 인터페이스 좀 더 자세히 이해하기 (0) | 2025.09.09 |
| 자바 - 프로그램 죽이기 ( System.exit(n) 매서드 ) (0) | 2025.09.08 |