본문 바로가기

Android Studio (Kotlin)

Kotlin 기본 문법

널 체크

 

코틀린의 변수 선언은 본래 null을 허용하지 않음. 기본적으로 NotNull이고 Nullable한 타입은 타입 뒤에 '?'가 사용된다.

 

Non-null : 변수 뒤에 !!으로 표시(Not null 단정기호)

  • property나 변수에 붙이면 강제로 null이 아니다 라고 선언한 것. 
  • null이 들어오면 npe 발생

safe-call : type 뒤에 ?를 붙임

  • null이 가능한 변수라는 뜻

엘비스 연산자

  • null인 경우 default를 주고싶을 때 ?:를 사용한다.
  • null인 경우 ?: 뒤쪽 수행

함수형 프로그래밍

람다의 규칙

  • 람다 함수는 항상 {}으로 감싸서 표현해야 한다.
  • {} 안에 -> 표시가 있으며 -> 왼쪽은 매개변수, 오른쪽은 함수 내용
  • 매개변수 타입을 선언해야 하며 추론할 수 있을 때는 생략 가능
  • 함수의 반환 값은 함수 내용의 마지막 표현식
  • 매개변수가 하나인 경우는 생략 가능
  • 코드 마지막 줄은 return type으로 추론됨
//생략되지 않은 전체 표현
val multi:(Int, Int) -> Int ={ x:Int, y:Int -> x*y}

//선언 자료형 생략
val multi = {x:Int, y:Int -> x*y}

//람다식 매개변수 자료형의 생략
val multi:(Int, Int) -> Int = {x, y->x*y}

//에러 발생! 추론이 가능하지 않기 때문
val multi={x,y -> x*y}

 

클래스와 객체

생성자

  • 클래스를 통해 객체가 만들어질 때 기본적으로 호출되는 함수
  • 객체 생성 시 필요한 값을 인자로 설정할 수 있게 한다.
  • 생성자를 위해 특별한 함수인 constructor() 정의
class 클래스명 constructor(필요한 매개변수들..){ //주 생성자 위치
...
constructor(필요한 매개변수들..){ //부 생성자의 위치
//프로퍼티 초기화
}
[constructor(필요한 매개변수들..){..}] //추가 부 생성자
...
}

주 생성자

  • 클래스명과 함께 기술되며 보통의 경우 constructor 키워드를 생략할 수 있다.

부 생성자

  • 클래스 본문에 기술되며 하나 이상의 부 생성자를 정의할 수 있다. 
  1. 프로퍼티들 : 선언만 함
  2. 부 생성자 : 매개변수를 통해 초기화 할 프로퍼티에 지정

클래스에 부 생성자를 하나 혹은 그 이상 포함할 수 있다.

매개변수는 서로 달라야 한다.

//주 생성자 선언
class Human constructor(_name: String, _age:Int){
//프로퍼티
	val name: String = _name
    var age: Int = _age
}

class Human1 constructor(var name: String, var age:Int){
//프로퍼티 : 위에 var 혹은 val로 선언함으로서 프로퍼티가 이미 포함 됨
}

다형성

다형성 : 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해줌

오버라이딩 : 상속받아서 선언부는 동일하나 완전히 다르게 바꾸어 재설계

오버로딩 : 함수 명은 동일하지만 인자를 다르게 하여 여러 경우를 처리한다.

 

코틀린에서 게터와 세터의 동작

val user = User(_id:1, _name:"당근걸", _age:25)

//게터에 의한 값 획득 val name = user.name
//세터에 의한 값 지정 user.age = 30

val name = user.name;
println("name: $name, ${user.age}")

불변형인 val은 게터만 설정 가능

//게터 세터 실습
class User(_id: Int, _name: String, _age: Int){
	val id: Int=_id
    get() = field
    val name: String =_name
    get() = field
    set(value){
    	field = value
    }
    val age: Int =_age
    get() = field
    set(value){
    	field = value
    }
 }

지연초기화

변수나 객체의 값은 생성시 초기화가 필요하다. 클래스에서 기본적으로 선언하는 프로퍼티 자료형들은 null을 가질 수 없지만 객체의 정보가 나중에 나타나는 경우 나중에 초기화 할 수 있는 방법이 필요하다. 지연 초기화를 위해 lateinit과 lazy 키워드를 사용한다.

 

lateinit을 사용한 지연초기화

  • 의존성이 있는 초기화나 unit 테스트를 위한 코드 작성시
  • 프로퍼티 지연 초기화
  • 클래스를 선언할 때 프로퍼티 선언은 null을 허용하지 않는다.
  • 하지만 지연초기화를 위한 lateinit 키워드를 사용하면 프로퍼티에 바로 값이 할당되지 않아도 된다.

lateinit의 제한

  • var로 선언된 프로퍼티에만 가능
  • 프로퍼티에 대한 게터와 세터를 사용할 수 없음

lazy를 통한 지연 초기화

  • 호출 시점에 by lazy {...} 정의에 의해 블록 부분의 초기화를 진행
  • val에만 사용 가능(읽기전용)
  • val이므로 값 변경 불가능