Hun's Blog

[JAVA] Method Overloading & Overriding 본문

Language/Kotlin & Java

[JAVA] Method Overloading & Overriding

jhk-im 2020. 3. 21. 23:02

http://tcpschool.com/java/java_usingMethod_overloading

참고

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

메소드 시그니쳐 (method signature)

  • 메소드 오버로딩의 핵심
  • 메소드의 선언부에 명시되는 매개변수 리스트

 

만약  메소드가 매개변수의 개수와 타입,  순서까지 모두 같다면,   메소드의 시그니처는 같은 것이다.

 

메소드 오버로딩 (method overloading)

  • 같은 이름의 메소드를 중복하여 정의함

 

*자바에서는 클래스 내에 같은 이름의 메소드를  이상 가질  없다. 하지만 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성   있다. 메소드 오버로딩은 서로다른 시그니처를  여러 메소드를 같은 이름으로 정의하는 것이다.

 

장점

  • 이름의 절약
  • 메소드 호출  전달해야할 매개변수 타입이나 개수에 대해 크게 신경쓰지 않도 된다.
  • 객체 지향 프로그래밍의 특징  하나인 다형성을 구현하는 방법  하나이다.

 

대표적인 메소드 오버로딩

println()

println(boolean x)

println(int x)

println(String x)

전달받은 매개변수의 타입에 따라 다양한 원형중 적절한 메소드를 호출하게 된다.

 

만약 오버로딩이 없다면

printlnBoolean(boolean x)

printlnInteger(int x)

printlnString(String x)

이런 식으로 구현하지 않았을까? 나처럼?

 

메소드 오버로딩의 조건

1. 메소드의 이름이 같아야한다.

2. 메소드의 시그니처가 달라야한다.

반환 타입과는 관계없다

메소드 시그니처는 같은데 타입만 다른 경우는 오버로딩이 성립되지 않는다.

 

예제

자바 컴파일러는 사용자가 오버로딩된 함수를 호출하면, 전달된 매개변수의 개수와 타입이 같은 시그니처를 갖고있는 메소드를 찾아 호출한다.

1
2
3
4
5
6
7
8
9
10
11
class Test{
    void display (int num1){
        System.out.println(num1);
    }
    void display (int num1,int num2){
        System.out.println(num1*num2);
    }
    void display (int num1,float num2){
        System.out.println(num1+num2);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

결과

1
2
3
4
5
Test test = new Test();
test.display(1); // 1
test.display(1,20); // 20
test.display(1,1.5f); // 2.5
test.display(1,'a'); // char a code = 97 --> 2번째 메소드 호출
 

-> char 'a' 는 아스키 코드값이 97 이므로 int형으로 자동 타입변환되어 2번째 diplay가 호출되었다.

 

정리

 

메소드 오버로딩이란  메소드의 이름은 같지만 시그니처가 다른 것을 의미한다. 

시그니처란 메소드의 입력값을 의미하는데 메소드의 입력값의 타입, 개수 등을 의미한다.

시그니처가 다르다는 것은 메소드의 입력값의 타입, 개수 혹은 그 조합이 중복이 없이 다른 것을 의미한다.  예를들면  void 오버로딩 (int) {} , void 오버로딩 (float) {}  처럼 타입이 다른경우 또는 void 오버로딩 (int,int) {} , void 오버로딩 (int) {} 처럼 개수가 다른 경우  또는 void 오버로딩 (int,float) {} , void 오버로딩 (int,char) {} 처럼 조합이 다른 경우 를 뜻한다.  

 

오버로딩의 장점은 이름을 절약할 수 있다는 것인데 대표적인 메소드인 println() 을 예를들수 있다.

pnrintln() 은 하나의 이름으로 다양한 입력값을 받는다.  println(1.5), println(2), pnrintlnt('a') 처럼 말이다. 사용자가 콘솔에 무언가를 출력하려고 할 때 println 이라는 하나의 이름인 메소드에 다양한 입력값을 넣어도 출력이라는 같은 기능을 제공한다. 오버로딩이 없다면 각 타입별로 이름을 다르게 구분해야 했을지도 모른다. 

 

오버로딩은 return 타입에 영향을 받지 않는다.  시그니처만 다르다면 리턴타입을 다르게 주어도 상관없다. 

위에 display 메소드들은 리턴타입이 void 이다. 
이번에는 리턴타입이 int인 display 메소드를 시그니처가 중복되지 않도록 하여 실행해보자.

 

1
2
3
4
5
6
int display (int num1,int num2, int num3){
    return num1+num2+num3;
}
 
//결과
System.out.println(test.display(1,2,3)); // 6
 

 

메소드 오버라이딩 (method overriding)

상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고    있다.

 

자바에서 자식 클래스는 부모 글래스의 private 멤버를 제외한 모든 메소드를 상속받는다. 이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 재정의하여 사용할  있다.

 

*메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미한다.

 

오버라이딩 조건

1. 메소드의 동작만을 재정의하는 것이므로 메소드의 선언부는 기존 메소드와 완전히 같아야 한다.

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

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

 

예제

Child.class ,  Parent.class 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Child extends Parent {
    @Override
    void display() {
        super.display();
        System.out.println("-> 자식 클래스에서 실행");
    }
}
class Parent {
    void display() {
        System.out.println("부모 클래스의 display()");
    }
}
 
//호출 및 결과
Parent pa = new Parent();
pa.display(); // 부모 클래스의 display()
Child ch = new Child();
ch.display(); //부모 클래스의 display() -> 자식 클래스에서 실행
Parent pc = new Child();
pc.display(); //부모 클래스의 display() -> 자식 클래스에서 실행
// Child cp = new Parent(); error
 

 

Parent pc = new Child() 가 가능한 것은 자바의 다형성 때문이다.

이 설명만으로는 완벽히 이해가 안되는 것을 보니 다형성에 대해서도 다시한번 자세히 봐야할것같다.

정리

부모객체의 display와 자식 객체의 display가 서로 구분되어 비슷하지만 다른 동작을 한다. 

메소드 오버라이딩이란 부모 클래스에 있는 메소드를 자식클래스에서 가져다가 재정의하여 사용하는 것이다. 자식클래스에서 부모클래스에 있는 메소드의 이름을 입력하면 인텔리제이에서 창으로 띄워서 알려주고 엔터만 누르면 자동으로 생성된다. @Override 주석이 생성된다. 안드로이드에서 클릭이벤트 혹은 리스너를 구현할때 많이 볼 수있는 주석이다. onClickListener 를 생각해 보면 기본적으로 해당 버튼의 클릭을 감지하는 기능을 사용하면서 추가적으로 어떻게 동작하는지 재정의하여 사용한다. 

*오버로딩과 오버라이딩은 단어의 유사함으로 인해 혼동하기 쉽다.
하지만 그 개념은 확실히 다르며, 그 차이점을 아는것이 중요하다. 

오버로딩은 새로운 메소드를 정의하는것,
오버라이딩은 상속받은 기존의 메소드를 재정의하는것 으로 구분하여 기억하자. 

 

http://tcpschool.com/java/java_inheritance_overriding

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

http://tcpschool.com/java/java_usingMethod_overloading

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com