Kotlin/Kotlin In Action

코틀린이란?

혠꿍 2023. 7. 2. 16:23

 

📨 인자와 매개변수의 차이
매개변수: 함수를 선언할 때 (a: Int, b: Int)
인자: 함수를 호출할 때 sum(1,2)
인자 함수는 선언 부분에 있는 매개변수 a와 b로 복사되어 전달된다.

매개변수는 함수의 정의부분에 나열되어 있는 변수들을 의미하며, 전달인자는 함수를 호출할때 전달되는 실제 값을 의미한다.

1. 정적 타입 지정 언어

정적 타입이란 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해준다는 의미이다.
타입과 관계 없이 모든 값을 변수에 넣을 수고 메소드나 필드 접근에 대한 검증이 실행 시점에 일어나기 때문에 코드가 짧아지고 데이터 구조를 더 유연하게 생성할 수가 있다.
코틀린 컴파일러가 문맥으로부터 대부분 변수 타입을 자동으로 유추하기 때문에 타입 선언 생략이 가능하다. (타입 추론)

  • 성능: 실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없기 때문에 메소드 호출이 더 빠르다.
  • 신뢰성: 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 중에 프로그램이 오류로 중단될 가능성이 적어진다.
  • 유지 보수성: 코드에서 어떤 객체가 어떤 타입에 속하는지 명확하기 때문에 유지보수에 유리하다.
  • 도구 지원: 정적 타입 지정을 활용하여 더 안전하게 리팩토링이 가능하고 도구는 더 정확한 코드 완성 기능을 제공할 수 있다.
  • 널이 될 수 있는 타입: 컴파일 시점에 널 포인터 예외가 발생하는지 검사가 가능하다.
  • 함수 타입: 함수형 프로그래밍이 가능하다.

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

2-1. 함수형 프로그래밍이란?

함수형 프로그래밍은 순수 함수를 작성하여 프로그램의 부작용을 줄이는 프로그래밍 기법으로 람다식과 고차함수를 사용한다.

2-2 순수함수 / 람다식 / 고차함수

순수함수란?

  • 같은 인자에 대하여 항상 같은 값을 반환한다.
  • 함수 외부의 어떤 상태도 바꾸지 않는다.

순수 함수를 사용하게 된다면 코드의 재사용성을 높여 강력한 추상화가 가능하고 중복된 코드를 방지할 수 있다.

// 순수함수: 항상 두 인자의 합을 리턴하면서 외부의 어떤 변수도 변경하지 않는다.
fun sum(a: Int, b: Int) {
    retrun a + b
}

// 순수함수가 아닌 함수: User.grade()의 결과에 따라 process 함수 실행이 결정된다.
fun check() {
    val test = User.grade()
    if(test != null) process(test)
}

람다식이란?

  • 메소드를 하나의 식으로 표현한 것이다.
  • 메소드의 이름과 반환값이 없어지기 때문에 익명함수라고도 한다.
  • 함수형 프로그래밍에서 자주 사용된다.
  • 일명함수는 일급객체라는 특징을 가지고 있다.
  • 메소드를 변수처럼 다루는게 가능하다.

2-3. 함수형 프로그래밍 특징

일급 시민 함수란?

일급 시민 함수는 함수를 일반 값처럼 다룰 수 있고 3가지의 조건을 충족해야한다. 함수를 자유롭게 조작하고 함수형 프로그램의 큰 특징이 된다.

  1. 함수를 변수에 저장할 수 잇다.
  2. 함수를 인자로 전달할 수 있다.
  3. 함수의 반환값으로 함수를 전달할 수 있다.
더보기

🌭 1급 객체와 1급 함수

- 1급 객체란?

1급 시민의 조건을 충족하는 객체이다. 코틀린의 함수는 객체로 사용할 수 있기 때문에 1급 객체에 속한다.

 

- 1급 함수란?

프로그램 언어에서 함수를 값(객체)로 다룰 수 있는 것을 말하며 아래 조건을 만족한다.

  • 함수의 실제 매개변수가 될 수 있다.
  • 함수의 결과값으로 반환 될 수 있다.
  • 할당문의 대상이 될수있다. (값을 할당한다는 의미)
  • 동등성 테스트가 가능하다.

질문: 1급 함수 == 1급 객체라는 이야기가 많은데 찾아 본 결과 1급 함수는 인자, 1급 함수는 파라미터가 될수 있다는 점과 1급 함수는 할당문의 대상, 동등성 테스트가 가능하다는 얘기들이 있는데 글에 정리한 차이점이 맞는건지 궁금함
 

  • 불변성: 함수형 프로그래밍에서 생성 후 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성한다.
  • 부수 효과 없음: 함수형 프로그래밍에서 입력이 같으면 항상 같은 출력을 내놓으며 다른 객체의 상태를 변경하지 않는다. 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.

2. 코틀린 철학

코틀린은 자바와의 상호운용성에 초점을 맞춘 실용적이고 간결하며 안전한 언어라고 표현할 수 있다.

2-1. 실용성

코틀린의 특성을 코드에 적용하면 간결하게 코드를 작성할 수 있다.

2-1. 간결성

코드를 간결(부수적인 요소를 줄이는게 가능)하게 작성할 수 있기 때문에 내용 파악이 쉬워 유지보수에 용이하다.

2-2. 안전성

코틀린은 JVM에서 실행되기 때문에 메모리 안정성을 보장하고 버퍼 오버플로를 방지하며 동적으로 할당된 메모리를 잘못 사용함으로 인해 발생할 수 있는 다양한 문제 예방이 가능하다. 또 정적 타입 지정 언어이기 때문에 애플리케이션의 타입 안정성을 보장한다.
런타임 시점에서 오류를 발생시키는 대신 컴파일 시점 검사를 통해 오류를 방지할 수도 있다. 특히 코틀린은 NullPointException을 금지하기 때문에 null safety하다.

2-3. 상호운용성

자바에서 사용하던 기존 라이브러리를 그대로 사용이 가능하다. 때문에 자바와 코틀린은 혼합해서 사용이 가능하다.

3. 코틀린 도구 사용

코틀린도 컴파일 언어이기 때문에 코드를 실행하기 전에 먼저 코드를 컴파일하는 과정이 필요하다. 코틀린은 JVM 위에서 동작하며 정적 타입 언어이다.

3-1. 코틀린 코드 컴파일

kotlin, java 컴파일 과정

1. 코틀린은 보통 .kt 확장자 파일을 사용한다.
2. kt 파일은 kotlin 컴파일러를 통해 바이트 코드(기계가 이해할 수 있는 언어)로 변환된다.
3-1. kotlin runtime 라이브러리(코틀린 자체 표준 라이브러리, java API 확장)에 의존되어 실행 된다.
3-2. 해독된 기계언어를 메모리에 할당 후 cpu에 의해 실행시킨다.
kotlin runtime 라이브러리가 가지고 있는 라이브러리는 Gradle, maven과 같은 빌드 도구가 Application으로 패키징할때 포함해준것이다.