Android Studio (Kotlin)
Kotlin 기본 문법
애용쓰
2022. 4. 4. 03:07
널 체크
코틀린의 변수 선언은 본래 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 키워드를 생략할 수 있다.
부 생성자
- 클래스 본문에 기술되며 하나 이상의 부 생성자를 정의할 수 있다.
- 프로퍼티들 : 선언만 함
- 부 생성자 : 매개변수를 통해 초기화 할 프로퍼티에 지정
클래스에 부 생성자를 하나 혹은 그 이상 포함할 수 있다.
매개변수는 서로 달라야 한다.
//주 생성자 선언
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이므로 값 변경 불가능