1. ? :Null Safe
Integer a = 100; //[자바]
val b: Int? = 100 //[코틀린_1]
val c: Int = 100 //[코틀린_2]
a = null;
/// 중략 ///
a.sum(); // NullPointException이 날 수도 있음.
//null safe 한 코드를 구성해야 함
if (a!=null) {
a.sum();
}
b?.sum() //null일 경우 실행하지 않음.
c.sum() //애초에 nullsafe함.
- Java의 경우, NPE가 날 수 있기에 별도로 널값에 대해 예외 처리를 해주어야 한다. → 비효율적!
- Kotlin의 경우, Null type처리를 통해 사전에 NPE를 차단한다. → 오류가 발생하더라도 찾기 편함!
2. Scope Function(apply, with, let, also, run)

1. apply 함수
: block함수를 literal function receiver로 받는 객체의 확장 함수이다.
: 내부에서 this로 접근이 가능하고 또 this는 생략이 가능하다.
- return 값 : 코드블록에 전달된 수신 객체 자체를 그대로 다시 반환
- 사용 방식 : apply 함수의 경우, 객체의 내부에서 프로퍼티(property)에 접근이 가능하며 반환 값이 객체 자신이 되기에 이는 주로 객체 초기화의 목적으로 사용이 된다.
※ [참고] literal function receiver
2. also 함수
// [코틀린] Also 함수
Random.nextInt(100).also{
print("getRandomInt() generated value $it")
}
Random.nextInt(100).also{value ->
print("getRandomInt() generated value $value")
}
// [자바] Also 기능 대체 구현
int value = Random().nextInt(100);
System.out.print(value);
: 코드블록에 전달된 수신 객체 자체를 그대로 다시 반환하는 함수.
: (apply와 달리) 코드블록에 파라미터로 수신 객체를 전달. 따라서 변수 name으로 접근 가능.
이때 변수의 네이밍의 경우 default는 'it'이나 이는 사용자가 변경 가능하다.
- return 값 : 코드블록에 전달된 수신 객체 자체를 그대로 다시 반환
- 사용 방식 : also 함수의 경우, 람다 입력값으로 받고 그 객체를 다시 반환하기 때문에 객체의 유효성을 확인하거나 print 함수를 통해 디버깅하는 용도로 주로 사용된다.
3. let 함수
//[코틀린]Let 함수
val number: Int?
val sumNumberStr = number?.let {
"${sum(10,it)}"
}
//[자바]Let 기능 대체 구현
Integer number = null;
String sumNumberStr = null;
if (nuber != null) {
sumNumberStr = "" + sum(10, number);
}
: 코드블록에 전달된 수신 객체 자체를 그대로 다시 반환하는 함수.
: (apply, also와 달리) 코드블록의 수행결과가 리턴됨. 즉, 람다 내부의 코드를 실행하기 위한 용도가 큼.
→ 실행 결과, 즉 리턴이 존재한다면 이는 파라미터가 null이 아닐 때 일 것임.
→ 이러한 특징을 활용하여 아래와 같이 활용하기도 함.
→ 즉, 'Nullsafe'한 코드를 작성하기 위해 자주 사용함.
- return 값 : 코드블록에 전달된 수신 객체 자체를 그대로 다시 반환
- 사용 방식 : also 함수의 경우, 람다 입력값으로 받고 그 객체를 다시 반환하기 때문에 객체의 유효성을 확인하거나 print 함수를 통해 디버깅하는 용도로 주로 사용된다.
//[코틀린]Let 함수
val number: Int?
val sumNumberStr = number?.let{
"${sum(10, it)}"
}.orEmpty()
//[자바]Let 기능 대체 구현
Integer number = null;
String sumNumberStr = null;
if (number !=null) {
sumNumberStr = "" + sum(10, number);
} else {
sumNumberStr = "";
}
→ 위 코드와 같이 .orEmpty()를 추가하여 사용해 let함수가 실행되지 않고 null값이 넘어갔을 때 빈값으로 처리 가능.
→ 즉, Nullsafe한 코드 작성 + Null값 대체.
4. With 함수
//[코틀린]With 함수
val person = Person()
with(person) {
work()
sleep()
println(age)
} //'with'를 통해서 person의 work, sleep, print-age를 한번에 실행.
//[자바]With 기능 대체 구현
Person person = new Person();
person.work();
person.sleep();
System.out.println(person.age);
- 함수의 반환 == 람다를 실행한 결과! (특정 값 X)
- 수신 객체가 매개변수로 제공됨. (by 명시적) -> 따라서 this를 통해서 해당 객체의 변수 혹은 함수 사용 가능.
5. Run 함수
val result = service.run {
port = 8080
query()
}
service.port = 8080
Result result = service.query()
- 함수의 반환 == 람다를 실행한 결과! (특정 값 X)
- with와 유사하나 with는 확장함수 X. run은 확장함수 O.
- 수신 객체의 함수를 활용해 어떤 값을 계산시 사용. 즉, 어떤 값을 계산할 필요가 있을때.
- 객체 구성과 결과 계산이 한번에 있을 때 사용. 즉, 초기화와 동시에 실행할 필요가 있을 때 사용.
- 여러 지역 변수의 범위 제한시에도 사용
3. Data Class

- Java의 경우, 'get, set, 생성자, copy, toString, hashCode'등을 구현해 주어야 함.
- Kotlin의 경우, 'Data Class'라는 데이터 저장 용도의 클래스를 제공해주어서 위의 과정이 별도로 필요 X.
→ Data Class의 경우 주로 모델의 class를 작성할 때 사용함. 이는 굉장히 축약적이며 유용하다. :)
※ 코틀린은 객체의 프로퍼티에 직접 접근하는 방식을 취함에도 Data Class 생성시 get, set 기능을 자동 구현해줌.
→ 자바코드와 코틀린 코드 혼용시, 자바코드에서 코틀린 코드에 접근 할 수도 있기 때문.
(자바의 경우 getter와 setter로 객체의 프로퍼티에 접근하기 때문)
→ 단 코틀린의 Data Class에서 val로 선언시 setter는 자동 생성 X. var은 모두 자동 생성 O.
4. 람다 표현식(Lambda expression)

Kotlin의 경우 함수형 언어적 특징을 많이 지님. 람다식을 쉽게 이용할 수 있도록 제공하고 있음.
→ 람다식 : 함수에 함수를 전달하고 함수에서 함수를 실행시키는 역할을 함.
※ [참고 예시] setOnClickListener
✔ setOnClickListener
- 자바
: View의 OnClickListener라는 인터페이스를 구현. OnClickListener의 인터페이스 안의 onClick 메소드를 구현체를 통해 구현. 해당 구현체를 button에 넘김. 따라서 button이 실제로 클릭이 되면 구현체의 onClick이 실행되게 동작. - 코틀린
: 인터페이스에 메소드가 하나 뿐(onClick)일 경우, 위와 같은 과정없이 람다식으로 간단히 동작 구현 가능.
→ 자바, 코틀린 둘 다 setOnClickListener에서 View를 파라미터로 넘겨줌. 허나 구현이 훨씬 코틀린이 간단함 :)
.
5. 코틀린 지연 초기화 (lazy initialization)
NullSafe한 코드를 사용하기 위해서 non-null Type으로 변수를 선언한다.
이때 초기화를 필수로 요구한다. 그렇다면 초기값이 없는 변수는 어떻게 초기화를 해야할까?
초기값이 없으면 변수 선언 자체가 안되는데..

1. lateinit
var nullableNumber: Int? = null
lateinit var lateinitNumber : Int
//추후 초기화하는 코드
lateinitNumber = 10
//사용할 때
nullableNumber?.add()
lateinitNumber.add()
변수의 값을 지정하는 작업을 뒤로 미루는 기능의 메소드.
- Non-Nullable한 변수 선언시 사용.
- local 변수로 사용 X. 전역 변수로 사용 O.
- mutable 변수만 가능하기 때문에 var 키워드 변수에서만 사용 가능 O.
- 초기화 해주지 않을 경우 NPE(NullPointerException) 에러 발생의 위험 有.
2. by lazy
val lazyNumber : Int by lazy {
100
} //사용하기 전까지는 lazyNumber라는 변수에 100이 할당되지 않음.
lazyNumber.add() //사용할 때 100이 할당됨.
lateinit과 유사한 값을 지정하는 작업을 미루는 메소드. → 변수를 호출시, 즉 사용시 할당됨!!
- local 변수로 사용 X. 전역 변수로 사용 O.
- immutable 변수에서만 적용 가능하기 때문에 val 키워드 변수에서만 사용 가능 O.
- 변수 값을 최초에만 설정하고 변경할 필요가 없는 경우 사용하면 유용하다.
'Language > Kotlin' 카테고리의 다른 글
| 01-1. Kotlin 문법 훑어보기 (0) | 2022.01.23 |
|---|---|
| [코틀린 시작하기] 01-1. 코틀린의 탄생배경 (0) | 2022.01.23 |