Java

[Java] 오버로딩, 오버라이딩

dalooong 2023. 5. 30. 15:21

오버로딩이란?

한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것

이름은 같지만 매개변수는 다름

오버로딩 조건 3가지

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 반환 타입은 영향 없다.
int add (int a, int b) {return a+b;}
int add (int x, int y) {return x+y;}
메서드 이름 add 동일, 
변수타입int 동일,
반환타입 return 동일로 오버로딩이 성립되지 않는다. 
int add (int a, int b) {return a+b;}
long add (int a, int b) {return (long)a+b;}
메서드 이름 add 동일, 
변수타입은 다르지만 
반환타입 return 동일로 오버로딩이 성립되지 않는다. 
int add (int a, int b) {return a+b;}
long add (long a, long b) {return a+b;}
메서드 이름 add 동일, 
변수타입은 달라 오버로딩 성립된다. 

오버라이딩 (overriding)이란?

  • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
  • 정확하게는 메서드 오버라이딩이라고 한다.
  • 선언부는 변경불가, 구현부{내용}만 변경 가능
package babylion.day5;

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());
    }
}
class MyPoint3 extends Object{
    int x;
    int y;

    MyPoint3(int x, int y){
        this.x = x;
        this.y = y;
    }

    public String toString(){ //Object클래스의 tostring()을 오버라이딩
        return "x:"+x+",y:"+y;
    }
}

public class OverrideTest {
    public static void main(String[] args) {
       MyPoint3 P = new MyPoint3(3,5);
//        P.x=3;
//        P.y=5;

//        System.out.println(P.toString()); //tostring 호출
        System.out.println(P); //p만 호출해도 tostring 결과값과 같은 결과를 출력한다.
    }

 

오버라이딩의 조건

  1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
  2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  3. **접근제어자 : (public, protected, default, private)**
  4. 예외는 조상 클래스의 메서드보다 많이 선언 할 수 있다.
class Point{
    int x;
    int y;
    
    **String getLocation()**{ // 선언부 일치
        return "x:"+x+",y:"+y; 
    }
}
class Point3D extends Point {
    int z;

    **String getLocation()** {
        return "x:" + x + ",y:" + y + ",z:" + z; 
    }
}

조상이 예외가 2개인데, 자손이 예외가 더 많으면 안되고, 같거나 더 적어야한다.

 

오버로딩 vs 오버라이딩

  • 오버로딩 : 기존에 없는 새로운 메서드(이름이 같을 뿐)를 정의하는 것 (new)
  • 오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(change, modify)

**이름만 비슷하지 관계는 없다.

 

 

 

출처 : 자바의정석 - 기초편