자바 컬렉션은 코틀린 컬렉션과 똑같은 클래스다. 따라서, 서로의 코드를 호출할 때 컬렉션을 변환할 필요가 없다.
최상위 함수 = 패키지의 멤버 함수 -> 다른 패키지에서는 해당 패키지를 임포트해야 함 but 유틸리티 클래스가 필요 없으니 이득!
-> 컴파일러가 파일 이름으로 된 클래스를 생성한다. 자바에서 호출할 때 '파일이름(join.kt -> JoinKt).함수()' 형식을 사용한다.
최상위 프로퍼티
정적 필드에 저장된다
자바에서 사용할 때는 getter, setter로 접근한다.
상수로 사용할 경우 접근자 사용은 부자연스러우므로 const로 선언하면 public static final 필드로 컴파일 할 수 있다.
확장 함수
클래스의 멤버 메서드처럼 호출할 수 있지만 사실 클래스 밖에 정의된 함수이다.
수신 객체: 메서드가 호출되는 대상이 되는 객체(값)
this로 수신 객체에 접근할 수 있다.
어떤 JVM 언어가 됐든 소스 파일이 없어도 컴파일된 클래스 파일이 있는 한 클래스에 확장 함수를 추가할 수 있다.
캡슐화를 깨진 않는다: 객체의 private,protected 멤버는 사용할 수 없다.
객체의 메서드를 호출할 때 메서드인지 확장함수인지 구분할 수 없고, 중요하지도 않다.
확장 함수도 클래스, 최상위 함수와 마찬가지로 임포트 해야 한다.
내부적으로 확장 함수는 수신 객체를 첫 번째 인자로 받는 정적 메서드이다
-> 1. 따라서, 런타임 부가 비용이 발생하지 않는다.
-> 2. 자바에서 사용할 때 정적 메서드를 호출하며 객체를 첫 번째 인자로 넘기면 된다.
정적 메서드와 같기 때문에 하위 클래스에서 오버라이드할 수는 없다.
확장 함수의 호출은 정적으로 결정된다. 변수 타입에 의해 컴파일 시점에 결정된다는 뜻이다.
멤버 함수의 호출 우선 순위가 확장 함수보다 높다
-> 외부 프로젝트에서 선언한 확장 함수와 시그니처가 같은 멤버 변수를 추후에 클래스에 추가하면 문제가 될 수 있다.
---> 그래서 어쩌라고?
특정 부분에서만 사용할 함수는 확장 함수로 정의하여 클래스를 가볍게 유지할 수 있다.
private, protected 멤버에 접근할 필요가 없는 함수도 확장 함수로 정의하면 수신 객체를 지정하고 않고 접근할 수 있다.
---> 굳이 그래야 하나 싶다. 억지로 확장 함수가 유용하다고 말하려고 덧붙인 것 같다.
확장 프로퍼티
확장 프로퍼티는 상태를 가질 수 없다. 왜? 정적으로 저장되기 때문이다.
backing field가 없어서 값으로 초기화할 수 없다. getter를 꼭 정의해야 한다.
--> 왜 안되지? 정적 필드에 저장 된다며
==> 확장 프로퍼티는 상태를 갖지 못하도록 backing field를 못만들게 설계한 것 같다. 그렇게 얘길 해야지 왜 거꾸로 설명해서 헷갈리게
하냐
확장 프로퍼티로 함수 호출 구문을 더 짧게 만들 수 있다.
--> 굳이 해야할 필요성을 못느끼겠다. -> String.lastIndex 생각해보니 사용할만도 하긴 하네?ㅋㅋ
---> 라이브러리 만들 땐 사용할만 하겠다.
가변 인자 함수
대표적인 사용처: 컬렉션 초기화 - listOf(1, 2, 3)
파라미터 앞에 varargs 키워드를 붙인다. 자바는 타입 뒤에 ...을 붙인다.
코틀린은 자바와 달리 배열을 풀어서 가변 인자에 넣어야 하는데, 스프레드 연산자가 이 역할을 한다
-> ex) *args
스프레드 연산자를 활용하면 다른 값과 배열을 한꺼번에 가변 길이 인자에 전달할 수 있다.
중위 호출
수신 객체에 대해 인자가 하나뿐인 메서드를 호출할 때 사용한다
infix 키워드를 함수 선언 앞에 추가하면 중위 호출을 방식으로 메서드를 호출할 수 있다.
예시) to 함수: Pair
구조 분해 선언으로 Pair를 각각 변수에 할당할 수 있다. => 구조 분해 선언은 7장에서 더 자세히 설명
중위 호출은 특별한 문법처럼 보이지만 함수를 더 간결하게 호출하기 위함일 뿐이다.
문자열과 정규식 => 이 챕터의 목적이 뭐지? 함수 사용 예제 + 자바보다 편리한 문자열 다루기 보여주기?
자바와 달리 정규식을 사용하지 않고 문자열을 파싱할 수 있다.
정규식도 자바보다 더 편하게 사용할 수 있다
-> 삼중 따옴표를 쓰면 이스케이프 문자가 필요 없다. 단, 정규식 패턴 이스케이프는 해야 한다
삼중 따옴표 문자열은 공백 문자를 이스케이프 문자가 아니라 공백 문자 그대로 받아들인다. 따라서, 여러 줄 문자열을 보기 좋게
코드로 나타낼 수 있다.
-> 들여쓰기와 구분 문자열 + trimMargin(구분 문자열) 사용
삼중 따옴표 문법이 이해가 안간다. 어떤 건 문자로 사용하기 위해 이스케이프 해야 하고 어떤건 이스케이프가 필요 없다.
규칙이 뭐야?
긴 문자열이 결과로 나오는 테스트를 할 때 삼중 따옴표를 유용하게 사용할 수 있다고 한다. 난 잘 모르겠다, 예시도 없고.
로컬 함수
함수를 함수 내부에 중첩해서 로컬 함수로 정의할 수 있다.
로컬 함수로 함수 안에서만 발생하는 코드 중복을 깔끔하게 리팩토링할 수 있다.
중첩이 깊어지면 읽기 어려워지므로 한 단계까지만 중첩시키자.
로컬 함수는 자신이 속한 함수의 모든 변수에 접근할 수 있다.
셀프 피드백
공부량 늘리기: 디자인 패턴, 클린 코드, 제트팩 컴포즈
공부한 내용 더 정리해서 업로드하기
생각
공부를 했지만 머리에 남는 건 많지 않다. 다시 보고 체계적으로 정리해야겠지? 공부는 항상 어렵다. 열심히 이해하면서 봤는데, 정작 기억 나는 건 많지 않다. 공부가 원래 그런 걸까