본문 바로가기

Android

Kotlin 문법2 - Class

Data Class

- 데이터를 저장하기 위한 클래스

 

Java Code

public class JavaObject {
	private String s;
    JavaObject(String s) {
    	this.s = s;
    }
    
    public String getS(){
    	return s;
    }
    
    public void setS(String s){
    	this.s = s;
    }
}

Kotlin Code

data class JavaObject(val s: String)

위에 자바 코드가 아래 코틀린 코드 한 줄로 모두 설명이 가능합니다.

data class는 데이터와 관련된 내용을 정리하는 클래스이므로 get, set함수를 포함하고 있으며

model class에서 작업할 때 data class를 사용하게 됩니다.

Kotlin에서는 get, set 함수를 사용해서 접근하는 것이 아니라 property에 직접 접근해서 값을 변경하거나

반환하는 방식으로 진행하게 됩니다.

 

위에 JavaObject 클래스는 파리미터로 val 값을 받기 때문에 set함수가 따로 생성되지 않습니다. (변하지 않는 상수)

var로 파라미터 값을 주면 set 함수는 생성이 됩니다.

 


Lambda Expression

Java

button.setOnClickListener(new View.OnClickListener(){
	@Override
    public void onClick(View v){
    	// 
    }
})

Kotlin

button.setOnClickListener { v ->

}

Kotlin은 함수형 언어에 가까워서 lambda expression 형태로 코드가 진행됩니다.

함수에 함수를 전달하고 전달된 함수에서는 다른 함수를 실행시키는 역할을 합니다.

위 코틀린 코드는 View OnClickListener 인터페이스에서 Override 하는 메소드가 하나일 경우

즉, OnClick 함수가 하나일 경우 View 객체를 Arrow Function으로 바로 구현 부분을 진행할 수 있습니다.

 


LateInit & Lazy init

 

LateInit Lazy init(by lazy{...})
non-null type만 선언하고 local 변수로는 사용이 불가능
나중에 변수를 초기화 할 것이므로 타입만 정해서 선언
나중에 사용할 때 초기화하는 것으로 처음에 초기화를 하더라도 사용하지 않는다면 정의된 값이 활성화되지 않음
var로 선언한 프로퍼티에만 사용할 수 있습니다. val로 선언한 프로퍼티에서만 사용할 수 있습니다.
lateinit는 클래스 몸체, Top-Level, 함수 내부에 선언한 프로퍼티에 사용할 수 있다. 주 생성자에서는 사용할 수 없다. lateinit과는 다르게 선언과 초기화가 같이 이뤄집니다.
UI-Component 바인딩하는데 있어서 lazy init이 더 적절합니다.
lateinit는 사용자 정의 getter/setter를 사용하지 않은 프로퍼티에만 사용할 수 있다. getter, setter가 없는 프로퍼티에서만 사용 가능합니다.
lateinit은 사용자정의 getter, setter를 사용하지 않은 프로퍼티에서만 사용할 수 있다. 클래스 생성자에서 사용 불가능
로컬 변수에서 사용 가능
기초 타입 프로퍼티에는 사용할 수 없다. 람다를 파라미터로 받고 Lazy<T> 인스턴스를 반환하는 함수
   

lateinit 예제

var nullableNumber: String? = null
lateinit var variable1: String // 성공
lateinit var variable2: Int // 기초타입 int로 선언한 경우 사용 불가능
lateinit var variable3: String? // nullable 변수로 선언하는 것 불가능
lateinit val variable4: String // 변하지 않는 val로 변수 선언 불가능


// 클래스 내부, Top-level, 함수 내부에 선언한 프로퍼티에는 사용 가능, But 생성자에는 사용 불가능
class User(lateinit var username: String){

}

lazy init 예제

 val a: Int by lazy {
     1000
 }
    
 println("late init: $a")
 
 // var로 선언하면 안됨
 // 로컬 변수로 선언할 수 있음

 

 

반응형

'Android' 카테고리의 다른 글

카메라/갤러리 기능  (0) 2023.01.17
Firebase Messaging 관리  (2) 2023.01.17
Kotlin 문법1 - 변수/Scope  (0) 2023.01.17
액티비티(Activity)  (0) 2023.01.17
Service & Thread  (0) 2018.03.13