코틀린 프로젝트를 여행 🚞에 비유하면, 모듈은 목적지 🗽🌆, 패키지는 여행용 가방👜🎒, 파일은 가방 속에 넣은 짐 👙🎲🎧
📦 HelloKotlin
┣ 📂com.example.edu
│ㅤ│ㅤ┕ 📑 control.kt
│ㅤ┕ HelloKotlin.kt
┣ 📂OtherModule
│ㅤ┕ㅤ📑 Other.kt
대규모 프로젝트를 진행할 때는 기능을 모듈로 분리하여 관리
코틀린 파일은 .kt 확장자를 가지며, 파일의 맨 위에는 이 파일이 어떤 패키지에 포함된 것인지 코틀린 컴파일러가 알 수 있도록 패키지 이름을 선언해야 한다.
default 패키지는 src 폴더에 따로 패키지 이름이 지정되지 않은 파일이다.
코틀린은 자바처럼 클래스 이름과 파일 이름이 동일해야 하고 public 클래스는 하나만 사용해야 하는 등의 규칙이 없다.
📍 코틀린에서는 파일 이름과 클래스의 선언개수를 신경쓰지 않음
📍 같은 파일에 있는 여러 개의 클래스는 모두 그 파일에서 지정한 패키지로 인식
📍 같은 파일명이라도 패키지가 다르면 오류가 발생하지 않는다.
acaroom.com
이라면 pacakage com.acaroom
!!
📂kotlin 밑에 new package com.example.edu
를 만들어준 결과
-> '.' 을 기준으로 하위 폴더가 생성되어 있는 것을 확인할 수 있음
📍 여기서 주목할 것
package com.example.edu
class Person (val name: String, val age: Int)
.kt
가 생략 됨class Person (val name: String, val age: Int)
.kt
가 나타남기본 패키지 : 코틀린으로 프로그램을 만들 때 자주 사용하는 클래스와 함수 등을 미리 만들어 놓은 것
import
로 선언하여 사용 -> 기본 패키지는 선언하지 않아도 사용 가능패키지 이름 | 설명 |
---|---|
kotlin.* | Any, Int, Double 등 핵심 함수와 자료형 |
kotlin.text.* | 문자와 관련된 API |
kotlin.sequences.* | 컬렉션 자료형의 하나로 반복이 허용되는 개체를 열거 |
kotlin.ranges.* | if문이나 for문에서 사용할 범위 관련 요소 |
kotlin.io.* | 입출력 관련 API |
kotlin.collections.* | List, Set, Map 등의 컬렉션 |
kotlin.annotation.* | 애노테이션 관련 API |
import 패키지 이름
📍 가져온 패키지에서 같은 이름의 class가 있는 경우에는 뒤에 as 별명
을 붙여주면 됨
변수란 값을 넣을 수 있는 상자 📦
더이상 값을 바꿀 수 없음
val username: String = "Jimuk" // 선언키워드 변수명 자료형 값
자료형을 안 적을거라면 값이라도 넣어라
123abc ❌
while, if ...
카멜 표기법? 🐪🐫
👉 여러 단어로 된 변수 이름을 지정할 때 첫 번째 글자는 소문자로 쓰고 나머지는 각 단어의 첫 번째 글자를 대문자로 써서 구별하는 방법numberOfBooks
참조형으로 선언한 변수는 성능 최적화를 위해 코틀린 컴파일러에서 다시 기본형으로 대체됨
-> 코틀린에서는 참조형을 기본형으로 고려하는 등의 최적화를 신경쓰지 않아도 됨
Heap
에 저장🤔 참조형만 사용하는 코틀린은 속도가 더 느릴까? 🤷♂
코틀린은 컴파일 과정을 거치며 참조형이 기본형으로 바뀐다.
-> 코틀린 컴파일러가 자동으로 최적화를 수행
📚 정수 자료형
자료형 | 크기 |
---|---|
Long | 8 byte (64bit) |
Int | 4 byte(32bit) |
Short | 2 byte (16bit) |
Byte | 1 byte (8bit) |
Int
로 추론되기 때문에 다른 자료형을 쓰고 싶으면 직접 자료형을 명시하면 됨val ex01: Byte = 127
val ex02: Short = 6321
🔍 부호가 없는 경우
자료형 | 크기 |
---|---|
ULong | 8 byte (64bit) |
UInt | 4 byte(32bit) |
UShort | 2 byte (16bit) |
UByte | 1 byte (8bit) |
코틀린에서는 언더스코어로 자릿값을 구분할 수 있다.
val number = 1_000_000_000
-> 값이 길어 읽기 힘들 때 사용 (값에 영향을 주지 않음)
📚 실수 자료형
자료형 | 크기 |
---|---|
Double | 8 byte (64bit) |
Float | 4 byte (32bit) |
Double
형으로 추론함 -> 식별자에 F를 붙으면 Float형으로val ex03 = 3.14F
📚 논리 자료형
자료형 | 크기 | 값의 범위 |
---|---|---|
Boolean | 1 bit | true, false |
📚 문자 자료형
자료형 | 크기 |
---|---|
Char | 2 byte (61bit) |
컴퓨터는 A를 65로 저장
A
로 선언 문자열 자료형 : 문자 자료형에서 더 나아가 여러 문자를 배열하여 저장할 수 있는 자료형
📍 문자 자료형인 Char는 char와 같은 기본형으로 처리되지만, 문자열 자료형은 기본형에 속하지 않는 배열 형태로 이루어진 특수한 자료형
fun main() {
var str1: String = "Hello"
var str2: String = "World"
var str3: String = "Hello"
println("str1 === str2: ${str1 === str2}")
println("str1 === str3: ${str1 === str3}")
}
str1 === str2: false / str1 === str3: true
📍 코틀린은 Heap영역에 String Pool이라는 공간에 문자열 Hello
를 저장해두고 str1, str3가 참조하도록 만듦
-> 메모리 공간을 재활용함
$
기호를 사용하면 된다.var a = 1
var s1 = "a is $a"
var s2 = "a is ${a +2}"
a is 1 / a is 3
출력
\
, {}
를 사용한다."""
로 감싼다.typealias
키워드를 사용한다.typealias Username = String
val user Username = "Jimuk"
?
를 사용해 선언해야 한다.?
를 명시한다.fun main() {
var str1: String? = "Hello Kotlin"
str1 = null
println("str1: $str1")
}
null 허용 여부에 따라 String과 String?은 서로 다른 변수이다.
?.
를 붙여주면 된다.!!.
를 붙여주면 된다.NPE
를 발생시킨다.?:
옆으로 보면 엘비스 머리 같아서 이렇게 생겼단다 .. 귀여운 개발자들..
fun main() {
var str1: String? = "Hello Kotlin"
str1 = null
println("str1: $str1 length: ${str1?.length ?: -1}")
}
str1: null length: -1
: null이라 오른쪽 식 출력
int a = 1;
double b = a;
결국 b에는 1이 아닌 1.0이 할당된다.val a: Int = 1
val b: Double = a.toDouble()
toByte, toFloat, toLong, toDouble, toShort, toChar, toInt
📍 null을 허용한 변수는 같은 값을 저장해도 이중 등호와 삼중 등호를 사용한 결과값이 다르다.
Int
형으로 선언하면 기본형으로 변환되어 스택에 값 저장
Int?
형으로 선언하면 스택에 힙의 참조주소가 저장
스마트 캐스트 : 컴파일러가 자동으로 형변환을 한다. 대표적으로 Number
형이 있다.
is
키워드 사용as
: 형 변환이 가능하지 않으면 예외를 발생시킨다.
Any
형 : 자료형이 특별하게 정해지지 않은 경우에 사용한다.
📍 필요한 자료형으로 자동 변환된다.
📚 산술 연산자 +, -, *, /, %
📚 대입 연산자 -,+=, -=, *=, /=, %=
📚 증가, 감소 연산자 ++, --
📚 비교 연산자 >, <, >=, <=, ==, != , ===, !==
📚 논리 연산자 &&, ||, !
📚 비트 연산자 shl, shr, ushr, and, or, xor, inv