독서

[코틀린 인 액션] 2장. 코틀린 기초

오렌지색 귤 2024. 3. 24. 01:39
반응형

찾아본 내용

 

1. 대입문은 자바에서는 식(expression)이었으나 코틀린에서는 문(statement)가 됐다. 그로 인해 자바와 달리 대입식과 비교식을 잘못 바꿔 써서 버그가 생기는 경우가 많았다. (p.63)

 

Expression(식) vs. Statement(문)의 차이

 

Expression(식)Statement(문)은 프로그래밍 언어에서 기본적인 구성 요소입니다. 이 둘의 가장 큰 차이는 값의 반환 여부와 할당의 가능성에 있습니다.

 

  • Expression(식): 값을 생성하고, 변수에 할당될 수 있는 코드 조각입니다. 예를 들어, 2 + 3, myVariable, myFunction() 등은 모두 값으로 평가되어 결과를 반환하는 식입니다. 식은 다른 식의 일부로 사용될 수 있습니다.
  • Statement(문): 프로그램의 동작을 지시하는 완전한 명령입니다. 값으로 평가되지 않으며, 단순히 명령을 수행합니다. 예를 들어, 변수 선언, 반복문, 조건문 등은 모두 문입니다. 문은 독립적인 실행 단위로, 결과를 반환하지 않습니다.

 

자바에서의 대입문과 코틀린에서의 대입문

 

자바(JAVA)에서 대입문은 식(Expression)으로 취급됩니다. 이는 대입문이 값으로 평가될 수 있음을 의미합니다. 예를 들어, a = b = 5는 b에 5를 할당하고, 그 결과값 5를 a에도 할당하는 식입니다.

 

코틀린(Kotlin)에서 대입문은 문(Statement)으로 취급됩니다. 즉, 값을 반환하지 않고 단순히 명령을 수행합니다. 따라서 코틀린에서는 대입을 값으로 사용할 수 없습니다.

 

 

자바와 코틀린에서의 버그 발생 사례

 

자바에서는 대입식을 조건식으로 잘못 사용할 수 있는데, 이로 인해 예상치 못한 버그가 발생할 수 있습니다. 예를 들어, if (a = b)와 같은 경우, 개발자가 의도한 것이 a == b인지, a에 b를 할당하려는 것인지 명확하지 않습니다. 이 실수는 프로그램의 논리적 오류로 이어질 수 있습니다.

 

반면, 코틀린은 대입문을 식으로 취급하지 않기 때문에 이러한 종류의 실수를 방지합니다. 코틀린에서는 대입이 값을 반환하지 않으므로, 조건식이나 다른 식에서 대입을 실수로 사용하는 것을 컴파일러가 방지합니다.

 

 

예제 코드

자바

int a, b;
b = 5;

// 대입식을 조건식으로 사용한 경우 (잘못된 사용 예)
if (a = b) {
    // 이 코드는 컴파일되지만, a = b는 대입 후 a의 값이 true인지 false인지를 평가합니다.
    // 이는 대부분의 경우 개발자의 의도와 다르게 작동할 수 있습니다.
}

코틀린

var a: Int
var b = 5

// 코틀린에서는 대입문이 값을 반환하지 않으므로 아래 코드는 오류를 발생시킵니다.
if (a = b) {
    // 오류: 대입문은 Boolean 값을 반환하지 않습니다.
}

 

코틀린의 접근 방식은 이런 종류의 실수를 방지하여 코드의 안전성을 높입니다.

 

 

 

궁금한 내용

 

1. 자바 컨벤션에서는 import 시에 `.*`사용을 지양했던 것 같은데, 코틀린에서는 사용해도 될까? (p.75)

 

자바에서의 와일드카드 임포트 (.* 사용)

 

자바에서 .*을 사용하는 와일드카드 임포트는 특정 패키지의 모든 클래스를 한 번에 임포트합니다. 이 방법은 편리해 보일 수 있으나, 몇 가지 단점으로 인해 일반적으로 지양됩니다. 주된 이유는 다음과 같습니다:

 

  • 명확성 감소: 어떤 클래스가 어떤 패키지에서 왔는지 명확하지 않아, 코드의 가독성과 유지보수성이 떨어집니다.
  • 네임스페이스 충돌: 서로 다른 패키지에 같은 이름의 클래스가 있을 경우, 어떤 클래스가 사용될지 예측하기 어려워집니다.

 

코틀린에서의 와일드카드 임포트

 

코틀린에서도 자바와 비슷한 이유로 와일드카드 임포트를 지양하는 것이 좋습니다. 하지만, 코틀린은 몇 가지 추가적인 이유로 인해 와일드카드 임포트의 사용을 더욱 유연하게 다룹니다:

 

  • 명시적 이름 충돌 해결: 코틀린은 이름 충돌이 발생할 경우, as 키워드를 사용하여 임포트하는 클래스나 함수를 다른 이름으로 별칭을 지정할 수 있어 충돌 문제를 해결할 수 있습니다.
  • 함수 및 속성 임포트: 코틀린은 함수와 속성(멤버 변수)도 직접 임포트할 수 있으므로, 특정 클래스 전체 대신 필요한 부분만 임포트할 수 있는 유연성을 제공합니다.

 

2. 코틀린에서는 semicolon을 쓰지 않는데 그럼 개행 문자로 구분하는 것인가? 코드 스타일로 인해 자동 개행이 되는 경우와 어떻게 구분하는가?

 

코틀린에서는 세미콜론(;)을 문(statement)의 끝을 나타내는데 필수적으로 사용하지 않습니다. 대신, 개행 문자(즉, 줄 바꿈)를 사용하여 대부분의 문을 구분합니다. 이는 코드를 더 깔끔하고 읽기 쉽게 만드는 코틀린의 설계 철학 중 하나입니다.

 

개행 문자로 구분하기

 

코틀린 컴파일러는 개행 문자를 통해 문의 끝을 인식합니다. 하지만, 여러 문을 한 줄에 쓰고 싶은 경우에는 세미콜론을 사용하여 문을 구분할 수 있습니다. 그러나 이런 경우는 드물고, 대부분의 코틀린 코드는 명시적인 세미콜론 없이 작성됩니다.

 

코드 컨벤션과 자동 개행

 

현대적인 통합 개발 환경(IDE)과 코드 에디터는 코틀린 코드를 작성할 때 코드 포매팅을 자동으로 도와줍니다. 이러한 도구들은 코틀린의 코드 스타일 가이드에 따라 개행과 들여쓰기를 적절히 적용하여 코드의 가독성을 높여줍니다. 개행이 자동으로 이루어지더라도, 컴파일러는 문법적으로 유효한 위치에서만 새로운 문으로 인식합니다.

 

 

 

 

참조

 

 

From the Kotlin community on Reddit

Explore this post and more from the Kotlin community

www.reddit.com

 

반응형