Java/Java(base)

[Java] 다형성 Polymorphism : Overloading(오버로딩), Overriding(오버라이딩)

ID_DI 2021. 11. 29. 19:16

다형성(Polymorphism)

  1. 오버로딩

    • 같은 이름의 메소드를 여러 개를 선언하는 기법이다.
    • 매개변수의 개수 혹은 타입이 다르면 같은 이름의 메소드로 여러개 선언할 수 있다.
    • 이름이 아니라 매개변수로 구별이 가능하다.
    • 전달된 값의 타입 혹은 개수로 알아서 구분하여 알맞은 메소드가 자동으로 호출된다.
    //overloading
    void dog(){
        System.out.println("매개변수 없음");
    }
    void dog(int a, int b){
        System.out.println("매개변수: " + a + b);
    }
    void dog(String c){
        System.out.println("매개변수: " + c);
    }

    오버로딩의 예 : 기본생성자와 매개변수가 있는 생성자가 동시에 있는 클래스

    보통 기본생성자를 선언해줌

  2. 오버라이딩(Overriding) : 재정의

    • 부모 필드에 이미 a() 라는 메소드가 존재한다면 자식 객체 생성시 부모 생성자가 먼저 호출되기 때문에, 부모 클래스의 a()가 먼저 메모리에 올라간다
    • 그 다음 자식 필드를 완성시킬 때 같은 이름의 a()라는 메소드가 선언되어 있다면, 같은 이름으로 2개가 만들어지는 것이 아니라 기존에 만들어진 부모 필드의 a()메소드에 자식에서 작성한 메소드가 덮어씌워진다.
    • 자식 객체 a() 메소드를 사용하게 되면 재정의된 기능으로 사용하며 이것을 오버라이딩이라고 한다.
    class Car{
        String brand;
        String color;
        int price;
    
        public Car(String brand, String color, int price) {
            this.brand = brand;
            this.color = color;
            this.price = price;
        }
    
        void engineStart() {
            System.out.println(brand+" 열쇠로 시동켜기");
        }
    
        void engineStop() {
            System.out.println(brand+" 열쇠로 시동 끄기");
        }
    }
    
    class SuperCar extends Car{
        public SuperCar(String brand, String color, int price, String pw) {
            super(brand, color, price);
            this.pw = pw;
        }
        @Override
        void engineStart() {
            System.out.println(brand+" 원격으로 시동켜기");
        }
        @Override
        void engineStop() {
            System.out.println(brand+" 원격으로 시동 끄기");
        }

    <Overloading과 Overriding의 차이점>

    구분 오버로딩 오버라이딩
    메서드 이름 동일 동일
    매개변수, 타입 다름 동일
    리턴 타입 상관없음 동일