본문 바로가기

ANDROID

00 - kotlin 문법

 

Kotlin

 

-장점 : 표현력과 간결함, 널 안정성(safe code), 상호 운용성(자바와의 100%호환), 구조화 동시성(coroutines)

 

 

변수

변경 가능성에 따라 val, var 키워드를 사용한다.
val 변수명:타입 = 값 
var 변수명: 타입 = 값

val 키워드로 선언한 변수는 도중에 값을 바꿀 수 없지만, var 키워드로 선언한 변수는 값을 바꿀 수 있다.

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

단, lateinit를 사용하면 var 변수의 초깃값 선언을 미룰 수 있다.

lateinit var data1: String

 

초기화를 미루는 또다른 방법에는 lazy 키워드가 있다. 

val data2: Int by lazy {
//마지막 줄의 실행 결과가 변수의 초깃값이 된다.
}

 

코틀린의 모든 변수는 객체이다.
기초 타입 객체
- 정수 : Int, Short, Long
- 실수 : Double, Float
- 2진수 : Byte
- Boolean 타입 : true, false

문자와 문자열
- Char // 작은따옴표' ' 로 감싸 표현한다. 
- String // 문자열은 큰따옴표(")나 삼중 따옴표(""")로 감싸 표현한다. 줄바꿈 이스케이프 시퀀스는 \n이며, 삼중따옴표 사용 시 줄바꿈이나 들여쓰기 등이 데이터에 그대로 반영된다.

문자열 템플릿 (String 데이터에 연산식의 결괏값을 포함할 경우) 
- $를 사용한다. 
ex)
var age:Int = 10
println("age: $age")

결과 : age: 10

모든 타입 
- Any // 코틀린의 최상위 클래스. Any타입으로 선언한 변수에는 모든 타입의 데이터를 할당할 수 있다.

 

코틀린은 변수를 선언할 때 null이 가능한 변수인지, 그렇지 않은지를 반드시 명확하게 구분해서 선언해야 한다. 따라서 타입 뒤에 물음표(?)를 붙이는데, 물음표가 붙으면 널 허용으로 선언된 변수이며, 그렇지 않을 경우는 널값이 불가능한 변수로 선언된 것이다.

 

var nonull: Int //널 불가능
var yesnull: Int? //널 가능

 

컬렉션 타입

컬렉션 : 여러개의 데이터를 표현하는 방법. Array, List, Set, Map이 있다.

 

배열
- Array<배열 타입> = Array(배열의 크기, {초깃값})
- [ ] 로 접근하거나, set(), get()을 이용할 수도 있다. 
- arrayOf<타입>(값1,값2,값3) 과 같은 arrayOf 함수를 이용해 선언할 때 값을 할당할 수도 있다.

컬렉션 타입 클래스
- List: 순서가 있는 데이터 집합. 중복을 허용한다.
- Set: 순서가 없으며, 중복을 허용하지 않는다.
- Map: 키와 값으로 이루어진 데이터 집합. 순서가 없으며, 키의 중복은 허용하지 않는다.
- 셋 모두 앞에 Mutable을 붙여 가변 타입으로 선언할 수 있다. add(), set() 함수의 이용이 가능해진다. 

 

함수 선언

fun 함수명(매개변수명:타입 = 기본값): 반환 타입 {  
              함수1....
              return 반환값
}

함수의 매개변수에는 val이 자동 적용되며, 매개변수에 var val 키워드를 사용할 수 없다. 또한 매개변수에 가본값을 선언하여 인자를 전달하지 않을 경우 기본값이 적용되게 할 수 있다. 

 

조건문 if~else, when, 반복문 for과 while은 java와 거의 차이가 없으므로 넘어간다.

 

 

 

클래스

 

선언
class 클래스이름(매개변수이름: 매개변수타입) {

}

 

상속 : 클래스를 선언할 때 다른 클래스를 참조해서 선언한다.
open class One(name: String) {
//다른 클래스에서 상속받을 수 있도록 open 키워드를 사용한다.
}

class Sub: One(name) {
//콜론(:) 상속받을 클래스 이름 을 입력하면 기존 클래스를 재사용할 수 있다.
//상속받을 클래스의 매개변수도 제대로 입력해준다
//상위 클래스에서 open으로 선언된 변수나 함수의 경우
// 하위 클래스에서 override 키워드를 통해 오버라이딩(함수 재정의)을 할 수 있다.
}

 

접근 제한자
접근 제한자 최상위에서 선언할 경우 클래스 멤버
public 모든 파일 모든 클래스
internal 같은 모듈 내 같은 모듈 내
protected 사용 불가 상속 관계의 하위 클래스
private 파일 내부 클래스 내부

*모듈 : 그래들(Gradle)이나 메이븐(Maven)같은 빌드 도구에서 프로젝트의 단위 또는 같은 세트 단위

 

데이터 클래스

자주 사용하는 데이터를 객체로 묶어준다. VO(Value-Object)클래스를 편리하게 이용할 수 있게 해준다.

data calss DataClass (
val name:String
val age: Int
)

 

오브젝트 클래스

익명 클래스를 만들 목적으로 사용하는 클래스이다. 클래스를 선언하면서 동시에 객체를 생성해야 한다. (그렇지 않을 경우, 이후 객체 생성 불가능)

val obj = ojbect: 타입 {

}

 

컴패니언 클래스

멤버 변수나 함수를 클래스 이름으로 접근할 때 사용한다. 객체를 생성하지 않고도 클래스 이름으로 특정 멤버를 사용할 수 있다. 

class 클래스이름 {
companion object {
}
}

 

 

 

람다 함수(람다식)

 

 

- 람다 함수는 { } 로 표현한다.

- { } 안에 -> 가 있으며, 화살표 왼쪽은 매개변수, 오른쪽은 함수 본문이다. 매개변수가 없을 경우 ->를 생략할 수 있다.

- 함수의 반환값은 함수 본문의 마지막 표현식이다.

fun sum(number1: Int, number2: Int) : Int {
return no1 + no2
}

val sum = { number1: Int, number2: Int -> numeber1 + numeber2 }
sum(1,2)
// val sum = { number1: Int, number2: Int -> numeber1 + numeber2 } (1, 2) 을 사용하여 선언하자마자 호출할 수 있다. 

val print1 = (Int) -> Unit = {println(it)} // 매개변수가 1개일 경우 람다식에 it 키워드를 사용할 수 있다.
// 단, 이 경우 해당 매개 변수의 타입을 식별할 수 있을 때만 가능하다. 

 

함수 타입 선언

fun sum(no1: Int, no2: Int) : Int {  
return no1 + no2 
}

val sum : (Int, Int) -> Int = {no1: Int, no2: Int -> no1+no2 }
//함수 타입을 이용해 함수를 변수에 대입 할 수 있다.

 

타입 별칭

- typealias : 타입의 별칭을 선언하는 키워드. 주로 함수 타입을 선언하는 데 사용한다.

typealias MyFunType = (Int, Int) -> Boolean

 

고차 함수

함수를 매개변수로 전달받거나 반환하는 함수

 


 

널 안정성

 

널(NULL) : 객체가 선언되었으나 초기화되지 않은 상태. 즉, 객체가 주소를 가지지 못한 상태. 

- 널인 상태의 객체를 이용하면 '널 포인트 예외'가 발생한다. 

- 널 안정성 : 널 포인트 예외가 발생하지 않도록 코드를 작성하는 것

 

널 안전성 호출 연산자 - ?. 연산자
var data: String? = "tistory"
var length = data?.length
// ?. 연산자는 변수가 null이 아닐 때만 멤버에 접근하며, null이면 접근하지 않고 null을 반환한다.

 

엘비스 연산자 - ?: 연산자

변수가 널이면 널을 반환하거나, 널일 때 대입해야하는 값 또는 실행해야 하는 구문을 실행한다.

fun main( ) {
var data: String = "tistory"
data = null
println("data = $data : ${data?.length ?: -1}")

결과 
data = null : -1

 

예외발생 - !! 연산자

객체가 널일 때 예외를 일으키는 연산자

fun namefun(name: String?): Int {
return name!!.length
}

fun main( ) {
println(namefun(null))
}

결과 : Exception in thread "main" java.lang.NullPointerException 

 

'ANDROID' 카테고리의 다른 글

Android - 로컬DB편 : SharedPreferences  (0) 2022.01.13
Android - 로컬DB편 : Room  (0) 2022.01.13