코틀린은 JVM 위에서 컴파일 되는 언어. 구글에서 안드로이드와 Java의 라이센스 문제에서 완전히 독립하기 위해 공식언어로 지정됨.
안드로이드 앱 뿐만이 아니라, java처럼 다른 모든 플랫폼의 개발가능. (참조 - 안드로이드의 경우 컴파일은 JVM, 빌드는 dex 포맷으로, 실행은 ART 엔진)
코틀린 주요 프레임워크
Spring Boot - 자바 기반의 백앤드 애플리케이션 개발 프레임워크
Ktor - JetBrains 에서 만든 코틀린 기반의 웹 애플리케이션 개발 프레임워크
Kotlin Native - 크로스 플랫폼 애플리케이션 개발 기술, iOS, macOS, windows, Linux 등
KMM (Kotlin Multiplatform Mobile) - Kotlin Native 에서 사용하는 개발 프레임워크, iOS앱 개발에 사용이 목적
IDE 지원 - IntelliJ IDEA, Android Studio, Eclipse(플러그인), VS Code(플러그인)
빌드 도구 - Gradle, Maven, Ant
한 Project 안에는 여러개의 Module(App)을 만들 수 있다.
Kotilin 에서는 세미콜론을 강제하지 않는다.
Java의 Top-Level 구성요소 = 클래스, 모든 변수 함수가 클래스 내에 존재해야함. 객체지향만 지원.
Kotlin의 Top-Level 구성요소 = 클래스 밖에 변수 함수가 존재할 수 있다. Kotlin은 객체지향 뿐만이 아니라 함수형 프로그래밍(FP)도 지원한다.
1. 자바의 한계: 자바는 "모든 코드는 클래스 내부에 있어야 한다"는 규칙이 매우 엄격합니다.
설계적 불편함: 위 예시의 상수 a처럼, 특정 객체(Kim, Lee 등)에 귀속되지 않는 공용 데이터나 단순 유틸리티 함수를 만들 때도 무조건 클래스를 거쳐야 합니다.
2. 코틀린의 해법: Top-level
코틀린은 굳이 클래스라는 바구니가 필요 없는 변수나 함수를 파일 최상단(Top-level)에 직접 꺼내놓을 수 있습니다.
//Kotlin
// Main.kt 파일
val GLOBAL_A = 0 // Top-level 상수
class User(val name: String, val age: Int)
fun main() {
val user1 = User("Kim", 20)
println(GLOBAL_A) // 클래스 이름 없이 바로 접근
}
[Kotlin Top-Level과 Java Static 비교]
Java: 모든 상수는 클래스 내부에 선언되어야 함. 이로 인해 불필요한 유틸리티 클래스를 설계해야 하는 번거로움이 있음.
Kotlin: 클래스 밖(Top-level)에 변수/함수 선언 가능.
메모리 및 성능: 코틀린도 컴파일 시 내부적으로는 static 클래스 구조로 변환됨. 따라서 물리적인 메모리 이득이나 성능 차이는 미미함.
핵심 이점: 클래스라는 제약에서 벗어나 더 유연하게 코드를 작성할 수 있는 생산성 및 유지보수의 편의성에 있음. (객체지향뿐만 아니라 함수형 프로그래밍 스타일을 자연스럽게 지원함)
코틀린은 Top Level에 변수, 함수가 존재할 수 있다.
package com.example.kotlin_test.ch2.section1
import java.util.Date
//변수, 함수를 top level에 선언 가능..
//클래스, 객체의 멤버가 아닌 변수, 함수라면 (자바에서 static 으로 선언하던..) 굳이 class 로 묶지 않아도 된다.
var sum = 0
fun calSum(){
for (i in 1..10){
sum += i
}
}
//코틀린.. 객체지향을 지원한다..
class User {
//클래스 멤버..
val name = "Kim"
fun sayHello(){
//객체 생성구문이다.. new 예약어는 없다.. 생성자 바로 호출이다..
val date = Date()
println("date : " + date)
println("Hello " + name)
}
}
fun main() {
//top level 에 선언된 변수, 함수는 바로 이용..
calSum()
println(sum)
//클래스 멤버는 꼭 객체를 생성히고.. 객체명으로 이용..
User().sayHello()
}
패키지란 관련된 클래스들을 묶기 위한 물리적인 개념 (폴더) 이용하려는 클래스가 다른 패키지에 있다면 import 구문
변수/함수 import - 패키지 내에 선언된 전역변수나 전역함수처럼 취급 - 임포트 할때 이름을 바꾸어 다른 이름으로 사용가능 (as활용)
변수와 타입 - 강형, 약형 (추가 이해 필요)
❓ 이해 안 된 부분 / 도움 요청
구글과 오라클의 라이센스 전쟁에 대한 이야기에서 api만 가져다가 썼다는 부분에서 의문이 생긴다. 그러면 java와 안드로이드개발 언어는 다른것? ⇒
문법과 API: 개발 편의를 위해 Java의 문법과 API 설계도를 그대로 사용했으나, 이는 겉모습(Interface)일 뿐. (컴파일단계 JVM)
변환 장치(D8/R8): 빌드 시 D8/R8이라는 도구가 Java 바이트코드를 안드로이드 전용인 DEX 포맷으로 완전히 재조립.
실행 엔진(ART): 실제 폰에서는 오라클의 JVM이 아닌, 구글이 만든 ART 엔진이 구동되므로 기술적·법적으로 Java와 독립된 시스템.
요즘의 언어들은 대부분 멀티 플랫폼 개발이 가능한데, 실제로 특화된 영역이 있고 대부분 멀티 플랫폼에서 성공하지 못하는 이유는??
아까 말씀하시기를 코틀린에서 top Level에 클래스만 있을 필요가 없어서. static 상수를 예로 들어서 메모리 활용 측면에서 효율적이라고 하셨는데. 저렇게 jvm으로 자바 언어로 바꾼다면, 메모리 활용은 다시 어떻게 되는건가요? gradle로 빌드 되고 나서는 또 어떻게 되는건가요? (내가 무엇을 잘 못 이해했는지 확인하기)
⇒ 강사님의 설명에 잘못 이해한 부분이 있는 것 같다. 코틀린이 자바보다 성능적인 면으로 더 뛰어나다고 보기는 힘들다. 유지보수 생산적 측면에서 유리하다. (학습내용 수정 완료)