[Java/객체지향] 오버로딩과 오버라이딩

2024. 8. 19. 20:13프로그래밍 언어/Java

오버로딩

  • 한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것
  • 매개변수는 다르지만, 같은 의미의 기능 수행
  • ex) 메서드 대표적 이름은 ‘add, println, round’ → 어떤 작업을 수행하는 것이 메서드라 대부분 동사 → 이름이 같다 = 하는 동작이 같다.
오버로딩 성립 조건 3가지
  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 반환 타입은 관계없다.
class Ex6_10 {
    public static void main(String args[]){
        MyMath3 mm = new MyMath3();//인스턴스 생성
				int result = mm.add(3, 3);
        System.out.println("mm.add(3, 3) 결과:" + result);//인스턴스메소드 호출

        System.out.println("mm.add(3L, 3) 결과:" + mm.add(3L, 3));
        System.out.println("mm.add(3, 3L) 결과:" + mm.add(3, 3L));
        System.out.println("mm.add(3L, 3L) 결과:" + mm.add(3L, 3L));

        int[] a = {100,200,300};
        System.out.println("mm.add(a) 결과: "+ mm.add(a));
    }
}

class MyMath3{
    int add(int a, int b){
        System.out.println("int add(int a, int b) - ");
        return a+b;}

    long add(int a, long b){
        System.out.println("int add(int a, long b) - ");
        return a+b;}

    long add(long a, int b){
        System.out.println("long add(long a, int b) - ");
        return a+b;}
    
    long add(long a, long b){
        System.out.println("long add(long a, long b) - ");
        return a+b;}

    int add(int[] a){
        System.out.println("int add(int[] a) - ");
        int result =0;
        for(int i=0;i<a.length;i++)
            result += a[i];
        return result;}
}

메서드 오버라이딩

  • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
class MyPoint3{
    int x;
    int y;
    String getLocation(){
        return "x:"+x+"y:"+y;
    }
}
class MyPoint3D extends MyPoint3{
    int z;
    //조상의 getLocation()을 오버라이딩
    String getLocation(){
        return "x:"+x+", y:"+y+", z:"+z;
    }
}
public class OverrideTest {
    public static void main(String[] args) {
        MyPoint3D p = new MyPoint3D();
        p.x=3;
        p.y=5;
        p.z=7;
        System.out.println(p.getLocation());
    }
}

오버라이딩의 조건

  1. 선언부(반환타입, 메서드이름, 매개변수 목록)가 조상 클래스의 메서드와 일치해야함
  2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

오버로딩vs오버라이딩

  1. 오버로딩: 기존에 없는 새로운 메서드를 정의하는 것(대신 이름은 같은) → 상속과 관계X
  2. 오버라이딩: 상속받은 메서드의 내용을 변경하는 것→ 상속과 관계O