Inflearn brand logo image

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

geforce3080ti님의 프로필 이미지
geforce3080ti

작성한 질문수

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

메소드 오버로딩

섹션9. 66 메소드 오버로딩 시 질문이 있습니다.

작성

·

21

0

 record 메소드를 여러개 정의해서 사용하는데, 하나의 정의로 모든 경우에 쓰지 않는 이유가 메소드 양이 너무 많아져서 그런 건가요>?

void record(boolean showDateTime, boolean showSpeed, int min)
{
    System.out.println("녹화 시작");
    if(showDateTime)
    {
        System.out.println("영상에 날짜 정보 표시");
    }

    if(showSpeed) //위의 if 가 true 일때는 밑의 if가 실행이 안 되기 때문에
    {
        System.out.println("영상에 속도 정보 표시");
    }

    System.out.println("영상은" + min + "분 단위로 기록됩니다");
    System.out.println("-----------------------------------------------------");
}

void record() {
    record(true, true, 5);//메소드 호출 시 기본 값 설정
}

저런 식으로 나누지 않고 첫 번째 정의에 다 통합시키면 번거로울까요?

답변 1

1

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

안녕하세요?

질문에 아래와 같이 답변 드립니다.

// 1. 매개변수가 3개인 record 메소드
void record(boolean showDateTime, boolean showSpeed, int min) { ... }

// 2. 매개변수가 없는 record 메소드
void record() { ... }

먼저 위와 같이 2개의 메소드를 두고 각각 사용하도록 예제를 구성하였는데요. 이렇게 한 가장 큰 이유는 바로 편의성 때문입니다.

만약 매개변수가 없는 record() 메소드가 없다고 가정해 봅시다. 사용자가 날짜와 속도를 항상 표시하고, 5분 단위로 녹화하는 가장 일반적인 기능을 쓰고 싶을 때도 매번 아래와 같이 코드를 작성해야 하겠지요.

record(true, true, 5); // 항상 이렇게 모든 값을 넘겨줘야 함

하지만 record() 메소드를 오버로딩으로 만들어두면, 사용자는 그냥 기본값으로 녹화하고 싶을 때 간단하게 record(); 라고만 호출하면 됩니다. 내부적으로는 record(true, true, 5);가 호출되니 결과는 같지만, 코드를 사용하는 입장에서는 훨씬 간결하고 편리해지는 것이죠.

즉, 오버로딩을 통해 두 가지 선택지를 제공하는 것입니다.

  1. record(): "가장 일반적인 설정(기본값)으로 녹화해 줘."

  2. record(boolean, boolean, int): "내가 원하는 세부 설정을 줄 테니 그대로 녹화해 줘."

이렇게 하면 하나의 메소드 정의로 모든 경우를 처리하려고 복잡한 로직을 만드는 것보다 훨씬 코드가 깔끔하고 직관적이 됩니다.

이해가 되셨을까요? 여전히 궁금증이 남는다면 다시 답글 남겨주시면 다르게 설명드리겠습니다 😊


아, 그리고 if문에 대한 추가로 설명해 드릴 부분이 있습니다.

if(showDateTime)
{
    System.out.println("영상에 날짜 정보 표시");
}

if(showSpeed) //위의 if 가 true 일때는 밑의 if가 실행이 안 되기 때문에
{
    System.out.println("영상에 속도 정보 표시");
}

라고 작성을 하셨는데요.

주석에 "위의 if가 true일 때는 밑의 if가 실행이 안 되기 때문에"라고 적어주신 부분은 잘못된 설명입니다. 코드에 작성된 두 개의 if문은 서로 독립적이에요. showDateTime이 true인지 아닌지 확인하는 첫 번째 if문과, showSpeed가 true인지 아닌지 확인하는 두 번째 if문은 서로에게 아무런 영향을 주지 않습니다.

showDateTime이 true이면 첫 번째 if문 안의 코드가 실행되구요. 이와는 상관없이 showSpeed가 true이면 두 번째 if문 안의 코드도 실행됩니다.

만약 둘 중 하나만 실행되게 하려면 if-else if 구조를 사용해야 하지만 현재 코드에서는 날짜 표시 여부와 속도 표시 여부가 별개의 옵션이므로, 각각 if문을 사용하는 것이 맞습니다.

함께 알아두시면 좋겠습니다 🙌

감사합니다.

geforce3080ti님의 프로필 이미지
geforce3080ti

작성한 질문수

질문하기