본문 바로가기

Language/Kotlin

01-2. Kotlin vs Java

 

 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)

코틀린-람다함수(apply, with..) 개념 팔가 자료

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.
  • 변수 값을 최초에만 설정하고 변경할 필요가 없는 경우 사용하면 유용하다.

 

 

728x90

'Language > Kotlin' 카테고리의 다른 글

01-1. Kotlin 문법 훑어보기  (0) 2022.01.23
[코틀린 시작하기] 01-1. 코틀린의 탄생배경  (0) 2022.01.23