JAVA

오버로딩과 오버라이딩

Lahezy 2023. 2. 22.
728x90

오버로딩(OverLoading)

  • 같은 이름의 함수(메서드)를 여러 개 생성하는 것이다
  • 기존에 없는 새로운 메서드를 정의하는 것이다
  • 리턴(반환) 타입이 달라도 상관이 없다
  • 메서드의 이름이 같을 때 메서드의 파라미터의 개수나 타입이 달라야 한다

하단 코드를 실행하면 오른쪽과 같은 결과가 나옴을 확인할 수 있다.

l은 long형의 리터럴 표기를 위해서 사용했다.

import java.io.IOException;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        System.out.println(sum(List.of(1,2)));
        System.out.println(sum(1, 2));
        System.out.println(sum(1l, 2l));
    }

    private static int sum(List<Integer> arr) {
        System.out.println("sum1");
        return arr.stream().mapToInt(i -> i).sum();
    }

    private static int sum(int a, int b) {
        System.out.println("sum2");
        return a+b;
    }

    //반환타입이 달라도 된다. 여기서 반환타입이 int로 변해도 가능하다(파라미터 타입이 달라서)
    private static long sum(long a, long b) {
        System.out.println("sum3");
        return a+b;
    }
    
/*
    오버로딩 되지 않는다(파라미터 타입이 일치한다)
    private static long sum(int a, int b) {
        return a+b;
    }
 */
}

 


오버 라이딩 (Overriding)

  • 이미 있는 함수를 상속받아서 메서드를 구현하는 것이다
  • 리턴 타입이 동일하다
  • 상속받은 메서드의 내용을 변경하는 것이다

- 오버 라이딩의 조건

  • 이름이 같아야 한다
  • 매개변수가 같아야 한다
  • 반환 타입이 같아야 한다
  • 접근 제어자는 조상 클래스의 메서드 보다 좁게 변경할 수 없다(조상이 protected 라면 자손은 protected나 public 이어야 한다)
  • 조상클래스 보다 많은 예외를 선언할 수 없다

- 오버 라이딩의 예시

조상 클래스로 vehicel (운송수단)이라는 클래스가 있다고 가정하자

이때 자손클래스로 car, bike, airplane 등이 있을 수 있다 (상속)

이때 vehicle에서 1km당 사용되는 기름의 양을 표기하는 oil()이라는 메서드를 가지고 있다고 가정할 때 각 자손 클래스에(car, bike, airplane)에서 oil메서드를 재정의 하여 사용한다. 이때 사용하는 것이 오버라이딩이다

class Vehicle {
    public String oil() {
        return "아직 정의 되지 않음";
    }
}

class Bike extends Vehicle {
    @Override
    public String oil() {
        return "3씩 사용한다.";
    }
}

class Car extends Vehicle {
    @Override
    public String oil() {
        return "5씩 사용한다.";
    }

}

class AirPlane extends Vehicle {
    @Override
    public String oil() {
        return "10씩 사용한다.";
    }
}


public class Main {
    public static void main(String args[]) {
        Vehicle vehicle = new Vehicle();
        Car car = new Car();
        Bike bike = new Bike();
        AirPlane airPlane = new AirPlane();
        System.out.println(vehicle.oil());
        System.out.println(bike.oil());
        System.out.println(car.oil());
        System.out.println(airPlane.oil());
    }
}

 

실제 코드에서는 다음과 같이 사용된다.

static class Node implements Comparable<Node> {
    private int index;
    private int distance;

    public Node(int index, int distance) {
        this.index = index;
        this.distance = distance;
    }

    @Override //객체를 비교하는 부분을 오버라이딩
    public int compareTo(Node other) {
        if (this.distance < other.distance) {
            return -1;
        } else return 1;
    }
}

 

참고

자바의 정석(3판)

728x90

'JAVA' 카테고리의 다른 글

람다식(Lambda Expression)  (1) 2023.03.08
Enum 클래스  (0) 2023.02.28
ArrayList와 LinkedList  (0) 2023.02.24
Array 배열 복사의 4가지 방법  (0) 2023.02.10
JAVA 자료형 범위  (0) 2022.10.03

댓글