코틀린
코틀린은 안전성, 간결성, 상호 운용성을 강조하는 다중 패러다임, 다중 플랫폼 프로그래밍 언어입니다.
안전성
프로그래밍 언어가 안전하려면 프로그래머의 오류를 방지할 수 있어야 합니다. 실전에서 오류를 방지하려면 대가가 필요하기 때문에 안전성을 고려해 언어를 설계하는 것은 트레이드오프의 문제입니다.
코틀린의 설계 목표 중 하나는 자바보다 더 안전성을 보장하는 언어를 설계하되, (자바보다는) 개발자의 생산성을 덜 해치는 언어를 만드는 것입니다.
- 타입 추론(type inference): 개발자가 명시적으로 타입을 지정하지 않아도 됨(자바10에서도 지역변수에 대한 타입 추론 도입)
- 널이 될 수 있는 타입(nullable type): null 사용 제한하여 NPE 예외를 좀 더 쉽게 방지
- 스마트 캐스트(smart cast): 타입을 안전하게 변환할 수 있고, 실행 시점에 타입 캐스트 오류 방지
- 예를 들어, nullable type의 null 여부 체크 후 null이 아님이 확실하다면, 널이 될 수 없는 타입으로 스마트 캐스트
다중 패러다임
코틀린은 자바와 같은 전형적인 주류 프로그래밍 언어가 지원하는 일반적인 객체지향 패러다임 외에 함수형 프로그래밍을 지원합니다. 자바 역시 JAVA8에서부터 Stream API와 람다식, 함수형 인터페이스를 지원하고 있지만 자바보다 코틀린의 표현력이 더 우수합니다.
→ 코틀린의 함수형 프로그래밍 내용은 다음 시간에..
함수형 프로그래밍이란?
함수를 다른 값과 마찬가지로 다룬다는 생각에서 비롯된 프로그래밍 방법
클린코드의 저자 Robert C.Martin은 함수형 프로그래밍을 대입문이 없는 프로그래밍이라고 정의함
→ 함수를 다른 함수의 인자로 넘기거나, 지역적으로 함수를 선언하거나, 변수에 저장하거나, 함수가 함수를 반환하는 등의 일 가능
→ 함수형 프로그래밍은 데이터가 변하지 않도록 불변성(Immutability)을 유지해야 함
즉, 함수는 부수 효과를 만들어낼 수 없음
(현재, JAVA8에서부터 Stream API와 람다식, 함수형 인터페이스 등을 지원하여 Java 역시 함수형 프로그래밍 가능)
코틀린 언어가 성장해가면서 두 가지 프로그래밍 패더라임을 더 지원하게 되었습니다.
- API를 도메인 특화 언어(Domain Specific Language, DSL)로 정의할 수 있는 기능 덕분에 코틀린을 선언적인 스타일로 코딩할 수 있습니다.
- 코루틴을 도입하면서 코틀린은 동시성(concurrent) 프로그래밍을 지원하게 되었습니다. 자바를 포함한 여러 언어가 동시성을 지원하지만, 코틀린은 새로운 프로그래밍 접근 방법을 가능하게 해주는 풍부한 프로그래밍 패턴을 제공합니다.
// 명령형 (HOW)
fun howMethod(values: List<Int>): List<Int> {
val result = mutableListOf<Int>()
for(value in values) {
result.add(value + 2)
}
return result
}
// 선언형 (WHAT)
fun whatMethod(values: List<Int>): List<Int> {
return values.map { it + 2 }
}
선언형 프로그래밍이란?
How가 아닌 What에 집중하여 기존 명령형 프로그래밍과는 다르게 설계를 하는 것을 의미합니다.
→ 프로그램이 어떤 방법(How)으로 해야하는지를 나타내기 보다는 무엇(What)과 같은지를 설명하는 경우에 선언형이라고 합니다.
예) 센터필드는 어떻게 가나요?
- 명령형: 선릉역 5번 출구에서 역삼역 방향으로 약 8분 직진하고 횡단보도를 한 번 건너면 됩니다.
- 선언형: 센터필드의 주소는 서울특별시 강남구 테헤란로 231 입니다.
간결성과 표현력
코틀린 설계자들은 필드 게터(getter), 세터(setter), 익명 클래스, 명시적인 위임 등과 같은 자바의 악명 높은 불필요한 준비 코드를 제거하고 언어를 가능한 한 간결하게 만들기 위해 노력했습니다.
상호 운용성
코틀린은 독립적으로 존재하는 언어가 아니며, 가능한 기존의 (자바) 코드 기반과 부드럽게 협력해야했기 때문에 자바 상호 운용성은 코틀린 설계 시 중요한 목적이었습니다. 그래서 기존 자바 코드를 코틀린에서 사용할 수 있게 했을 뿐 아니라, 코틀린 코드를 거의 아무런 노력을 들이지 않고도 자바에서 사용할 수 있도록 보장하기 위해 노력했습니다.
코틀린 어플리케이션 진입점
fun main() {
println("Hello, Kotlin!")
}
위 코드는 코틀린 어플리케이션의 진입점 역할을 하는 main() 함수입니다. 위 코드는 아래의 자바 프로그램 main() 메소드와 유사합니다.
public class Main {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
- 코틀린의 println() 함수를 JVM에 맞게 컴파일하면, System.out.println()에 대한 호출과 동일해집니다.
- JVM 진입점은 반드시 정적 클래스 메소드(static class method)여야 합니다.
- 코틀린의 경우, 명시적으로 클래스를 정의하지 않아도 코틀린 컴파일러가 뒤에서 자동으로 클래스를 하나 만들고 그 안에 main() 함수를 호출하는 진입점을 넣어주어 위와 같이 간단하게 main() 함수를 작성할 수 있습니다.
- JVM 진입점은 파라미터로 반드시 명령줄 인수를 받기 위한 배열을 지정해야 합니다.
- 코틀린 main() 함수는 파라미터가 없어도 되며, 필요할 경우 파라미터를 받도록 설정할 수 있습니다.
참고 자료
'PROGRAMMING LANGUAGE > KOTLIN' 카테고리의 다른 글
[Kotlin] 널 가능성 (0) | 2022.08.12 |
---|---|
[Kotlin] 클래스 기초 (0) | 2022.08.12 |
[Kotlin] 코틀린 함수 (0) | 2022.08.04 |
[Kotlin] 코틀린 언어 기초 (0) | 2022.08.04 |
[Kotlin] 코틀린에도 삼항 연산자(ternary operator)가 있나요? (0) | 2022.06.27 |