티스토리 뷰

Java

자바 - 변수타입 vs 실제 객체타입

Kodong's blog 2025. 9. 10. 16:55

추상클래스를 공부하면서, "생성한 객체를 사용할 때"가 엄청 헷갈렸다. 

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

 

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함