NULL

JAVA 오버로드와 오버라이딩 차이점과 개념정리 본문

Back-end/JAVA

JAVA 오버로드와 오버라이딩 차이점과 개념정리

1924 2022. 2. 2. 08:58

오버로딩과 오버라이딩 차이

오버로딩이란?

서로 다른 시그니처를 갖는 여러 메소드를 하나의 이름으로 정의하는 것이였다.

 

오버라이딩이란?

상속관계에 있는 부모클래스에서 이미 정의된 메소드를 자식클래스에서

같은 시그니처를 갖는 메소드로 재정의하는 것이라고 할 수 있다.

 

간단히 정의하면

오버로딩은 새로운 메소드를 정의

오버라이딩은 상속받은 기존 메소드를 재정의

 

 

class Parent {

    void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }

}

class Child extends Parent {

    // 오버라이딩된 display() 메소드

    void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }

    void display(String str) { System.out.println(str); } // 오버로딩된 display() 메소드

}

 

public class Inheritance06 {

    public static void main(String[] args) {

        Child ch = new Child();

        ch.display();

        ch.display("오버로딩된 display() 메소드입니다.");

    }

}

 

오버라이딩의 조건

1. 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전동일 해야한다.

 하지만 메소드 반환타입은 부모클래스의 반환타입으로 변환할수 있는 타입이라면 변경가능하다.

2. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.

3. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.

 

 

 

메소드 오버라이딩

 

 Car클래스를 상속받은 Bus클래스는 부모 클래스가 가지고 있는 run() 메소드를 잘 사용한다.

    //run 메소드를 가지고 있는  Car클래스 
    public class Car{
        public void run(){
            System.out.println("Car의 run메소드");
        }
    }

    //Car 를 상속받는 Bus 클래스 
    public class Bus extends Car{

    }

    public class BusExam{
        public static void main(String args[]){
            Bus bus = new Bus();
            bus.run();  //Car의 run메소드가 실행된다. 
        }
    }

 

Bus클래스에 부모가 가지고 있는 메소드와 모양이 같은 메소드를 선언

 

    public class Bus extends Car{
        public void run(){
            System.out.println("Bus의 run메소드");
        }
    }

    public class BusExam{
        public static void main(String args[]){
            Bus bus = new Bus();
            bus.run();  //Bus run메소드가 실행된다. 
        }
    }

 

BusExam을 실행하면 "Bus의 run메소드"가 출력된다.

메소드를 오버라이드하면, 항상 자식클래스에서 정의된 메소드가 출력된다.

 

오버라이드 한다고 해서 부모의 메소드가 소멸되는 것은 아니다.

super를 사용하면 부모 메소드를 호출할 수 있다.

 

    public class Bus extends Car{
        public void run(){
            **super.run();**  // 부모의  run()메소드를 호출 
            System.out.println("Bus의 run메소드");
        }
    }

 

'Back-end > JAVA' 카테고리의 다른 글

클래스 이름 가져오기  (0) 2022.02.08
JAVA 클래스 형변환 개념정리  (0) 2022.02.02
JAVA super와 부모생성자 개념정리  (0) 2022.02.02
JAVA 추상클래스  (0) 2022.01.27
JAVA 캡슐화, 접근제한자  (0) 2022.01.27
Comments