Override (오버라이드)
다형성을 구현하기 위한 Override
- 육군(Army), 해군(Navy), 공군(AirForce) 은 Unit이라는 클래스를 통하여 공통 속성을 정의하고 있다.
- 공통속성은 : 이름(멤버변수 및 getter, setter),
공격(attack() 메서드)
- 같은 이름이지만 다른 동작을 수행해야 하는 필요성
-> 모든 군대는 '공격'이라는 공통된 특성을 갖지만 공격하는 방법은 육/해/공군이 서로 다르게 처리되어야 한다.
위와 같은 상황에서 부모클래스에게 물려받은 attack() 메서드를 "재정의" 하는 것을 Override(오버라이드)라 한다.
-
부모 클래스에 정의된 것과 동일한 이름을 갖는 메서드를 자식 클래스가 정의한 경우,
부모 클래스의 기능은 자식에게 가려진다.
-
하나의 이름으로 다양한 효과 얻기
-> 모든 자식클래스가 동일한 이름의 메서드를 갖게 되므로 각 객체에 대하여
attack()이라는 이름을 사용하여 서로 다른 형태를 구현할 수 있게 된다.
메서드 재정의 과정에서 오타가 발생한 경우
- 부모 클래스의 'say()'메서드를 재정의 하는 과정에서 개발자의 실수로 'sai()' 라고 메서드가 추가되었다면, Java는 새로운 메서드가 추가한 것으로 인식하고 특별한 에러를 표시하지 않는다.
때문에 자바에선 위와 같은 메서드 재정 과정에서의 오타 방지 옵션이 있는데, 바로 @Override 이다.
@Override
부모 클래스의 메서드를 재정의 하고자 할 경우, 의도치 않은 실수를 예방하기 위한 '오타 방지용 옵션' 이다.
여러 개의 메서드를 재정의 한다면 재정의 되는 모든 메서드들 위에 각기 명시해야 한다. (필수는 아님)
Overload (오버로드)
- 원칙적으로 하나의 클래스 안에는 동일한 이름의 메서드가 두개 이상 존재할 수 없지만, 이를 가능하게 하는 예외적인 처리 기법.
이름이 동일한 메서드를 정의하기 위한 조건
- 메서드간의 파라미터가 서로 달라야한다.
- 파라미터의 데이터 타입이 다르다.
(데이터 형이 동일하고 변수의 이름이 다른경우는 동일한 파라미터로 인식된다)
- 파라미터의 개수가 다르다.
- 서로 다른 데이터형을 갖는 파라미터들의 전달 순서가 다르다.
- 리턴형이 다른 경우는 오버로드의 성립에 아무런 영향을 주지 않는다.
오버로드 예시
- 파라미터의 데이터형이 서로 다르기 때문에 오버로드 성립
public void user(int a){ .. }
public void user(long a){ .. }
- 파라미터의 개수가 서로 다르기 때문에 오버로드 성립
public void user( int a ){..}
public void user( int a, int b ){..}
- 데이터 형의 전달 순서가 서로 다르기 때문에 오버로드 성립
public void user(int a, String b){..}
public void user(String b, int a ){..}
public void user(int a, String b){...}
public void user(int b, String a){...}
생성자의 Overload
- 객체 생성 방법의 다양화
- 생성자 역시 메서드의 한 종류이므로 Overload가 가능하다
- 생성자를 Overload 할 경우, 해당 클래스에 대해 '객체를 생성하는 방법'을 다양하게 준비할 수 있게 된다.
this 키워드를 사용한 생성자 Overload
- this 키워드의 용법
-> 메서드처럼 사용할 경우, 현재 클래스의 다른 생성자를 의미한다.
- this 키워드를 사용하여 생성자 Overload를 간결하게 처리하기
- 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록 하여,
데이터의 초기화를 한 곳에서 일괄적으로 처리하도록 구현할 수 있다.