쌓고 쌓다
[JAVA] 메소드 오버라이딩 / super 키워드 본문
메소드 오버라이딩
슈퍼 클래스에 작성된 메소드와 동일하게 똑같이 서브 클래스에 재작성하는 것이다.
이는 슈퍼 클래스의 메소드를 무시하고 서브 클래스에 오버라이딩 된 메소드를 실행할 수 있게 해 준다.
예시
class Person
{
void Speak()
{
System.out.println("사람입니다.");
}
}
class Student extends Person
{
void Speak() // Student에 오버 라이딩
{
System.out.println("학생입니다.");
}
}
Person 클래스의 Speak는 사람입니다. 라고 출력을
Student 클래스의 Speak는 학생입니다.라고 출력을 하는 메소드를 작성했습니다.
Person person = new Person();
person.Speak();
Student student = new Student();
student.Speak();
위의 코드를 실행하게 된다면
아래와 같이 Person과 Student 각자의 Speak를 실행합니다.
실행 결과
위의 예시는 레퍼런스와 객체가 동일하여 쉽게 이해가 가지만 업 캐스팅의 경우 헷갈릴 수 있다.
Person person = new Student(); // 업 캐스팅
person.Speak();
실행 결과
Person 클래스를 가리키는 person 레퍼런스이지만, person이 가리키는 객체는 Student이기에
오버라이딩한 Student 클래스의 Speak 메소드가 실행된다.
@Override 사용법
메소드의 오버라이딩에서 개발자들이 가끔 메소드의 원형과 다르게 작성하는 실수를 하는데
이 실수를 방지하고자 @Override라는 주석문(Annotation)을 제공하고 있다.
class Person
{
void Speak()
{
System.out.println("사람입니다.");
}
}
class Student extends Person
{
void Speok() // Speok??? 실수
{
System.out.println("학생입니다.");
}
}
public class Main{
public static void main(String[] args) {
Student student = new Student();
student.Speak();
}
}
실행 결과
위처럼 개발자가 실수로 원형을 달리했지만 컴파일러는 새로운 메소드의 작성인줄 알기에 컴파일 오류를 발생 시키지 않고 정상 실행이 된다.
이를 방지하고자 아래처럼 @Override를 사용한다.
class Person
{
void Speak()
{
System.out.println("사람입니다.");
}
}
class Student extends Person
{
@Override // 오버 라이딩이 정확한지 컴파일러가 확인
void Speak()
{
System.out.println("학생입니다.");
}
}
메소드 오버라이딩시 주의점
1. 슈퍼 클래스와 동일한 원형으로 작성해야 한다.
2. 슈퍼 클래스의 접근 지정자보다 접근 범위를 줄여서 작성할 수 없다.
슈퍼 클래스에 protected로 작성된 메소드는 서브 클래스에서 protected, public으로만 오버라이딩 가능
public은 public으로만 오버라이딩 가능
3. static, private 또는 final로 선언된 메소드는 서브 클래스에서 오버라이딩을 할 수 없다.
super 키워드
super.슈퍼클래스의멤버(함수,변수 모두 가능)
super는 슈퍼 클래스에 대한 레퍼런스이다.
메소드가 오버라이딩 되어있으면 항성 서브 클래스의 메소드만 실행되는데
super 키워드로 슈퍼 클래스의 멤버에 접근이 가능하다.
class Person
{
void Speak()
{
System.out.println("사람입니다.");
}
}
class Student extends Person
{
void Speak()
{
super.Speak(); // 슈퍼 클래스의 메소드에 접근
System.out.println("학생입니다.");
}
}
public class Main{
public static void main(String[] args) {
Student student = new Student();
student.Speak();
}
}
실행 결과
'프로그래밍 > java' 카테고리의 다른 글
[JAVA] 인터페이스(interface) (0) | 2021.12.28 |
---|---|
[JAVA] 추상 클래스 (0) | 2021.12.27 |
[JAVA] 업 캐스팅, 다운 캐스팅 / instanceof 연산자 (0) | 2021.12.25 |
[JAVA] super() 과 상속에서의 생성자 순서 (0) | 2021.12.25 |
[JAVA] final 키워드 (0) | 2021.12.24 |