Purple Bobblehead Bunny

Backend/JAVA

[JAVA] 오버로딩, 오버라이딩 (Overloading, Overrding)

준영어린이 2022. 3. 14. 20:42

오버로딩(Overloading)
"과하다, 과적하다" 라는 뜻
한 메소드(생성자)를 각가 다른 매개변수를 주어서 중복하여 선언 한 것.

class Func { 

       void func() {...}

       void func(int num) {...}

       void func(double num) {...}

       void func(String str) {...]

}

같은 이름을 가졌지만, 서로 다른 "매개변수"를 가진 메소드나 생성자를 선언할 때 "오버로딩" 한다고 말한다.

 

자바가 알아서 형에 맞는 메소드를 찾아서 출력을 한다.

 

오버로딩 하는 이유 예제-1

 

계산을 해주는 메소드인 caclEngine 이라는 메소드가 있는데,
이 메소드에 int 값을 넣으면 int형으로 값을 계산해서 반환하고, 
double값을 넣으면 double 형으로 값을 계산해서 반환하도록 해야한다고 한다.

위와 같은 상황일 때 오버로딩이 없을 때는 "int형 calcEngine"과 "double형 calcEagine"을 이름이 다르게 따로 만들어야 한다. 하지만 오버로딩이 있으면 아주 쉽게 자료형만 바꿔서 사용 할 수 있다.

 

오버로딩 하는 이유 예제-2

 

개발자 2명이 있는데
1명은 "이름.나이.학력.주소" 를 가지고 있고, 또 다른 1명은 "이름.나이.주소"를 가지고 있는데,
개발자 정보를 처리하는 프로그램이 필요하다

여기서 오버로딩이 없으면 힘들어진다. 한 가지 각각 상황에 따라서 다른 메소드를 불러와야 하고

하지만, 오버로딩이 있으면 쉽게 자료형 개수만 바꿔서 할 수 있다.

 

 

 

첫번 째 예제에서 다음과 같이 처리가 가능하다.

 

 

여기서 CalcEngine 클래스를 보면, int일 때의 add와 double 일 때의 add, min이 같이 선언 되어 있다.
만약 곱하기, 나누기까지 선언되면 코드가 길어지게 된다.
int일 때, double 일 때 까지 오버로딩 비슷하게 처리하여 2개의 add메소드와 min메소드를 하나로 합칠 수 있다.
Generic을 사용하면 된다.


class CalcEngine {
       void add(final T num1, num2) {...}
       void min(final T num1, num2) {...}


CalcEngine cal = new CalcEngine();


이렇게 하면, T가 Integer로 치환되게 된다. 쉽게 자료형을 바꿀 수 있지만, 기본자료형을 사용할 수 없다는 단점이 있다.

 

 

오버라이딩(Overriding)
"깔아 뭉개는 것" 과 같다.
이전에 있던 메소드를 상속한 후, 그 수퍼 클래스의 메소드를 서브 클래스에서 재정의 한 것을 말한다.

class Human {

       private String name;

       private int age;

       Human(final String name, final int age) {...}

       public void printInfo() {...}

 

class Student extends Human {

       private String school;

       private char grade;

       Student(final String name, final int age, final String school, final char grade) {...}

       void printInfo() {...} // Human 클래스의 printInfo() 오버라이딩

 

여기서 Student는 Human을 상속하게 된다.

원래의 Student 객체에서 printInfo()를 호출하면, Human의 printInfo()를 호출해야 하지만,

위 코드에서 Student 클래스 내에서 Human의 printInfo 메소드를 오버라이딩 함으로써, 

Human의 printInfo()가 아니라 Student의 printInfo()가 실행이 된다.

여기서 man1.printInfo() 는 그대로 출력이 되고, man2.printInfo()는 오버라이딩 된 pritnInfo()가 실행된다.

 

 

'Backend > JAVA' 카테고리의 다른 글

[JAVA] 접근 제어자  (0) 2022.03.16
[JAVA] Object  (0) 2022.03.15
[JAVA] abstract , interface  (0) 2022.03.11
[JAVA] 쓰레드 (Thread)  (0) 2022.03.10
[JAVA] Stack, Queue, Deque  (0) 2022.03.09