쌓고 쌓다

[JAVA] 메소드 오버라이딩 / super 키워드 본문

프로그래밍/java

[JAVA] 메소드 오버라이딩 / super 키워드

승민아 2021. 12. 26. 20:34

메소드 오버라이딩

슈퍼 클래스에 작성된 메소드와 동일하게 똑같이 서브 클래스에 재작성하는 것이다.

이는 슈퍼 클래스의 메소드를 무시하고 서브 클래스에 오버라이딩 된 메소드를 실행할 수 있게 해 준다.

 

예시

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();


    }
}

실행 결과

Comments