💡 Kotlin - JetBrains에서 개발한 프로그래밍 언어이며, ‘Java Virtual Machine (JVM)’에서 실행이 되며 Java 코드와 100% 호환되는 객체 지향언어입니다. - ‘타입 추론’을 지원하는 정적 언어이며, 코드가 컴파일될 때 타입이 결정되어 런타임 중에 발생할 수 있는 오류에 대해 컴파일 단계에서 사전에 방지할 수 있습니다.
[ 더 알아보기 ] 💡 타입 추론(Type Inference)
- Kotlin에서 지원하는 기능으로 변수의 타입을 명시적으로 선언할 필요가 없습니다. 이는 Kotlin 컴파일러가 초기화 값을 기반으로 변수의 타입을 자동으로 추론합니다. - 그러나, 모두 타입 추론을 할 수 없으며 명시적 타입 선언이 필요한 경우가 있습니다. - 변수를 선언할 때 초기화하지 않는 경우 - 컴파일러가 타입을 정확히 추론하지 못하는 경우 - 특정 타입으로 명시적으로 지정하고 싶은 경우
val name = "John"// String 타입으로 추론됨var age = 30// Int 타입으로 추론됨var result: Double// 초기화하지 않을 때는 타입을 명시해야 함val number: Int = 5// 명시적으로 Int 타입으로 지정
- Kotlin 소스코드는 Java와 동일하게 JVM에 의해 컴파일되어 수행되기에 Kotlin 프로젝트 내에서 Java 언어와 병행하여 사용이 가능하기에 설정을 통해 서로 호출하여 사용하기가 가능합니다.
- 또한, IntelliJ IDEA의 자동변환 기능을 통해서 IntelliJ IDEA는 Kotlin 파일을 Java로, 또는 Java 파일을 Kotlin으로 자동 변환하는 기능을 제공합니다. 파일을 열고 'Code' 메뉴에서 'Convert Java File to Kotlin File' 또는 그 반대를 선택할 수 있습니다. - 해당 변환방법이 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
// [기본 구조-1] 변수 타입을 지정하지 않은 경우 + 타입 추론val / var <변수 이름> = 변수 값
// 기본 구조 예시 -1 val userId = "adjh54";
var userNm = "lee"// or// [기본 구조-2] 변수 타입을 지정한 경우 + 명시적으로 변수 타입 선언val / var <변수 이름> : 타입 = 변수 값
// 기본 구조 예시 -2val userId : String = "adjh54";
var userNm : String = "lee";
💡 Collection Type : Interface - Kotlin에서 데이터 컬렉션을 다루기 위한 기본적인 계약(contract)을 정의하는 인터페이스입니다. 이는 컬렉션의 기본 동작과 기능을 명시합니다. - 해당 Interface에서는 읽기 전용(Read-only) 인터페이스와 가변(Mutable) 인터페이스가 있습니다. 1. 읽기 전용(Read-only) 인터페이스 - 데이터를 조회만 할 수 있고 수정할 수 없는 인터페이스입니다. Collection, List, Set, Map이 여기에 속합니다.
2. 가변(Mutable) 인터페이스 - 데이터를 조회하고 수정할 수 있는 인터페이스입니다. MutableCollection, MutableList, MutableSet, MutableMap이 여기에 속합니다.
컬렉션
분류
설명
Set
읽기 전용(read-only)
중복되지 않는 요소들의 집합입니다
List
읽기 전용(read-only)
순서가 있는 요소들의 컬렉션입니다
Map
읽기 전용(read-only)
키-값 쌍의 컬렉션입니다
Sequence
읽기 전용(read-only)
지연 평가되는 컬렉션으로, 대량의 데이터를 처리할 때 효율적입니다
MutableSet
가변(mutable) 인터페이스
요소를 추가하거나 제거할 수 있는 Set 입니다
MutableList
가변(mutable) 인터페이스
요소를 추가, 제거, 수정할 수 있는 List 입니다
MutableMap
가변(mutable) 인터페이스
키-값 쌍을 추가, 제거, 수정할 수 있는 Map 입니다
ArrayDeque
가변(mutable) 인터페이스
양쪽 끝에서 요소를 추가하거나 제거할 수 있는 double-ended queue입니다
package com.blog.kotlinspringbootform.component.dataType
import org.springframework.stereotype.Component
@ComponentclassCollectionComponent {
/**
* 초기화, 읽기만 가능한 Collection
*/funreadCollection(username: String, password: String) {
// Set 초기화val readOnlySet = setOf(1, 2, 3)
// List 초기화val readOnlyList = listOf("apple", "banana", "cherry")
// Map 초기화val readOnlyMap = mapOf("a" to 1, "b" to 2, "c" to 3)
// 이후에는 이 컬렉션들을 변경할 수 없습니다.// readOnlyList.add("date") // 컴파일 에러
}
/**
* 초기화, 읽기, 수정, 삭제가 가능한 Collection
*/funmutableCollection() {
// MutableSet 사용val mutableSet = mutableSetOf(1, 2, 3)
mutableSet.add(4) // 가능// MutableList 사용val mutableList = mutableListOf("apple", "banana", "cherry")
mutableList.add("date") // 가능// MutableMap 사용val mutableMap = mutableMapOf("a" to 1, "b" to 2)
mutableMap["c"] = 3// 가능
}
/**
* Collection 빈 상태로 선언합니다.
*/funemptyCollection() {
val emptySet = emptySet<Int>();
val emptyList = emptyList<String>();
val emptyMap = emptyMap<String, Int>()
}
/**
* Collection Build를 이용하여 선언 및 값을 초기화합니다.
*/funbuildCollection() {
val map = buildMap { //
put("a", 1)
put("b", 0)
put("c", 4)
}
println(map)
val list = buildList {
add("hello")
add("world")
}
valset = buildSet {
add("hello")
add("world")
}
}
}
3.2. Collection Type : 인터페이스 구현체
컬렉션
분류
설명
ArrayList
List 구현체 : 가변(mutable) 인터페이스
동적 크기 조정이 가능한 배열 리스트입니다
LinkedList
List 구현체 : 가변(mutable) 인터페이스
이중 연결 리스트로 구현된 리스트입니다
HashSet
Set 구현체 : 가변(mutable) 인터페이스
해시 테이블을 사용하는 Set 구현체입니다
TreeSet
Set 구현체 : 가변(mutable) 인터페이스
정렬된 Set 구현체입니다
HashMap
Map 구현체 : 가변(mutable) 인터페이스
해시 테이블 기반의 Map 구현체입니다
TreeMap
Map 구현체 : 가변(mutable) 인터페이스
정렬된 Map 구현체입니다
@ComponentclassCollectionComponent {
/**
* Collection Type 구현체를 사용하는 예시
*/funcollectionImplements() {
val arrayList = ArrayList<String>() // 동적 크기 조정이 가능한 리스트
arrayList.add("첫 번째")
arrayList.add("두 번째")
val linkedList = LinkedList<Int>() // 이중 연결 리스트
linkedList.add(1)
linkedList.add(2)
// Set 예제val hashSet = HashSet<String>() // 해시 테이블 기반 Set
hashSet.add("사과")
hashSet.add("사과") // 중복된 값은 추가되지 않음val treeSet = TreeSet<Int>() // 정렬된 Set
treeSet.add(3)
treeSet.add(1)
treeSet.add(2)
println(treeSet) // [1, 2, 3] 순서로 출력// Map 예제val hashMap = HashMap<String, Int>() // 해시 테이블 기반 Map
hashMap["one"] = 1
hashMap["two"] = 2val treeMap = TreeMap<String, Int>() // 정렬된 Map
treeMap["b"] = 2
treeMap["a"] = 1
treeMap["c"] = 3
println(treeMap) // 키를 기준으로 정렬되어 출력
}
}
💡 [참고] Java에서 Collection Framework에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
@ComponentclassCastingComponent {
/**
* 기본 타입의 캐스팅 방법
*/funnormalCasting() {
val intNum = 10val longNum = 1000Lval floatNum = 3.14f// Int를 다른 타입으로 변환val byteNum: Byte = intNum.toByte()
val shortNum: Short = intNum.toShort()
val longFromInt: Long = intNum.toLong()
val floatFromInt: Float = intNum.toFloat()
val doubleFromInt: Double = intNum.toDouble()
val charFromInt: Char = intNum.toChar()
val stringFromInt: String = intNum.toString()
// Long을 Int로 변환val intFromLong: Int = longNum.toInt()
// Float를 Int로 변환val intFromFloat: Int = floatNum.toInt()
}
/**
* 안전하지 않은 as 캐스팅
*/funasCasting() {
val obj: Any = "Hello"val str: String = obj as String // "Hello"val num: Int = obj asInt// ClassCastException
}
}