JAVA

(JAVA) 메소드 오버로딩 vs 메소드 오버라이딩

혀래이 2021. 7. 7. 17:11

1. 메소드 오버로딩

 

JAVA는 C언어와 다르게 함수명을 중복해서 정의할 수 있다. 조건과 특징은 아래와 같다.

  • 같은 알고리즘(로직) 기능을 가지고 있어야 한다.
  • 매개변수, 인자의 개수 or 데이터 타입(리턴 타입)이 달라야 한다. ( 하지만 기능은 같음 )
  • 상속 관계 X
  • 여러개 정의할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package test;
 
public class Test1 {
    static int sum(int a, int b) {
        return a+b;
    }
    static int sum(int a, int b, int c) {
        return a+b+c;
    }
    static double sum(double a, double b) {
        return a+b;
    }    
    
    public static void main(String[] args) {
        
        int a = 10, b = 20, c = 30;
        double d = 14.2 , e = 15.5;
        
        System.out.println(sum(a,b)); // 첫 번째 함수
        System.out.println(sum(a,b,c)); // 두 번째 함수
        System.out.println(sum(d,e));     // 세 번째 함수
    }
}
 
cs

 

오버로딩 함수 실행 결과

2. 메소드 오버라이딩

메소드 오버라이딩은 객체지향의 핵심 중 하나인 '상속'의 중요한 개념 중 하나이다.

메소드 오버라이딩을 하기 위한 조건과 특징은 아래와 같다.

  • 상속관계 이어야 한다.
  • 인자의 개수, 타입 and 리턴타입 모두 같아야한다. (= method signature가 동일해야 함!)
  • 부모 클래스에 있는 메서드의 기능을 재정의 하고 싶을 때 사용한다.

 

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
package test;
class Animal{
    String name;
    int age;
    
    Animal(String name){
        this.name = name;
    }
    
    void show() {
        System.out.println("이 동물의 이름은 " + this.name + "입니다.");
    }
}
 
class Turtle extends Animal{
    Turtle(String name, int age){
        super(name);
        this.age = age;
    }
    
    void show() { // 메소드 오버라이딩 --> 부모 클래스의 show() 함수를 재정의합니다.
        System.out.println("이 거북이의 이름은 " + this.name + "이고 " + this.age + "살 입니다.");
    }
}
 
public class Test2 {
    public static void main(String[] args) {
        Animal a = new Animal("꼬부기");
        Turtle b = new Turtle("꼬부기"120);
 
        a.show();
        b.show();
    }
}
 
cs

같은 이름의 함수지만 다른 기능