티스토리 뷰

SEB_BE_41

JAVA - Overloading

Greatshine 2022. 8. 3. 23:32

 

계속해서 등장하는 Calculator로직은 2개의 인자 값(left, right)에 대한 연산을 수행하고 있다.

만약 3개의 값을 대상으로 연산을 해야 한다면 어떻게 해야 할까?

 


public void setOprands( int left, int right, int third) {

this.left = left;

this.right = right;

this.third = third;


 

기존의 setOparnds 메소드를 세 개의 값을 받을 수 있도록 수정하면 될 것이다.

이렇게 되면 2개의 값을 받는 연산과 3개의 값을 받는 연산 둘 다 활성화시키기 위해

 


c1.setOprands2 (10, 20) ;

c1.setOprands3 (10 , 20, 30) ;


 

이런 식으로 두 개의 메소드를 다른 이름으로 지정해야 한다.

하지만 매개변수의 수에 따라 메소드의 이름을 바꾸는 것은

한 두 개의 메소드는 괜찮지만, 메소드의 수가 늘어난다면 무척이나 번거로운 일이 될 것이다.

그렇다면 어떻게 해야 할까?

 

 

 

바로 메소드 오버로딩(Overloading)을 이용하는 것이다.

오버로딩은 위의 주석에도 적혀있듯이 메소드의 이름이 같아도 매개변수의 형식, 숫자가 다르다면

다른 메소드로 인식한다

즉, 이름은 같지만 시그니처는 다른 메소드를 중복으로 선언할 수 있는 방법이다.

 

 

 

 

따라서 이 로직을 실행하게 되면

인자 값을 두 개만 갖고 있는 것은 처음 정의한 메소드를 호출하고

세 개를 갖고 있는 것은 두 번째로 정의한 메소드를 호출하여 값을 출력한다.

값은 30, 15, 60, 20으로 나온다.

 

이번에는 비교를 위해 다른 로직을 살펴보자

 

 

 

메소드들 마다 다른 매개변수의 형식을 갖고 있다.

그렇다면 인자 값의 형식에 따라 그에 맞는 메소드를 호출하고 있다는 것을 알 수 있다.

위의 로직을 보면 오류를 뜻하는 빨간 줄이 그어져 있는 것을 확인할 수 있다.

메소드의 이름도 같고 시그니처 또한 같지만 리턴 형식이 다르기 때문이다.

이는 이 차이점을 알기 위해 만든 로직이다.

이름도 같고 시그니처도 같은 메소드들 끼리 리턴 타입을 달리 한다 해도 오버로딩이 되지 않는다.

자바는 od.A();를 실행했을 때 리턴 값이 없는 것을 호출한 것인지,

리턴 값이 int형인 것을 호출한 것인지 자바는 이해할 수 없기 때문이다.

 

그렇다면 매개변수의 이름을 바꾸는 것은 오버로딩이 가능할까?

 

 

 

되지 않는다.

이름을 바꾸더라도 데이터타입을 바꾼 것이 아니기 때문에 같은 값을 받고 있다. 

이 역시 자바가 정확히 어떤 메소드를 받는지 모르기에 오류가 발생하는 것이다.

 

또 다른 로직을 살펴보자

 

 

 

이 전의 로직을 상속받는 새로운 로직이다.

여기선 오버로딩과 오버라이딩의 차이점을 확인할 수 있다.

첫 번째 A 메소드는 부모 클래스의 메소드와 이름이 같지만 매개변수의 개수가 다르기 때문에

자바는 이를 다른 메소드로 인식하며, 이는 오버로딩이다.

두 번째 A 메소드는 부모 클래스의 메소드와 같은 이름, 같은 매개변수, 같은 리턴 타입을 갖고 있기 때문에

이는 오버라이딩이라고 볼 수 있다.

'SEB_BE_41' 카테고리의 다른 글

JAVA - API  (0) 2022.08.08
번 아웃 증후군(+합격)  (0) 2022.08.08
JAVA - Overriding  (0) 2022.08.02
JAVA - 상속과 생성자  (0) 2022.08.01
JAVA - 상속  (0) 2022.07.30
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/09   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함