[Java] 클래스에 대한 캐스팅(Casting)과 오버라이딩(Overriding)

2024. 10. 16. 22:07·☕ Java

Java의 클래스에 대한 캐스팅과 메소드 오버라이딩

Java에서 클래스와 관련된 캐스팅은 업캐스팅(upcasting)과 다운캐스팅(downcasting)으로 나뉩니다. 또한, 메소드 재정의와 관련된 개념으로 오버라이딩(overriding)과 오버로딩(overloading)도 있습니다.

클래스 캐스팅 (Casting)

캐스팅(casting)이란 타입 변환을 의미합니다. Java에서는 클래스에 대한 캐스팅이 업캐스팅과 다운캐스팅으로 나뉩니다.

업캐스팅 (Upcasting)

업캐스팅은 서브 클래스 객체가 슈퍼 클래스 타입으로 변환되는 것을 의미합니다.

Person person;
Student student = new Student();
person = student; // 업캐스팅

위의 코드에서 student 객체가 person이라는 슈퍼 클래스 타입으로 변환되었습니다. 업캐스팅된 객체는 슈퍼 클래스의 멤버만 접근할 수 있습니다. 즉, student 객체의 멤버에 직접 접근할 수 없으며, Person 클래스의 멤버만 접근할 수 있습니다.

업캐스팅은 명시적인 타입 변환이 필요하지 않습니다. 이는 서브 클래스가 슈퍼 클래스를 상속받기 때문입니다.

다운캐스팅 (Downcasting)

다운캐스팅은 업캐스팅된 객체를 다시 원래 서브 클래스 타입으로 되돌리는 것을 의미합니다. 다운캐스팅을 통해 서브 클래스의 고유한 메소드와 필드에 접근할 수 있습니다.

Person p = new Student("이재문"); // 업캐스팅
Student s = (Student) p; // 다운캐스팅

다운캐스팅을 할 때는 명시적으로 타입 변환을 지정해야 합니다. 다운캐스팅은 객체의 고유한 속성을 다시 사용할 수 있도록 하는 과정입니다.

instanceof 연산자

객체의 타입을 확인할 때는 instanceof 연산자를 사용합니다.

Person p = new Professor();
if (p instanceof Person) { // true
    // p는 Person 타입의 객체입니다.
}
if (p instanceof Student) { // false
    // p는 Student를 상속받지 않았으므로 false입니다.
}
if (p instanceof Researcher) { // true
    // p는 Researcher 타입의 객체입니다.
}
if (p instanceof Professor) { // true
    // p는 Professor 타입의 객체입니다.
}

메소드 오버라이딩 (Overriding)

오버라이딩(Overriding)은 슈퍼 클래스에 정의된 메소드를 서브 클래스에서 재정의하는 것을 의미합니다. 오버라이딩된 메소드는 항상 서브 클래스의 메소드가 호출됩니다. 이를 통해 다형성(같은 메소드 이름으로 다른 기능을 구현하는 성질)을 실현할 수 있습니다.

오버라이딩의 규칙

  • 서브 클래스에서 오버라이딩한 메소드는 슈퍼 클래스의 메소드 이름, 리턴 타입, 매개 변수 리스트가 모두 동일해야 합니다.
  • 슈퍼 클래스의 레퍼런스를 이용하든, 서브 클래스의 레퍼런스를 이용하든 항상 서브 클래스의 오버라이딩된 메소드가 호출됩니다.

동적 바인딩 (Dynamic Binding)

동적 바인딩이란 실행할 메소드를 컴파일 시점이 아닌 실행 시점에 결정하는 것을 의미합니다. 자바에서는 동적 바인딩을 통해 오버라이딩된 메소드가 항상 실행되도록 보장합니다.

super 키워드

오버라이딩된 메소드가 항상 호출되는 것을 막고 슈퍼 클래스의 멤버에 접근하고 싶다면 super 키워드를 사용할 수 있습니다.

name = "sub";
super.name = "super";
super.draw();

위 코드에서는 super 키워드를 사용하여 슈퍼 클래스의 멤버에 접근하고 있습니다.

오버로딩 (Overloading)과 오버라이딩 (Overriding)의 차이

오버로딩(Overloading)과 오버라이딩(Overriding)은 비슷한 개념처럼 보이지만 서로 다른 목적을 가지고 있습니다.

비교 요소 메소드 오버로딩 메소드 오버라이딩
선언 같은 클래스나 상속 관계에서 동일한 이름의 메소드를 중복 작성 서브 클래스에서 슈퍼 클래스의 메소드와 동일한 이름의 메소드 재작성
관계 동일한 클래스 내 또는 상속 관계 상속 관계
목적 사용의 편리성 향상 (이름이 같은 여러 개의 메소드) 새로운 기능의 메소드를 재정의하기 위함
조건 메소드 이름 동일, 인자의 개수나 타입이 다름 메소드 이름, 인자의 개수, 인자의 타입, 리턴 타입 모두 동일
바인딩 정적 바인딩 (컴파일 시점에 결정) 동적 바인딩 (실행 시점에 결정)

요약

  • 오버라이딩: 슈퍼 클래스에 있는 메소드를 서브 클래스에서 재정의하는 것. 다형성 실현을 위한 도구입니다.
  • 오버로딩: 같은 클래스나 상속 관계에서 동일한 이름의 메소드를 다른 매개변수로 여러 번 정의하는 것. 사용의 편리성을 제공합니다.

마무리

Java에서 클래스 캐스팅과 메소드 오버라이딩은 객체 지향 프로그래밍의 중요한 요소입니다. 업캐스팅과 다운캐스팅을 통해 타입 변환을 효율적으로 관리하고, 오버라이딩을 통해 다형성을 실현하며 코드의 재사용성을 높일 수 있습니다.

'☕ Java' 카테고리의 다른 글

[Java] 메모리 영역  (1) 2024.10.16
[Java] 추상클래스(Abstract class)와 인터페이스(Interface)  (0) 2024.10.16
[Java] Thread와 Java Thread  (0) 2024.10.15
[Java] 자료형  (0) 2024.10.15
'☕ Java' 카테고리의 다른 글
  • [Java] 메모리 영역
  • [Java] 추상클래스(Abstract class)와 인터페이스(Interface)
  • [Java] Thread와 Java Thread
  • [Java] 자료형
kkongdo
kkongdo
kkongdo 님의 블로그 입니다.
  • kkongdo
    숲을 바라보며 나무를 심는 아이
    kkongdo
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • 🌏 Web (0)
      • ☕ Java (5)
      • 🌱 Spring (9)
        • Spring Boot (7)
        • Spring Data JPA & QueryDSL (2)
      • 🗂️ Database (5)
      • 💻 CS (12)
        • 운영체제 (4)
        • 네트워크 (5)
        • 자료구조 (3)
      • 🗃️Git (1)
      • 🔍 Algorithm (0)
      • 📡 DevOps (0)
        • Docker (0)
      • 🔭 ETC (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • GitHub
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    @annotation
    OS
    네트워크기기
    DI
    db
    java
    데이터베이스
    SpringSecurity
    네트워크
    springbatch
    스케줄링
    JPA
    자료구조
    복잡도
    spring
    QueryDSL
    운영체제
    조인
    CS
    SpringMVC
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kkongdo
[Java] 클래스에 대한 캐스팅(Casting)과 오버라이딩(Overriding)
상단으로

티스토리툴바