본문 바로가기

공부 자료/코틀린[Kotlin]

[Atomic 31] 이름 붙은 인자와 디폴트 인자

함수를 작성할 때 기본 값을 지정하고,
함수를 호출할 때 인자의 이름을 지정할 수 있다.

 

 

우리는 함수를 작성할 때 파라미터를 함께 넣어서 함수를 호출하는 경우가 많은데,

지금까지의 예제들은 파라미터가 많지 않았지만 많아진다면 각 파라미터가 어떤것을 의미하는지 이해하기 쉽지 않을 것이다.

이를 위해 이름 붙은 인자를 사용하면 코드의 가독성이 좋아지는데 이름 붙은 인자와 디폴트 인자가 어떻게 쓰이는지 알아보자!

 


 

[ 이름 붙은 인자 ]

 

함수 호출 시 해당 인자가 의미하는 것이 무엇인지 이름을 붙이는 것

 

import atomictest.eq

fun color(red:Int, green:Int, blue:Int) =
	"($red, $green, $blue)"

fun main(){
	color(1, 2, 3) eq "(1, 2, 3") // 이름을 붙이지 않음
    
    // 이름 붙은 인자
    color(red = 76, green= 89, blue = 0) eq "(76, 89, 0)"
    color(52, 34, blue = 0) eq "(52, 34, 0)"
    color(green = 70, blue = 0, red = 80) eq "(80, 70, 0)"
}

 

- 모든 인자에 이름을 붙일 경우 모든 인자의 의미가 명확해지지만, 모든 인자에 이름을 붙이지 않아도 됨

- 인자에 이름을 붙일 경우 인자의 순서를 변경 가능하지만, 순서를 변경했다면 나머지 인자에도 이름을 붙여 사용해야 함 (컴파일러가 이름이 생략된 인자들의 위치를 알아내지 못할 수 있기 때문)

 


[ 디폴트 인자 ]

 

파라미터의 디폴트 값을 함수 정의 시 지정하는 것

 

import atomictest.eq

fun color(red:Int = 0, green:Int = 0, blue:Int = 0) =
	"($red, $green, $blue)"

fun main(){
	color(1, 3) eq "(1, 3, 0") // 이름을 붙이지 않음
    
    // 이름 붙은 인자
    color(green= 89) eq "(0, 89, 0)"
    color(blue = 10, green = 70) eq "(0, 70, 10)"
}

 

- 값을 지정하지 않은 인자의 경우 자동으로 디폴트 값으로 지정되며, 이 경우 코드를 짧고 더 가독성 있게 작성할 수 있음

 

 


[ 덧붙은 콤마 ]

 

import atomictest.eq

fun color(red:Int = 0, green:Int = 0, blue:Int = 0,) =
	"($red, $green, $blue)"

 

- 마지막 파라미터 뒤에 콤마를 추가로 붙인 것을 의미

- 파라미터 값을 여러 줄에 걸쳐 작성하는 경우 유용

- 덧붙은 콤마가 존재할 경우 콤마를 추가하거나 빼지 않아도 새로운 아이템을 추가하거나 순서를 변경할 수 있음

 

 


[ joinToString() ]

 

- 이터레이션이 가능한 객체(리스트, 집합, 범위 등)의 내용을 String으로 합침

- 원소 사이에 들어갈 문자열(구분자 : separator), 맨 앞에 붙일 문자열(접두사 : prefix), 맨 뒤에 붙일 문자열(접미사 : postfix) 지정 가능하며, 각 디폴트 값은 separator = ", " / prefix, postfix = ""(빈 문자열)로 지정되어 있음

 

import atomictest.eq

fun main(){
	val list = listOf(1,2,3)
    
    list.toString() eq "[1, 2, 3]"
    list.joinToString() eq "1, 2, 3"
    list.joinToString("!", "(", ")") eq "(1!2!3)" // 이름 없는 인자는 헷갈릴 수 있기 때문에 아래와 같이 나타냄
    list.joinToString(separator = "!", prefix "(", postfix = ")") eq "(1!2!3)"
}

 

 


 

[ trimMargin() ]

 

- 여러 줄 String 형식을 맞춰주는 표준 라이브러리 함수

- 각 줄의 시작 부분을 인식하기 위한 경계를 표현하는 접두사 String을 파라미터로 받아 사용(디폴트 값은 파이프 | )

- 소스 String의 각 줄 맨 앞에 있는 공백들 다음에 지정한 접두사 String까지를 잘라내서 문자열을 다듬어줌

- 여러 줄 문자열의 첫 번째 줄과 마지막 줄에 공백으로만 이뤄진 줄을 제거

 

import atomictest.eq


fun main() { 
	val poem = """
  		|-> Last night I saw upon the stair 
    	  |ー> A little man who wasn't there 
       		   |-> He wasn't there again today
      		 |->Oh, how I wish he'd go away."""
       
     poem.trimMargin() eq
	"""->Last night I saw upon the stair 
    ->A little man who wasn't there
	->He wasn't there again today
	->0h, how I wish he'd go away."""
    
	poem.trimMargin(marginPrefix = " |->") eq 
    """Last night I saw upon the stair
	A little man who wasn't there
	He wasn't there again today
	Oh, how I wish he'd go away."""
}

 


 

[ 오늘의 학습 소감 ]

 

오늘은 크게 이름 있는 인자, 디폴트 인자에 대해서 학습을 하는 아톰이었다. 내용이 크게 어렵지 않고 이해하기 쉬운 아톰이었지만 덧붙은 콤마, 함수 등 새롭게 나온 내용이 있어서 이해가 어려운 부분이 존재하기도 했던 아톰이었다. 하지만 그만큼 유용하고 쓰임이 많은 내용이었기에 이번 학습이 추후 어떻게 사용될지 기대가 되는 파트이기도 하다.