주완 님의 블로그
Kotlin Study (kotlin in action) 본문
1장
주제
- 코틀린 기본 기능 데모
- 코틀린 언어의 주요 특성 !
- 코틀린을 활용한 안드로이드와 서버 개발
- 코틀린이 다른 언어보다 더 나은 점
- 코틀린으로 코드를 작성하고 실행하는 방법
본문
코틀린은 무엇인가?
코틀린은 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어다. 코틀린은 간결하고 실용적이며, 자바 코드와의 상호운용성’Interoperab"ity을 중시한다.
현재 자바가 사용 중인 곳이라면 거의 대부분 코틀린을 활용할 수 있다. (android studio 겠죠?) 대표적으로 서버 개발, 안드로이드 앱 개발 등의 분야에서 코틀린을 쓸 수 있다.
코틀린은 기존 자바 라이브러리나 프레임워크와 함께 잘 작동하며, 성능도 자바와 같은 수준이다. 1장에서는 코들린의 주요 특성을 자세히 살펴본다
- 본인은 android studio를 java 로 먼저 배웠기 떄문에 Kotlin을 사용하는 근본적인 이유가 궁금했다.
[Android] Kotlin 언어의 특징과 문법
본격적인 안드로이드 앱 개발에 앞서, 앱 개발시 사용할 언어인 `코틀린`의 특징과 문법을 정리해보았습니다.
velog.io
데이터 클래스 정의, 널이 될 수 있는 (NullPointerException?) 파라미터 디폴트 값
최상위 함수, 이름 붙은 파라미터, 람다 식과 엘비스 연산자, 문자열 템플릿, toString 자동 생성
대상 플랫폼 : 서버, 안드로이드 등 자바가 실행되는 모든 곳
코틀린의 주목적 : 더 간결하고 생산적이며 안전한 대체 언어를 제공한다. (그니까 뭐가)
- 서버상의 코드
- 안드로이드 디바이스에서 실행되는 모바일 어플리케이션
더 적은 코드로 더 편하게 프로그래머의 목표를 달성할 수 있을 것이다.( 코드의 간결성)
코틀린은 다른 환경에서도 잘 작동한다고 한다. iOS 디바이스, 테스크탑 애플리케이션, 자바뿐만 아니라 자바 스크립트로도 코틀린을 컴파일 할 수있다고 한다.
왜 코틀린을 선택해야 하는가? 코틀린을 사랑할 수 밖에 없는 이유!
* 이 포스팅은 《다재다능 코틀린 프로그래밍》에서 발췌한 내용으로 작성되었습니다. 아, 코틀린이여! 코틀린은 러시아 상트페테르부르크 근처의 섬의 이름이지만, 이 책에서 이야기할 코틀린
ydot.tistory.com
정적 타입 지정 언어(Statically typed)
프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고(?) 프로그램 안에서 객체의 필드나 메소드를 사용할 떄마다 컴파일러가 타입을 검증해준다는 뜻이다.
→ 정확한 내용을 위해 gpt 선생님께 한 번 물어봤습니다. 예시가 있으면 좋을 것 같아서..
1. 정적 타입 시스템 (Static Typing)
정적 타입 시스템에서는 컴파일 시점에 모든 변수나 함수의 타입이 결정됩니다. 즉, 변수가 선언될 때 타입이 명확히 정해지고, 컴파일러가 해당 타입에 맞지 않는 작업을 할 경우 컴파일 타임에 오류를 발생시킵니다. 이는 코드의 안전성을 높이고, 잘못된 사용을 사전에 방지하는 데 도움을 줍니다.
예를 들어, 아래 코드는 정적 타입 시스템을 따르는 코틀린에서 컴파일 오류를 발생시킵니다:
kotlin
복사
fun addNumbers(a: Int, b: Int): Int {
return a + b
}
val result = addNumbers(5, "10") // 컴파일 오류 발생
여기서 addNumbers 함수는 Int 타입의 인자 두 개를 받아서 Int 타입의 결과를 반환하는데, "10"은 String 타입이기 때문에 컴파일 시점에 오류가 발생합니다. 즉, 코드가 실행되기 전에 잘못된 타입의 인자를 전달하는 것을 컴파일러가 미리 발견합니다.
2. 타입 추론 (Type Inference)
코틀린은 타입 추론 기능을 제공하므로, 명시적으로 타입을 선언하지 않아도 컴파일러가 변수나 함수의 타입을 자동으로 추론할 수 있습니다. 예를 들어:
kotlin
복사
val number = 10 // 타입이 Int로 추론됨
val name = "Kotlin" // 타입이 String으로 추론됨
이 경우, 코틀린 컴파일러는 number 변수가 Int 타입임을 컴파일 시점에 추론하고, name 변수가 String 타입임을 추론합니다. 컴파일러는 이 정보를 바탕으로 코드가 잘못 작성되었을 경우 오류를 발생시킵니다.
3. 타입 안전성 (Type Safety)
정적 타입 시스템은 타입 안전성을 제공합니다. 즉, 컴파일러가 프로그램에서 타입이 올바른지 검사하여 타입 관련 오류를 실행 전에 미리 잡을 수 있습니다.
예를 들어:
kotlin
복사
fun greet(name: String) {
println("Hello, $name!")
}
greet(123) // 컴파일 오류 발생, 'Int' 타입을 'String'으로 전달
위의 예시에서, greet 함수는 String 타입만 받을 수 있지만, Int 타입을 전달하면 컴파일 시점에 오류가 발생합니다. 이러한 점에서 타입 안전을 보장하며, 런타임에 발생할 수 있는 타입 관련 오류를 미리 방지할 수 있습니다.
4. **동적 타입 시스템 (Dynamic Typing)**과의 차이
동적 타입 시스템에서는 실행 시점에 변수나 객체의 타입이 결정됩니다. 즉, 타입이 컴파일 시점에 고정되지 않으며, 코드가 실행될 때 타입이 결정되기 때문에, 타입 오류가 실행 시점에 발생할 수 있습니다. 예를 들어, 파이썬, 자바스크립트 등이 동적 타입 언어에 해당합니다.
python
복사
def add_numbers(a, b):
return a + b
result = add_numbers(5, "10") # 실행 시 오류 발생
위 코드는 파이썬에서 실행되며, add_numbers(5, "10")가 실행되기 전까지는 오류를 알 수 없습니다. 실행 시에만 오류가 발생합니다.
5. 코틀린에서 타입을 컴파일 시점에 알 수 있는 장점
- 타입 관련 오류를 미리 잡을 수 있음: 코드가 실행되기 전에 잘못된 타입을 사용할 경우 컴파일러가 오류를 발생시킵니다. 이로 인해 실행 중 오류를 줄이고 안전한 코드를 작성할 수 있습니다.
- 최적화: 컴파일러가 타입 정보를 미리 알기 때문에, 성능 최적화나 타입 관련 최적화를 쉽게 할 수 있습니다.
- 코드의 가독성 및 유지보수성: 타입을 명확하게 알 수 있기 때문에 코드의 의도를 더 잘 이해할 수 있고, 추후에 코드 수정 시 예상되는 타입 오류를 미리 방지할 수 있습니다.
☑️ 동적 타입 지정 언어
이런 점은 다른 동적 타입 지정 언어와는 다르다. JVM에서는 그루비나 JRuby가 대표적인 동적 타입 지정 언어다. 대표적인 동적 타입 지정 언어다. 동적 타입 지정 언어에서는 타입과 관계없이 모든 값을 변수에 넣을 수 있고 메소드나 필드 접근에 대한 검증이 실행 시점에 일어나며, 그에 따라 코드가 더 짧c}지고 데이터 구조를 더 유연하게 생성하고 사용할 수 있다. 하지만 반대로 이름을 잘못 입력하는 등의 실수도 컴파일 시 걸러내지 못하고 실행 시점에 오류가 발생한다.
→ 자바와 달리 코틀린에서는 모든 변수의 타입을 프로그래머가 직접 명시할 필요가 없다. 대부분의 경우 코틀린 컴파일러가 문맥으로부터 변수타입을 자동으로 유추할 수 있기 때문에 프로그래머는 타입 선언을 생략해도 된다.
| * 신뢰성 | 컴파일러가 프로그램의 정확성correctness을 검증하기 때문에 실행 시 프 로그램이 오류로 중단될 가능성이 더 적어진다. | | --- | --- | | * 유지 보수성 | 코드에서 다루는 객체가 어떤 타입에 속히는지 알 수 있기 때문에 처음 보는 코드를 다룰 때도 더 쉽다. | | * 도구 지원 | 정적 타입 지정을 활용하면 더 안전하게 리팩토링refactoring 할 수 있고, 도구는 더 정확한 코드 완성 기능을 제공할 수 있으며, IDE의 다른 지원 기능도 더 잘 만들 수 있다 | | * 성능 | 실행 시점에 어떤 메소드를 호출할지 일마내는 과정이 필요 없으므로 메소 드 호출이 더 빠르다. |
→ 타입 추론
- 가장 중요한 특성은 코틀린이 널이 될 수 있는 타입을 지원한다는 점이다. 널이 될 수 있는 타입을 지원함에 따라 컴파일 시점에 널 포인터 예외가 발생할 수 있는지 여부를 검사할 수 있어서 좀 더 프로그램의 신뢰성을 높일 수 있다.
- 코틀린의 타입 시스템에 있는 다른 새로운 내용으로는 함수 타입에 대한 지원을 들 수 있다. 함수 타입이 무엇인가 알아보기 위해 함수형 프로그래밍이 어떤 개념인지와 코틀린이 함수형 프로그래밍을 어떻게 지원하는지에 대해 먼저 알아보자
- 일급 시민인 함수 : 함수를 일반 값처럼 다룰 수 있다. 함수를 변수에 저장할 수 있고, 함수를 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어서 반환할 수 있다.
fun add(a: Int, b: Int): Int {
return a + b
}
fun main() {
// 함수를 변수에 할당
val sum: (Int, Int) -> Int = ::add
// 할당된 함수를 호출
println(sum(3, 5)) // 출력: 8
}
- 불변성: 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성한다.
- 부수 효과 없음(sideEffect 아시는구나) : 함수형 프로그래밍에서는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수함수를 사용한다.
그럼 함수형 스타일로 프로그램을 작성하면 어떤 면에서 이득인가?
간결성 : 함수를 값처럼 활용할 수 있으면 더 강력한 추상화를 할 수 있고, 강력한 추상화를 사용해 코드 중복을 막을 수 있다.
다중 스레드 사용해도 안전하다 : 다중 스레드 프로그램에서는 적절한 동기화 없이 같은 데이터를 여러 스레드가 변경하는 경우가 가장 많은 문제가 생긴다. ..?
코틀린은 함수형 스타일로 프로그램을 짤 수 있게 지원하지만 함수형 프로그래밍 스타일을 강제하지는 않는다. 명령형 방식이 더 적합한 경우라면 함수형 프로그래밍으로 번거롭게 코드를 작성할 필요 없이 직접 변경 가능한 데이터와 부수 효과를 활용하는 함수를 시용해도 된다.
당연히 인터페이스와 클래스 계층 구조를 바탕으로 하는 프레임 워크도 자비를 사용할 때와 마찬가지로 쉽게 쓸 수 있다. 코틀린으로 코드를 작성할 때는 객체지향과 함수형 접근 방법을 함께 조합해서 문제에 가장 적합한 도구를 시용하면 된다.
☑️ 무료 오픈소스
- 코틀린 언어와 컴파일러, 라이브러리 및 코틀린과 관련된 모든 도구는 모두 오픈소스며, 어떤 목적에든 무료로 사용할 수 있다.
☑️ 코틀린 응용
코틀린 서버 프로그래밍
이런환경에서자바코드와매끄럽게상호운용할수있다는점이코틀린의큰장점이다. 코틀린은 새로운 컴포넌트를 작성하거나 기존 서비스 코드를 코틀린으로 이식해야 히는 경우에 모두 잘 들어맞는다. 자바 클래스를 코틀린으로 확장해도 아무 문제가 없으며, 코틀린 클래스 안의 메소드나 필드에 특정 (자바) 애노테이션annotatlon을 붙여야 하는 경우에도 아무 문제가 없다. 그러면서도 시스템 코드는 더 간결해지고 더 신뢰성이 높아 지며, 더 유지 보수하기 쉬워질 것이다.
☑️ 코틀린 안드로이드 프로그래밍
모바일 애플리케이션은 엔터프라이즈 애플리게이션보다 더 작고 기존 코드 기반과 새 코드를 통합할 필요도 더 적다. 또 모바일 애플리케이션은 보통 더 다양한 디바이스에 대해 서비스의 신뢰성을 보장하면서 더 빠르게 개발해 배포할 필요가 있다.
→ 특별한 컴파일러 플러그인 지원을 조합하면 안드로이드 애플리케이션 개발의 생산성을 높이고 개발의 즐거움을 더할 수 있다. (컨트롤에 리스너 추가, 레이아웃 요소 바인딩 등)
☑️ 코틀린의 철학
- 실용성
코틀린은 연구를 위한 언어가 아니다. 최신 프로그래밍 언어 설계를 앞서 채택하거나 전산학계에서 연구 중인 혁신적인 아이디어를 코틀린을 통해 탐구하려고 하지 않는다. 대신 코틀린은 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존한다.
- 간결성
코드가 더 간단하고 간결할수록 내용을 파악하기가 더 쉽다, 코틀린을 만들면서 프로그래머가 작성하는 코드에서 의미가 없는 부분을 줄이고, 언어가 요구하는 구조를 만족시키기 위해 별 뜻은 없지만 프로그램에 꼭 넣어야 하는 부수적인 요소를 줄이기 위해 많은 노력을 기울였다.
- 안전성
일반적으로 프로그래밍 언어가 안전하다는 말은 프로그램에서 발생할 수 있는 오류 중에서 일부 유형의 오류를 프로그램 설계가 원천적으로 방지해준다는 뜻이다.(절대적이지는 않다) 실행시점에 NullPointerException이 발생할 수 있는 연산을 사용하는 코드를 금지한다. +ClassCastException
- 상호 운용성
라이브러리가 어떤 API를 제공하던 간에 코틀린에서 그 API를 활용할 수 있다. 자바 메소드를 호출하거나 자바 클래스를 상속mherit(확장extend)하거나 인터페이스를 구현하거나 자바 애노테이션을 코틀린 코드에 적용하는 등의 일이 모두 가능하다.
'Android' 카테고리의 다른 글
| DI - koin & Hilt (0) | 2025.05.25 |
|---|---|
| MVVM , repository 패턴 (1) | 2025.05.11 |
| Android Studio - Jetpack Compose (0) | 2025.04.28 |
| Android study(1) (1) | 2025.02.28 |
| Android 개발 (0) (0) | 2025.02.28 |