캐스팅(casting)이란 타입 변환을 의미하는데,
자바에서 클래스에 대한 캐스팅은 업캐스팅(upcasting)과 다운캐스팅(downcasting)으로 나뉜다.
서브 클래스 객체가 슈퍼 클래스 타입의 객체로 변환되는 것
// 업캐스팅 기본 예제 코드
Person person;
Student student = new Studnet();
person = student; // 업캐스팅
업캐스팅된 것을 다시 원래대로 되돌리는 것
// 다운캐스팅의 예
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
오버라이딩을 한마디로 표현하자면 '덮어쓰기'라고 말할 수 있다.
주의사항 : 서브 클래스에 오버라이딩한 메소드는 반드시 슈퍼 클래스에 작성된 메소드의 이름, 리터 타입, 매개 변수 리스트까지 모두 같도록 작성해야 한다!
오버라이딩은 상속을 통해 '하나의 인터페이스(같은 이름)에 서로 다른 내용을 구현하는 것을 의미" 이라는 객체 지향의 다향성을 실현하는 도구이다.
실행할 메소드를 컴파일 시 (compile time)에 결정하지 않고, 실행 시(run time)에 결정하는 것
// 결과값
Super Object
// 결과값
Sub Object
super.슈퍼클래스의멤버
name = "sub";
super.name = "super";
super.draw();
오버라이딩(overriding)은 슈퍼 클래스에 있는 메소드의 이름, 매개 변수 타입과 개수, 리턴 타입등이 모두 동일한 메소드가 서브 클래스에서 재정의 되었을 경우이다.
오버로딩(overloading)은 한 클래스나 상속 관계에 있는 클래스에 서로 매개 변수의 타입이나 개수가 다른 여러개의 메소드가 같은 이름을 작성된 것을 의미한다.
비교 요소 | 메소드 오버로딩 | 메소드 오버라이딩 |
---|---|---|
선언 | 같은 클래스나 상속 관계에서 동일한 이름의 메소드를 중복 작성된다. | 서브 클래스에서 슈퍼 클래스에 있는 메소드와 동일한 이름의 메소드를 재작성한다. |
관계 | 동일한 클래스 내 혹은 상속 관계이다. | 상속 관계이다. |
목적 | 이름이 같은 여러 개의 메소드를 중복 선언하여 사용의 편리성 향상된다. | 슈퍼 클래스에 구현된 메소드를 무시하고, 서브 클래스에서 새로운 기능의 메소드를 재정의하고자 한다. |
조건 | 메소드 이름은 반드시 동일하다. 메소드의 인자의 개수나 인자의 타입이 달라야 성립된다. | 메소드의 이름, 인자의 타입, 인자의 개수, 리턴 타입 등이 모두 동일하여야 성립된다. |
바인딩 | 정적 바인딩. 컴파일 시에 중복된 메소드 중 호출되는 메소드를 결정한다. | 동적 바인딩, 실행 시간에 오버라이딩된 메소드를 찾아 호출한다. |