메소드 재정의 (오버라이딩)
- 부모 클래스의 메소드가 자식 클래스에서 사용하기에 부적합한 경우 자식 클래스에서 수정하여 사용
- 부모가 가진 메소드를 자식에 물려줌 자식 입장에서 그대로 사용하기에는 부적합한 경우가 있음
- 자식클래스에서 다시 정의(선언)해서 사용
- 부모의 메소드 내용이 A였다면 자식은 같은 메소드를 가져오지만 내용은 B로 바꿀 수 있음
- 즉, 부모 클래스로부터 상속받은 메소드의 내용을 재정의(변경)하는 것을 말한다.
- 메소드 재정의 방법
-
부모 메소드와 동일한 시그니처 가져야 함
- 부모에서 선언된 방식대로 자식이 선언해야 함
- 부모의 선언부 같아야 함
- 즉, 이름/매개변수/반환타입이 같아야 함
-
접근 제한 더 강하게 재정의할 수 없음
- 접근제한자를 변경할 수 있으나 부모가 가진 접근제한자보다 강하게는 바꿀 수 없음
-
새로운 예외를 throws할 수 없음
- 새로운 예외를 발생시킬 수 없음
- 부모 클래스의 메소드보다 더 많은 수의 예외를 선언할 수 없음
+메소드를 새로 작성하는 것이 아니고 내용만 새로 작성하는 것임을 기억하자!
- 메소드가 재정의될 경우 부모 객체 메소드가 숨겨지며, 자식 객체에서 메소드 호출하면 자식 메소드가 호출됨
- 부모메소드1
- 자식메소드1
- 자식메소드2
- 외부에서 메소드1을 호출하면 자식메소드가 재정의했기때문에 자식메소드1이 호출됨
@Override 사용하기
@Override
메소드( ) { //메소드 부모로부터 상속 받은 메소드(구현부가 같은 메소드)
}
- 자식 메소드 위에 @Override 를 입력하면메소드를 재정의할 때 부모의 메소드와 같은지 검사해 준다.
- 메소드 선언부가 부모와 같다.
- 메소드 구현부를 재정의하는 방식
- @Override 어노테이션을 이용해서 오버라이드 되었음을 알려준다.
- @어노테이션(annotation): 자바에서 특정 기능을 수행되도록 미리 정의하고 해당코드 바로 위에 작성하면 특정기능이 수행된다.
- 아래 메소드가 부모로부터 상속되었음을 알 수 있음
- 오버라이드된 메소드는 자식메소드가 구현
- 단, super 키워드를 사용하면 부모메소드도 구현가능
- 자식클래스에서 오버라이드 메소드를 구현(implement)할 때 자동 설정이 가능하다.
- 부모메소드의 이름을 어느정도 치도 컨트롤 스페이스하면 부모메소드명과 오버라이드글자 뜸 엔터하면 됨
부모 메소드 호출
- 메소드가 호출이 되면 재정의된 자식 메소드를 호출함
- 부모 메소드를 호출하고 싶을 경우가 있는데 자식메소드 내부에서 호출해야 함(자식외부에서는 불가능)
super
- 자식 객체 생성할 때 부모 객체가 먼저 생성되고 그 다음 자식 객체가 생성됨
- 자식 생성자의 맨 첫 줄에서 부모의 기본 생성자가 호출됨 → super( );자동으로 생성됨
- super은 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다.
- 멤버변수와 지역변수의 이름이 같을 때 this로 구별한 것과 매우 유사하다.
- 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때 super로 구별할 수 있다.
- this() 같은 클래스의 다른 생성자를 호출, super()는 부모 클래스의 생성자를 호출하는데 사용
- 부모 생성자가 기본생성자가 아닐 경우
- 부모 생성자가 매개변수를 가지고 있는 경우 명시적으로 호출해야 함
- 자식생성자에서 다음과 같이 부모생성자를 호출해야 함
- public SportsCar ( 매개변수 선언, …) {
super (부모의 매개값, …);
}
다형성 (Polymorphism)
- 부모타입의 객체참조 변수로 여러 자식객체(인스턴스)를 참조할 수 있다.
- 하나의 메소드는 객체가 다양한 기능을 구현할 수 있는 것 → 오버라이딩, 오버로딩