[Kotlin in Action] 1. 코틀린이란 무엇이며, 왜 필요한가?

코코아의 앱 개발일지·2025년 5월 11일

개념

목록 보기
1/2
post-thumbnail

[Kotlin in Action] 1장을 읽고, 정리한 내용입니다.

1.1) 코틀린 맛보기

https://play.kotlinlang.org/

⬆️ http://try.kotl.in 입력하면 아래 코틀린 플레이그라운드 링크로 이동함.

data class Person(val name: String,
									val age: Int? = null)

fun main(args: Array<String> {
	val persons = listOf(Person("영희"),
											 Person("철수", age=29))
	val oldest = persons.maxBy { it.age ?: 0 }
	println("나이가 가장 많은 사람: $oldest")
}
  • 언급한 개념
    • 데이터 클래스
    • nullable type
    • 최상위 함수
    • 람다식
    • 엘비스 연산자 (?:)
    • 문자열 템플릿
    → 후에 모든 내용을 자세히 알게될 수 있음

1.2) 코틀린의 주요 특성

1.2.1 대상 플랫폼

서버, 안드로이드 등 자바가 실행되는 모든 곳

1.2.2 정적 타입 지정 언어

  • 코틀린은 자바와 마찬가지로 정적(static) 타입 지정 언어

💡 “정적 타입 지정”

  • 모든 프로그래밍 구성 요소의 타입을 컴파일 시점에 알 수 있음
  • 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해 줌
    ↔ 동적 타입 지정

JVM에서는 Groovy, JRuby가 대표적인 동적 타입 지정 언어

  • 타입과 관계없이 모든 값을 변수에 넣을 수 있음
  • 메소드나 필드 접근에 대한 검증이 런타임에 일어남
  • 코드가 더 짧아지고, 데이터 구조를 더 유연하게 생성하고 사용할 수 있음
  • 이름을 잘못 입력하는 등의 실수를 컴파일 시 걸러내지 못함 → 런타임에서 오류 발생
  • 정적 타입 지정 ↔ 동적 타입 지정
    • 정적 타입 지정

      예시 언어C, C++, Java, Kotlin, Swift
      특징 / 장점- 강력한 타입 체크 → 런타임 오류 가능성을 줄임
      - 컴파일 최적화가 용이
      - 실행속도가 빠르고 효율적인 프로그램 작성 가능
      사용 분야- 대규모 프로젝트
      - 애플리케이션 개발 (성능 중요)
    • 동적 타입 지정

      예시 언어Python, JavaScript, Ruby
      특징 / 장점- 변수 타입을 런타임에 결정 → 타입 선언이 간결하고, 코드의 양이 작음
      - 빠른 프로토타이핑과 스크립팅에 유리
      - 타입 변환 유연성↑ → 다양한 타입의 데이터를 쉽게 처리할 수 있음
      사용 분야- 작은 규모의 프로젝트
      - 데이터 과학, 웹 개발 등

      참고: https://f-lab.kr/insight/programming-language-type-systems

  • 타입 추론 (type inference)

    컴파일러가 문맥을 고려해 변수 타입을 결정하는 기능

    var x = 1
  • 변수를 정의하면서 정수 값으로 초기화 → 코틀린이 이 변수의 타입이 Int임을 자동으로 알아냄
  • 정적 타입 지정의 장점
성능실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없음 → 메소드 호출이 더 빠름
신뢰성컴파일러가 프로그램의 정확성 검증
→ 실행 시 프로그램이 오류로 중단될 가능성↓
유지보수성코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있음
→ 처음 보는 코드를 다룰 때 더 쉬움
도구 지원- 더 안전한 리팩토링
- 도구가 더 정확한 코드 완성 기능 제공 가능
- IDE의 다른 자원 기능도 더 잘 만들 수 있음
  • 코틀린의 타입 시스템
    • class, interface, generics는 모두 자바와 비슷하게 작동
    • nullable type 지원 → 컴파일 시점에 null pointer exception이 발생할 수 있는지 여부를 검사 가능 (신뢰성↑)
    • 함수 타입에 대한 지원

1.2.3 함수형 프로그래밍과 객체지향 프로그래밍

  • 함수형 프로그래밍의 핵심 개념

    • 일급 시민(first-class) 함수
    • 불변성 (immutability)
      • 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성함
      • Kotlin에서 가변성을 제한하는 방법
        1. 읽기 전용 프로퍼티 val

        2. Mutable 컬렉션과 read-only 컬렉션 구분

          ex) ArrayList ↔ List

          • 읽기 전용: Iterable, Collection, Set, List
          • 읽기&쓰기: MutableInterable, MutableCollection, MutableSet, MutableList
        3. data class의 copy()
          참고: [Kotlin] 불변성(Immutability)과 가변성(Mutability)

    • 부수 효과(side effect) 없음
      • 함수형 프로그래밍에서는 순수 함수(pure function)를 사용
        • 입력이 같으면 항상 같은 출력이 나옴
        • 함수 외부나 다른 바깥 환경과 상호작용하지 않음 (부수 효과 X)
  • 함수형 프로그래밍 장점

    1. 간결성
      • 함수를 값으로 활용할 수 있으면 더 강력한 추상화 가능 → 이를 통해 코드 중복을 막을 수 있음
      • 람다식(무명 함수 구문) → 공통 부분을 따로 함수로 뽑아내고, 서로 다른 세부사항을 인자로 전달할 수 있음
        fun findAlice() = findPerson { it.name == "Alice" }
        fun findBob() = findPerson { it.name == "Bob" }
    2. 다중 스레드를 사용해도 안전함 (safe multi-threading) ← 감이 잘 안 잡힌다
      • 다중 스레드에서 문제가 생기는 경우: 여러 스레드가 같은 데이터를 적절한 동기화 없이 변경할 때
      • 불변 데이터 구조 사용 & 순수 함수를 그 데이터 구조에 적용하면 → 다중 스레드 환경에서 여러 스레드가 같은 데이터를 변경할 수 없음 → 복잡한 동기화를 적용하지 않아도 됨
    3. 테스트 용이성
      • 부수 효과가 있는 함수는 준비 코드가 필요함
        • 그 함수를 실행할 때 필요한 전체 환경을 구성하는 것
      • 순수 함수는 그런 코드 없이 독립적으로 테스트할 수 있음
  • 코틀린에서의 함수형 프로그래밍

    • 일반적으로 언어와 관계없이 함수형 스타일을 활용할 수 있음. 그러나 코틀린은 함수형 프로그래밍을 편하게 사용하기 위한 충분한 라이브러리와 문법을 지원함

💡“코틀린은 아래와 같은 함수형 프로그래밍을 지원해요”

  • 함수 타입을 지원함에 따라 어떤 함수가 다른 함수를 파라미터로 받거나 함수가 새로운 함수를 반환할 수 있다.
  • 람다 식을 지원함에 따라 번거로운 준비 코드를 작성하지 않아도 코드 블록을 쉽게 정의하고 여기저기 전달할 수 있다.
  • 데이터 클래스는 불변적인 값 객체(value object)를 간편하게 만들 수 있는 구문을 제공한다 .
  • 코틀린 표준 라이브러리는 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다.

1.3) 코틀린 응용

1.3.2 코틀린 안드로이드 프로그래밍

안드로이드 개발에 코틀린을 사용한 예제

  • 코틀린을 사용하면 애플리케이션의 신뢰성이 더 높아짐
  • NPE 문제를 줄여줌

1.4) 코틀린의 철학

코틀린은 자바와의 1) 상호운용성에 초점을 맞춘 2) 실용적이고, 3) 간결하며, 4) 안전한 언어!

1.4.1 실용성

  • 코틀린은 실제 문제를 해결하기 위해 만들어진 실용적인 언어
  • 다년간의 IT 업계 경험을 바탕으로 이루어진 설계
  • 다른 프로그래밍 언어가 채택한, 이미 성공적으로 검증된 해법&기능에 의존 → 언어 복잡도 ↓, 학습 러닝커브 ↓
  • 도구를 강조 (IDE 지원)
    • 코틀린은 IntelliJ의 아이디어 & 컴파일러 개발과 맞물려 이루어져옴
    • 코틀린 언어의 특성은 항상 도구의 활용을 염두에 두고 설계되어 옴

1.4.2 간결성

  • 코드가 간단하고 간결할수록 내용을 파악하기 더 쉬움
  • 코틀린은 프로그래머가 작성하는 코드에서 의미없는 부분을 줄이고, 부수적인 요소를 줄이기 위해 많은 노력을 기울임 ex) getter, setter, 생성자 파라미터를 필드에 대입하기 위한 로직 등의 준비 코드를 코틀린은 묵시적으로 제공 (↔ 자바)
  • 기능이 다양한 표준 라이브러리 제공 → 라이브러리 호출로 반복 / 길어질 수 있는 코드를 대치
    • 람다 지원 → 라이브러리 함수에 코드 블록을 쉽게 전달 가능

1.4.3 안정성

💡“프로그래밍 언어가 안전하다” ⇒ 프로그래밍에서 발생할 수 있는 오류 중 일부 유형의 오류를 프로그램 설계가 원천적으로 방지해 줌

  • 코틀린은 컴파일 시점에 오류를 많이 방지해줌 (컴파일 > 런타임)
  • NullPointerException
    • null 객체에 접근해서 메소드를 호출하는 경우 발생하는 에러
    • null 허용을 위해서는 ? 만 추가하면 됨
          val s: String? = null // nullable
          val s2: String = ""
    • 코틀린 타입 시스템은 null이 될 수 없는 값을 추적
    • 실행 시점에 NPE가 발생할 수 있는 연산을 사용하는 코드를 금지함
  • ClassCastException
    • 특정 클래스의 객체를 이와 호환되지 않는 다른 클래스의 객체로 전환하려 할 때 발생하는 에러

    • 코틀린에서는 타입 검사와 캐스트가 한 연산자에 의해 이루어짐

      if (value is String) // 타입을 검사
      	println(value.toUpperCase()) // 해당 타입의 메소드를 사용

1.4.4 상호운용성

  • 코틀린은 자바의 기존 라이브러리를 그대로 사용할 수 있음
  • 자바 & 코틀린 소스 파일을 병행하더라도 제대로 프로그램 컴파일할 수 있음

1.5 코틀린 도구 사용

1.5.1 코틀린 코드 컴파일

  • 소스코드: .kt 확장자
  • 코틀린 컴파일러: 코틀린 소스코드 분석 → .class 파일 생성
  • 코틀린 컴파일러로 컴파일한 코드: 코틀린 런타임 라이브러리에 의존
    • 런타임 라이브러리: 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어있음
    • 코틀린으로 컴파일한 애플리케이션 배포 시에는 런타임 라이브러리도 함께 배포해야 함
  • 실제 개발 진행 시 프로젝트를 컴파일하기 위해 사용하는 빌드 시스템: maven, gradle, ant 등
    • maven, gadle: 애플리케이션을 패키지할 때 알아서 코틀린 런타임을 포함시켜줌
profile
안드로이드 개발자를 꿈꾸는 학생입니다

0개의 댓글