본문 바로가기
개발일지

자바(Java) 함수의 디폴트 파라미터

by 앱또웹 2024. 12. 5.
728x90
반응형

코틀린 함수 코드를 작성하다 보면 기존 자바코드에 비해 확실히 편해진 부분 중 하나가

'함수의 디폴트 파라미터 값'을 지원한다는 점

함수의 기본값 설정이 어떤 것인지 이해하기 위해 먼저 자바에서 함수 파라미터의 기본값이 필요한 경우를 생각해봅시다

토스트 관련 함수 '파라미터에 따라' 짧거나 길게 보여주기 윟 다음 함수를 설계 했습니다

ToastUtilJava.java
package com.example.kotlinsample;

import android.widget.Toast;

public class ToastUtilJava {
    // 짧은 토스트 메세지를 보여주는 함수
    public static void toastShort(String message) {
        Toast.makeText(MainApplication.getAppContext(), message, Toast.LENGTH_SHORT).show();
    }

    // 긴 토스트 메세지를 보여주는 함수
    public static void toastLong(String message) {
        Toast.makeText(MainApplication.getAppContext(), message, Toast.LENGTH_LONG).show();
    }
    
    // 파라미터에 따라 긴 토스트 메세지, 또는 짧은 토스트 메세지를 보여준다
    public static void toast(String message, int length){
        Toast.makeText(MainApplication.getAppContext(), message, length).show();
    }
}

새로 추가된 toast() 함수를 사용하려면 다음과 같이 사용하면 됩니다

ToastUtilJava.toast("" + number + " 는 2의 배수입니다.", Toast.LENGTH_SHORT);

toast() 함수는 String 타입의 메세지를 전달 받은 '길이'를 기준으로 짧거나 길게 보여줍니다

그런데 막상 프로젝트를 진행하다 보면 Toast 메세지를 길게 쓰는 경우는 1% 정도밖에 되지 않습니다

호출 시 99%는 'Toast.LENGTH_SHORT'가 넘어올 것 입니다

 

함수를 사용하는 코드는 매번 'Toast.LENGTH_SHORT'를 넘겨야 해서 불편할 뿐만 아닌

자칫 실수로 잘못된 값을 넘길 수도 있죠

이런 경우 '파라미터의 기본값'이 정해져 있으면

사용힉 더 편리한 함수를 만들 수 있겟죠?

다만 자바에서는 함수 파라미터의 기본값을 제공하지는 않기 때문에 '메소드 오버로딩'으로 문제를 해결 합니다

ToastUtilJava.java
package com.example.kotlinsample;

import android.widget.Toast;

public class ToastUtilJava {
    // 짧은 토스트 메세지를 보여주는 함수
    public static void toastShort(String message) {
        Toast.makeText(MainApplication.getAppContext(), message, Toast.LENGTH_SHORT).show();
    }

    // 긴 토스트 메세지를 보여주는 함수
    public static void toastLong(String message) {
        Toast.makeText(MainApplication.getAppContext(), message, Toast.LENGTH_LONG).show();
    }

    // 파라미터에 따라 긴 토스트 메세지, 또는 짧은 토스트 메세지를 보여준다
    public static void toast(String message, int length){
        Toast.makeText(MainApplication.getAppContext(), message, length).show();
    }

    // 파라미터의 기본값을 사용하기 위해 메소드 오버라이딩
    public static void toast(String message){
        toast(message, Toast.LENGTH_SHORT)''
    }
}

코드 중 메소드 오버로딩된 부분이 보이시나요?

오버로딩 된 toast() 함수는 파라미터로 'message'만 받습니다

함수가 호출되면 파라미터로 받은 message와 기본값이 되어야 할 'length'는 자주 사용하는

'Toast.LENGTH_SHORT'를 사용하여 원래의 toast() 함수로 패스해 버립니다

이제 이 함수를 다른 클래스에서는 2가지 방법으로 사용이 가능 합니다

ToastUtilJava.toast("" + number + " 는 2의 배수입니다.", Toast.LENGTH_LONG);
ToastUtilJava.toast("" + number + " 는 2의 배수입니다.");

2번째 파라미터를 전달하지 않으면 자동 99%가 사용하는 '짧은 토스트 메세지'가 화면에 보이고

필요한 경우만 2번째 파라미터를 전달할 수 있는 것이죠

이 방법은 동작은 잘되지만 상당히 불편합니다

지금은 파라미터가 2개이지만 파라미터가 5개, 6개라면?

파라미터가 5개인데 그 중 4개가 거의 같은 파라미터 값을 사용한다고 생각해보세요

// 파라미터가 5개인 함수, 이중 param2 ~ param5 가 거의 같은 값을 사용한다면?
public static void function(int param1, int param2, int param3, int param4, int param5) {
}

// param5의 기본값을 지정한 함수
public static void function(int param1, int param2, int param3, int param4) {
	function(param1, param2, param3, param4, 5);
}

// param4 ~ param5 의 기본값을 지정한 함수
public static void function(int param1, int param2, int param3) {
	function(param1, param2, param3, 4, 5);
}

// param3 ~ param5 의 기본값을 지정한 함수
public static void function(int param1, int param2) {
	function(param1, param2, 3, 4, 5);
}

// param2 ~ param5 의 기본값을 지정한 함수
public static void function(int param1) {
	function(param1, 2, 3, 4, 5);
}

함수 파라미터의 기본값을 지정하기 위해 같은 메소드가 4번 오버라이딩 되었죠!

코드의 양도 상당히 많고 코틀린은 이런 문제점을 '파라미터의 기본값'을 지원함으로 해결 합니다!

728x90
반응형