• [코틀린/Kotlin] 기초 문법 정리

    2021. 11. 1.

    by. 하루플스토리

    반응형

    안녕하세요, 하루플입니다😊

    안드로이드에서 자바가 아닌 코틀린으로 공부를 진행하면서 필요한 문법을 정리해보려합니다.

    코틀린의 기초 사항을 정리하는 것이고 이후에 코딩테스트를 진행하면서 필요한 부분을 보충하겠습니다.

     

    https://www.youtube.com/watch?v=8RIsukgeUVw&list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN&index=2 

    저는 위 강의를 보면서 개인적으로 공부한 내용을 정리하였습니다.


    1. 세미콜론을 붙이지 않아도 된다.

    fun main() {
        println("Hello, world!!!")
    }

     

    2. 변수 선언시 파스칼, 카멜 표기법을 권장한다.

    파스칼 표기법 : ClassName

    카멜 표기법 : className

     

    3. 변수 선언 방법

    var : 일반적으로 통용되는 변수. 언제든지 읽기 쓰기가 가능함.

    val : 선언시에만 초기화 가능. 중간에 값을 변경할 수 없음.

    ex) runtime시 변경되지 말아야 할 값은 안전하게 val로 선언하는 것이 좋다.

     

    변수는 선언 위치에 따라 두가지 이름으로 부른다.

    클래스에 선언된 변수 : Property(속성)

    이 외의 Scope 내에 선언된 변수 : Local Variable (로컬변수)

     

    고전적인 언어들은 변수가 선언된 후 초기화 되지 않으면 기본 값으로 초기화 되거나 값이 할당되지 않았다는 표시로 null 값을 가지게 된다,

    코틀린은 기본 변수에서 null을 허용하지 않고, 변수에 값을 할당하지 않은채로 사용하게 되면 문법 에러를 표시하고 컴파일을 막아주므로 의도치 않은 동작이나 null pointer exception 등을 원천적으로 차단해준다는 장점이 있다.

    fun main() {
        var a: Int = 123 //코틀린은 값 초기화 필수!
        println(a)
    }

    변수에 값을 할당하는 것은 반드시 선언시에 할 필요는 없으며 변수를 참조하여 사용하기 전까지만 하면 된다.

    fun main() {
        var a: Int
        a = 123 //이렇게 초기화해도 된다
        println(a)
    }

     

    그런데 프로그램에 따라서는 변수에 값이 할당되지 않았다는 것을 하나의 정보로 사용하는 경우도 있을 수 있다.

    fun main() {
        var a:Int? = null
    }

    그런 경우에는 null을 허용하는 nullable 변수로 선언해줄 수 있다. 하지만 null pointer exception이 발생할 수 있으므로 꼭 필요한 경우에 한해 주의해서 사용해야한다.

     

     

    4. 자료형

    변수에서 사용할 수 있도록 코틀린이 제공하는 기본 자료형은 자바와의 호환을 위해 자바와 거의 동일하다.

     

    정수, 실수형

    fun main() {
        var intValue:Int = 1234
        var longValue:Long = 1234L //L을 붙여 더 큰 메모리를 사용하는 정수임을 표시
        var intValueByHex:Int = 0x1af //16진수
        var intValueByBin:Int = 0b //2진수 (binary 약자)
        //코틀린은 8진수 표기는 지원하지 않는다.
        
        var doubleValue:Double = 123.5 //실수는 소수점을 포함해 숫자를 쓰거나
        var doubleValueWithExp:Double = 123.5e10 //필요시 지수 표기법을 추가한다.
        var floatValue:Float = 123.5f //Float는 f를 붙인다.
    }

     

    코틀린은 내부적으로 문자열을 UTF-16 BE 방식을 사용한다. 따라서 글자 하나하나가 2byte의 메모리 공간을 사용한다.

     

    문자, 문자열

    fun main() {
        var charValue:Char = 'a'
        var koreanCharValue:Char = '가'
        var stringValue = "one line string test"
        var multiLineStringValue = """multiline
        string
        test"""
    }

     

    불리언

    fun main() {
        var booleanValue:Boolean = true
    }

     

     

    5. 형 변환

    코틀린은 형변환시 발생할 수 있는 오류를 막기위해 다른 언어들이 지원하는 '암시적 형변환'은 지원하지 않는다.

    명시적 형변환 : 변환될 자료형을 개발자가 직접 지정함.

    암시적 형변환 : 변수를 할당할 시 자료형을 지정하지 않아도 자동으로 형변환 된다.

     

    형변환 함수

    toByte()

    toShort()

    toInt()

    toLong()

    toFloat()

    toDouble()

    toChar()

    fun main() {
        var a: Int = 54321
        var b: Long = a.toLong() //int를 long형으로 변환
    }

     

    6. 배열

    fun main() {
        var intArr = arrayOf(1,2,3,4,5) //int 배열
        var nullArr = arrayOfNulls<Int>(5) //비어있는 5크기의 배열
        
        int Arr[2] = 8 //index2에 8값 할당
    }

    배열은 처음 선언했을 때의 전체크기를 변경할 수 없다는 단점이 있지만 한번 선언하면 다른 자료구조보다 빠른 입출력이 가능한 장점이 있다.

     

     

    7. 타입 추론

    타입추론 : 변수나 함수들을 선언할 때나 연산이 이루어 질 때 자료형을 코드에 명시하지 않아도 코틀린이 자동으로 자료형을 추론해주는 기능

    fun main() {
        var a = 1234 //int
        var b = 1234L //long
        
        var c = 12.45 //Double
        var d = 12.45f //float
        
        var e = 0xABCD //16진수
        var f = 0b0101010 //2진수
        
        var g = true //boolean
        var h = 'C' //Char
    }

     

     

    8. 함수

    함수 : 특정한 동작을 하거나 원하는 결과값을 연산하는데 사용. 

     

    a,b,c를 더해서 나오는 값이 Int이므로 fun add(a: Int, b: Int, c:Int): Int 맨 마지막 반환형 Int 선언.

    반환값이 없다면 생략해도 된다.

    fun main() {
    	println(add(5, 6, 7))
    }
    
    fun add(a: Int, b: Int, c:Int): Int {
        return a + b + c
        //리턴 발생 시 함수 중간이더라도 함수 종료
    }

    실행결과 : 18

     

    단일 표현식 함수 : 위와 같이 여러가지 일을 하는 것이 아니라 a,b,c를 단순히 더해서 반환하는 역할과 같이 간단한 기능의 경우 마치 변수에 결과값을 할당하듯 기술할 수 있도록 함.

    fun main() {
    	println(add(5, 6, 7))
    }
    
    fun add(a: Int, b: Int, c: Int) = a + b + c

    단일 표현식 함수는 반환형의 타입 추론이 가능하므로 반환형을 생략할 수 있다.

     

    코틀린에서 함수는 내부적으로 기능을 가진 형태이지만, 외부에서 볼 때는 파라미터를 넣는다는 점 외에는 자료형이 결정된 변수라는 개념으로 접근하는 것이 좋다.

     

     

     

    8. 조건문

    if문은 java와 동일하다.

    fun main() {
    	var a = 7
    	if(a > 10){
            println("a는 10보다 크다")
        } else{
            println("a는 10보다 작거나 같다")
        }
    }

     

    다른 언어에서의 switch 문을 when 으로 사용한다.

    Any 자료형 : 어떤 자료형이든 상관없이 호환되는 코틀린의 최상위 자료형

    fun main() {
    	doWhen(12L)
    }
    
    fun doWhen (a :Any){
        when(a) {
            1 -> println("정수 1이다")
            "DiMo" -> println("디모의 코틀린 강좌")
            is Long -> println("Long 타입이다")
            !is String -> println("String 타입이 아니다")
            else -> println("어떤 조건도 만족하지 않는다")
        }
    }

    실행결과 : Long 타입이다

     

    when의 조건이 맞을때 값을 반환하는 표현식으로서의 역할을 하게 하려면 동작대신 값을 써주면 된다.

    fun main() {
    	doWhen(12L)
    }
    
    fun doWhen (a :Any){
        var result = when(a) {
            1 -> "정수 1"
            "DiMo" -> "디모의 코틀린"
            is Long -> "Long 타입"
            !is String -> "String 타입 아니다"
            else -> "어떤 조건도 만족하지 않는다"
        }
        
        println(result)
    }

     

     

    9. 반복문

    조건형 반복문 : 조건이 참인 경우 반복을 유지 (while, do...while)

    범위형 반복문 : 반복 범위를 정해 반복을 수행 (for)

     

    while 문

    fun main() {
    	var a = 0
        
        while(a < 5){
            println(a++)
        }
    }

    실행결과

    0

    1

    2

    3

    4

     

     

    do...while 문

    while에 의해 조건을 체크하여 반복한다는 점은 같지만 최초 한번은 조건없이 do 에서 구문을 실행한 후 while로 조건을 체크하는 선 후 관계에 차이가 있다.

    fun main() {
    	var a = 0
        
        do
        {
            println(a++)
        }while (a < 5)
    }

     

    for문

    기본적으로 for문은 값을 1씩 증가시키며 반복한다.

    fun main() {
    	for(i in 0..9){ //0~9까지 반복
            print(i)
        }
    }

    실행결과 : 0123456789

     

    증가값은 step을 이용하여 변경할 수 있다.

    fun main() {
    	for(i in 0..9 step 3){ //0~9까지 3 단위로 반복
            print(i)
        }
    }

    실행결과 : 0369

     

     

    for문 감소 방법

    fun main() {
    	for(i in 9 downTo 0){ //1씩 감소하며 반복 
            print(i)
        }
    }

    실행결과 : 9876543210

     

     

     

     

     

     

    10. 흐름제어

    fun main() {
        for(i in 1..10){
            if(i==3) break
            print(i)
        }
    }

    break : 실행 시 반복문 종료

    실행결과 : 12

     

    fun main() {
        for(i in 1..10){
            if(i==3) continue
            print(i)
        }
    }

    continue : 3인 경우 다음 숫자로 넘어가서 for문 계속 실행

    실행결과 : 1245678910

     

    여기까지는 기존의 언어랑 비슷한데 코틀린은 하나의 기능이 더 추가되었다.

    다중 반복문에서 break나 continue가 적용되는 반복문을 lable을 통해 지정할 수 있는 기능이다.

     

    i가 1이고 j가 2면 모든 반복문을 종료해야 한다고 가정해본다.

    fun main() {
        for(i in 1..10){
            for(j in 1..10){
                if(i == 1 && j == 2) break
            }
            //또 체크?
        }
    }

    고전적인 언어에서는 내부 반복문에서 조건을 체크하여 break를 하더라도 외부 반복문에서 또 다시 조건을 체크하여 모든 반복문을 수동으로 종료해야만 했다.

     

    코틀린에서는 외부 반복문에 레이블 이름과 @ 기호를 달고, break문에서 @와 레이블 이름을 달아주면 레이블이 달린 반복문을 기준으로 즉시 break를 시켜준다.

    fun main() {
        loop@for(i in 1..10){
            for(j in 1..10){
                if(i == 1 && j == 2) break@loop
            }
        }
    }

    이는 continue의 경우에도 마찬가지이다.

     

    다음 코드는 출력 예시이다. 변수명 앞에 $를 적으면 변수 값이 출력된다.

    fun main() {
        loop@for(i in 1..10){
            for(j in 1..10){
                if(i == 1 && j == 2) break@loop
                println("i : $i, j : $j")
            }
        }
    }

    출력결과 : i : 1, j : 1

     

    반응형

    댓글