Post

[멋쟁이사자처럼 백엔드 스쿨] Java 프로그래밍 기초 - overloading vs overriding

[멋쟁이사자처럼 백엔드 스쿨] Java 프로그래밍 기초 - overloading vs overriding

수업한 내용들을 기록하지만 개인적으로 요약정리 한 내용들이 포함되어있을 수 있습니다.

Summary

  • 오버로딩(overloading): 기존에 없는 새로운 메서드를 정의
  • 오버라이딩(overriding): 상속받은 메서드의 내용을 변경
구분오버로딩오버라이딩
메서드 이름동일동일
매게변수, 타입다름동일
리턴타입상관없음동일
메서드 결정 시점compileruntime

간단한 예시와 함께 확인해보자.

overloading

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Calculator {

  // 정수 덧셈
  int add(int a, int b) {
    return a + b;
  }

  // 실수 덧셈
  double add(double a, double b) {
    return a + b;
  }

  // 세 숫자 덧셈
  int add(int a, int b, int c) {
    return a + b + c;
  }
}

public class Main {

  public static void main(String[] args) {
    Calculator calc = new Calculator();

    System.out.println(calc.add(3, 5));           // 정수 덧셈 호출
    System.out.println(calc.add(3.5, 5.5));       // 실수 덧셈 호출
    System.out.println(calc.add(1, 2, 3));        // 세 숫자 덧셈 호출
  }
}

overriding

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Parent {

  // 부모 클래스의 메서드
  void greet() {
    System.out.println("Hello from Parent!");
  }
}

class Child extends Parent {

  // 메서드 오버라이딩
  @Override
  void greet() {
    System.out.println("Hello from Child!");
  }
}

public class Main {

  public static void main(String[] args) {
    Parent parent = new Parent();
    Parent child = new Child();

    parent.greet(); // Parent 의 greet 호출
    child.greet();  // Child 의 greet 호출
  }
}

@overriding 어노테이션 사용 권장

  • 장점
    • 컴파일 시점에 오류 방지 가능
    • 가독성 향상

메서드에 사용하는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Animal {

  // 동물이 소리를 내는 메서드
  void sound() {
    System.out.println("Some generic animal sound");
  }
}

class Dog extends Animal {

  @Override
  void sound() {
    // 부모 메서드를 오버라이딩
    System.out.println("Woof Woof!");
  }
}

public class Main {

  public static void main(String[] args) {
    Animal dog = new Dog();
    Animal cat = new Cat();

    dog.sound(); // Dog 클래스의 sound 메서드 호출
  }
}

인터페이스에 사용하는 경우

  • 장점
    • 인터페이스에 선언 된 메서드가 제대로 구현 되었는지 컴파일 타임에 확인
  • 주의사항
    • 접근 제한자는 반드시 public
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// 인터페이스 정의
interface Animal {

  void sound(); // 추상 메서드

  void move();  // 추상 메서드
}

// Dog 클래스가 인터페이스를 구현
class Dog implements Animal {

  @Override
  public void sound() {
    System.out.println("Woof Woof!");
  }

  @Override
  public void move() {
    System.out.println("The dog runs swiftly.");
  }
}

// Cat 클래스가 인터페이스를 구현
class Cat implements Animal {

  @Override
  void sound() {  // 컴파일 error, 접근 제한자가 public 이 아님
    System.out.println("Meow Meow!");
  }

  @Override
  public void move() {
    System.out.println("The cat jumps gracefully.");
  }
}

public class Main {

  public static void main(String[] args) {
    Animal dog = new Dog();
    Animal cat = new Cat();

    dog.sound(); // Dog 클래스의 sound 메서드 호출
    dog.move();  // Dog 클래스의 move 메서드 호출

    cat.sound(); // Cat 클래스의 sound 메서드 호출
    cat.move();  // Cat 클래스의 move 메서드 호출
  }
}
This post is licensed under CC BY 4.0 by the author.