이 포스팅은 Kotlin in Action, 드미트리 제메로프 & 스베트라나 이사코바, 에이콘출판사(2017)을 읽고 개인 학습용으로 정리한 글입니다.
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")
println(set.javaClass) //출력: class.java.util.HashSet
println(list.javaClass) //출력: class.java.util.ArrayList
println(map.javaClass) //출력: class.java.util.HashMap
javaClass는 자바 getClass()에 해당하는 코틀린 코드
코틀린 컬렉션은 자바 컬렉션과 똑같은 클래스
자바에는 디폴트 파라미터 값이라는 개념이 없음
-> 코틀린 함수를 자바에서 호출하는 경우 모든 인자 명시해야
@JvmOverloads 애노테이션
-> 코틀린 컴파일러가 자동으로 맨 마지막 파라미터로부터 파라미터를 하나씩 생략한 오버로딩한 자바 메서드 추가해줌
-> 각각의 오버라이딩한 함수들은 시그니처에 생략된 파라미터에 대해 코틀린 함수의 디폴트 파라미터 값을 사용
코틀린에서 최상위 함수 선언
-> JVM은 클래스 안에 있는 코드만 실행할 수 있음
-> 컴파일러는 이 파일을 컴파일할 때 최상위 함수가 들어있는 코틀린 소스 파일의 이름으로 새로운 클래스 생성
@JvmName 애노테이션
-> 코틀린 최상위 함수가 포함되는 클래스 이름을 바꾸고 싶을 때 사용
-> 파일의 맨 앞, 패키지 이름 선언 이전에 위치
기본적으로 최상위 프로퍼티도 다른 모든 프로퍼티처럼 접근자 메서드를 통해 자바 코드에 노출됨
최상위 프로퍼티를 활용해 상수를 추가하는 경우 const 변경자 추가
-> 자바의 public static final 필드로 컴파일됨
기존 자바 API를 재작성하지 않고도 코틀린이 제공하는 여러 편리한 기능을 사용할 수 있게 함
함수가 확장할 클래스의 이름: 수신 객체 타입(receiver type)
확장 함수가 호출되는 값(객체): 수신 객체(receiver object)
함수가 확장할 클래스가 자바나 코틀린 중 어떤 것으로 작성됐는가는 중요하지 X
-> 그루비(Groovy)같은 다른 JVM 언어로 작성된 클래스도 확장 가능
클래스 안에서 정의된 메서드와 달리 내부에서만 사용할 수 있는 멤버(private, protected) 사용 X
호출하는 쪽에서는 확장함수와 멤버 메서드를 구분할 수 X
클래스를 임포트할 때와 동일한 구문을 사용해 함수 임포트
as 키워드를 사용하면 임포트한 클래스/함수 다른 이름으로 부를 수 있음
임포트할 때 이름을 바꾸는 것이 확장 함수 이름 충돌을 해결할 수 있는 유일한 방법
확장 함수는 클래스 밖에 선언 됨 -> 클래스의 일부가 아니다
확장 함수를 호출할 때 수신 객체로 지정한 변수의 정적(컴파일 시점) 타입에 의해 어떤 확장 함수가 호출될지 결정된다
-> 그 변수에 저장된 객체의 동적(런타임) 타입에 의해 결정되지 X
어떤 클래스를 확장한 함수와 그 클래스의 멤버 함수의 이름과 시그니처가 같다면
-> 멤버 함수가 호출된다 (우선순위 멤버 함수가 더 높음)
확장 프로퍼티는 뒷받침하는 필드가 없음
-> 초기화할 수 X
-> 기본 게터 구현 제공되지 X, 최소한 게터는 꼭 정의해야 함
자바에서 확장 프로퍼티를 사용하고 싶다면 항상 게터나 세터를 명시적으로 호출해야
가변 길이 인자
-> 메서드를 호출할 때 원하는 개수만큼 값을 인자로 넘기면 자바 컴파일러가 배열에 그 값들을 넣어주는 기능
-> 파라미터 앞에 varargs 변경자 붙이기
이미 배열에 들어있는 원소를 가변 길이 인자로 넘길 때
-> 코틀린에서는 배열을 명시적으로 풀어서 배열의 각 원소가 인자로 전달되게 해야
-> 스프레드 연산자: 전달하려는 배열 앞에 * 붙이기
스프레드 연산자를 통하면 배열에 들어있는 값과 다른 여러 값을 함께 써서 함수 호출 가능
자바의 split 메서드의 구분 문자열은 실제로는 정규식
-> split(".")에서 마침표(.)는 모든 문자열을 나타내는 정규식으로 해석됨 -> 항상 빈 배열 반환
코틀린에서는 자바의 split 대신 여러가지 다른 조합의 파라미터를 받는 split 확장 함수 제공
-> 정규식을 파라미터로 받는 함수는 Regex 타입의 값을 받는다
3중 따옴표 문자열 -> 역슬래시(\) 포함 어떤 문자도 이스케이프 할 필요 X
일반 문자열을 사용해 정규식을 작성하는 경우 마침표 기호 이스케이프하려면 \\. 라고 써야
-> 3중 따옴표 문자열에서는 \. 라고 쓰면 됨
여러 중 문자열에서 코드를 더 보기좋게 표현하고자 한다면
-> 들여쓰기를 하되 들여쓰기의 끝부분을 특별한 문자열로 표시
-> trimMargin을 사용해 그 문자열과 그 직전의 공백 제거
3중 따옴표 문자열 안에 문자열 템플릿 사용 가능
3중 따옴표 문자열 안에 $기호를 넣어야 한다면 문자열 템플릿 안에 '$'문자를 넣어야
val price = """${'$'}99.9"""
여러 줄 문자열은 테스트의 예상 출력을 작성할 때 가장 완벽한 해법
-> 복잡하게 이스케이프 쓸 필요 X
-> 외부 파일에서 텍스트를 불러올 필요 X
-> 3중 따옴표 안에 HTML 또는 텍스트를 넣으면 됨
기존 라이브러리를 새 언어에서 활용하는 패턴: 라이브러리 알선
코틀린에서는 함수에서 추출한 함수를 원 함수 내부에 중첩시킬 수 있음
로컬 함수는 자신이 속한 바깥 함수의 모든 파라미터와 변수 사용 가능
중첩된 함수의 깊이가 깊어지면 코드를 읽기 어려워짐
-> 일반적으로 한 단계만 함수 중첩 권장