자바의 메소드 오버라이딩

mDev_97·2022년 1월 5일
0

Java

목록 보기
10/28

메소드 오버라이딩

• Method Overriding

• 슈퍼 클래스의 메소드를 서브 클래스에서 재정의하는 것

• 메소드의 이름, 매개변수 타입과 개수, 리턴 타입이 모두 동일하여야 한다.

동적 바인딩 발생
-> 서브 클래스에서 오버라이딩된 메소드가 무조건적으로 실행되는 것

• 슈퍼 클래스에서 선언된 메소드를 서브 클래스마다 새로 구현하는 기능

• 객체 지향의 다형성을 실현

class ExNumber {
    public void printNumber() {
        System.put.println("ExNumber");
    }
}
class NumberOne extends ExNumber {
    @Override
    public void printNumber() { // 오버라이딩
        System.out.println("NumberOne");
    }
}

class NumberTwo extends ExNumber {
    @Override
    public void printNumber() { // 오버라이딩
        System.out.println("NumberTwo");
    }
}

class NumberThree extends ExNumber {
    @Override
    public void printNumber() { // 오버라이딩
        System.out.println("NumberThree");
    }
}

public class MethodOverridingExample {
    public static void main(String[] args) {
        NumberTwo numberTwo = new NumberTwo();
        numberTwo.printNumber();
        
        ExNumber exNumber = new NumberTwo(); // 업캐스팅
        exNumber.printNumber();
        // 오버라이딩된 메소드를 호출한다.(동적 바인딩)
    }
}

• 실행 결과

NumberTwo
NumberTwo

오버라이딩과 super 키워드

super 키워드는 슈퍼 클래스의 멤버에 접근할 때 사용되는 레퍼런스

• 서브 클래스에서만 사용한다.

• 슈퍼 클래스의 메소드를 호출할 때 사용한다.

• 컴파일러는 super 의 접근을 정적 바인딩으로 처리한다.

class ExNumber {
    protected int number;
    
    public void showNumber() {
        printNumber();
    }
    
    public void printNumber() {
        System.put.println(number);
    }
}
class NumberOne extends ExNumber {
    protected int number;
    @Override
    public void printNumber() { // 오버라이딩
        number = 1;
        super.number = 0;
        super.printNumber(); // 정적 바인딩
        // ExNumber 클래스의 printNumber()를 호출
        System.out.println(number);
    }
}

public class OverridingAndSuperExample {
    public static void main(String[] args) {
        ExNumber exNumber = new NumberOne();
        exNumber.showNumber();
    }
}

• 실행 결과

0
1

메소드 오버로딩

같은 클래스나 상속 관계에서 동일한 이름의 메소드를 중복 작성 하는 것

• 이름이 같은 여러 개의 메소드를 중복 작성
-> 메소드 사용의 편리성을 향상하기 위해 사용

• 메소드 이름은 반드시 동일하여야 한다.

• 매개변수의 타입 또는 개수가 달라야 한다.

정적 바인딩



추상 메소드와 추상 클래스

추상 메소드(abstract method)

• 선언은 되어 있으나 구현되어 있지 않은 메소드

abstract로 선언

• 추상 메소드는 서브 클래스에서 오버라이딩하여 구현하여야 한다.

public abstract int getNumber();
public abstract void setNumber(int number);

추상 클래스(abstract class)

추상 메소드를 하나라도 가진 클래스
-> 클래스 앞에 abstract를 선언하여야 한다.

• 추상 메소드가 없더라고 abstract로 선언된 클래스

슈퍼 클래스에서는 개념을 정의하고 서브 클래스마다 목적에 맞게 추상 메소드를 다르게 구현하여 계층적인 상속 관계의 클래스 구조를 만들기 위해 사용

※ 추상 클래스는 객체를 생성할 수 없다.

// 추상 메소드를 포함하는 추상 클래스
abstract class ExNumber {
    abstract public printNumber();
}

// 추상 메소드는 없지만 abstract로 선언된 추상 클래스
abstract class NumberOne {
    int number;
    public void setNumber(int number) {
        this.number = number;
    }
    
    public int getNumber() {
         return number;
    }
}

public class AbstractClassExample {
    public static void main(String[] args) {
        ExNumber exNumber = ExNumber(); // 컴파일 오류!
        
        NumberOne numberOne = new NumberOne(); // 컴파일 오류!
    }
}

추상 클래스 상속

추상 클래스를 단순 상속

• 추상 클래스를 상속받아 추상 메소드를 구현하지 않으면 추상 클래스가 된다.
-> 서브 클래스도 abstract로 선언해야 한다.

추상 클래스를 구현하여 상속

• 서브 클래스에서 상속받은 추상 클래스의 추상 메소드를 구현하는 경우
-> 이 경우 서브 클래스는 추상 클래스가 아니다.

// 추상 클래스를 단순 상속하는 경우
// 추상 메소드 구현 x
abstract class ExNumer {
    abstract public void printNumber();
}

abstract class NumberOne extends ExNumber {
    public void showNumber() {
        System.out.println("1");
    }
}


// 추상 메소드를 구현하여 상속하는 경우
abstract class ExNumber {
    abstract public void printNumber();
}

class NumberOne extends ExNumber {
    @Override
    public void printNumber() { // 오버라이딩
        System.out.println("1");
    }
}
profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글

관련 채용 정보