📱 안드로이드 Android ~ Kotlin

[Kotlin/코틀린] 1 - 변수/상수, 데이터타입, 함수, 컬렉션 타입

핑크빛연어 2022. 2. 4. 15:38

 

🚨 변수 / 상수

 

변수(var) - 초기값이 할당된 후에도 값을 바꿀 수 있는 변수
var [변수명]: [데이터 타입] = [값] 의 형태

상수(val) - 초깃값이 할당되면 바꿀 수 없는 변수
val [변수명]: [데이터 타입] = [값] 의 형태 

값에 따라 데이터 타입을 유추할 수 있을 때는 데이터 타입을 생략할 수 있다.

    /* 변수 - 초기값이 할당된 후에도 값을 바꿀 수 있는 변수 */
    var a: Int = 1
    a = 10
    var b = 3.14
    b = 2.10
    var c: String = "c문자"
    c = "c문자 입니다."
    
    
    /* 상수 - 초깃값이 할당되면 바꿀 수 없는 변수 */
    val d: Int = 1
    val e: Double = 3.14
    val f: String = "f문자"

 

초깃값 할당

최상위에 선언한 변수나 클래스의 멤버 변수는 선언과 동시에 초깃값을 할당해야 한다.
함수 내부에 선언한 변수는 선언과 동시에 초깃값을 할당하지 않아도 된다.

물론 변수를 이용하려면 값을 할당하고 이용해야 한다.

val data1: Int  //ERROR
val data2 = 10  //SUCC

fun someFun() {
    val data3: Int
    println("data3 : $data3")  //ERROR
    data3 = 10
    println("data3 : $data3")  //SUCC
}

class User {
    val data4: Int  //ERROR
    val data5: Int = 10  //SUCC
}

 

초기화 미루기

lateinit 키워드
lateinit var data: String
- 이후에 초깃값을 할당할 것임을 명시적으로 선언
var 키워드로 선언한 변수에만 사용가능
- 로컬변수로 사용불가, 전역번수로만 사용가능
- int, Long. Short, Double, Float, Boolean, Byte 타입에는 사용불가능
- 사용하기 전 초기화 후 사용해야 함

lazy 키워드
val data: Int by lazy {
   ... 

- 소스에서 변수가 최초로 이용되는 순간 중괄호로 묶은 부분이 자동으로 실행되어 그결괏값이 변수의 초깃값으로 할당

/* lateinit 사용 */
lateinit var data1: String

/* lazy 사용 */
val data2: Int by lazy {
    100
}


fun main() {

    //사용하기 전 초기화 후 사용해야 함
    data1 = "데이터1"
    println("data1 : $data1")  // => 데이터1

    //data2 를 사용하기 전까지는 data2 라는 변수에 100 이 할당되지 않음
    println("data2 : ${data2+10}")  // => 110

}

 

 

🚨 데이터 타입

- 코틀린(Kotlin)의 모든 변수는 객체. 코틀린(Kotlin)의 모든 타입은 객체 타입
- 정수를 다루는 타입이 Int 인데 Int 는 기초 데이터 타입이 아니라 클래스이다
- Int 타입이 기초 데이터 타입이라면 변수에 null을 대입할 수 없으며 메서드 호출도 불가능
- 하지만 코틀린(Kotlin)의 모든 타입은 객체이므로 
  Int 타입의 변수에 10 이라는 변수뿐만 아니라 null 을 대입할 수도 있고 객체의 메서드로 호출 가능
  (null : 객체가 선언만 되고 메모리 할당이 되지 않았음을 의미)

fun someFun() {
    var data1: Int = 10
    var data2: Int? = null  //null 대입 가능

    data1 += 10
    println("data1 - 1 : $data1")  // => 20
    data1 = data1.plus(10)  //객체의 메서드 이용 가능
    println("data1 - 2 : $data1")  // => 30
}

 

기초 타입 객체

Int, Short, Long, Double, Float, Byte, Boolean : 기초 데이터를 객체로 표현하는 타입
Char, String : 문자와 문자열

 

Any : 모든 타입 가능

- 코틀린(Kotlin)에서 최상위 클래스

val data: Any = 10
val data: Any = "data"

 

Unit : 반환문이 없는 함수

- Unit 타입으로 선언한 변수에는 Unit 객체만 대입 가능
- Unit 타입으로 변수를 선언할 수 있지만 의미가 없다

val data: Unit = Unit

/* 같은 의미의 some() 함수 소스 */
fun some(): Unit {
   println(10+20)
}
fun some() {
   println(10+20)
}

 

Nothing : null 이나 예외를 반환하는 함수

- Nothing 으로 선언한 변수에는 null 만 대입 가능
- Nothing 으로 선언한 변수는 데이터로서의 의미가 없다

val data: Nothing? = null

 

널 허용(nullable) / 불허용(not null)

- 코틀린(Kotlin)의 모든 타입은 객체이므로 변수에 null을 대입할 수 있다
- null 은 값이 허용되지 않은 상황을 의미
- 코틀린(Kotlin)에서는 변수를 선언할 때 null을 대입할 수 있는 변수인지( 널허용, nullable), 
  null을 대입할 수 없는 변수인지(널 불허용, not null)를 명확하게 구분해서 선언해야한다
- 이러한 구분은 변수를 선언할 때 타입 뒤에 물음표(?) 로 표시
- 타입 뒤에 물음표 추가하면 널 허용 / 추가하지 않으면 널 불허용

var data1: Int = 10 
var data2: Int? = 10

data1 = null  //오류! 
data2 = null  //성공!

data1.sum()  //애초에 nullsafe 함
data2?.sum()  //null 일 경우 실행하지 않음

 

 

🚨 함수

fun 함수명(매개변수1: 타입, 매개변수2: 타입): 리턴타입 { 
   ...
   return 리턴값

반환타입 생략 시 자동으로 Unit 타입이 적용된다.

fun sum1(a: Int, b: Int): Int {
    return a+b
}

fun sum2(a: Int, b: Int) = a+b

fun max(a: Int, b: Int) = if(a > b) a else b

 

 

🚨 컬렉션 타입

여러개의 데이터를 표현하는 방법

 

Array : 배열 표현

- 배열의 타입은 제네릭으로 표현(제네릭은 선언하는 곳이 아니라 이용하는 곳에서 타입을 지정하는 기법)

/* 0으로 초기화한 데이터를 3개 나열한 정수형 배열
*  -  첫번쨰 매개변수 : 배열의 크기
*  - 두번쨰 매개변수 : 초깃값을 지정하는 함수
* */
val dataArr: Array<Int> = Array(3, {0})

dataArr[0] = 10  //배열의 0번째 데이터를 10으로 설정
dataArr[1] = 20  //배열의 1번째 데이터를 20으로 설정
dataArr.set(2, 30)  //배열에서 2번째 데이터를 30으로 설정

dataArr[0]  //배열의 0번째 데이터 가져오기 => 10
dataArr[1]  //배열의 1번째 데이터 가져오기 => 20
dataArr.get(2)  //배열의 2번째 데이터 가져오기 => 30


/* 배열 선언과 동시에 값 할당 */
val dataArr2 = arrayOf(10, 20, 30)  //크기가 3인 int형 배열을 선언하고 10, 20, 30 으로 할당

 

기초 타입의 배열

- 배열의 데이터가 기초 타입이라면 Array 를 사용하지 않고 기초 타입을 나타내는 클래스를 이용할 수도 있다.
- BooleanArray, ByteArray, CharArray, DoubleArray, FloatArray, IntArray, LongArray, ShortArray 클래스 이용가능

val data1: IntArray = IntArray(3, {0})
val data2: BooleanArray = BooleanArray(4, {false})
val data3 = intArrayOf(10, 20, 30)
val data4 = booleanArrayOf(true, true, true,true)

 

List, Set, Map

- Collection 인터페이스를 타입으로 표현한 클래스
- List : 순서가 있는 데이터 집합. 데이터의 중복 허용
- Set : 순서가 없으며 데이터의 중복을 허용하지 않음
- Map : 키와 값으로 이루어지 데이터 집합. 순서가 없으며 키의 중복은 허용하지 않음

구분 타입 함수 특징
List List      listOf() 불변
MutableList mutableListOf() 가변
Set Set setOf() 불변
MutableSet mutableSetOf() 가변
Map Map mapOf() 불변
MutableMap mutableMapOf() 가변

불변은 size(), get() 함수만 제공
가변은 size(), get(), add(), set() 함수까지 가능

var list = listOf<Int>(10, 20, 30)	
list[0]  // => 10
list.get(2)  // => 30
	
var mutableList = mutableListOf<Int>(10, 20, 30)	
mutableList.add(3, 40)	
mutableList.set(0, 50)	
	
mutableList[0]  // => 50
mutableList.get(3)  // => 40
	
var map = mapOf<String, String>(Pair("one", "hello"), "two" to "world")	
map.get("one")  // => hello
map.get("two")  // => world

 

 

감사합니당~:)

더보기
Kotlin/코틀린

 

728x90
반응형