본문으로 바로가기

1. 오버라이딩

 

오버라이딩과 오버 로딩에 대해서는 공부를 하면서 종종 들어왔다.

정확한 개념과 용법에 대해서 정리하자면 시간이 오래 걸리겠지만

간단하게 이해하려면 다음과 같이 이해할 수 있다.

 

오버로딩 - 가령 생성자를 생성자(), 생성자(매개변수) 등과 같이 동일한 이름이지만 사용방식이 다른 문법.

오버라이딩 - 상속관계에 있는 클래스간 이름과 사용방식이 같지만, 클래스에 의해 구별되는 메서드.

 

이 오버라이딩은 후에 설명할 다형성을 가능하게 해주는 중요한 기법이다.

 

2. 캐스팅

상속성과 관련 있는 오버라이딩을 이해하기 위해서는 먼저, 업 캐스팅에 대해서 알아야한다.

쉽게 말해서, 하위클래스를 상위클래스로 캐스트 변환해 주는 것이다. 그리고 업 캐스팅은 주로 묵시적, 즉 특별한 기법 없이

배정문을 통해 간단하게 구현할 수 있다.

ex)  상위클래스 이름 = new 하위클래스생성자();

 

그러면 각 클래스의 정보에 대한 접근은 어떻게 이루어질까?

만약 Customer에는 이름, 고객번호 정보가 있고

VipCustomer는 Customer를 상속하고 추가로 개인 담당 직원이 배정되어 있다.

Customer lee = new VipCustomer(); 와같이 업 캐스팅을 통해 lee라는 객체를 생성했다면,

원래는 VipCustomer의 정보가 아닌 Customer에 정의된 변수와 메서드에만 접근이 가능하다.

즉, VipCustomer 에는  개인 담당자 변수가 있지만, Customer로 업캐스팅 했다면! Customer에는 이와 같은

내용이 포함되어 있지 않기 때문에 사용할 수 없다!

 

그러나! 만약 이미 Customer 클래스에 showinfo()라는 고객이름과 번호를 출력하는 메서드가 정의 되어있었고,

VipCustomer에 같은 이름으로 showinfo()라는 고객이름과 번호, 담당 직원과 할인율 등 vip고객에 대한 정보를 출력하는 메서드가

오버라이딩 되어 정의 되어 있다면!

다른 변수와 메서드들과는 다르게 오버라이딩 된 메서드는 상위클래스의 메서드가 아닌 this인 하위클래스의 메서드가 사용된다.

이는 메서드 이름도 하나의 주소에 저장되는데, 오버라이딩 되면서 새로운 주소에 메서드가 저장되고 그것이 호출된다고 추상적으로 이해하면 되겠다.

 

그럼 결론적으로, 다음과 같은 이점을 얻을 수 있다.

하나의 어레이리스트에 vip,gold,silver 등 여러 클래스의 고객정보를 Customer라는 상위 클래스로 업캐스팅 하여 담는다면!

각 클래스별, 고객정보를 뽑는 메서드를 이름을 다르게 설정해주어, 여러 if문 분류를 통해 자기에 맞는 메서드를 호출할 필요 없이!

그저 각 클래스에 같은 이름을 지닌 메서들을 정의해 놓았다면, 업캐스팅 되어도 그 메서드에 접근하기 때문에

같은 showinfo() 호출 명령어로 모든 클래스의 동일한 목적의 메서드를 수행할 수 있다. ( 수행되는 내용은 클래스별 다름!)

 

이와 같은 성질을 다형성이라 한다. 또한 이때 컴파일러가 에러를 반환하지 않도록

@Override   어노테이션을 위에 선언해주면 더욱 안전성이 확보된다.

 

다운 캐스팅에 대하여 알아보도록 하자.

 

업캐스팅과 상속, 다형성은 불필요한 if문을 통해 분류하는 과정을 비약적으로 단축시켜준다.

그런데 아무리 비슷한 성질을 구체화한 종속 관계라도, 분명 다른 기능을 수행하는 상황이 온다.

그러나 이미 그 객체는 업캐스팅을 한 상태여서 다른 기능을 정의해놓은 메서드에 접근이 불가능하다.

이때 필요한 것이 다운캐스팅이다!

 

가령 동물이라는 상위 클래스에 포유류, 조류, 어류 등과 같은 하위 클래스들이 있다면,

업캐스팅을 통해 자다, 먹다, 정보 출력과 같은 공통적인 행위는 오버라이딩을 통한 다형성 메서드를 통해 처리가 가능하지만,

포유류가 걷다, 조류가 날다, 어류가 헤엄치다 와 같이 클래스별 각기 다른 메서드를 호출해야할 필요성도 있다.

 

업캐스팅을 통해 객체를 관리하던 이때! 다운캐스팅을 통해 조건에 맞게 각 메서드를 수행할 수 있다.

=> 업캐스팅된객체 instanceof 다운캐스팅하고자하는클래스

는 boolean 값을 반환하는 수행어로, 객체가 원래 하위 클래스였다면 true를 반환하며 이와 같은 과정을 통해

자신이 다운 캐스팅을 하고자하는 클래스를 분별할 수 있으며, 최종적으로는

=> 원하는클래스 temp = (원하는클래스) 업캐스팅된객체 

=> temp.메서드();

를 통해 다운캐스팅을 진행할 수 있다.

 

오늘 알아본 내용을 쉽게 정리해보자면

 

상위 클래스 : 동물 {종 이름, 나이}

하위 클래스 : 포유류, 조류, 어류

오버라이딩 메서드 : 먹다, 자다, 객체정보출력

다운캐스팅을 통한 행위 구현 : 포유류 - 걷다, 조류 - 날다, 어류 - 헤엄치다

 

동물 사자 = new 포유류(); // 업캐스팅

동물 독수리 = new 조류(); // 업캐스팅

동물 참치 = new 어류(); // 업캐스팅

 

3객체를 ArrayList animal 에 담는다.

 

for(동물 임시 : animal){ // 오버라이딩, 다형성

     임시.객체정보출력();

     임시.자다();

}

 

for(동물 임시 : animal){ //  다운캐스팅

      if( 임시 instanceof 포유류){

           포유류 임시2 = (포유류)임시;

           임시2.걷다();

      }

      else if( 임시 instanceof 조류){

           조류 임시2 = (조류)임시;

           임시2.날다();

      }

      else if( 임시 instanceof 어류){

           어류 임시2 = (어류)임시;

           임시2.헤엄치다();

      }

}

CS 공부Java, Spring (재정리)카테고리의 다른글

Spring - DI, IoC  (0) 2021.03.25
java template 메서드  (0) 2020.01.02
java abstract 클래스, 추상클래스  (0) 2020.01.02
자바 항목에 있는 글들은  (0) 2020.01.01
java 상속성  (0) 2020.01.01