웹개발/JAVA

Overloading vs Overriding

bergerac 2025. 2. 21. 09:11

1. 오버로딩(Overloading)

  • 같은 클래스 내에서 같은 이름을 가진 메서드(또는 생성자)를 매개변수의 개수나 타입을 다르게 하여  여러개 정의하는 것을 의미합니다.
  • 생성자 오버로딩을 사용하면 객체를 유연하게 생성할 수 있습니다.

      1) 주의점

  • 메서드명은 동일하게 사용합니다.
  • 매개변수의 타입, 개수, 순서 중 적어도 하나 이상은 달라야 한다
  • 반환타입은 상관없습니다.
  • 메서드 동작을 다양한 상황에 맞게 조정합니다.

     2) 예제코드

기본 생성자: 아무런 값을 초기화하지 않음
매개변수 2개 생성자: name, studentID 초기화
매개변수 3개 생성자: name, studentID, residentNum 초기화

 

// Student 클래스를 정의 (Class라는 이름은 예약어이므로 피함)
public class Student {
    private String name;
    private int studentID;
    private int residentNum;
    boolean isBusan;

    // 기본 생성자
    public Student() {
        System.out.println("기본 생성자가 호출되었습니다.");
    }

    // 매개변수 2개인 생성자 (이름과 학번 초기화)
    public Student(String name, int studentID) {
        this.name = name;
        this.studentID = studentID;
        System.out.println("2개 매개변수를 가진 생성자가 호출되었습니다.");
    }

    // 매개변수 3개인 생성자 (이름, 학번, 주민번호 초기화)
    public Student(String name, int studentID, int residentNum) {
        this.name = name;
        this.studentID = studentID;
        this.residentNum = residentNum;
        System.out.println("3개 매개변수를 가진 생성자가 호출되었습니다.");
    }

    // 학생 정보를 출력하는 메서드
    public void printInfo() {
        System.out.println("이름: " + name + ", 학번: " + studentID + ", 주민번호: " + residentNum);
    }

    // 실행 테스트 코드
    public static void main(String[] args) {
        Student s1 = new Student(); // 기본 생성자 호출
        Student s2 = new Student("cyrano", 12345); // 2개 매개변수 생성자 호출
        Student s3 = new Student("bergerac", 67890, 123456789); // 3개 매개변수 생성자 호출

        // 학생 정보 출력
        s2.printInfo();
        s3.printInfo();
    }
}

 

<출력결과>

기본 생성자가 호출되었습니다.
2개 매개변수를 가진 생성자가 호출되었습니다.
3개 매개변수를 가진 생성자가 호출되었습니다.
이름: cyrano, 학번: 12345, 주민번호: 0
//주민번호에 아무것도 입력하지 않은 경우에는 default value로 설정됨
//현재 이 코드에서는 0으로 설정
이름: bergerac, 학번: 67890, 주민번호: 123456789

 

 


2. 오버라이딩(Overriding)

[1]오버라이딩(Overriding)이란?

오버 라이딩은 부모 클래스에서 정의한 메서드를 자식 클래스에서 재정의하는 것을 의미합니다.

이를 통해 부모 클래스의 동작을 유지하면서도, 자식 클래스에 맞게 동작을 변경할 수 있습니다.

<특징>

  • 메서드 시그니처(메서드명, 매개변수)가 부모 클래스와 동일해야 한다.
  • 반환 타입은 동일하거나, 부모 타입으로 변환 가능한 타입이어야 한다.
  • 메서드명 위에 @Override 어노테이션을 작성하는 것이 권장된다.
  • super 키워드를 사용하면 부모 클래스의 메서드를 호출할 수 있다.

[2] @Override 어노테이션이란?

@Override는 부모 클래스의 메서드를 자식 클래스에서 재정의했음을 명확하게 나타내는 어노테이션입니다.

@Override를 사용하는 이유 ✔ 컴파일러가 올바르게 오버라이딩되었는지 검증할 수 있다.
부모 클래스의 메서드가 변경되었을 때, 실수로 오버라이딩이 깨지는 것을 방지한다.
코드 가독성을 향상시키고, 유지보수를 쉽게 한다.

💡 @Override는 생략해도 오버라이딩이 가능하지만, 반드시 작성하는 것이 좋은 습관입니다!


[3] 오버라이딩 예제 코드

 

 
class ParentClass {
    void exercise() {
        System.out.println("good runner");
    }
}

class ChildClass extends ParentClass {
    @Override
    void exercise() {
        super.exercise();  // 부모 클래스의 exercise() 메서드 호출
        System.out.println("피구도 잘합니다.");
    }
}

public class OverridingExample1 {
    public static void main(String[] args) {
        ChildClass child = new ChildClass();
        child.exercise();
    }
}
 
<출력결과>
good runner
피구도 잘합니다.
 

-ChildClass에서 exercise() 메서드를 오버라이딩하여, 부모 클래스의 동작을 확장했습니다.
- super.exercise();를 사용하여 부모 클래스의 동작을 먼저 실행한 후, 추가 동작을 수행합니다.


[3]-1오버라이딩 예제코드2

 
class AnimalClass {
    void sound() {
        System.out.print("동물이 울음소리를 냅니다 : ");
    }
}

class DogClass extends AnimalClass {
    @Override
    void sound() {
        super.sound();  // 부모 클래스의 sound() 메서드 호출
        System.out.println("멍멍");
    }
}

class CatClass extends AnimalClass {
    @Override
    void sound() {
        System.out.println("야옹");
    }
}

public class OverridingExample1 {
    public static void main(String[] args) {
        AnimalClass animal = new AnimalClass();
        animal.sound(); // 부모 클래스 메서드 실행

        System.out.println(); // 줄바꿈

        DogClass dog = new DogClass();
        dog.sound(); // 오버라이딩된 메서드 실행

        CatClass cat = new CatClass();
        cat.sound(); // 오버라이딩된 메서드 실행
    }
}
<출력결과>
동물이 울음소리를 냅니다 :
동물이 울음소리를 냅니다 : 멍멍
야옹
 
 
  •  DogClass에서 sound()를 오버라이딩하여 "멍멍"을 추가.
  •  CatClass에서 sound()를 오버라이딩하여 "야옹"을 출력.
  • 부모 클래스의 sound()를 유지하면서, 동물마다 다른 소리를 내도록 변경할 수 있습니다.

[4]@Override 없이 오버라이딩하면?

@Override를 사용하지 않으면, 실수로 부모 메서드와 다른 시그니처로 작성될 위험이 있습니다.

package Tistory;

class Parent {
    void showMessage() {
        System.out.println("부모 클래스 메시지");
    }
}

class Child extends Parent {
    // 실수로 매개변수를 추가함 -> 오버라이딩이 아니라 '새로운 메서드'가 됨
    void showMessage(String message) {
        System.out.println("자식 클래스에서 받은 메시지: " + message);
    }
}

public class OverrideErrorExample {
    public static void main(String[] args) {
        Parent obj = new Child();
        obj.showMessage();  // 부모 클래스의 메시지가 출력됨 (오버라이딩되지 않음)
    }
}

 

<출력결과>

 
부모 클래스 메시지

 

Child 클래스에서 showMessage(String message)를 만들었지만, 오버라이딩이 아닌 새로운 메서드가 된다는 것을 알 수 있습니다. 이러한 실수를 방지하려면 @Override를 반드시 사용해야 합니다.


[5] @Override 어노테이션의 역할

 @Override는 반드시 메서드명 바로 위에 작성해야 합니다.

class Parent {
    void printMessage() {
        System.out.println("부모 클래스 메시지");
    }
}

class Child extends Parent {
    @Override
    void printMessage() {  // 부모 클래스의 메서드를 재정의
        System.out.println("자식 클래스에서 오버라이딩한 메시지");
    }
}

부모 클래스의 printMessage() 메서드를 자식 클래스에서 오버라이딩했음을 명확하게 표시
자바 컴파일러가 자동으로 검사하여, 잘못된 오버라이딩을 방지해야 한다.


[6] 오버라이딩 vs 오버로딩 차이점

오버라이딩과 오버로딩은 자주 혼동되는 개념이므로 차이점을 정확히 알아두는 편이 좋습니다.

구분오버라이딩 (Overriding)오버로딩 (Overloading)

사용되는 관계 상속 관계에서 사용 같은 클래스 내에서 사용
메서드 시그니처 완전히 동일해야 함 메서드명은 같지만, 매개변수 타입 또는 개수가 다름
반환 타입 동일하거나 공변 반환 타입 가능 관계없음
목적 부모 메서드의 동작을 변경 같은 기능을 다양한 방식으로 제공
@Override 사용 여부 반드시 사용 (권장) 필요 없음

 

 

'웹개발 > JAVA' 카테고리의 다른 글

Collection - Java List  (1) 2025.02.23
Collection Framework  (1) 2025.02.22
Array(JAVA에서 배열 활용법)  (1) 2025.02.20
상속(Inheritance)  (0) 2025.02.19
제어자(Modifier)  (1) 2025.02.18