풀스택 과정 day10_Java
22.3.18.(금)
다형성과 Override
1. 다형성 - 오버라이드
- 클래스 다이어그램에서 육군(Army), 해군(Navy), 공군(AirForce)은
Unit이라는 클래스를 통하여 공통 속성을 정의하고 있다.
- 공통속성 : 이름(멤버변수 및 getter, setter), 공격( attack( ) 메서드 )
- 같은 이름이지만 다른 동작을 수행해야 하는 필요성
-> 모든 군대는 '공격'이라는 공통된 특성을 갖지만, 공격하는 방법은
육/해/공군이 서로 다르게 처리되어야 한다.
- 부모 클래스가 가지고 있는 기능을 자식 클래스가 재정의
-> 부모 클래스에 정의된 것과 동일한 이름을 갖는 메서드를
자식 클래스가 정의한 경우, 부모 클래스의 기능은 자식에서 가려진다.
-> 이렇게 부모의 기능을 재정의 하는 것은 메서드 Override 라 한다.
- 하나의 이름으로 다양한 효과 얻기
-> 모든 자식 클래스가 동일한 이름의 메서드를 갖게 되므로 각 객체에 대하여
attack( )이라는 이름을 사용하여 서로 다른 형태를 구현할 수 있게 된다.
< say( ) Override 예제 >
1-1. super 키워드
- 클래스의 상속 관계에서 자식 클래스가 부모 클래스를 가리키는 예약어
- 사용방법
-> 멤버변수 이름 앞에 명시
: 부모 클래스의 멤버변수를 의미한다. 하지만 부모 클래스의 멤버변수는
이미 모두 상속되어 있기 때문에 이 경우에는 this 키워드를 사용하는 것과
동일한 결과이기에 잘 사용하지 않는다.
-> 메서드 이름 앞에 명시
: 부모 클래스의 메서드를 의미한다.
: 재정의(Override) 되지 않은 메서드
- 이미 상속되어 있기 때문에 this 키워드를 사용하는 것과 동일한 결과를 갖는다.
: 재정의(Override) 된 메서드
- Override된 메서드 이름 앞에 사용하게 되면 재정의 되기 이전의
원본 메서드를 의미한다.
-> 키워드 자체를 메서드처럼 사용
: super( );
: 부모 클래스의 생성자를 의미한다.
< say( ) 메서드의 Override와 super를 통한 부모 클래스의 메서드 호출 >
1-2. 상속 관계에서의 생성자 처리
- 생성자가 정의된 클래스의 상속 제한
- 생성자는 상속되지 않는다.
- 하지만 생성자가 정의된 클래스는 객체 생성을 위해서 생성자 파라미터를 반드시
전달받아야 하기 때문에, 파라미터를 갖는 생성자가 정의된 클래스를 상속 받게 되면
에러가 발생된다.
- 부모 생성자의 강제 호출
-> 생성자가 정의된 클래스를 상속받는 경우에는 자식 클래스의 생성자를 통해서
부모 생성자를 강제로 호출해야 한다.
-> 부모의 생성자를 호출하는 방법은 super 키워드를 메서드 이름으로
사용하는 것이다.
< 생성자가 정의된 클래스의 상속과 부모 클래스의 생정자 호출 >
< 기본 생성자는 보통 생략이 되므로, super( ) 또한 자손 클래스의 생성자에서 자동적으로 호출된다. >
< 부모 클래스의 생성자가 "String str"을 파라미터로 가질 때, 자손 클래스의 생성자에서 super(str)을 해줘야하며,
자손 클래스의 생성자 또한 부모 클래스의 생성자와 동일한 "String str"을 파라미터로 가져야한다. >
Quiz.
< Unit, Army를 참고하여
Navy, AirForce를 완성하고
main 메서드가 포함된 class 생성해서
Army, Navy, AirForce의 객체를 각각 생성해서 attack 호출 >
1-3. 메서드 재정의 과정에서 오타가 발생한 경우
- 부모 클래스의 say( ) 메서드를 재정의 하는 과정에서 개발자의 실수로 인해
"sai( )" 라는 메서드가 추가되었다면, Java는 새로운 메서드를 추가한 것으로 인식하고,
특별한 에러를 표시하지 않는다.
- say( ) 메서드가 재정의된 것을 생각한 개발자는 이 경우
의도하지 않은 결과를 만나게 될 것이다.
1-4. @Override 옵션(오버라이드 어노테이션)
- "@Override" 은 이 키워드가 명시된 위치 아래에 정의되는 메서드가 부모 클래스에
존재하지 않을 경우 구문 에러로 처리한다.
- 부모 클래스의 메서드를 재정의 하고자 할 경우 의도치 않은 실수를 예방하기 위한
'오타 방지 옵션' 이다.
- 여러 개의 메서드를 재정의 한다면 재정의 되는 모든 메서드를 위에 각기 명시해야 한다.
< 부모 클래스인 Unit 클래스이며, 멤버변수 name과 "String str"을 파라미터로 가지는 생성자, getter, setter 메서드
그리고 자손 클래스에서 재정의 될 attack( ) 메서드가 존재한다. >
< 각각 Unit의 자손 클래스인 Army, Navy, AirForce 클래스이며, 부모 클래스와 동일하게 "String str"을 파라미터로 가지는 생성자를 포함하며, 부모 클래스의 attack( ) 메서드를 Override 하였다. 마지막으로 각 클래스의 독자적인 메서드를 추가시켰다. >
< 위의 Unit, Army, Navy, AirForce 클래스에 대한 자손 클래스의 객체 생성과 메서드 출력 >
Author And Source
이 문제에 관하여(풀스택 과정 day10_Java), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@doby98/풀스택-과정-day10Java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)