[TIL] 20230711: Kotlin In Action 3장

ERyukSa·2023년 7월 11일
0

TIL

목록 보기
1/6

공부 내용

Kotlin In Action 3장: 함수 정의와 호출

  1. 자바 컬렉션은 코틀린 컬렉션과 똑같은 클래스다. 따라서, 서로의 코드를 호출할 때 컬렉션을 변환할 필요가 없다.

  2. 최상위 함수 = 패키지의 멤버 함수 -> 다른 패키지에서는 해당 패키지를 임포트해야 함 but 유틸리티 클래스가 필요 없으니 이득!
    -> 컴파일러가 파일 이름으로 된 클래스를 생성한다. 자바에서 호출할 때 '파일이름(join.kt -> JoinKt).함수()' 형식을 사용한다.

  3. 최상위 프로퍼티

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

셀프 피드백

  • 공부량 늘리기: 디자인 패턴, 클린 코드, 제트팩 컴포즈
  • 공부한 내용 더 정리해서 업로드하기

생각

  • 공부를 했지만 머리에 남는 건 많지 않다. 다시 보고 체계적으로 정리해야겠지? 공부는 항상 어렵다. 열심히 이해하면서 봤는데, 정작 기억 나는 건 많지 않다. 공부가 원래 그런 걸까

0개의 댓글