[Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린] 코틀린 시작하기

코틀린 언어의 장점, 파일 구성, 변수와 함수 선언, 데이터 타입, 컬렉션 타입, 조건문과 반복문에 대해 정리했다. 코틀린은 간결하고 안전한 코드, 자바와의 상호 운용성, 구조화된 동시성 등의 장점을 가지고 있다. 변수는 val과 var로 선언하며, 함수는 fun 키워드를 사용한다. 다양한 데이터 타입과 컬렉션 타입을 지원하며, 조건문 if와 when, 반복문 for와 while을 통해 제어 흐름을 관리할 수 있다.
DriedPollack's avatar
Jun 14, 2024
[Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린] 코틀린 시작하기

🌼코틀린 언어 소개

💡코틀린의 장점

  • 표현력과 간결함
    • 같은 로직을 자바와 코틀린으로 각각 작성해 보면 코틀린 코드가 훨씬 간결하다는 것을 알 수 있다.
  • 안전한 코드
    • 코틀린에서는 변수를 널 허용과 널 불허용으로 구분해서 선언한다.
  • 상호 운용성
    • 코틀린은 자바와 100% 호환된다.
  • 구조화 동시성
    • 코루틴 기법을 이용하면 비동기 프로그래밍을 간소화할 수 있다.

💡코틀린 파일 구성

  • package 이름은 코틀린 파일의 위치와 상관없는 별도의 이름으로도 선언할 수 있다.
    • 자바에서는 최상위에 클래스만 선언할 수 있으며 변수나 함수는 최상위에 선언할 수 없다. 따라서 코틀린에서 최상위로 선언한 변수나 함수를 자바에서 이용할 수 없을 것 처럼 보인다.
    • 하지만 코틀린 컴파일러가 이를 가능하게 해 준다. 코틀린 소스 파일의 최상위에 선언한 변수와 함수는 자동으로 파일명+Kt 라는 이름의 클래스에 포함된다.
 

🌼변수와 함수

💡변수 선언하기

  • 코틀린에서 변수는 val, var 키워드로 선언한다.
    • val은 value의 줄임말로 초기값이 할당되면 바꿀 수 없는 변수다.
    • var는 variable의 줄임말로 초기값이 할당된 후에도 값을 바꿀 수 있는 변수다.
  • 변수명 뒤에는 콜론(:)을 추가해 타입을 명시할 수 있으며, 타입 추론을 할 수 있을 때는 생략할 수 있다.
    • val data1: Int = 10 val data2 = 20
  • 최상위에 선언한 변수나 클래스의 멤버 변수는 선언과 동시에 초깃값을 할당해야 한다.
    • val data1: Int // 오류 val data2 = 20 // 성공
  • lateinit이나 lazy 키워드를 이용해서 값을 이후에 할당할 수 있다.
    • lateinitvar 키워드로 선언한 변수에만 사용할 수 있다.
    • Int, Long, Short, Double, Float, Boolean, Byte 타입에는 사용할 수 없다.
    • lateinit var data1: Int // 오류 lateinit var data3: String // 성공
  • lazy키워드는 변수 선언문 뒤에 by lazy { } 형식으로 선언하며, 결괏값이 변수의 초깃값으로 할당된다.
    • val data4: Int by lazy{ printLn("in lazy......") 10 }

💡데이터 타입

  • 코틀린의 모든 변수는 객체다. 따라서 코틀린의 모든 타입은 객체 타입이다.
  • Int, Short, Long, Double, Float, Byte, Boolean은 기초 데이터를 객체로 표현하는 타입이다.
  • Char, String은 문자와 문자열을 표현하는 타입이다.
    • Char 타입의 데이터는 문자를 작은따옴표(’)로 감싸서 표현하며, Number 타입으로 표현할 수는 없다.
    • String은 문자열을 큰따옴표(”)삼중 따옴표(”””)로 감싸서 표현한다.
      • 큰따옴표로 표현한 문자열에서 줄바꿈이나 들여쓰기를 그대로 유지하려면 역슬래시(\)로 시작하는 이스케이프 시퀀스를 입력해야 한다.
      • 삼중 따옴표로 표현할 때는 입력한 줄바꿈이나 들여쓰기 등이 데이터에 그대로 반영된다.
      • 삼중 따옴표를 사용하면 닫는 따옴표 뒤에 .trimIndent() 함수가 추가되어 문자열 앞의 공백을 없애준다.
    • String 타입의 데이터에 변숫값이나 연산의 결괏값을 표현해야 할 때는 $기호를 사용한다. 이를 문자열 템플릿이라고 한다.
      • fun sum(no: Int): Int{ var sum = 0 for(i in 1..no){ sum += i } return sum } val name: String = "kkang" println("name : $name, sum : ${sum(10)}")
  • Any는 코틀린에서 최상위 클래스이다. 모든 코틀린의 클래스는 Any의 하위 클래스이다.
  • Unit은 반환문이 없는 함수로 다른 타입과 다르게 데이터의 형식이 아닌 특수한 상황을 표현하려는 목적으로 사용한다.
    • 함수 선언시 반환 타입을 생략하면 자동으로 Unit이 적용된다.
  • Nothing은 null이나 예외를 반환하는 함수로 데이터로서는 의미가 없다.
    • 주로 함수의 반환 타입에 사용하는데, 항상 null만 반환하는 함수나 예외를 던지는 함수의 반환 타입을 Nothing으로 선언한다.
  • 타입 뒤에 물음표를 추가하면 널 허용으로 선언하지만 추가하지 않으면 널 불허용으로 선언한다.

💡함수 선언하기

  • 코틀린에서 함수를 선언하려면 fun 키워드를 사용한다.
    • fun 함수명(매개변수명: 타입): 반환 타입 {...}

💡함수 선언하기

  • 코틀린에서 함수를 선언하려면 fun 키워드를 사용한다.
    • fun 함수명(매개변수명: 타입): 반환 타입 {...}
  • 반환 타입을 생략하면 Unit 타입이 적용된다.
  • 매개변수에는 var이나 val 키워드를 사용할 수 없다. val이 자동 적용되며 함수 안에서 매개변숫값을 변경할 수 없다.
    • fun some(data1: Int) { data1 = 20 // 오류 }
  • 매개변수에는 기본값을 선언할 수 있다.
    • fun some(data1: Int, data2: Int = 10): Int{ return data1 * data2 }
  • 어떤 함수의 매개변수가 여러 개면 호출할 때 전달한 인자를 순서대로 할당한다.
    • 호출 시 매개변수명을 지정하면 순서를 바꿔도 된다. 이를 명명된 매개변수라고 한다.
    • some(data2 = 20, data1 = 10)

💡컬렉션 타입

  • 컬렉션 타입이란 여러 개의 데이터를 표현하는 방법이며 Array, List, Set, Map이 있다.
  • Array는 코틀린에서 배열을 표현할 때 사용한다.
    • 생성자에서 첫 매개변수는 배열의 크기, 두 번째는 초깃값을 지정한다.
    • 배열의 타입은 제네릭으로 표현한다.
    • 배열의 데이터에 접근할 때는 대괄호([])set(), get() 함수를 이용한다.
    • val data1: Array<Int> = Array(3, {0}) data1[0] = 10 data1[1] = 20 data1.set(2,30) println( """ array size : ${data1.size} array data : ${data1[0]}, ${data1[1]}, ${data1.get(2)} """ )
    • 만약 배열의 데이터가 기초 타입이라면 Array를 사용하지 않고 각 기초 타입의 배열을 나타내는 클래스를 이용할 수도 있다.
      • 사용 가능한 클래스: BooleanArray, ByteArray, CharArray, DoubleArray, FloatArray, IntArray, LongArray, ShortArray
      • val data1: IntArray = IntArray(3, {0})
    • arrayOf()함수도 기초 타입을 대상으로 하는 booleanArrayOf(), byteArrayOf(), charArrayOf(), doubleArrayOf(), floatArrayOf(), intArrayOf(), longArrayOf(), shortArrayOf() 함수를 제공한다.
      • val data1 = intArrayOf(10,20,30)
  • List, Set, MapCollection 인터페이스를 타입으로 표현한 클래스이며 통틀어 컬렉션 타입 클래스라고 한다.
    • List는 순서가 있는 데이터 집합으로 중복 데이터를 허용한다.
    • Set은 순서가 없으며 데이터의 중복을 허용하지 않는다.
    • Map은 키와 값으로 이루어진 데이터 집합으로 순서가 없으며 키의 중복은 허용하지 않는다.
    • 코틀린에는 가변과 불변이라는 2가지 타입의 클래스를 제공한다. MutableList는 가변타입이므로 size(), get() 함수 이외에 add(), set() 함수를 사용할 수 있다.
    • 구분
      타입
      함수
      특징
      List
      List
      listOf()
      불변
      List
      MutableList
      mutableListOf()
      가변
      Set
      Set
      setOf()
      불변
      Set
      MutableSet
      mutableSetOf()
      가변
      Map
      Map
      mapOf()
      불변
      Map
      MutableMap
      mutableMapOf()
      가변
      var list = listOf<Int>(10,20,30) var mutableList = mutableListOf<Int>(10,20,30) var map = mapOf<String, String>(Pair("one","hello"), "two" to "world") // 키값을 Pair 객체로 표현해 Map에 대입 또는 to를 통해 대입 가능
 

🌼조건문과 반복문

💡조건문 if~else와 표현식

  • 대부분의 프로그래밍 언어에서 제공하는 조건문과 차이가 없다.
  • 추가적으로 코틀린에서는 표현식으로 사용이 가능하다.
    • fun main(){ var data = 10 var result = if(data>0){ println("data > 0") true }else{ println("data <= 0") false } println(result) } // 실행 결과 data > 0 true

💡조건문 when

  • when 키워드 다음의 소괄호 () 안에 넣은 데이터가 조건이 되고 이 값에 따라 각 구문을 실행한다.
    • fun main(){ var data = 10 when(data){ 10 -> println("data is 10") else ->{ println("data is not valid data") } } }
  • when 문의 조건으로 정수가 아닌 다른 타입의 데이터를 지정할 수도 있다.
    • fun main(){ var data: Any = 10 when(data){ is String -> println("data is String") 20, 30 -> println("data is 20 or 30") in 1..10 -> println("data is 1..10") else -> println("data is not valid data") } }
  • when 문을 이용하면서 데이터를 명시하지 않고 조건만 명시할 수도 있다.
    • fun main(){ var data = 10 when{ data <= 0 -> println("data is <= 0") else -> println("data is valid") } }
  • when 문을 표현식으로 사용할 수도 있다.
    • fun main(){ var data = 10 var result = when { data <= 0 -> println("data is <= 0") else -> "data is valid" } println(result) }

💡반복문 for와 while

  • 코틀린에서 for 문의 조건에는 주로 범위 연산자인 in을 사용한다.
    • fun main(){ var sum: Int = 0; for(i in 1..10){ sum += i } println(sum) }
    • for문의 조건은 다양하게 작성할 수 있다.
      • for(i in 1..10) {} // 1부터 10까지 1씩 증가 for(i in 1 until 10) {} // 1부터 9까지 1씩 증가(10은 미포함) for(i in 2..10 step 2) {} // 2부터 10까지 2씩 증가 for(i in 10 downTo 1) {} // 10부터 1까지 1씩 감소
    • 증감 조건을 숫자로 명시하지 않고 컬렉션 타입의 데이터 개수만큼 반복하게 할 수도 있다.
      • fun main(){ var data = arrayOf<Int>(10,20,30) for(i in data.indices){ // indices는 컬렉션 타입의 인덱스값을 의미한다. print(data[i]) if(i!==data.size-1) print(",") } }
    • 배열의 크기만큼 for문을 반복하게 할 수도 있다.
      • fun main(){ var data = arrayOf<Int>(10,20,30) for((index, value) in data.withIndex()){ // for문을 반복하면서 인덱스와 실제 데이터를 함께 가져오려면 withIndex() 함수를 이용한다. print(value) if(index!==data.size-1) print(",") } }
  • while문을 이용해 반복문을 작성할 수도 있다.
    • fun main(){ var x = 0; var sum1 = 0 while(x<10){ sum1 += ++x } println(sum1) }
 

🏁결론

코틀린 언어의 장점, 파일 구성, 변수와 함수 선언, 데이터 타입, 컬렉션 타입, 조건문과 반복문에 대해 정리했다. 코틀린은 간결하고 안전한 코드, 자바와의 상호 운용성, 구조화된 동시성 등의 장점을 가지고 있다. 변수는 valvar로 선언하며, 함수는 fun 키워드를 사용한다. 다양한 데이터 타입과 컬렉션 타입을 지원하며, 조건문 ifwhen, 반복문 forwhile을 통해 제어 흐름을 관리할 수 있다.
Share article

More articles

See more posts
RSSPowered by inblog