티스토리 뷰


이번 포스팅에서는 

저번 포스팅 마지막에 언급된

오버라이드와

유사한 단어로 헷갈릴 수 있는 

오버로딩에 대해 이야기하겠습니다.


====================================================


Overloading vs Override & 다형성





1. Overloading부터 살펴봅시다! 



정말 간단하면서도 다형성을 지원하는 방법이 오버로딩(overloading)입니다. 

프로그래밍에서 overloading이란 메소드 함수명은 같은데 전달받는 파라미터 인자 값에 의해 호출되는 메소드가 다르게 하는 것입니다. 



예로 들어봅시다.


숫자를 더하는 프로그램을 만드는데 2개의 숫자 덧셈뿐만 아니라 3개의 숫자 덧셈까지도 가능하게 하도록 하려 합니다.


 [overloading 사용 안할 시]



그렇다면 우리는 덧셈을 하는 메소드를 호출하는데 2개 숫자일 때와 3개 숫자일 때, 경우에 따라 호출해주어야 합니다.

하지만 이는 매우 불필요한 작업입니다. 매개변수로 전달되는 값의 개수(x , y , z or x. y)의 값에 의해 기능이 결정되고 메소드 명에 의해서 호출되는데 굳이 따로 메소드명을 구분하여 사용한다는 것이죠.

이와 같을 경우 사용하는 것이 오버로딩입니다.



[overloading 사용 시]



오버로딩을 사용한다면 메소드 명이 같아도 전달되는 매개변수의 개수에 따라 정의된 메소드가 호출됩니다. 


즉 오버로딩은 메소드 이름, 반환 타입과는 상관없이 메소드 이름이 같다면 매개변수의 타입과 개수에 의해 호출되는 메소드가 결정되는 것입니다.


위의 같은 경우는 메소드 오버로딩이라 하는데 생성자 오버로딩도 존재합니다.


생성자 오버로딩은 메소드 오버로딩과 같습니다. 생성자도 하나의 메소드처럼 생각하면 되는데 객체를 생성하면서 초깃값으로 설정해주는 생성자에도 오버로딩이 가능합니다. 클래스 내에 생성자를 매개변수에 따라 각각 정의해준다면 객체를 생성할 때 넘겨주는 파라미터의 값에 따라 생성자가 호출되는 것입니다.






2. Overloading 조건 / 장점! 



1) 조건

- 오버로딩은 메소드 이름이 같아야 합니다.

- 매개변수의 개수 또는 타입이 달라야 합니다. 당연히 매개변수로 전달되는 인자의 순서도 같아야 합니다.

- 매개변수는 같고 반환 타입이 다른 경우는 오버로딩이 성립되지 않습니다.



2) 장점

- 가독성이 증가합니다.

- 하나의 이름만 기억하면 되므로 오류의 가능성을 많이 줄일 수 있습니다.

- 메서드의 이름만 보고 이름이 같으니, 같은 기능이라고 예측할 수 있습니다.

- 메서드 이름을 절약할 수 있습니다.


## 대표적인 예로 우리가 자주 사용하는 println() 메소드가 있습니다. 우리는 메소드 이름은 println 하나만 사용하지만 int형을 출력할 때와 String 형을 출력할 때 등 모두 같은 기능으로 출력됩니다. 이는 메소드 이름은 같으나 매개변수로 전달되는 인자 타입이 다르기 때문에 오버로딩을 통한 메소드 호출입니다.

만약 오버로딩없이 printlnInt(), printlnString() 이런 식으로 구현되었다면 사용하는 입장에서 오류의 가능성이 엄청나게 늘어날 것이고, 메소드 사용에도 굉장한 불편함을 나았을 겁니다.







3. Override란?


 프로그래밍에서는 오버라이드를 덮어씌우는 것으로 생각하면 좋습니다.

앞서 포스팅한 상속개념에서 잠깐 나온 내용인데 상속 관계인 부모 클래스와 자식 클래스 사이에서 부모 클래스의 메소드를 똑같이 가져와 사용하는 것입니다.


앞서 포스팅에서 사용했던 코드로 예를 들겠습니다.

Terran, Barrack, Marine 클래스에는 각각 다음과 같은 메소드가 정의되어 있었습니다.


...


String tell() {
    return "Terran Class";
}


...


String tell() {

    return "Barrack Class";

}


...


String tell() {

return "Marine Class";

}



분명 상속 관계에서는 부모 클래스의 리소스를 자식 클래스가 사용할 수 있다 했는데 같은 리턴 타입, 메소드명, 매개변수를 가지고 재정의하여 사용했습니다.

이것이 바로 오버라이드라는 것인데 부모 클래스가 정의한 함수를 덮어씌워 다시 정의하여 사용하는 것이죠.


하지만 여기서 오버라이드를 한다고 부모 클래스의 기능이 사라지는 것이 아닙니다.



class Example {
public static void main(String[] args) {
Terran b = new Marine();
System.out.println(b.tell());
System.out.println(b.getResource());
}
}



다음과 같이 Marine 객체를 생성하여 tell() 메소드를 호출하면 Marine 클래스에 정의된 메소드가 호출합니다.

그 말은 즉 Barrack 객체를 생성하여 tell() 메소드를 호출한다면 Barrack 클래스에 정의된 메소드가 호출된다는 것이죠.


이런 식으로 부모 클래스의 메소드를 사용할 수 있어도 자식 클래스에서 변경해야 할 상황이 발생한다면 오버라이드를 통해 자식 클래스에서만 새로운 기능으로 재정의할 수 있습니다.





4. Override 조건 / 장점! 



 1) 조건

- 부모 클래스와 자식 클래스 사이에서만 성립됩니다.

- static 메소드는 클래스에 속하는 메소드이기 때문에 상속되지 않고 오버라이드 되지도 않습니다.

 : 이 부분은 static이 객체가 생성될 때가 아니라 클래스가 생성되고 한번만 메모리에 생성된다는 개념을 숙지하셨다면 금방 이해가 갈 것입니다.

- private의 접근제어자를 가진 메소드는 상속 자체가 되지 않아 오버라이드도 성립되지 않습니다.

- interface를 구현하여 오버라이드할 때는 반드시 public 접근 제어자를 사용해야 합니다.

- 오버로드와 달리 리턴 타입, 메소드 명, 매개변수 패턴이 모두 같아야 합니다.

- 부모 클래스의 메소드의 접근 제한자 범위보다 작아질 수 없고 확장은 가능합니다.

- 부모 클래스의 메소드보다 더 많은 예외를 던질 수 없습니다.

- final이 지정된 메소드는 오버라이드할 수 없습니다.


(조건이라 하여 많은 것을 써놨는데 하나하나 차근차근 읽고 생각해보면 당연히 그럴 수밖에 없구나 생각이 들 것입니다.)



 2) 장점

사실 오버로딩의 장점과 비슷하다고 생각합니다. 

다만 오버라이드는 메소드 하나로 여러 객체를 다루고 객체마다 다른 기능을 사용할 수 있다는 장점이 있습니다. 






5. 다형성

 다형성은 프로그래밍에서 요구하는 아주 중요한 특성입니다. 자바에서는 오버라이딩과 오버로딩이 대표적으로 다형성을 나타내는 기능입니다.

다형성이란 하나의 클래스나 함수가 다양한 방식으로 동작하는 것을 의미합니다. 오버로딩에서는 하나의 메소드로 여러 동작을 할 수 있었고, 오버라이드에서는 여러 클래스의 다른 기능을 하나의 메소드로 제어할 수 있었습니다.


이처럼 다형성이란 특징은 프로그래밍에 있어 효율성을 아주 많이 높여주는 객체지향개념의 중요한 특징 중 하나입니다.



=========================================================================================================



## 오버로딩과 오버라이드는 가끔 면접할 때 물어보는 질문이라 들었습니다. 두 개가 헷갈려서 저는 아래처럼 외웠습니다.

(override와 최대한 구별되고 이해하기 쉽게 하기 위해 해석한 것입니다. )



- 오버로딩

 사전적 의미의 overloading은 과적이라는 뜻으로 나오는데 개인적으로는 over와 loading을 따로 생각하여 이해하는 것이 머리에 더 잘 들어오는 것 같습니다.

over는 '~이상, 덮인 상태'로 해석하면 무엇을 로딩할 때 기존 것을 덮어서 로딩한다고 해석하면 좋을 것 같습니다. 


- 오버라이드

 사전적 의미의 override는 기각하다, 중단시키다 라는 의미를 입니다. 그렇기 때문에 오버라이드는 덮어서 쓴다 라는 뜻으로 해석하여 이해했습니다. 오버라이드는 상속 관계에서만 적용되는 특징이기 때문에 부모 클래스에 있는 메소드를 덮고 자식 클래스에서 정의한 것으로 대체한다고 외웠습니다.

 


 

 




'Java > 문법' 카테고리의 다른 글

11. 제네릭스 : Generics  (0) 2018.11.01
10. 인터페이스 : interface  (0) 2018.10.14
9. 추상화 : abstraction  (0) 2018.10.11
7. 상속 : extends  (0) 2018.10.11
6. 접근 제어자 : Access Modifier  (0) 2018.10.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
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
31
글 보관함