본문 바로가기

프로그래밍 언어/Kotlin

[Kotlin] 코틀린 기초 문법

1. val 과 var 및 자료형

// 변하지 않는 값
val a = 0

// 변하는 값
var b = 0

a = 10  오류 발생
b = 10

 

Kotlin에서는 Java와 마찬가지로 자료형을 선언해 주어야 한다.

 

형태는 다음과 같다.

val a : 자료형 = 값

 

값을 선언해 주었다면 자료형은 생략해도 상관없다.

 

val a : Int = 0
val b = 0

var string : String = "test"
var string = "test

 

 

2. 입·출력 및 String템플릿

 

입력은 readLine(), 출력은 print(), println() 메서드를 사용한다.

var name = readLine()
print("안녕? 나는 $name 이야!") // 줄 바꿈 x
println("안녕? 나는 $name 이야!") // 줄 바꿈

 

위의 $name 처럼 문자열 사이에 원하는 변수에 해당하는 값을 넣고 싶을 때 사용하는 것이 String템플릿이다.

 

사용 방법은 $변수명 (띄어쓰기), ${변수명} 으로 사용할 수 있다.

 

var name = readLine()
print("안녕? 나는 $name 이야!") 
println("안녕? 나는 ${name}이야!")

 

 

3. 조건식

3.1 IF 문

if(조건문){
     print("if")
}
else if(조건문){
     print("else if")
}
else{
     print("else")
}

 

3.2 When

Java에 switch문이 있다면 kotlin에는 when이 있다.

when (month) {
     1 -> "1월"
     2 -> "2월"
     3, 4 -> "3월 4월"
     in 7..9 -> "7~9월 중 하나"
     else -> "이외 모든 것"
}

//변수에 값을 대입시킬 경우
var a = when (month) {
     1 -> "1월"
     2 -> "2월"
     3, 4 -> "3월 4월"
     in 7..9 -> "7~9월 중 하나"
     else -> "이외 모든 것"
}

 

4. 배열과 리스트

배열에는 Array와 List가 있다.

 

또한 Array와 List의 차이에 대해서는 자료구조에 해당하므로 여기에서는 세세하게 다루지 않고 간단하게만 짚고 넘어가려 한다.

 

Array는 인덱스의 값을 변경할 수 있지만, List는 변경 불가능하다.

 

또한 Array는 크기가 고정, List는 가변적이다.

 

val array = arrayOf(1,2,3,4,5)
array[0] = 10
// array : [10,2,3,4,5]

val list = listOf(1,2,3,4,5)
list[0] = 10  // 오류 발생
list.add(6) //오류 발생
// List는 값이 고정이므로 추가, 변경 등 값을 변화시킬 수 없다.

 

하지만 우리에겐 두 개를 합쳐 놓은 ArrayList가 존재한다. (또는 MutableList 사용)

 

ArrayList는 MutableList로 Array처럼 인덱스의 값을 변경할 수 있으며, List처럼 크기가 가변적이다.

 

val arrayList = arrayListOf(1,2,3,4,5)
arrayList[0] = 10
arrayList.add(6)
// arrayList : [10,2,3,4,5,6]

val arrayList2 = ArrayList<Int>() // 빈 값 초기화
arrayList2.add(1)
arrayList2.add(2)
// arrayList2 : [1,2]

 

5. 반복문

5.1.1 for문

kotlin에서의 for문은 다른 언어의 for문과 다르다.

 

for(i in 0..5) { 
     print(i) // 0,1,2,3,4,5
}
        
// until : 5 이전까지
for(i in 0 until 5){
     print(i) // 0,1,2,3,4
}
        
// step(num) : num만큼 증가
for(i in 0..5 step(2)) { 
     print(i) // 0,2,4
}
        
// downTo : 아래로 진행
for(i in 5 downTo 0){
     print(i) // 5,4,3,2,1,0
}

// Array or List
val list = listOf(1,2,3,4,5)
for(i in list) {
     print(i) // 1,2,3,4,5
}

 

5.1.2 forEach

kotlin에서는 for문 대신 forEach로 대체가 가능하다.

val list = listOf(1,2,3,4,5)

(0..5).forEach { data ->
     print(data) // 0,1,2,3,4,5
}

list.forEach { data ->
     print(data) // 1,2,3,4,5
}

//인덱스가 
list.forEachIndexed { index, data ->
     println("${index}번 인덱스의 값은 ${data} 입니다.") // 0번 인덱스의 값은 1 입니다.  ...
}

 

5.2 While , do~while

var a = 0
while(a < 5) 
{
     print(a++) // 0,1,2,3,4
}

 do
{
     print(a++)    // 0,1,2
}while(a < 3)

 

do~while 문은 do를 먼저 실행 후 while 조건문을 확인한다.

 

즉, while 조건문이 거짓이여도 do의 내용은 무조건 한 번 실행

 

6. 함수

Kotlin에서의 함수는 다음과 같이 사용한다.

fun 함수 이름(매개 변수) : 반환 값 {
     ...

     return
}

 

만일 반환 값이 없다면 : 반환 값은 생략 가능하며, 매개 변수 또한 없으면 빈 괄호로 둘 수 있다.

 

fun 함수 이름() {
     ...
}

 

7. Nullable 과 NonNull

7.1  ?

Kotlin에서는 Null이 있는 곳이라면 어디든지 따라가는 ? 가 있다.

var nullTest : String = null

 

위의 코드를 실행하면 에러가 난다.

 

그 이유는 String 형태를 사용한다 하였는데 null이 들어 갔기 때문

 

따라서 에러가 나지 않으려면 다음과 같이 사용해야 한다.

 

var nullTest : String? = null
var nullTest = null // 이렇게 써도 되긴 함

 

이때 이 nullTest 변수를 사용하여 어떠한 메서드를 사용한다고 하면

 

nullTest.split(" ") // 띄어쓰기를 기준으로 문자열 분리

 

다음과 같이 사용하면 에러가 나며, 실제로는 . 에 빨간 밑줄이 뜬다.

 

따라서 Null이거나 Null일 수도 있는 변수에는 ?를 붙여주어야 한다.

 

var nullTest : String? = null
nullTest?.split(" ") // null
nullTestFunction(nullTest) // null

nullTest = "Null Test"
nullTest.split(" ") // [Null, Test]
nullTestFunction(nullTest) // "Null Test"

fun nullTestFunction(word : String?) {
     println(word)
}

 

사실 개발할 때, ?가 필요한데 없으면 빨간 줄이 뜨기 때문에 편하다...ㅎ

 

7.2  ?:

var lastName = null
val name = "홍"+(lastName?: "!") // 홍!

var lastName = "길동"
val name = "홍"+(lastName?: "!") // 홍길동

 

lastName이 null이 아니면 그대로 출력, null이면 "!" 출력

 

7.3  !!

Null이 절대 아니라는 뜻 또는 값이 무조건 들어있다는 의미

fun nullTestFunction(number: Int?) {
     val a = number!!
     println(a.toString())
}

 

매개 변수로 넘어온 number에 !!로 null이 아니라는 확신을 주었기 때문에 toString() 메소드를 사용할 때 ?를 안써주어도 된다.

 

!! 썻는데 null이 넘어온다면 오류가 난다.

 

8. Class

class 클래스명(매개 변수A) : 상속클래스(), 인터페이스{

     // 생성자 
     constructor (매개변수A, 매개변수B) : this(A) {

         클래스 매개 변수 외 추가로 매개 변수가 필요할 때 사용

     }
    init{ 클래스 생성 시 실행 }

    fun 함수명() : 반환형 {
           ...
    }

    override fun 함수명() {
         ...
    }

}

 

클래스에서의 상속은 Java에서의 extends, implements로 나뉘지 않고 : 뒤에 적어주면 된다.

 

다만 클래스 상속은 뒤에 ()를 붙여주고, 인터페이스는 안붙여준다는 차이점이 있다.

 

오버라이드도 Java에서는 @Override 어노테이션을 사용하였다면, Kotlin에서는 override fun 으로 사용한다.

 

클래스 객체 생성

//java
ClassName 변수명 = new ClassName();

//Kotlin
val 변수명 = ClassName()

 

Kotlin에서는 new를 생략하고 작성해주면 된다.

'프로그래밍 언어 > Kotlin' 카테고리의 다른 글

[Kotlin] 정렬  (0) 2024.06.11
[Kotlin] 배열과 리스트 복사  (0) 2024.03.06
[Kotlin] 문자열 String  (0) 2023.11.03