오버로딩과 오버라이딩

JavaBeginner
지금 연습하기

소개

이 랩에서는 메서드 오버로딩 (method overloading) 과 메서드 오버라이딩 (method overriding) 에 대해 배우게 됩니다. 오버라이딩과 오버로딩은 Java 프로그래밍 언어에서 사용되는 두 가지 개념입니다. 두 개념 모두 프로그래머가 동일한 이름 아래에서 메서드에 대해 서로 다른 구현을 제공할 수 있도록 합니다. 오버로딩은 컴파일 시간에 발생하고, 오버라이딩은 런타임에 발생합니다. 정적 메서드는 오버로딩될 수 있지만 오버라이딩될 수 없습니다. 오버로딩은 정적 바인딩 (static bond) 인 반면, 오버라이딩은 동적 바인딩 (dynamic bond) 입니다.

오버로딩

이전 부분에서, 우리는 Person 클래스에 세 개의 생성자가 있었기 때문에 오버로딩을 이미 사용했습니다. 이것은 간단한 예시입니다. 오버로딩은 클래스가 동일한 이름을 가진 둘 이상의 메서드를 가질 수 있도록 하는 기능입니다. 이를 통해 우리는 다양한 상황을 처리할 수 있으며 혼란을 겪지 않을 수 있습니다. 일반적으로 오버로딩을 달성하는 세 가지 방법이 있습니다.

  • 서로 다른 매개변수 개수
  • 서로 다른 매개변수 유형
  • 서로 다른 유형의 매개변수 순서

예시:

/home/labex/project/overloadingTest.java 파일에 다음 코드를 작성하십시오.

public class overloadingTest{
    public static void main(String[] args){
        overloadingTest test = new overloadingTest();
        System.out.println("add(10,20)= " + test.add(10,20));
        System.out.println("add(10,20,30)= " + test.add(10,20,30));
        System.out.println("add(5.5, 10.5)= " + test.add(5.5f, 10.5f));

        test.printInfo(1 , "an error!");
        test.printInfo("another error!" , 2);
    }
    // this method has two int params, returns an integer
    int add(int a, int b){
        return a+b;
    }
    // this method has three int params, returns an integer
    int add(int a, int b, int c){
        return a+b+c;
    }
    // this method has two float params, returns a float number
    float add(float a, float b){
        return a+b;
    }
    // this method has one string param and one int param, returns nothing
    void printInfo(String str, int code){
        System.out.println("Code: " + code + "\nMessage: " + str);
    }
    // this method has one int param and one string param, returns nothing
    void printInfo(int code, String str){
        System.out.println("Code: " + code + "\nMessage: " + str);
    }
}

출력:

다음 명령을 사용하여 overloadingTest.java 파일을 실행하십시오.

javac /home/labex/project/overloadingTest.java
java overloadingTest

출력을 확인하십시오.

add(10,20)= 30
add(10,20,30)= 60
add(5.5, 10.5)= 16.0
Code: 1
Message: an error!
Code: 2
Message: another error!

오버라이딩

클래스가 상위 클래스에서 메서드를 상속받는 경우, 해당 메서드가 final 또는 private으로 표시되지 않은 경우 메서드를 오버라이딩할 수 있습니다. 오버라이딩을 통해 하위 클래스에 특정한 동작을 정의할 수 있으며, 이는 하위 클래스가 요구 사항에 따라 부모 클래스 메서드를 구현할 수 있음을 의미합니다. OOP 에서 오버라이딩은 기존 메서드의 기능을 재정의하는 것을 의미합니다. 반환 유형은 상위 클래스의 원래 (오버라이딩된) 메서드에서 선언된 반환 유형과 동일하거나 하위 유형이어야 합니다. 접근 수준은 오버라이딩된 메서드의 접근 수준보다 더 제한적일 수 없습니다. 예를 들어, 상위 클래스 메서드가 public으로 선언된 경우, 하위 클래스의 오버라이딩 메서드는 private 또는 protected일 수 없습니다. 우리는 또한 Animal (간단한 버전) 의 경우를 사용합니다.

예시:

/home/labex/project/overridingTest.java 파일에 다음 코드를 작성하십시오.

class Animal{
    public void grow(){
        System.out.println("I'm animal, I grow up.");
    }
    public void sleep(){
        System.out.println("I'm animal, I am sleeping.");
    }
}
class Dog extends Animal{
    // overriding method
    public void grow(){
        System.out.println("I'm dog, I grow up.");
    }
}
class Bird extends Animal{
    // keep superclass grow(), add own statements
    // overriding method
    public void grow(){
        super.grow();
        System.out.println("I'm bird, I grow up.");
    }
    // overriding method
    public void sleep(){
        System.out.println("I'm bird, I am sleeping...");
    }
    // Bird own method
    public void sing(){
        System.out.println("I'm bird, I am singing a song...");
    }
}
public class overridingTest{
    public static void main(String[] args){
        Dog dog = new Dog();
        dog.grow();
        Bird bird = new Bird();
        bird.grow();
    }
}

출력:

다음 명령을 사용하여 overridingTest.java 파일을 실행하십시오.

javac /home/labex/project/overridingTest.java
java overridingTest

출력을 확인하십시오.

I'm dog, I grow up.
I'm animal, I grow up.
I'm bird, I grow up.

요약

큰 프로젝트를 구성하려면 아키텍처에 대한 좋은 생각이 필요하므로, 이 랩에서 다루는 필수 개념을 알아야 합니다. 오버라이딩과 오버로딩은 메서드를 활용할 수 있는 더 많은 유연성을 제공합니다.