코틀린학습 - #2 함수

2020. 11. 9. 19:52개발&TIL/kotlin

코틀린에서 컬렉션 만들기

  • .javaClass는 자바의 getClass()에 해당하는 코틀린 코드
  • 코틀린은 자체 컬렉션을 제공하지 않고 자바 컬렉션을 활용한다.
  • last(): 리스트의 마지막 원소 조회, max() 최댓값
 val strings = listOf("first", "second", "fourteenth")
 println(strings.last())

 val numbers = setOf(1, 14, 2) 
 println(numbers.max())

이름 붙인 인자

코틀린으로 작성한 함수를 호출할 때는 함수에 전달하는 인자 중 일부 또는 전부의
이름을 명시할 수 있다.

자바로 작성한 코를 호출할 때는 이름 붙인 인자를 사용 할 수 없다.

 joinToString(collection, separator = " ", prefix = " ", postfix = ".")

디폴트 파라미터 값

코틀린에서는 함수 선언에서 파라미터의 디폴트 값을 지정할 수 있으므로 오버로드 중 상당수를 피할 수 있다.

  • 디폴트 값이 지정된 파라미터
fun <T> joinToString(
   collection: Collection<T>,
   separator: String = ", ",
   prefix: String = "",
   postfix: String = ""
): String

자바쪽에서 코틀린 함수를 편하게 호출하고 싶다면 @JvmOverloads 를 붙이면
오버로딩 함수를 만들어 준다.

클래스의 이름을 바꾸고 싶다면 파일에 @JvmName 애노테이션을 추가하라.
파일의 맨 앞, 패키지 이름 선언 이전에 위치해야 한다.

  • 클래스 이름 지정 애노테이선 선

    @file:JvmName("StringFunctions")

최상위 프로퍼티

const 변경자를 추가하면 프로퍼티를 public static final 필드로 컴파일 할 수 있다.

  • const 사용
const val UNIX_LINE_SEPARATOR = "\n"
  • const 동일 자바 코드
public static final String UNIX_LINE_SEPARATOR = "\n";

확장 함수와 확장 프로퍼티

확장 함수는 어떤 클래스의 맴버 메서드인 것처럼 호출할 수 있지만 그 클랫의 밖에 선언된 함수다.
확장 함수를 만들려면 추가하려는 함수 이름 앞에 그 함수가 확장할 클래스의 이름을
덧붙이기만 하면 된다.

  • 확장 함수 예
package strings

fun String.lastChar(): Char = this.get(this.length - 1)

확장 함수는 오버라이드할 수 없다.

확장 프로퍼티

확장 프로퍼티를 사용하면 기존 클래스 객체에 대한 프로퍼티 형식의 구문으로 사용할 수 있는 API를
추가할 수 있다.

컬렉션 처리: 가변 길이 인자, 중위 함수 호출, 라이브러리 지원

  • vararg
  • 키워드를 사용하면 호출 시 인자 개수가 달라질 수 있는 함수를 정의할 수 있다.
  • java varargs ... 를 붙이는 대신 파라미터 앞에 vararg 변경자를 붙인다.
  • 스프레드 연자 '*'를 배열 앞에 붙이면 배열을 명시적으로 풀어서 전달된다.
fun main(args: Array<String>) {
    val list = listOf("args:", *args)
    println(list)
}
  • 중위 함수 호출
    • 구문을 사용하면 인자가 하나뿐인 메소드를 간편하게 호출할 수 있다.
    • 인자가 하나뿐인 일반 메소드나 인자가 하나뿐인 확장 함수에 중위 호출을 사용할 수 있다.
1.to("one") //to 메서드를 일반적인 방식으로 호출
1.to "one"  // to 메서드를 중위 호출 방식으로 호출
  • 구조 분해 선언
    • 사용하면 복합적인 값을 분해해서 여러 변수에 나뉘 담을 수 있다.
    • Pair는 코틀린 표준 라이브러리 클래스로 두 원소로 이뤄진 순서쌍을 표현

문자열과 졍규식

  • '.', '-' 으로 문자열을 분리하는 예 (명시적 선언)
println("12.345-6.A".split("\\.|-").toRegex())
  • '.', '-' 으로 문자열을 분리하는 예 (인자 하나상 이)
println("12.345-6.A".split(",", "-"))
  • 스트링 확장 함수를 사용에 경로 파싱에 쉬워진다.

    "".substringBeforeLast("/") -> 파일명 이전까지의 path

    "".subStringafterLast("/") -> path 이후의 파일명

3중 따옴표

3중 따옴표 문자열에서는 역슬래시를 포함한 어떤 문자도 이스케이프할 필요가 없다.
3중 따옴표를 쓰면 줄 바꿈이 들어있는 프로그램 텍스트를 쉽게 문자열로
만들 수 있다.

  • 줄바꿈 예
    val str1 = """123
                     .456
                     .789"""
    println(str1.trimMargin("."))

로컬 함수

함수내에 로컬함수를 선언해서 사용하면 중복을 없애는 동시에 코드 구조를 깔끔하게 유지할 수 있다.

로컬 함수는 자신이 속한 바깥 함수의 모든 파라미터와 변수를 사용할 수 있다.

  • 로컬함수에서 바깥 함수의 파라미터 접근하기 예
fun saveUser(user: User) {
    fun validate(value: String, fieldName: String) {
        if (value.isEmpty()) {
            throw IllegalArgumentException("error: ${user.id}") //바깥 함수의 파라미터 접근
        }
    }

    validate(user.name, "Name")
    validate(user.address, "Address")
}
728x90

'개발&TIL > kotlin' 카테고리의 다른 글

코틀린학습 - #6 오버로딩  (0) 2020.11.17
코틀린학습 - #5 타입 시스템  (0) 2020.11.17
코틀린학습 - #4 람다  (0) 2020.11.16
코틀린학습 - #3 클래스  (0) 2020.11.11
코틀린학습 - #1 기초  (0) 2020.11.09