Tianea2160 / kotlin-in-action-study

코틀린 인 액션 책을 완독하기 위한 스터디 레포지토리 입니다.
MIT License
0 stars 0 forks source link

1주차 chapter 1, 2 #1

Open Tianea2160 opened 1 year ago

kim-sung-jee commented 1 year ago

1. 최상위 함수, 최상위 프로퍼티

최상위함수,최상위 프로퍼티 "만!" 있는 .kt 파일이 컴파일 될 때 어떻게 되는지

2. enum 이 int가 아닌 클래스이기 때문에 얻을 수 잇는 장점들

3. 코틀린 if,when문 특징

  1. 코틀린 컴파일러가 class file을 만들어준다 (이름은 "filename"+kt), 결국에는 JVM까지 가야하므로 class 가 필요하다.

  2. 이거는 좋은 글이 있어서 공유합니다 https://techblog.woowahan.com/2527/

  3. 그 자체로 값을 리턴할 수 있다

yangdongjue5510 commented 1 year ago
  1. whenif를 어떤 기준으로 선택할 수 있을까요?
  2. 코틀린의 함수에서 전달받은 인자를 재할당 받을 수 있을까요? 할 수 없다면 왜 그럴까요?
  3. 자바는 체크 예외와 언체크 예외를 구분했었는데 코틀린은 구분하지 않는 이유가 무엇일까요? 자바는 왜 구분했을까요?

제 생각 혹은 찾아본 내용

  1. else-if와 같이 분기가 여러 갈래로 나뉘는 경우 when을 사용하는 것이 가독성이 더 좋습니다. when은 자바의 switch와 비슷한 역할도 수행할 수 있어서 하나의 기준(하나의 객체, 리터럴 등)을 토대로 분기처리 하는 경우 코드를 깔끔하게 작성할 수 있습니다. 다만 분기가 하나이거나 매우 간단한 경우는 if를 사용하는 것이 좋아보입니다.
  2. 코틀린의 함수 안에서 전달받은 인자는 사실상 val(읽기 전용 값)에 저장됩니다. 그래서 함수 내부에서 인자를 다른 값으로 재할당할 수 없습니다. 이렇게 구현한 이유는 함수 인자가 의도하지 않게 변경되는 일을 방지하도록 설계되었기 때문입니다.
  3. 먼저 자바가 체크 예외와 언체크 예외를 나눈 이유는 개발자가 상황에 따라 다르게 예외 처리 하도록 설계했기 때문입니다. 체크 예외는 컴파일 시점에서 예상되는 예외를 말합니다. 그리고 이런 예외는 복구 가능하며 개발자가 미리 대응을 해놓도록 자바에서 강제했습니다. 반면 언체크 예외는 컴파일 시점에 발생할 지 알 수 없는 예외를 말합니다. 대부분 프로그래밍이 잘못된 오류이며 코드 상으로 복구가 불가능합니다. 또한 미리 발생할 지 알 수 없어서 굳이 대응을 강제로 해놓지 않았습니다. 반면 코틀린은 체크 예외가 없습니다. 체크 예외 처리를 강제 해도 대부분 복구를 하는 것이 아니라 의미 없는 다른 예외를 다시 던지도록 하거나 체크 예외가 발생해도 무시하는 코드를 작성하는 경우가 많았습니다. 이런 불필요한 처리를 하지 않고 사용하기 쉽도록 코틀린에서는 구분하지 않고 예외 처리를 강제하지 않도록 설계됐습니다.

https://www.acmicpc.net/problem/1182

kim-sung-jee commented 1 year ago
  1. 저도 매우 간단한 분기는 if문을 쓰고 양이 늘어날 것 같으면 switch나 when을 쓰는 게 좋아보입니다. (when이 자바의 if문으로 변환된다네요 https://stackoverflow.com/questions/49643265/any-performance-cost-with-using-when-instead-of-if-else )

  2. 함수의 파라미터 선언 시 val이나 var은 붙일 수 없다고 합니다. 애초에 코틀린이 인자로 받은 값을 immutable하도록 설계를 하였고(파라미터로 받은 것을 mutating하는 것은 좋은 스타일이 아니랍니다.),생성자의 val,var로 인해 property가 생성되는 문법과 충돌하기 때문에 그리고 함수의 인자로 전달된 것이 reference되지 않기 때문에 혼란을 주는 것을 피하려는 점도 있다고 합니다. (https://stackoverflow.com/questions/68822461/why-is-var-or-val-not-allowed-in-a-functions-parameter-in-kotlin)

Tianea2160 commented 1 year ago

이번주 질문

fun main() {
    val data = mapOf("hello" to 0, "world" to 1)
    for(e in data) println(e)
}

풀어보면 좋을 것 같은 간단한 문제들

https://www.acmicpc.net/problem/5622

https://www.acmicpc.net/problem/10809

https://www.acmicpc.net/problem/1157

hweyoung commented 1 year ago

코틀린 문서

kotlin online IDE : https://bit.ly/3X6EkTT kotlin 공식 문서 : https://kotlinlang.org/docs/home.html

간단한 질문들

  1. 코틀린에서 class 프로퍼티 선언시 제공하는 디폴트 접근자는 어떻게 될까? (val, var의 차이점)
  2. 코틀린은 call-by-value일까 call-by-reference 일까?
  3. 코틀린 예외처리의 특징

간단한 문제

소수 찾기(1978) : https://www.acmicpc.net/problem/1978 수 정렬하기(2750) : https://www.acmicpc.net/problem/2750 구간합구하기(11659) : https://www.acmicpc.net/problem/11659


Q. 코틀린은 call-by-value일까 call-by-reference 일까?

자바와 같은 방식으로 동작한다.

Q. 코틀린에서 class 프로퍼티 선언시 제공하는 디폴트 접근자는 어떻게 될까? (val, var의 차이점)

class Person{
    val name: String, // 읽기 전용 (getter)
    var isMarried: Boolean // 읽기(getter), 쓰기(setter) 가능
}

자바에서는 필드와 접근자를 한데 묶어 property라고 부른다.

코틀린 property는 자바의 필드와 접근자 메서드를 완전히 대신한다.

val로 선언한 프로퍼티는 읽기 전용이며, var로 선언한 프로퍼티는 변경 가능하다.

→ 코틀린 클래스 내에서 프로퍼티를 선언하게 되면 비공개 필드와 필드를 읽는 public 형식의 getter와 setter를 만들어낸다.

→ 코틀린은 값을 저장하기 위한 비공개 필드와 그 필드에 값을 저장하기 위한 세터, 필드의 값을 읽기 위한 게터로 이뤄진 간단한 디폴트 접근자 구현을 제공한다.

Q. 코틀린 예외처리의 특징

코틀린의 예외처리(exception)는 자바의 예외처리와 비슷합니다. 함수는 정상적으로 종료할 수 있지만, 오류가 발생하면 예외를 던질 수(throw) 있고, 함수를 호출하는 쪽에서는 그 예외를 잡아 처리할 수 있습니다.

발생한 예외를 함수 호출 단에서 처리(catch)하지 않으면, 함수 호출 스택을 거슬러 올라가면서 예외를 처리하는 부분이 나올 때까지 예외를 다시 던지게(rethrow) 됩니다.

자바와 가장 큰 차이는, 메소드 옆에 throws절이 없다는 점입니다.

자바에서는 함수를 작성할 때, 함수 선언 뒤에 throws IOException을 붙여서 예외(exception)를 명시적으로 처리해야 합니다.

하지만, 코틀린에서는 함수가 던지는 예외를 잡아내도 되고, 잡아내지 않아도 됩니다.

컴파일 타임에 예외처리에 대한 에러를 표시하지는 않지만 자원을 사용중에 에러가 발생시 런타임에 에러를 던집니다.

코틀린은 프로그래밍 로직에서 예외처리를 권장하고, throw의 경우 일반식처럼 사용이 가능합니다.

if (number in 0..100) {
  number
} else {
  throw IllegalArgumentException("0~100사이의 숫자가 아닙니다.")
}

try 키워드의 경우에도 값을 변수에 대입할 수 있다.

class Person{
    val name: String, // 읽기 전용 (getter)
    var isMarried: Boolean // 읽기(getter), 쓰기(setter) 가능
}
ccppoo commented 1 year ago

https://relic-thyme-07a.notion.site/1-3cf7faa9327e477fbece480cdf87fb93

어려울수있지만 유용한거 : https://relic-thyme-07a.notion.site/1-3cf7faa9327e477fbece480cdf87fb93