본문 바로가기
My Image
프로그래밍/kotiln

코틀린이란 무엇이며 왜 필요한가? (1장)

by Lim-Ky 2023. 1. 15.
반응형

1. 코틀린은 무엇인가?

코틀린은 자바 플랫폼에서 돌아가는 새로운 프로그래밍

코틀린은 간결하고 실용적이며, 자바 코드와의 상호운용성이 좋음

또, 자바와 동일한 성능을 발휘

이 말은 즉, 자바가 쓰이는 곳(서버 개발, 안드로이드 앱 개발 등등)에서 사용이 가능하다.

 

 

2. 코틀린의 주요 특성

정적타입의 언어

코틀린은 자바와 동일한 정적 타입 지정 언어

여기서 동적 타입 지정이란? 모든 프로그램 구성요서 타입을 컴파일 시점에 인지하여 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증 할 수 있다는 뜻임

 

정적타입의 반대인 동적타입 언어인 구루비나 Jruby 는 타입 관계없이 모든 값을 변수에 넣을 수 있고, 메소드, 필드 접근에 대한 검증이 실행시점이 일어난다. 하지만 이름을 잘못 입력하는 등의 실수를 컴파일시 발견하지 못함

 

다시 돌아가서, 코틀린은 더 나아가 모든 변수의 타입을 개발자가 직접 명시팔 필요가 없다. 코틀린 컴파일러가 문액으로부터 변수 타입을 자동으로 유추할 수 있기 때문에 개발자는 타입선언을 생략할 수 있다.

var x = 1

코틀린 컴파일러는 위 코드를  보고 변수 타입이 자동으로 Int 임을 알아낸다. 이런 기능을 "타입 추론" 이라고 부름.

 

정적 타입 지정의 장점

  • 성능 : 실행시 전에 어떤 메소드를 호출할지 알기 때문에 메소드 호출이 빠름
  • 신뢰성 : 실행시 전에 컴파일을 통해 타입을 검증하기 때문에 안정성이 있음
  • 유지 보수성 : 타입을 정확하게 몰라도, 타입 지정없이 쉽게 코딩이 가능하기 때문에 유지보수성이 좋다. (타입이 엄격하지 않음)
  • 도구 지원 : 더 안전하게 리팩토링이 가능, IDE 다른 지원기능도 잘 만들 수 있음

 

Nullabe Type 지원함

코틀린은 null이 될 수 있는 타입을 지원한다. null이 될 수 있는 타입을 컴파일 시점에 인지하여 null pointer exception 발생 여부를 검사 할 수 있고 이로 인해 프로그램의 신뢰성을 높일 수 있다.

 

 

함수형 프로그래밍이 가능함

함수형 프로그램은 아래와 같은 특징이 있다.

  • 일급 시민(first-class) 함수 : 함수를 일반 값처럼 다룰 수 있다.
    • 함수를 변수에 저장,
    • 함수를 인자로 다른 함수에 전달
    • 함수에서 새로운 함수를 만들어서 반환
  • 불변성(immutability) : 함수형 프로그래밍에서는 불변 객체를 사용해 프로그램을 작성한다.
  • 부수 효과(side effect) 없음
    • 입력이 같으면 항상 같은 출력
    • 다른 객체의 상태를 변경하지 않는다.
    • 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용
  • 함수형 스타일로 프로그램을 작성하면 어떤 유익?
    • 간결성, 다중 스레드에서 안전, 테스트하기 쉬움

함수형 프로그래밍의 장점

간결성

  • 함수를 값처럼 활용 → 더 강력한 추상화 → 코드 중복 막을 수 있음
  • ex) 공통부분을 따로 함수로 뽑아내고 서로 다른 세부사항을 인자로 전달. 인자 그 자체가 함수
fun findAlice() = findPerson { it.name == "Alice" }
fun findBob() = findPerson { it.name == "Bob" }

다중 스레드를 사용해도 안전

  • 불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용한다면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경할 수 없다. (따라서 복잡한 동기화를 적용하지 않아도 된다)

함수형 프로그램은 테스트하기 쉽다

  • 순수함수는 준비 코드(setup code) 없이 독립적으로 테스트할 수 있다.

추가로, 코틀린은 함수형 프로그래밍이 필수는 아니다. 상황에 따라 객체지향 프로그래밍과 함수형 프로그래밍을 적절하게 조합해서 문제를 해결하도록 하자.

 

3. 코틀린의 철학

코틀린이 자바와 상호운용성이 좋고, 실용적, 간결하며 안전한 언어이다.

각각 하나씩 알아보자.

 

실용성

코틀린은 실제 문제를 해결하기 위해 만들어진 언어이다. (연구용이 아님)

실제 실무자들에 의해서 현장에서 느꼈던 고민들을 녹여 코틀린이 탄생했다.

코틀린은 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능을 적극 활용하고 수용한다.

코틀린은 특정 프로그래밍의 스타일이나 패러다임을 강제하지 않는다. 따라서, 개발자의 스타일에 맞게 코딩이 가능하다.

코틀린은 인텔리J 아이디어의 개발과 컴파일러의 개발이 맞물려 있다. 또한, 항상 도구의 활용을 염두두고 설계돼 왔다.

 

간결성

실제 개발자들은 코딩을 하는 시간보다 기존 코드를 이해하는데 오랜 시간을 쓴다고 한다.

코틀린은 간결한 언어로써 작성된 코드를 통해 개발자가 쉽게 의도를 파악할 수 있는 구문 구조를 제공한다. (준비 코드가 적음)

ex) setter, getter, 생성자 등등 자바에 존재하는 여러가지 번거로운 준비 코드들을 코틀린은 묵시적으로 제공한다.

코드가 불필요하게 길어지는 또다른 이유는 컬렉션에서 원소를 찾는 것과 같은 일반적인 작업을 수행하기 위해 명시적으로 작성해야만 하는 코드의 양이 상당하기 때문이다.

코틀린은 기능이 다양한 표준 라이브러리를 제공하기 때문에 반복되거나 길어질 수 있는 코드를 라이브러리 함수 호출로 대치할 수 있다. 람다를 지원하기 때문에 작은 코드 블록을 라이브러리 함수에 쉽게 전달할수도 있다. 따라서 일반적인 기능을 라이브러리 안에 캡슐화하고 작업에 따라 달라져야 하는 개별적인 내용을 사용자가 작성한 코드 안에 남겨둘 수 있다.

 

코드가 더 간결하면 쓰는데 시간이 덜 걸린다. 더 중요한것은 읽는데도 시간이 덜 걸린다는 점이다. 간결성은 생산성을 향상시켜주고 개발을 더 빠르게 진행할 수 있게 해준다.

 

안정성

코틀린을 만들면서 자바보다 더 높은 수준의 안전성을 달성하되 전체 비용은 더 적게 지불하고 싶었다. 타입 안정성, 한걸음 더 나아가 실행 시점에 오류를 발생시키는 대신 컴파일 시점 검사를 통해 오류를 더 많이 방지해준다. 코틀린의 타입 시스템은 NULL이 될 수 없는 값을 추적하며, 실행 시점에 NullPointerException이 발생할 수 있는 연산을 사용하는 코드를 금지한다.
또한 ClassCastException을 방지 해준다. 타입 검사와 캐스트가 한 연산자에 의해 이뤄진다.

 

NullPointerException 방지

val s1: String?=null //null이 될 수 있음
val s2: String=""    //null이 될 수 없음

ClassCastException 방지

if (value in String) {  // 타입 검사
	println(value.toUpperCase()) // 해당 타입의 메서드를 사용
}

상호운용성

코틀린은 자바 라이브러리가 어떤 API를 제공하던 간에 코틀린에서 그 API를 활용할 수 있다. 자바 메소드를 호출하거나 자바 클래스를 상속하거나 인터페이슬 구현하거나 자바 어노테이션을 코틀린 코드에 적용하는 등의 일이 모두 가능하다. 다른 일부 JVM 언어와 달리 코틀린은 상호운용성 측면에서 훨씬 더 많은 것을 제공한다. 코틀린의 클래스나 메소드를 일반적인 자바 클래스나 메소드와 똑같이 사용할 수 있다. 이에 따라 자바와 코틀린 코드를 프로젝트에서 원하는대로 섞어 쓸 수 있는 궁극적인 유연성을 발휘할 수 있다. 

 

기존 자바 프로젝트에 코틀린을 도입하는 경우 자바를 코틀린으로 변환하는 도구를 코드베이스 안에 있는 자바 클래스에 대해 실행해서 그 클래스를 코틀린 클래스로 변환할 수 있다. 이렇게 변경한 클래스가 프로젝트 안에서 어떤 역할을 하는지와는 관계없이 코틀린으로 바꾼 클래스가 어떤 것이든 프로젝트의 나머지 부분을 전혀 수정하지 않고도 컴파일 및 실행이 가능하다.

 

상호운용성 측면에서 코틀린이 집중하는 다른 방향으로는 기존 자바 라이브러리를 가능하면 최대한 활용한다. 코틀린은 자체 컬렉션 라이브러리를 제공하지 않는다. 코틀린은 자바 표준 라이브러리 클래스에 의존한다. 다만 코틀린에서 컬렉션을 더 쉽게 활용할 수 있게 몇가지 기능을 더할 뿐이다.

 

코틀린이 제공하는 도구도 다중 언어 프로젝트를 완전히 지원한다. 코틀린은 자바와 코틀린 소스 파일이 임의로 섞여 있어도 제대로 프로그램을 컴파일할 수 있다. 각 소스 파일 사이의 의존관계가 어떤 식으로 이뤄졌든 관계없이 컴파일할 수 있다. IDE 기능도 언어와 관계없이 제대로 동작한다.

  - 자바와 코틀린 소스 파일을 자유롭게 내비게이션할 수 있다.

  - 여러 언어로 이뤄진 프로젝트를 디버깅하고 서로 다른 언어로 작성된 코드를 언어와 관계없이 한 단계씩 실행할 수 있다.

  - 자바 메소드를 리팩토링해도 메소드와 관련있는 코틀린 코드까지 변경된다. 코틀린 메소드를 리팩토링해도 자바 코드까지 자동변경된다.

 

요약

  • 코틀린은 타입 추론을 지원하는 정적 타입 지정 언어다. 따라서 소스코드의 정확성과 성능을 보장하면서도 소스코드를 간결하게 유지 가능
  • 코틀린은 객체지향, 함슈형 프로그래밍 스타일 모두 지원, 일급 시민함수를 사용해 수준 높은 추상화 가능, 불변 값 지원을 통해 다중 스레드 애플리케이션 개발 및 테스트가 용이
  • 서버 애플리케이션 개발 가능, 기존 자바 프레임워크 완벽하게 지원 가능, 안드로이드 개발 가능
  • 코틀린의 런타임 라이브러리는 크기가 작고, 코틀린 컴파일러는 안드로이드 API 지원 가능
  • 코틀린 무료 오픈소스이며, 주요 IDE와 빌드시스템을 완전히 지원함
  • 코틀린은 실용성, 안정성, 간결성, 상호운용성이 좋고, 자바와 아무런 제약없이 통합될 수 있는 언어이다.
반응형

'프로그래밍 > kotiln' 카테고리의 다른 글

람다로 프로그래밍(5장)  (0) 2023.02.27
클래스, 객체, 인터페이스(4장)  (0) 2023.02.19
함수의 정의와 호출(3장)  (0) 2023.02.05

댓글