인프런 커뮤니티 질문&답변

갈색곰님의 프로필 이미지
갈색곰

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

메소드 오버로딩

메소드 오버로딩 강의 질문합니다

작성

·

313

0

안녕하세요 선생님

파이썬 기본 문법 강의부터 잘 들었던 학생입니다 ㅎㅎ

메소드 오버로딩 강의를 듣다가 메소드 오버로딩의 목적이 잘 이해가 가지 않아서 구글링을 해보았는데요,

TCP 스쿨 문서에

'이러한 메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있습니다.

또한, 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경을 쓰지 않고 호출할 수 있게 됩니다.

메소드 오버로딩은 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법 중 하나입니다.'

라고 답변이 나와있어 몇가지 질문드립니다.

  1. 메소드 오버로딩은 메소드에 사용되는 이름을 절약하는 것이 있고 다른 목적이 또 있을까요?

  2. 여기서 객체 지향 프로그래밍의 특징 중 하나인 '다형성'이라고 나오는데 다형성을 쉽게 이해할 수 있는 방법이 있을까요?

  3. 메소드 오버로딩의 대표적인 예로는 println() 메소드를 들 수 있다고하는데 자바 프로그래밍 언어를 창시할때 println()을 만들었을시, 해당 함수를 의미하는 것일까요?

항상 너무 감사하게 잘 듣고있습니다 친절하게 알려주셔서 정말 감사합니다 선생님 태풍 조심하시고 항상 건강하시고 행복한 하루 보내시길 바랍니다 :)

답변 3

2

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?
답변이 늦어 죄송합니다 🙇‍♂️

질문에 대해서 다음과 같이 답변드려요.

1. 메소드 오버로딩은 메소드에 사용되는 이름을 절약하는 것이 있고 다른 목적이 또 있을까요?

메소드의 이름은 동일하지만 전달값의 종류나 갯수를 다르게 정의하는 것이 메소드 오버로딩입니다. 이렇게 하게 되면 다양한 입력에 대해 동일한 작업을 수행하도록 할 수 있는데, 사용하는 입장에서는 여러 개의 메소드를 정의하는 대신 동일한 이름의 메소드를 사용하되 전달값만 다르게 함으로써 (1) 코드의 가독성을 높일 수 있으며(= 코드를 읽기가 쉬움) 메소드의 수정이 필요한 경우에도 보다 (2) 용이하게 유지보수를 할 수 있습니다. 또한 이름이 모두 같으므로 (3) 일관성도 가질 수 있으며 전달값의 조합에 따른 각각의 메소드를 외울 필요 없이 하나의 메소드만 알고 있으면 됩니다.

예를 들어서 아주 간단한 결제 관련 코드가 있습니다.
코드는 다음과 같이 작성했는데요.

public class Payment {
    public static int calculate(int price) {
        return price;
    }

    public static int calculate(int price, int discount) {
        return price - discount;
    }

    public static void main(String[] args) {
        System.out.println("상품의 가격은 " + calculate(20000) + "원입니다");
        System.out.println("할인된 상품의 가격은 " + calculate(20000, 1000) + "원입니다");
    }
}

마트에서 어떤 상품을 구매했는데 가격을 20,000 원이라고 해볼게요.

그럼 우리는 calculate(int price) 메소드를 이용해서

System.out.println("상품의 가격은 " + calculate(20000) + "원입니다");

코드를 실행하면 결제해야 할 금액을 알 수 있습니다.

(실행결과)
상품의 가격은 20000원입니다

그런데 상품 옆에 보니 할인 쿠폰이 종이로 붙어있는 거에요. 종이를 제시하면 1,000 원을 즉시 할인해준다고 합니다. 무조건 쿠폰을 써야겠죠? 이때 우리는 calculate(int price, int discount) 메소드를 쓸 수 있습니다. 동일한 메소드 이름이지만 전달값의 갯수가 달라진 오버로딩된 형태죠.

System.out.println("할인된 상품의 가격은 " + calculate(20000, 1000) + "원입니다");

이렇게 하면 상품의 가격인 20,000 원에서 쿠폰 할인 1,000 원을 적용한 결과를 얻을 수 있지요.

(실행결과)
할인된 상품의 가격은 19000원입니다

나중에 또 다른 형태의 계산 방법이 추가된다면 그에 따른 calculate() 메소드를 적절히 오버로딩하면 개발하는 입장에서는 calculate 라는 이름만 기억하고 있으면 수월하게 메소드를 사용할 수 있을 겁니다.


2. 여기서 객체 지향 프로그래밍의 특징 중 하나인 '다형성'이라고 나오는데 다형성을 쉽게 이해할 수 있는 방법이 있을까요?

※ 본 답변은 유사한 질문에 대한 답변을 토대로 작성되었습니다.
👉 https://www.inflearn.com/questions/887981

강의에서도 다뤘지만 객체 지향 프로그래밍 언어를 처음 공부하게 되면 누구나 헷갈리는 개념이에요. 다형성이란 말 그대로 다양한 형태를 띄는 것인데요.

예를 들어서 추운 겨울에는 강아지들도 산책을 할 때 바닥이 너무 차가워서 신발을 신는 경우가 있습니다. 강아지를 100 마리나 키우는 어떤 주인이 산책을 가기 위해 강아지들에게 신발을 신긴다고 가정해볼게요.

이 분은 이제 신발 신기기에는 도가 터서 눈을 감고도 할 수 있습니다.

1번 강아지, 2번 강아지, ... 101번 강아지.

어?

분명 산책을 나갈 강아지는 100 마리인데 신발을 다 신기고 보니까 101번을 신겼던 거에요. 알고 보니까 집 밖에 있던 고양이가 한마리 들어와서 강아지들 속에 껴 있었던 겁니다. (물론 이럴 일은 일어나지 않을 겁니다 🤣) 이 주인은 강아지 신발 신기기의 대명사인데 중간에 고양이가 한마리 껴도 아무런 문제 없이 신발을 신겼습니다

어떻게 이게 가능했을까요?

정답은 바로 다리에 있습니다.

개와 고양이는 모두 다리가 4개라서 주인은 아무런 의심 없이 신발을 신겼던 거죠.

며칠 뒤에는 소문이 퍼져서 온동네 주민들이 다 몰려듭니다.

"우리 토끼도 신발 좀 신겨줘요"
"우리 여우도 신발이 필요해요"
"우리 늑대도 가능할까요?"
"저희 집에 호랑이가 한마리 있는데요"

너도나도 할 것 없이 모두 다리 4개인 동물들을 데리고 와서 신발을 신겨 달라고 부탁한 것이죠. 그런데 사실 아무런 문제가 없습니다. (호랑이는.. 음..) 요청받은 동물들의 다리는 모두 4개이며 위치도 모두 다 비슷하거든요.

이게 바로 다형성입니다.

처음에는 강아지 신발만 신겼지만 어느새 고양이, 토끼, 여우, 늑대, 심지어 호랑이까지. 그저 다리가 4개인 동물이다라고 하면 아무런 문제 없이 그냥 신발을 신길 수 있게 된 것입니다.

 

그러면 이 주인분에게는 강아지 신발 신기기 달인이 어울릴까요? 아니면 고양이 신발 신기기 달인 이 어울릴까요?

먼저 코드로 적어보면 이렇게 될 것 같아요.

DogShoes dogShoes = new DogShoes(); // 강아지 신발 신기기
CatShoes catShoes = new CatShoes(); // 고양이 신발 신기기

그러면 DogShoes 와 CatShoes 클래스는 각각 있어야겠네요?

public class DogShoes {
    public void wearShoes() {
        System.out.println("강아지 신발을 신겨요");
    }
}

public class CatShoes {
    public void wearShoes() {
        System.out.println("고양이 신발을 신겨요");
    }
}

그리고 강아지 10마리와 고양이 10마리의 신발을 신기려면 이렇게 해야겠습니다.
(아직 리스트를 공부하지 않으셨다면 그냥 여러 자료를 한 번에 관리하기 위한 어떤 것이라고만 이해해주세요)

ArrayList<DogShoes> dogShoesList = new ArrayList<>();
// ... 신발 신을 강아지 목록 추가 ...

ArrayList<CatShoes> catShoesList = new ArrayList<>();
// ... 신발 신을 고양이 목록 추가 ...

강아지용 리스트와 고양이용 리스트를 따로 만드는 것이죠.

만약 토끼, 여우, 늑대 등의 동물도 신발을 신겨야 한다면 각각 리스트를 또 만들어줘야 할 것입니다.

 

하지만 제가 볼 때는 앞의 별명보다는 다리 4개인 동물 신발 신기기 달인이 더 어울릴 것 같습니다. 다리가 4개인 동물이라면 종류는 상관 없이 신발을 신길 수 있으니까요.

편의상 FourLegsAnimalShoes 라는 이름의 인터페이스로 만들어볼까요?

public interface FourLegsAnimalShoes {
    void wearShoes();
}

그리고 DogShoes 와 CatShoes 는 FourLegsAnimalShoes 인터페이스를 구현하도록 합니다.

public class DogShoes implements FourLegsAnimalShoes {
    ...
}

public class CatShoes implements FourLegsAnimalShoes {
    ...
}

그럼 이제 다음과 같이 코드를 작성할 수 있게 되는 거에요. 다형성에 의해서 말이죠.

FourLegsAnimalShoes dogShoes = new DogShoes(); // 강아지 신발 신기기
FourLegsAnimalShoes catShoes = new CatShoes(); // 고양이 신발 신기기

이 방법으로 강아지 10마리와 고양이 10마리의 신발을 신기려면 어떻게 할 수 있을까요?

ArrayList<FourLegsAnimalShoes> fourLegsAnimalShoesList = new ArrayList<>();
// ... 신발 신을 강아지, 고양이 목록 추가 ...

이번에는 리스트를 하나만 만들면 됩니다. 다형성에 의해서 가능한 일이죠.

강아지, 고양이 뿐만 아니라 다리가 4개인 모든 동물을 이 리스트 하나로 관리할 수 있게 됩니다. 서로 다른 동물의 종류만큼 리스트를 관리할 필요가 없으니 엄청 편리하죠?

그리고 사실 아래의 문장은

ArrayList<FourLegsAnimalShoes> fourLegsAnimalShoesList = new ArrayList<>();

다형성에 의해 이렇게 바꿀 수도 있답니다.

List<FourLegsAnimalShoes> fourLegsAnimalShoesList = new ArrayList<>();

ArrayList 가 List 인터페이스를 구현하거든요 😉


3. 메소드 오버로딩의 대표적인 예로는 println() 메소드를 들 수 있다고하는데 자바 프로그래밍 언어를 창시할때 println()을 만들었을시, 해당 함수를 의미하는 것일까요?

IntelliJ 에서 Ssytem.out.println(); 문장을 작성하고 나서 println 부분을 키보드 Ctrl 키를 누른 상태에서 마우스 클릭해보시면 정의된 소스코드를 확인할 수 있는데요. 동일한 이름인데 전달값의 형태나 갯수가 다른 여러 개의 println() 을 확인하실 수 있습니다.

public void println() { ... }
public void println(boolean x) { ... }
public void println(char x) { ... }
public void println(int x) { ... }
public void println(long x) { ... }
public void println(float x) { ... }
public void println(double x) { ... }
public void println(char x[]) { ... }
public void println(String x) { ... }
public void println(Object x) { ... }

위 메소드들은 모두 오버로딩되어 있기 때문에 사용하는 입장에서는 boolean 이나 int 나 double 이나 상관 없이 println() 을 이용할 수 있지요.

System.out.println(true); // boolean
System.out.println(123); // int
System.out.println(3.14); // double

아마 이 부분을 설명한 내용이 아닌가 합니다.

다소 답변 내용이 길었는데, 궁금증 해결이 도움되길 바라겠습니다 😊
감사합니다.

0

갈색곰님의 프로필 이미지
갈색곰
질문자

안녕하세요 선생님 상세한 답변 정말 감사드립니다 :)
감사 답변이 늦어졌네요 ㅠㅠ!
답변 상세하게 읽어보도록 하겠습니다.

정말 감사합니다 선생님 !!

0

안녕하세요, 인프런 AI 인턴입니다.

메소드 오버로딩은 메소드에 사용되는 이름을 절약하는 것 외에도 몇 가지 목적이 있습니다. 메소드 오버로딩을 사용하면 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경을 쓰지 않고 호출할 수 있습니다. 이를 통해 코드의 가독성을 높일 수 있으며, 개발자가 메소드를 사용할 때 매개변수의 타입을 명확하게 확인하지 않아도 되기 때문에 개발 편의성을 제공합니다.

메소드 오버로딩은 객체 지향 프로그래밍의 다형성을 구현하는 방법 중 하나입니다. 다형성이란 같은 이름의 메소드가 서로 다른 파라미터를 받거나 상속 관계의 클래스가 다른 구현을 가지는 것을 말합니다. 다형성을 이용하면 한 메소드 이름으로 다양한 상황에 맞는 동작을 수행할 수 있게 됩니다.

메소드 오버로딩의 대표적인 예로 println() 메소드를 들 수 있습니다. 자바에서 println() 메소드는 다양한 타입의 파라미터를 출력하기 위해 오버로딩되어 있습니다. 따라서 println()은 자바 프로그래밍 언어를 창시할 때부터 포함되어 있는 함수로, 여러 타입의 파라미터를 출력하기 위해 오버로딩되어 사용되는 것입니다.

다형성을 이해하는 방법 중 하나는 부모 클래스의 참조 변수로 자식 클래스의 객체를 참조하고, 이를 통해 부모 클래스에 정의된 메소드를 호출하는 것입니다. 이는 상속과 관련이 있으며, 상속 관계에서 다형성을 이용하여 객체를 다양한 형태로 사용할 수 있다는 점을 알려줍니다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있습니다.

좋은 질문 주셔서 감사합니다. 추가로 궁금한 점이 있으면 언제든지 물어보세요. 즐거운 학습되세요!

갈색곰님의 프로필 이미지
갈색곰

작성한 질문수

질문하기