달달한 스토리

728x90
반응형

 

플러터를 사용하면서 동시에 코틀린을 공부하려고 한다.

 

하이브리드 앱이 대세라고 하지만,

 

주 언어로 네이티브를 가져가고 싶은 욕심이 커서

 

동시에 공부 중이다.

 

역시 나는 do it 책에서 헤어 나오질 못한다.. 너무 정리가 잘되어 있다.

 

책에서 배운 내용을 정리하고자 한다.

 

출처는 do it 깡샘의 안드로이드 앱 프로그래밍 with 코틀린에서 가져왔다.


코틀린의 변수와 함수

 

1. 변수 선언

 

코틀린에는 크게 두가지의 변수 키워드가 있는데

 

var(value)val(variable)이다.

 

언뜻 보면 비슷하지만,

 

둘은 엄연히 다르다.

 

val 같은 경우는 초깃값이 할당 되면 바꿀 수 없는 변수를 선언할 때 사용하고,

 

var는 초깃값을 할당해도 추후에 바꿀 수 있는 변수를 선언할 때 사용한다.

 

코드는 아래와 같다.

val data1 = 10
var data2 = 10

fun main() {
  data1 = 20 // 오류가 난다.
  data2 = 20 // 가능하다.
}

 

2. 타입 지정과 타입 추론

보통 언어마다 앞에다가 타입을 지정해주는데,

 

자바 같은 경우는

 

TextView textView =...

 

이런 식으로 textView 변수 앞에 TextView라는 타입을 붙여준다.

 

코틀린은

 

변수명 뒤에 붙여준다.

 

val data1: Int = 10

그리고 이 타입을 생략할 수가 있는데,

 

값을 넣어주면 알아서 타입을 유추해서 넣어준다(타입 추론).

 

 

val data1: Int = 10
val data2 = 10

 

3. 초깃값 할당

 

최상위에 선언한 변수클래스 내부의 멤버 변수는 선언과 동시에 초깃값을 가져야 한다.

 

val data1: Int //오류
val data2 = 10 //성공

class User {
  val data3: Int //오류
  val data4: Int = 10 //성공 
}

 

하지만, 메서드 안에서는 초깃값을 할당하지 않아도 된다.

 

fun someFun() {
  val data: Int
  println("data : $data") //오류
  data = 10
  println("Data : $data") //성공
}

 

4. 초기화 미루기

 

앱을 만들다 보면 초깃값을 할당할 수 없는 경우가 생길 수 있다.

 

앱을 실행하고 추후에 변수에 값을 할당할 경우에는

 

아래 두 가지 키워드를 사용하면 된다.

 

lateinitlazy 키워드이다.

 

4 - 1 lateinit

 

lateinit은 추후에 값을 할당할 것임을 명시적으로 선언합니다.

 

선언은 아래와 같습니다.

lateinit var data1: Int //오류
lateinit val data2: String //오류
lateinit var data3: String //성공

이렇게만 보시면 왜 어떤 건 오류이고, 어떤건 성공이지 하실 수도 있습니다.

 

왜냐하면 lateinit에는 2가지 조건이 있기 때문입니다.

 

- lateinit은 var 키워드로 선언한 변수에서만 사용할 수 있습니다.

- Int, Long, Short, Double, Float, Boolean, Byte 타입에서는 사용할 수 없습니다.

 

4 - 2 lazy

 

lazy 키워드는 변수 선언문 뒤에 by lazy {} 형식으로 선언이 됩니다.

 

코드에서 변수가 최초로 사용이 되면 중괄호 안에 코드가 실행이 됩니다.

 

그리고 실행된 후에 결과 값이 변수의 초깃값으로 할당이 됩니다.

 

val data: Int by lazy{
  println("in lazy....")
  10 // 변수가 사용이 되면, 10이 할당됩니다.
}

fun main() {
  println("in main.....")
  println(data + 10)
  println(data + 10)
}

//실행 결과 값

// in main.....
// in lazy....
// 20
// 20

처음에는 in main 프린트가 실행이 되고,

두 번째 println함수가 실행되면서, (data 변수를 사용)

in lazy 프린트가 실행되고 반환 값인 10을 반환합니다. (data 변수에 10 할당됨)

 

이제 data변수에 10이 할당이 되었으니,

다음 프린트 함수에서 20이 찍힙니다.

 

lazy 함수는 var 키워드를 사용할 수 없고, val 키워드만 가능합니다.

 

고로, 한번 값이 할당이 되면 바꿀 수 없습니다.

 

반응형

5. 데이터 타입

 

보통 자바나 다트에서는 Int는 기초 데이터 타입(primitive type)이라고 합니다.

 

하지만 코틀린에서는 모든 변수는 객체라고 할 수 있습니다.

 

한마디로 코틀린에서 Int는 기초 데이터 타입이 아니라, 하나의 클래스입니다.

 

아래 코드를 보시면 이해하기 편하십니다.

 

fun someFun() {
  var data1: Int = 10
  var data2: Int? = null  // null 대입 가능
  
  data1 = data1 + 10
  data1 = data1.plus(10)  //  객체의 메서드 이용 가능
}

 

코틀린의 Int는 객체이기 때문에 null을 대입할 수 있습니다.

 

만약 기초 데이터 타입이었다면 null을 대입할 수 없고, 메서드를 호출할 수 없을 겁니다.

 

아래 data1.plus(10) 부분을 보시면 코틀린에서는 Int는 객체이기 때문에(하나의 클래스)

 

메서드를 호출할 수 있습니다.

 

 

6. 기초 타입 객체

 

기초 데이터를 객체로 표현하는 타입입니다.

 

정수는 Int, Short, Long

 

실수는 Double, Float

 

2진수를 표현하는 Byte

 

true와 false값을 표현하는 Boolean 

 

타입이 있습니다.

 

val a1: Byte = 0b00001011

val a2: Int = 123
val a3: Short = 123
val a4: Long = 10L
val a5: Double = 10.0
val a6: Float = 10.0f

val a7: Boolean = true

 

 

7.  문자와 문자열

7 - 1 Char

 

문자를 표현하는 Char 타입이 있습니다

 

Char 타입은 작은따옴표(')로 감싸고,

 

Number타입으로 표현할 수 없습니다.

 

 

val a: Char = 'a'

if(a == 1){
  //error
}

 

7 - 2 String

 

String은 문자열을 표현하는 타입입니다.

 

String은 큰 따옴표(")로 표현을 합니다.

 

혹은 삼중 따옴표(""")를 사용합니다.

 

 

큰 따옴표를 사용할 때 들여 쓰기나 줄 바꿈을 유지하려면

 

이스케이프 시퀀스를 사용해야 합니다.(escape sequence)

 

ex) val str1 = "Hello \n World"

 

삼중 따옴표를 사용할 때는 줄 바꿈이나 들여 쓰기가

 

코드에서 쓴 그대로 반영이 됩니다.

 

fun main() {

  val str2 = """
안녕
난 수열이야
"""

println(str2)

// 결과
//안녕
//난 수열이야

  val str3 = """
              안녕
              난 수열이야
"""

println(str3)

// 결과
//           안녕
//           난 수열이야

}

 

여기까지가 공부한 내용이고, 다음 공부 내용은 추후에 올리겠다

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading