메서드 오버라이딩(Method Overriding)이란?
: 부모 클래스 메소드의 이름, 매개변수 타입 및 개수, 리턴 타입 등 모든 것 동일하게 작성하는 것입니다. 쉽게 말해서 메소드 무시하기, 덮어쓰기로도 이야기 할 수 있습니다.
● 오버라이딩(Overriding)
- 오버라딩의 조건 : 상속 관계라는 전제하에 상위 클래스에 정의된 메소드의 이름, 반환형, 매개 변수 선언까지 완전히
동일한 메소드를 하위 클래스에서 다시 정의합니다.
- 부모 클래스에 선언된 메소드를, 각 자식 클래스들이 자신만의 내용으로 새로 구현하는 기능 입니다.
- 상속을 통해 '하나의 인터페이스(같은 이름)에 서로 다른 내용 구현'이라는 객체 지향의 다형성 실현합니다.
- 다형성 : 다형성이란 같은 자료형에 여러 가지 객체를 대입하여 다양한 결과를 얻어내는 성질을 의미합니다.
- 다형성의 효과 : 하나의 타입으로 다양한 결과를 얻을 수 있고, 객체를 부품화하여 유지 보수를 용이하게 합니다.
오버라이딩과 비슷한 단어의 오버로딩이라고 있습니다. 그 둘은 명확히 다른 예약어 이므로 혼동되면 안됩니다.
그 둘을 비교해보겠습니다.
● 오버라이딩 관계에서의 메소드 호출
package 상속;
class AAA {
public void rideMethod(){
System.out.println("AAA's Method");
} // overriding (가려짐)
public void loadMethod(){
System.out.println("void Method");
} // overloading
}
class BBB extends AAA {
public void rideMethod(){
System.out.println("BBB's Method");
} // overriding (가려짐)
public void loadMethod(int num){
System.out.println("int Method");
} //overloading
}
class CCC extends BBB {
public void rideMethod(){
System.out.println("CCC's Method");
} // overriding
public void loadMethod(double num){
System.out.println("double Method");
} // overloading
}
public class RideAndLoad {
public static void main(String[] args) {
// 다형성 관계
AAA ref1 = new CCC();
BBB ref2 = new CCC();
CCC ref3 = new CCC();
// method overriding
ref1.rideMethod(); // CCC's Method
ref2.rideMethod(); // CCC's Method
ref3.rideMethod(); // CCC's Method
rideMethod(); 다형성의 overriding 되어 있으므로,
CCC 자료형의 overriding 되어 있는 rideMethod();로 실행한다.
// method overloading
ref3.loadMethod(); // void Method - AAA
ref3.loadMethod(1); // int Method - BBB
ref3.loadMethod(1.2); // double Method - CCC
}
}
메서드 rideMethod();가 ref1~ref3 까지 상속 관계로 정의된 메소드의 이름, 반환형, 매개 변수 선언까지 완전히 동일한 메소드가 정의 되어있기 때문에 rideMethod(); 의 결과 값은 ref1과 ref2이 가리워져서 ref3.rideMethod();의 값으로 출력됩니다.
instanceof 연산자와 객체의 타입 판단
: 레퍼런스가 가리키는 객체의 타입 식별을 위해 사용합니다 또한 상속 안에서만 의미를 가집니다.
- 형태 : 참조변수 instanceof 자료형
- 결과값 : boolean 값 (true = 참조변수가 자료형을 안다, false = 참조변수가 자료형을 모른다.)
● instanceof 연산자 사용예시
class Person { }
class Student extends Person { }
class Researcher extends Person { }
class Professor extends Researcher { }
public class InstanceOfEx {
static void print(Person p) {
if(p instanceof Person)
System.out.print("Person ");
if(p instanceof Student)
System.out.print("Student ");
if(p instanceof Researcher)
System.out.print("Researcher ");
if(p instanceof Professor)
System.out.print("Professor ");
System.out.println();
}
public static void main(String[] args) {
System.out.print("new Student() ->\t"); print(new Student());
System.out.print("new Researcher() ->\t"); print(new Researcher());
System.out.print("new Professor() ->\t"); print(new Professor());
}
}
new Student() -> Person Student
new Researcher() -> Person Researcher
new Professor() -> Person Researcher Professor -- new Professor() 객체는 Person 타입이기도 하고, Researcher, Professor 타입이기도 합니다.
주의) instanceof 가장 하단의 자식 class 부터 역순으로 비교하도록 해야지 원하는 자료형을 찾아볼 수 있습니다.
'빅데이터 > JAVA' 카테고리의 다른 글
[JAVA] 예외처리 (0) | 2020.05.15 |
---|---|
[JAVA] Abstract 클래스, Interface (0) | 2020.05.13 |
[JAVA] 상속(inheritance) (0) | 2020.05.05 |
[JAVA] 콘솔 출력 (0) | 2020.05.04 |
[JAVA] 배열 (array) (0) | 2020.05.02 |