[코틀린 인 액션] CH3 함수 정의와 호출

0

코틀린 인 액션

목록 보기
3/13
post-thumbnail
post-custom-banner

[코틀린 인 액션] CH3 함수 정의와 호출

이 포스팅은 <<Kotlin in Action>>, 드미트리 제메로프 & 스베트라나 이사코바, 에이콘출판사(2017)을 읽고 개인 학습용으로 정리한 글입니다.

3.1 코틀린에서 컬렉션 만들기

val set = hashSetOf(1, 7, 53)
val list = arrayListOf(1, 7, 53)
val map = hashMapOf(1 to "one", 7 to "seven", 53 to "fifty three")
  • to는 언어가 제공하는 특별한 키워드 X, 일반 함수 O
println(set.javaClass) //출력: class.java.util.HashSet
println(list.javaClass) //출력: class.java.util.ArrayList
println(map.javaClass) //출력: class.java.util.HashMap
  • javaClass는 자바 getClass()에 해당하는 코틀린 코드

  • 코틀린 컬렉션은 자바 컬렉션과 똑같은 클래스

3.2 함수를 호출하기 쉽게 만들기

3.2.1 이름을 붙인 인자

  • 안드로이드 프레임워크나 JDK가 제공하는 함수를 호출할 때 이름 붙인 인자 사용 불가능
    -> 클래스 파일에 함수 파라미터 정보를 넣는 것은 자바 8 이후 추가된 선택적 특징
    -> 코틀린은 JDK 6과 호환됨

3.2.2 디폴트 파라미터 값

  • 자바에는 디폴트 파라미터 값이라는 개념이 없음
    -> 코틀린 함수를 자바에서 호출하는 경우 모든 인자 명시해야

  • @JvmOverloads 애노테이션
    -> 코틀린 컴파일러가 자동으로 맨 마지막 파라미터로부터 파라미터를 하나씩 생략한 오버로딩한 자바 메서드 추가해줌
    -> 각각의 오버라이딩한 함수들은 시그니처에 생략된 파라미터에 대해 코틀린 함수의 디폴트 파라미터 값을 사용

3.2.3 정적인 유틸리티 클래스 없애기: 최상위 함수와 프로퍼티

  • 코틀린에서 최상위 함수 선언
    -> JVM은 클래스 안에 있는 코드만 실행할 수 있음
    -> 컴파일러는 이 파일을 컴파일할 때 최상위 함수가 들어있는 코틀린 소스 파일의 이름으로 새로운 클래스 생성

  • @JvmName 애노테이션
    -> 코틀린 최상위 함수가 포함되는 클래스 이름을 바꾸고 싶을 때 사용
    -> 파일의 맨 앞, 패키지 이름 선언 이전에 위치

  • 기본적으로 최상위 프로퍼티도 다른 모든 프로퍼티처럼 접근자 메서드를 통해 자바 코드에 노출됨

  • 최상위 프로퍼티를 활용해 상수를 추가하는 경우 const 변경자 추가
    -> 자바의 public static final 필드로 컴파일됨

3.3 메서드를 다른 클래스에 추가: 확장 함수와 확장 프로퍼티

  • 기존 자바 API를 재작성하지 않고도 코틀린이 제공하는 여러 편리한 기능을 사용할 수 있게 함

  • 함수가 확장할 클래스의 이름: 수신 객체 타입(receiver type)
    확장 함수가 호출되는 값(객체): 수신 객체(receiver object)

  • 함수가 확장할 클래스가 자바나 코틀린 중 어떤 것으로 작성됐는가는 중요하지 X
    -> 그루비(Groovy)같은 다른 JVM 언어로 작성된 클래스도 확장 가능

  • 클래스 안에서 정의된 메서드와 달리 내부에서만 사용할 수 있는 멤버(private, protected) 사용 X

  • 호출하는 쪽에서는 확장함수와 멤버 메서드를 구분할 수 X

3.3.1 임포트와 확장 함수

  • 클래스를 임포트할 때와 동일한 구문을 사용해 함수 임포트

  • as 키워드를 사용하면 임포트한 클래스/함수 다른 이름으로 부를 수 있음

  • 임포트할 때 이름을 바꾸는 것이 확장 함수 이름 충돌을 해결할 수 있는 유일한 방법

3.3.2 자바에서 확장 함수 호출

  • 내부적으로 확장 함수는 수신 객체를 첫번째 인자로 받는 정적 메서드

3.3.3 확장 함수로 유틸리티 함수 정의

  • 확장 함수를 하위 클래스에서 오버라이드 할 수 X
    -> 확장 함수는 정적 메서드와 같은 특징을 가짐

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

  • 확장 함수는 클래스 밖에 선언 됨 -> 클래스의 일부가 아니다

  • 확장 함수를 호출할 때 수신 객체로 지정한 변수의 정적(컴파일 시점) 타입에 의해 어떤 확장 함수가 호출될지 결정된다
    -> 그 변수에 저장된 객체의 동적(런타임) 타입에 의해 결정되지 X

  • 어떤 클래스를 확장한 함수와 그 클래스의 멤버 함수의 이름과 시그니처가 같다면
    -> 멤버 함수가 호출된다 (우선순위 멤버 함수가 더 높음)

3.3.5 확장 프로퍼티

  • 확장 프로퍼티는 뒷받침하는 필드가 없음
    -> 초기화할 수 X
    -> 기본 게터 구현 제공되지 X, 최소한 게터는 꼭 정의해야 함

  • 자바에서 확장 프로퍼티를 사용하고 싶다면 항상 게터나 세터를 명시적으로 호출해야

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

3.4.1 자바 컬렉션 API 확장

3.4.2 가변 인자 함수: 인자의 개수가 달라질 수 있는 함수 정의

  • 가변 길이 인자
    -> 메서드를 호출할 때 원하는 개수만큼 값을 인자로 넘기면 자바 컴파일러가 배열에 그 값들을 넣어주는 기능
    -> 파라미터 앞에 varargs 변경자 붙이기

  • 이미 배열에 들어있는 원소를 가변 길이 인자로 넘길 때
    -> 코틀린에서는 배열을 명시적으로 풀어서 배열의 각 원소가 인자로 전달되게 해야
    -> 스프레드 연산자: 전달하려는 배열 앞에 * 붙이기

  • 스프레드 연산자를 통하면 배열에 들어있는 값과 다른 여러 값을 함께 써서 함수 호출 가능

3.4.3 값의 쌍 다루기: 중위 호출과 구조 분해 선언

  • 인자가 하나 뿐인 일반 메서드/확장 함수에 중위 호출 사용 가능
    -> 함수 선언 앞에 infix 변경자 추가
    -> 수신 객체와 유일한 메서드 인자 사이에 메서드 이름을 넣어 호출

3.5 문자열과 정규식 다루기

  • 코틀린 문자열은 자바 문자열과 같다
    -> 특별한 변환 X, 자바 문자열을 감싸는 별도의 래퍼 X

3.5.1 문자열 나누기

  • 자바의 split 메서드의 구분 문자열은 실제로는 정규식
    -> split(".")에서 마침표(.)는 모든 문자열을 나타내는 정규식으로 해석됨 -> 항상 빈 배열 반환

  • 코틀린에서는 자바의 split 대신 여러가지 다른 조합의 파라미터를 받는 split 확장 함수 제공
    -> 정규식을 파라미터로 받는 함수는 Regex 타입의 값을 받는다

3.5.2 정규식과 3중 따옴표로 묶은 문자열

  • 3중 따옴표 문자열 -> 역슬래시(\) 포함 어떤 문자도 이스케이프 할 필요 X

  • 일반 문자열을 사용해 정규식을 작성하는 경우 마침표 기호 이스케이프하려면 \\. 라고 써야
    -> 3중 따옴표 문자열에서는 \. 라고 쓰면 됨

3.5.3 여러 줄 3중 따옴표 문자열

  • 여러 중 문자열에서 코드를 더 보기좋게 표현하고자 한다면
    -> 들여쓰기를 하되 들여쓰기의 끝부분을 특별한 문자열로 표시
    -> trimMargin을 사용해 그 문자열과 그 직전의 공백 제거

  • 3중 따옴표 문자열 안에 문자열 템플릿 사용 가능

  • 3중 따옴표 문자열 안에 $기호를 넣어야 한다면 문자열 템플릿 안에 '$'문자를 넣어야

val price = """${'$'}99.9"""
  • 여러 줄 문자열은 테스트의 예상 출력을 작성할 때 가장 완벽한 해법
    -> 복잡하게 이스케이프 쓸 필요 X
    -> 외부 파일에서 텍스트를 불러올 필요 X
    -> 3중 따옴표 안에 HTML 또는 텍스트를 넣으면 됨

  • 기존 라이브러리를 새 언어에서 활용하는 패턴: 라이브러리 알선

3.6 코드 다듬기: 로컬 함수와 확장

  • 코틀린에서는 함수에서 추출한 함수를 원 함수 내부에 중첩시킬 수 있음

  • 로컬 함수는 자신이 속한 바깥 함수의 모든 파라미터와 변수 사용 가능

  • 중첩된 함수의 깊이가 깊어지면 코드를 읽기 어려워짐
    -> 일반적으로 한 단계만 함수 중첩 권장

profile
Be able to be vulnerable, in search of truth
post-custom-banner

0개의 댓글