어려울 거 같아서 미뤄뒀던 프로그래밍 공부 이번에 숨 딱 참고 Java 다이브 💦
이렇게 부모클래스가 갖고 있는 기능을 자식 클래스가 재정의 하도록 하는 것을 오버라이드라고 해요.
class Hello{
public void say() {
System.out.println("Hello");
}
}
class English extends Hello{ }
class Korean extends Hello{
public void say() {
// 부모클래스 Hello에 정의되어있는 say() 메서드를 재정의
// => 오버라이드(Override)
System.out.println("안녕하세요");
}
}
public class Main03 {
public static void main(String[] args) {
English e = new English();
e.say(); // 자식 클래스에 구현된 메서드가 없기 때문에,
// 부모 클래스에 정의된 메서드를 찾아가게 된다.
Korean k = new Korean();
k.say(); // 자식 클래스가 부모와 같은 이름의 메서드를 정의하고 있기 때문에,
// k 객체에게는 부모 클래스가 정의하고 있는 say()메서드가 가려지게 된다.
}
}
클래스의 상속관계에서 자식 클래스가 부모 클래스를 가리키는 예약어
class User{
private int age;
public int getAge(){
return age;
}
public void setAge( int age ){
this.age = age;
}
}
class A extends User{
public void print( int age ){
// super.age는 부모클래스인 User의 멤버변수 age를 뜻한다.
super.age = age;
}
}
class B extends User{
public void print( int age ){
// this.age는 부모클래스인 User의 멤버변수 age를 뜻한다.
this.age = age;
}
}
class Calc{
public void plus(int x, int y){
System.out.println(x + y);
}
}
class A extends Calc{
public void plus(int x, int y){
super.plus();
}
}
class B extends Calc{
public void plus(int x, int y){
this.plus();
}
}
class Hello{
public void say(){
System.out.println("Hello");
}
}
class Korean extends Hello{
// Korean 클래스에 의해 say()메서드가 Override 된 경우
public void say() {
super.say(); // 부모 클래스에 say()의 원본 메서드를 의미
System.out.println("안녕하세요."); // 부모 클래스에 say()를 오버라이드 하여 재구현
}
public void sayHello() {
super.say(); // 부모클래스(Hello)의 say() 호출
this.say(); // 나 자신(Korean)의 say()호출
}
}
class Hello{
Hello(){
...
}
}
class Korean extends Hello{
Korean() {
super(); // 부모 클래스의 생성자 Hello(){}를 의미
}
}
부모 생성자의 강제 호출
- 생성자가 정의된 클래스를 상속받은 경우에는 자식클래스의 생성자를 통해서 부모 생성자를 강제로 호출해야 해요.
- 부모의 생성자를 호출하는 방법은 super 키워드를 메서드 이름으로 사용하면 돼요.
class Hello{
Hello( String input ){
System.out.println(input);
}
}
class Korean extends Hello{
// 파라미터가 없으므로 에러
//Korean() {
// super();
//}
Korean( String input ) {
//super 키워드를 사용하여 부모의 생성자 강제 호출
super(input);
}
}
메서드 재정의 과정에서의 오타 방지 옵션
- @Override(어노테이션)는 이 키워드가 명시된 위치 아래에 정의되는 메서드가 부모 클래스에 존재하지 않을 경우 구문 에러로 처리해요.
- 부모 클래스의 메서드를 재정의 하고자 할 경우, 의도치 않은 실수를 예방하기 위한 오타 방지용 옵션이에요.
- 여러 개의 메서드를 재정의 한다면 재정의 되는 모든 메서드들 위에 각기 명시해야해요.
(1) 자바 어노테이션(Java Annotation) : 자바 소스 코드 사이에 @ 기호를 앞에 붙여서 사용하는 주석이다.
class Hello{
public void say(){
System.out.println("Hello");
}
}
class korean extends Hello{
@Override
public void say(){
System.out.println("안녕하세요.");
}
}
다음 다이브에서 또 만나요 🌊
출처
https://media.giphy.com/media/l2Je1bFuOpkNpyqYM/giphy.gif
https://media.giphy.com/media/Jbb3KS22397YQ/giphy.gif