Kotlin 문법 (1)
서론
이제 앞서서하던 Java를 이용한 Springboot 프로젝트가 마무리되면서 다음 프로젝트로는 Kotlin을 사용한 프로젝트를 계획하게 되었다.
해당 프로젝트에 들어가기 앞서 Kotlin 문법에 대해서 공부하고자 이 포스팅을 작성하게 되었다.
변수
변수 선언은 Java 보다는 Javascript에 가깝다고 느꼈다.
var: 변수값이 변경 가능한 변수 선언 (Javascript의 var,let)
val: 선언시에만 초기화 가능 (Javascript의 const, Java의 final)
fun main() {
var a: Int
a = 123
print(a) // 123
a = 234
print(a) // 234
val b:Int = 1232
print(b) // 1232
b = 3 // 에러 발생
print(b)
}
변수를 선언할 떄 변수이름 옆에 :(타입) 을 입력해줘야한다.
그리고 타입 옆에 ?를 붙여주면서 nullable을 나타낼 수 있다.
fun main() {
var a:Int? = null
print(a) //null
}
형변환
형 변환은 Java와 크게 다르지 않다.
to변수타입() 을 통해 형변환이 가능하다.
fun main() {
var a:Int = 123
var b:String = a.toString;
}
참고로 코틀린은 암시적 형변환을 지원하지 않는다.
배열
fun main() {
var intArr:Array<Int> = arrayOf(1,2,3,4) // Int형으로 배열 생성
var intArr2 = arrayOfNulls<Int>(5) // Type선언 생략가능, Nullable
var anyArr : Array<Any> = arrayOf(1,"a",3.2) // Any타입을 통해 어느 데이터든 들어갈 수 있음
print(intArr[0]) // 1
print(intArr2[0]) // null
print(anyArr[1]) // a
}
함수
함수 선언은 fun (함수이름) 으로 적는다.
그 다음 괄호에 매개변수를 적고 매개변수 타입을 선언해준다.
그리고 매개변수 뒤에 반환될 타입을 선언해준다.
fun main() {
print(add(1,2,3)) // 6
}
fun add(a:Int, b:Int, c:Int): Int {
return a+b+c;
}
위와 같은 함수는 아래와 같이 단일 표현식으로도 적을 수 있다.
fun add(a: Int, b: Int, c: Int) = a + b + c // Int타입만을 더하기때문에 Int타입으로 추론가능
조건문
기본적으로 다른 언어들과 크게 다르지 않다.
조금 다른게 있다면 Switch문을 when으로 쓴다는 점이다.
1
2
3
4
5
when(a){
1 -> print(2)
"awd" -> print("dwa")
else -> print(a)
}
값을 할당해줄때도 다음과 같이 쓸 수 있다.
1
2
3
4
5
var b = when(a){
1 -> 1
"awd" -> "dwa"
else -> a
}
반복문
반복문 또한 다른 언어와 크게 다르지 않다.
while(i < 3){
println(i)
i++
}
// i가 0부터 3까지 높아지며 반복
for(i in 0..3){
print(i)
print(" ")
}
// i가 3부터 0까지 낮아지며 반복
for(i in 3 downTo 0){
print(i)
print(" ")
}
// i가 0부터 5까지 2씩 높아지며 반복
for(i in 0..5 step 2){
print(i)
print(" ")
}
// i가 a부터 e까지 알파벳 순서로 반복
for(i in 'a'..'e'){
print(i)
print(" ")
}
클래스
자바와 가장 다른점은 이 클래스 선언일 것이다.
일단 자바와 다르게 생성자를 따로 선언해주지 않아도 된다.
class a(var name:String, val age:Int) {
fun introduce() {
println("$name $age")
}
}
fun main() {
var b = a("홍길동",26)
b.introduce() // 홍길동 26
println("${b.name}, %{b.age}) // 홍길동, 26
}
코틀린의 클래스에는 init이라는 기능이 있는데 이는 클래스가 인스턴스로 생성될 때 발생하는 로직을 정할 수 있다.
class a(var name:String, val age:Int) {
init{
println(create : ${this.name})
}
}
fun main() {
var b = a("홍길동",26) // create : "홍길동"
}
상속에 대해서도 조금 다른점이 있다.
상속을 받기 위해서는 부모클래스의 메소드에 open이라는 값을 입력해줘야한다.
상속받은 메소드를 override를 붙여서 override할 수 있다.
open class Person(var name:Strings, var job:String) {
open fun introduce() {
println("${this.name} ${this.job}")
}
}
class Artist(var name:String, var job:String) : Person(name, "예술가") {
override fun introduce() {
super.introduce()
}
}