[Kotlin] default argument, named argument

Kotlin|2019. 9. 18. 20:10

코틀린이 편리한 부분이 많다는것들은 많이 봤지만

("var ${var}" 도 그렇고.. data class도 그렇고 null check도 그렇고 너무 많네요..;;)

 

몰랐던 기능이 있어 기록을 남깁니다.

 

먼저 "default argument"

 

자바에서 보통 인자가 없을때 그리고 인자가 있을때 처리를 위해

메소드 오버로딩으로 처리하곤 합니다

 

이코드가 결국에는 default 값 처리를 위한 건데

결국 arg가 없는 메소드를 열어봐야 기본값을 알 수 있습니다.

public void hello(){
	hello("kim");
}

public void hello(String name){
	System.out.println("Hello " + name);
}


/////////아니면 아래처럼 null로 넘기고 null이면 기본값 처리하는 방법이..

public void hello(){
	hello(null);
}

public void hello(String name){
	String localName = name;
	if(localName==null){
		localName="kim";
	}
	System.out.println("Hello " + localName);
}

 

그런데 코틀린에서는 아래와 같이 코드를 작성해서 default argument를 설정할 수 있습니다.

fun hello(name: String="kim")=println("hello ${name}")

훨씬 간결해집니다.

 

그럼 인자가 많아지거나 다양해지면 어떻게 하나?

(몇개는 입력을 받고 몇개는 default로 처리하고 싶을때... )

 

자바로 작성하면 null체크를 덕지덕지 처리를 해주기도하고

overload 메소드를 거의 종류별로 만들어야 하는 경우도 생기기 때문에

args가 늘어나는것 대신 보통 input용 클래스를 빌더패턴으로 만들던 그냥 data 클래스로 만들던 만들어서 코드를 처리하기도 합니다.

 


	public void order() {
		order(null, -1);
	}

	public void order(int cnt) {
		order(null, cnt);
	}

	public void order(String menuName) {
		order(menuName, -1);
	}

	public void order(String menuName, int cnt) {
		String localName = menuName;
		if (localName == null) {
			localName = "대표메뉴";//default Menu
		}
		int localCnt = cnt;
		if (localCnt == -1) {
			localCnt = 1;// default Cnt
		}
		System.out.println(menuName + " order " + cnt);
	}

 

코틀린에서는 "named argument"를 써서 쉽게 처리할 수 있습니다.

 

fun order(menuName: String="대표메뉴", cnt: Int=1)=println("${menuName} order ${cnt}")

여기까지는 위에 default argument와 동일합니다.

여기서 중요한건 사용할때 기존 order(null,10) 형태로 호출하는것이 아니라

아래와 같이 인자를 줄때 변수을 명시해서 넘길수 있습니다.

		order("피자", 5)//결과적으로 "피자 order 5", 모두 채운 기존 형태
		order(3)//에러
		order("피자")//결과적으로 "피자 order 1"
		order(menuName = "피자")//결과적으로 "피자 order 1"
		order(cnt = 3)//결과적으로 "대표메뉴 order 3"
		order(menuName = "피자", cnt = 5)//결과적으로 "피자 order 5"
        order(cnt = 5, menuName = "피자")//결과적으로 "피자 order 5", 순서 상관없이 잘 동작합니다
		

 

named argument 덕분에 첫번째 인자가 어떤 변수인지 두번째 인자가 어떤 arg인지

메소드 선언을 보지 않아도 호출하는 쪽에서 변수명을 명시하면 혼동을 덜할수 있고

arg순서가 바뀌거나(물론 유지보수를 위해 메소드 arg를 막 변경하는 사람은 없겠지만) arg가 늘어나는 경우에도

대응하기 좋을것으로 보입니다.

 

 

 

댓글()