Java의 클래스에 대한 캐스팅(casting), 오버라이딩(Overriding)

Dohyeon Kong·2024년 4월 5일
0

Java☕

목록 보기
8/12
post-thumbnail

Java의 클래스에 대한 캐스팅

캐스팅(casting)이란 타입 변환을 의미하는데,
자바에서 클래스에 대한 캐스팅은 업캐스팅(upcasting)과 다운캐스팅(downcasting)으로 나뉜다.

  • 일상생활에서 예를 들어보자면 생물이 들어가는 박스에 사람이나 코끼리를 넣을 수 있고, 생물이 있음을 알리는 지시를 사용해도 된다.
    왜냐하면 사람은 생물을 상속받았기 때문이고 사람을 생물이라고 불러도 되기 때문이다.

업캐스팅(upcasting)

서브 클래스 객체가 슈퍼 클래스 타입의 객체로 변환되는 것

// 업캐스팅 기본 예제 코드
Person person;
Student student = new Studnet();
person = student; // 업캐스팅
  • 업캐스팅을 통해 p는 Student 객체를 가리키고 있지만 p로는 Person 클래스의 멤버만 접근할 수 있다.
  • 업캐스팅한 래퍼런스로는 객체 내 실존하는 모든 데이터를 접근할 수 없고 슈퍼 클래스의 멤버만 접근이 가능하다.
  • 위 코드를 예시로 말하면 Student 객체가 Person 클래스 객체로 취급되며 Student 클래스의 필드나 메소드에는 접근할 수 없다.
  • 업캐스팅은 명시적 타입 변환을 하지 않아도 된다. 왜냐하면 Student객체가 Person타입이기 때문이다.

다운캐스팅(downcasting)

업캐스팅된 것을 다시 원래대로 되돌리는 것

  • 업캐스팅된 서브 클래스 객체는 자신의 고유한 속성을 잃어버리는 것이 아닌 잠시 가려져 있는 것이다.
  • 자신의 고유한 속성을 사용하고 싶으면 다운캐스팅을 하면 된다.
// 다운캐스팅의 예
Person p = new Student("이재문"); // 업캐스팅
Student s = (Student)p; // 다운 캐스팅 (Student)의 타입 변환을 반드시 지정한다.1
  • 다운 캐스팅은 명시적으로 타입 변환을 지정해주어야 한다.

래퍼런스가 가리키는 객체가 어떤 클래스 타입인지 구분하기 위해서 우리는 instacneof연산자를 사용한다.

// instacneof 사용 예제
// Professor타입의 래퍼런스가 Person, Reseacher 타입의 객체를 상속받고 있다. 
Person p = new Professor();
if(p instanceof Person) // true
if(p instanceof Student) // false , Student를 상속받지 않기 때문
if(p instanceof Researcher) // true
if(p instanceof Professor) // true

Java의 메소드 오버라이딩(Overriding)

오버라이딩을 한마디로 표현하자면 '덮어쓰기'라고 말할 수 있다.

  • 서브 클래스에 선언된 메소드를 중복 작성하여 슈퍼 클래스에 작성된 메소드를 무력화시키고, 객체의 주인 노릇을 하는 것을 의미한다.
  • 슈퍼 클래스의 레퍼런스를 이용하든 서브 클래스의 레퍼런스를 이용하든 항상 서브 클래스에 오버라이딩한 메소드가 실행이 된다.

주의사항 : 서브 클래스에 오버라이딩한 메소드는 반드시 슈퍼 클래스에 작성된 메소드의 이름, 리터 타입, 매개 변수 리스트까지 모두 같도록 작성해야 한다!

오버라이딩은 상속을 통해 '하나의 인터페이스(같은 이름)에 서로 다른 내용을 구현하는 것을 의미" 이라는 객체 지향의 다향성을 실현하는 도구이다.

동적 바인딩(dynamic binding)

실행할 메소드를 컴파일 시 (compile time)에 결정하지 않고, 실행 시(run time)에 결정하는 것

  • 자바에서는 동적 바인딩을 통해 오버라이딩 된 메소드가 항상 실행되도록 보장하는 역할을 한다.

// 결과값
Super Object

// 결과값
Sub Object

오버라이딩과 super 키워드

  • 동적 바인딩을 인해 항상 서브 클래스에 오버라이딩한 메소드가 호출된다.
  • 슈퍼 클래스의 멤버에 접근하고 싶으면 super 키워드를 이용하여 정적 바인딩을 통해 슈퍼 클래스의 멤버에 접근할 수 있다.
super.슈퍼클래스의멤버

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

그럼 여기서 오버로딩(overloading)과 오버라이딩(overriding)을 어떻게 구분해야 할까?🤔

  • 오버라이딩(overriding)은 슈퍼 클래스에 있는 메소드의 이름, 매개 변수 타입과 개수, 리턴 타입등이 모두 동일한 메소드가 서브 클래스에서 재정의 되었을 경우이다.

  • 오버로딩(overloading)은 한 클래스나 상속 관계에 있는 클래스에 서로 매개 변수의 타입이나 개수가 다른 여러개의 메소드가 같은 이름을 작성된 것을 의미한다.

비교 요소메소드 오버로딩메소드 오버라이딩
선언같은 클래스나 상속 관계에서 동일한 이름의 메소드를 중복 작성된다.서브 클래스에서 슈퍼 클래스에 있는 메소드와 동일한 이름의 메소드를 재작성한다.
관계동일한 클래스 내 혹은 상속 관계이다.상속 관계이다.
목적이름이 같은 여러 개의 메소드를 중복 선언하여 사용의 편리성 향상된다.슈퍼 클래스에 구현된 메소드를 무시하고, 서브 클래스에서 새로운 기능의 메소드를 재정의하고자 한다.
조건메소드 이름은 반드시 동일하다. 메소드의 인자의 개수나 인자의 타입이 달라야 성립된다.메소드의 이름, 인자의 타입, 인자의 개수, 리턴 타입 등이 모두 동일하여야 성립된다.
바인딩정적 바인딩. 컴파일 시에 중복된 메소드 중 호출되는 메소드를 결정한다.동적 바인딩, 실행 시간에 오버라이딩된 메소드를 찾아 호출한다.

참조📜

  • 명품 JAVA ESSENTIAL - 황기태 지음-
profile
천천히, 꾸준히, 그리고 끝까지

0개의 댓글