해당 책은 리액트뿐만 아니라 리액트를 제대로 이해하기 위한 자바스크립트와 관련있는 전반적인 내용을

시작으로하여 리액트, 리덕스, 테스팅등 실제 업무에서 사용할수 있는 기본적인 내용들을 담고 있습니다. 

따라서, 리엑트를 실무에 적용하거나 다시한번 제대로 내용을 보고 싶은 개발자들에게 추천을 드립니다.


* 장점

- 리엑트 뿐만 아니라 자바스크립트 ES6 문법에 대한 소개, 함수형 프로그래밍 소개등 전반적인 지식을 포함하고 있습니다.

- 책의 구성이 쉽게 되어 있습니다 순수리엑트에서 부터  프로퍼티, 데이터 흐름, 리덕스 등 리엑트를 가장 쉽게 익힐 수 있도록 단원구성이 되어 있습니다. 

- 번역서지만 이해하기 쉽게 잘 번역이 되어 있습니다. 


* 단점

- 전부 다는 아니지만 중간중간에 있는 샘플 소스 코드 중에 다소 복잡해 보이는 코드들이 있었고, 예제 코드에 대한 설명이 개인적으로는 부족하다고 생각이 들었습니다.


* 총평

서버개발과 약간의 Front-End로 업무를 진행하다가 최근에 리액트를 사용하게 되었는데, 

해당 책을 통해서 원리에 대해서 잘 알지 못하고 기계적으로 사용하던 부분들에 대해서 다시 한번 알게 되어 많은 도움이 되었습니다.






이번 포스팅에서는 Kotlin 에서 언어 자체로서의 장점으로 이야기 하는 Null-Safe에 대해서 알아보도록 하겠다.


Kotlin에서 Safe 하다고 이야기 하는 부분은 크게 두가지로 나누어진다.


첫째, Nullable Type 명시를 통한 NullPointerException을 컴파일 타임에서 방지하는 점


둘째, 컴파일러에 의한 AutoCast를 통해서 MissCasting  Error 를 줄일 수 있는 점




이중에 Nullable 에 대해서 알아보도록 하자




Nullable Type & Non-Null Type

fun test(){

var a : Int = 3
a = null // Compile Error

var b : Int? = 4
b = null // Compile Success

}

Kotlin에서는 기본적으로 "?" 는 null을 의미한다.  Default 로는 Null을 허용하지 않고 Nullable 한 경우에는 "?"를 붙여서 Null 이 가능함을 나타내야 한다.

위 문장에서 a라는 변수는 default로 Null을 할당할경우 컴파일 타임에서 에러가 발생하지만, b같은 경우에는 ? 로 Null 이 가능하다고 표현하였기 때문에 에러가 발생하지 않고 Null 할당이 가능하다.



Safe Calls


Nullable Type 응 그래 이제 뭔지 알겠다. 그래서 ?? 개발자가 코드를 작성할때 뭐가 좋아지지?  라고 묻는다면 하나의 예제를 보여주겠다.

Nullable type을 그대로 참조할 경우에 컴파일 타임에서 에러가 발생하므로 개발자로 인해 발생하는 NPE에 대해서 막을 수 있다.  물론 100% 막을 수 있는건 아니지만, 개발을 하면서 NPE 발생에 대해서 생각할 수 밖에 없는 구조로 만들어져 있다. 

fun test(){
val name: String? = null // Nullable type
println(name.length()) // Compilation error
}


아래와 같은 인스턴스에 값을 할당한다고 생각 해보자.  NPE를 발생 시키지 않기 위해서는 어떻게 해야 할까.

fun test(){
var headLength = bob.department.head.length
}


일반적인 코딩을 생각하면 아래와 같이 모든 인스턴스에 대해서 Null 체크를 해줘야 한다.

if(bob != null && department != null & haed != null){
bob.department.head.length = 3
}


하지만 Kotlin 에서는 Nullable을 직접 명시하기 때문에 아래와 같이 표현이 가능하다.


fun test(){

var size = bob?.department?.size
print(size)

}

bob, Department 가 Nullable 이기 때문에 Null을 참조하더라도 바로 NPE가 발생하지 않고 , bob 이나 deprtment가  null 이라면 size 는 null 로 셋팅이 될 것이다.

위와 같은 경우에 default 값을 선언하기 위해서 Kotlin에서는 Elvis Operator 라는 것을 재공한다.





Elvis Operator


만약에 어떤 값이 Null 일경우 특정 값을 할당하는 경우 어떻게 표현해야 할까 ? If-else 구문을 활용하면 다음과 같이 표현 할 수 있다.

fun test(){

var size = if(bob.department != null) bob.department.length else -1

}


이런 표현식의 경우에 Elvis Operator ?: 을 활용하면 훨씬 쉽게 표현이 가능하다. ?: 의 다음에 오는 값이 앞에 오는 인스턴스가 NULL 일때 Default 값이라고 보면 될거 같다.

fun test(){

var size = bob?.department?.length ?: -1

}


Elvis Operator 를 응용하면 아래와 같이 Null 값에 대한 유효값 처리를 할 수 있다.

fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
}



!! Operator

non-null 을 나타내는 !! Operator가 있지만 NullPointer를 발생 시킬 가능성이 있기 때문에 최대한 해당 Operator의 사용은 피하는게 좋다.

굳이 Null Safe 한게 싫은 경우 사용하기를 바란다.(아무 생각 없이 코딩을 하다 보면 안드로이드 스튜디오 에러를 막기 위해서 !! 로 도배가 된다는 슬픈 전설이)




Collections of Nullable Type


Collection 타입에서 Null과 Non-Null Object를 필터할 수 있는 메소드가 제공된다. 사용법은 아래와 같다.

fun test(){
val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull()
}




'Programming' 카테고리의 다른 글

Kotlin Syntax (2) - Control Flow  (0) 2017.07.05
Kotlin Syntax (1) - Basic Type  (1) 2017.07.03
Java8 Lambda 최대값 갯수 표현식  (0) 2017.06.04
[JavaScript] Switch - Fall Through  (0) 2017.05.28
RecyclerView, Cardview Example  (0) 2017.05.28

Kotlin Control Flow




If Expression


Kotlin에서는 if 문이 값을 리턴하기 때문에 삼항연산자(condition? A:B) 를 사용할 필요가 없다. 


기존에는 아래와 같이 값을 직접 리턴할 수 없기 때문에 할당을 하는 블락이 필요했다.

val a =3 
val b =4
var max =0
if( a < b ){
max = b
}else{
max = a
}


 Kotlin 에서는 다음과 같이 if 문을 사용 할 수 있다. 생각보다 많은 양의 코드를 줄여 줄 수 있는 부분이다.

val a =3
val b =4
val max = if (a<b) b else a




When Expression


When 문은 자바나 C에 있는 Switch 문을 대체하는 용도로 사용되며, 실제로 코딩을 하다보면 단순히 switch 문의 대체문이 아니라 if else 의 늪을 어느 정도 커버 할 수 있는 제어문이라고 할 수 있다. 

기본적인 사용법은 아래와 같다. (Switch 문과는 다르게 별도의 break 는 필요 없다)


fun test(){
val x = 2
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> {
print("x is neither 1 nor 2")
}
}// Result : print 'x==2'
}


여러개의 값을 같이 매칭 시키기 위해서는 콤마(',') 또는 범위표현(..)을 사용할 수 있다. (범위 표현식에서는 앞에 "in"을 붙여야 한다)

fun test(){
val x = 2
when (x) {
0,1 -> print("zero and one") // , 를 사용하여 다중값 셋팅
in 2 .. 10 -> print("1 over Under 10") // 범위연산자를 활용하여 범위 표현
else -> {
print("else")
}
}
}



또한, 특정 값이 아니라 statement가 TRUE  냐  FALSE 냐에 따라서 처리도 가능하며, 이를 활용할 경우에 IF-ELSE 문을 대체 할 수 있다. 

fun hasPrefix(x:Any) = when(x){
is String -> x.startsWith("prefix")
else -> false
}
val x = 2
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}





For Loops


For 문은 기본 반복문과 같은 기능을 제공한다고 생각하면 되지만 기본적으로 foreach 문을 기본으로 활용한다고 생각하면 되고 기존의 인덱스 기반으로 인덱싱해서 반복 하는 기능은 다른 형태로 제공한다.


fun test(){

var collection = ArrayList<Int>()
var array = collection.toArray()

for (item in collection) print(item) // 일반적인 foreach 형태

for( i in array.indices){ // Array 순회
print(array[i])
}

for((index,value) in array.withIndex()){ // 인덱스를 가지고 Array 순회
println("the element at $index is $value")
}

}



위와 같이 for statement 를 사용할수도있지만 아래와 같이 foreach 문을 사용해서 표현도 가능합니다.

fun test(){
(1..10).forEach { i -> print(i) }
}




While Loops


while문과 do-while문은 기존의 언어에서 사용하던 문법과 달라진 점이 없습니다. (설명 생략)


fun test(){
while (x > 0) {
x--
}

do {
val y = retrieveData()
} while (y != null) // y is visible here!
}



'Programming' 카테고리의 다른 글

Kotlin Syntax (3) - Null Safe  (0) 2017.07.07
Kotlin Syntax (1) - Basic Type  (1) 2017.07.03
Java8 Lambda 최대값 갯수 표현식  (0) 2017.06.04
[JavaScript] Switch - Fall Through  (0) 2017.05.28
RecyclerView, Cardview Example  (0) 2017.05.28

+ Recent posts