메소드 오버라이딩(메소드 재정의)
- 상속받은 부모 클래스의 메소드를 자식클래스에서 재정의해서 사용하는 것
- 오버라이딩되면 부모 클래스의 메소드는 무시되고, 자식 클래스의 메소드만 실행된다. (=동적 바인딩이라고도 한다.)
메소드 오버라이딩 작성
- 부모 메소드의 이름, 리턴타입, 매개변수가 동일해야 한다.
- 접근을 막는 범위를 더 작게 변경할 수 없다. ex) publc -> private 변경 못함
- static, private, final로 선언된 메소드는 오버라이딩 할 수 없다.
- 부모 메소드에 없는 예외를 throw할 수 없다.
@Override
- 컴파일시에 오버라이딩 제대로 되었는 지 확인하라는 의미이다.
- 잘못 되었다면 컴파일 에러 출력하는 어노테이션
- 생략가능
class Red {
public void print(){
System.out.println("Red");
}
}
class Green extends Red{
@Override //오버라이딩 제대로 되었는지 컴파일시 확인하라는 표시
public void print(){
System.out.println("Green");
}
}
class Yellow extends Green{
@Override //오버라이딩 제대로 되었는지 컴파일시 확인하라는 표시
public void print(){
System.out.println("Yellow");
}
}
public class Solution {
public static void main(String[] args){
Red red = new Red(); //Red 객체 생성
red.print(); //Red에 오버라이딩된 print() 실행
Green green = new Green(); //Green 객체 생성
green.print(); //Green에 오버라이딩된 print() 실행
Yellow yellow = new Yellow(); //Yellow 객체 생성
yellow.print(); //Yellow에 오버라이딩된 print() 실행
}
}
//결과
//Red
//Green
//Yellow
메소드 오버라이딩을 하면 부모 메소드를 무시하는 것과 같다. -> 부모 메소드에 있던 내용을 자식 메소드에도 작성해주어야 한다.
동적 바인딩에 의해 생기는 이 문제를 해결하기 위해 super를 사용한다.
super 키워드를 이용해서 정적 바인딩을 통해 부모 클래스에 접근할 수 있다.
class Green {
public void print(){
System.out.println("Green");
}
}
class Yellow extends Green{
public String color = "green";
@Override
public void print(){
if(color.equals("yellow"))
System.out.println("Yellow");
else
super.print();
}
}
public class Solution {
public static void main(String[] args){
Yellow yellow = new Yellow(); //Yellow 객체 생성
yellow.print(); //color="green" -> 부모메소드 실행
yellow.color="yellow";
yellow.print(); //color="yellow" -> 자식메소드 실행
yellow.color="green";
yellow.print(); //color="green" -> 부모메소드 실행
}
}
//결과
//Green
//Yellow
//Green
이런 메소드 오버라이딩이 자바에서 사용되는 이유는 자바의 다형성 때문이다.
자바의 다형성
- 객체 사용 방법(동일한 메소드 사용)은 동일하지만 다양한 결과가 나오는 것
메소드 오버라이딩과 메소드 오버로딩
- 오버라이딩: 상속받은 메소드를 재정의하는 것
- 오버로딩: 새로운 메소드를 정의하는 것
오버라이딩은 기존의 메소드 재정의 -> 기존 메소드의 이름, 리턴타입, 매개변수가 같아야함
오버로딩은 새로운 메소드 정의 -> 기존 메소드의 이름은 같되, 리턴타입이나 매개변수가 달라야 한다.
'JAVA' 카테고리의 다른 글
[JAVA(자바)] 추상 클래스(abstract)와 봉인된 클래스(sealed) (0) | 2023.01.20 |
---|---|
[JAVA(자바)] 업캐스팅과 다운캐스팅 (feat. 다형성, instanceof) (0) | 2023.01.19 |
[JAVA(자바)] 상속과 생성자(super()) (0) | 2023.01.17 |
[JAVA(자바)] 접근 제한자(public, protected, default, private) (0) | 2023.01.16 |
[JAVA(자바)] 패키지(package) (0) | 2023.01.16 |
댓글