메서드 오버라이딩(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

+ Recent posts