컬렉션과 배열

코틀린의 컬렉션과 자바의 컬렉션 간의 관계에 대해 정리한다.

널 가능성과 컬렉션

타입 인자로 쓰인 타입에 ? 표시를 붙이면 널을 저장할 수 있다.
아래 예제에서는, List<Int?> 는 Int 나 null 을 저장할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fun readNumbers(reader: BufferedReader): List<Int?> {

val result = ArrayList<Int?>()

for (line in reader.lineSequence()) {
try {
val number = line.toInt()
result.add(number)
} catch (e: NumberFormatException) {
result.add(null)
}
}

return result
}

“어떤 변수 타입의 널 가능성” 과 “타입 파라미터로 쓰인 타입의 널 가능성” 은 차이가 있다.
예를 들어,

  1. List<Int?> : 리스트 안의 각 값이 널이 될 수 잇다.
  2. List? : 전체 리스트가 널이 될 수 있다.

읽기 전용과 변경 가능한 컬렉션

코틀린 컬렉션과 자바 컬렉션의 중요한 차이 중 하나는,
코틀린에서는 컬렉션 안의 데이터에 접근하는 인터페이스와 변경하는 인터페이스가 분리되었다는 점이다.

  1. kotlin.collections.Collection : 컬렉션 안의 데이터에 접근
  2. kotlin.collections.MutableCollection : 데이터 변경 (kotlin.collections.Collection 를 확장)

아래 코드에서, target 에 해당하는 인자로 읽기 전용 컬랙션을 넘길 수 없다.

Read more

Primitive Type

코틀린의 원시 타입을 정리한다.

원시 타입 : Int, Boolean …

자바에서는 원시 타입과 참조 타입을 구분한다.
원시 타입의 변수에는 그 값이 들어가고, 참조 타입의 변수에는 메모리상의 객체 위치가 들어간다.

코틀린에서는 원시 타입과 참조 타입을 구분하지 않는다.
아래 코드에서는, 정수를 표현하기 위해 Int 를 사용한다.

1
2
val i: Int = 1
val list: List<Int> = listOf(1, 2, 3)

그리고, 코틀린에서는 아래처럼 원시 타입의 값에 대해 메서드 호출이 가능하다.

1
2
3
4
fun showProgress(progress: Int){
val percent = progress.coerceIn(0, 100)
println("progress : $percent")
}

그런데, 원시 타입과 참조 타입 같으면 항상 객체로 표현되는 걸까? 아니다.
실행 시점에 가장 효츌적인 방식으로 표현된다.
예를 들어, 대부분의 경우 코틀린의 Int 타입은 자바 int 타입으로 컴파일 된다.

널이 될 수 있는 원시 타입 : Int?, Boolean? …

자바에서는, null 참조를 참조 타입의 변수에만 대입할 수 있다.
그래서, 코틀린에서 널이 될 수 있는 원시 타입을 사용하면 자바의 래퍼타입으로 컴파일 된다.
아레 예제에서, age 프로퍼티의 값은 java.lang.Integer 로 저장된다.

Read more

GraphQL Query

GraphQL Query 를 어떻게 작성하는지 정리한다.

Query

Query 로 API 에 데이터를 요청할 수 있다.
Query 안에는 서버로부터 받고 싶은 데이터를 필드로 넣는다.

https://snowtooth.moonhighway.com 에 접속해서, 아래 Query 를 실행해보자.

1
2
3
4
5
6
query {
allLifts{
name
status
}
}

응답되는 JSON 에는 아래와 같이,
allLifts 배열과 각 Lift 에 대한 name 과 status 가 있다.

query root type

query 는 GraphQL 의 타입 중 루트 타입이다.
타입 하나는 하나의 작업을 수행하는데, query 는 쿼리 문서의 루트를 의미하기 때문이다.
query 에 사용할 수 있는 필드는 API 스키마에 정의한다.
사용할 수 있는 필드는 아래와 같이 liftCount, allLifts, allTrains 등이 있다.

Read more

Null

코틀린에서 null 을 어떻게 처리하는지 정리한다.

nullability

nullability (널 가능성) 은, NPE 를 피할 수 있도록 돕기 위한 코틀린 타입 시스템의 특성이다.
널이 될 수 있는지의 여부를 타입 시스템에 추가해서,
컴파일러가 오류를 미리 감지해 실행 시점에 발생할 수 있는 가능성을 줄인다.

널이 될 수 있는 타입

다음 자바 함수를 보자.

1
2
3
int stringLength(String s) {
return s.length();
}

이 함수의 파라미터로 null 을 전달하면, NPE 가 발생한다.
이 함수를 코틀린으로 작성하면,

1
fun stringLength(s: String) = s.length

이 함수의 파라미터로 null 을 전달하면, 컴파일 시 오류가 발생한다.
그래서, 실행 시점에 NPE 가 발생하지 않는다고 확신할 수 있다.

만약 위 함수가 널과 문자열을 받을 수 있게 하려면, ? 를 명시해야한다.

Read more

GraphQL 소개

GraphQL 이 무엇이고, REST 와의 차이는 무엇인지 정리한다.

GraphQL 이란

GraphQL 은,

  1. API 를 만들 때 사용할 수 있는 쿼리 언어이자,
  2. 쿼리에 대한 데이터를 받을 수 있는 server-side 런타임이다.

GraphQL 은 선언형 데이터 패칭 언어라고 불린다.
무엇이 필요한지에 대한 요구사항만 작성하면 되고, 어떻게 가져올지는 신경쓰지 않아도 된다.

이에 대한 이해를 하기 위해, GraphQL 쿼리문과 응답 테스트를 여기서 해보자.
쿼리문을 보내고 데이터를 받을 수 있다.
https://graphql.github.io/swapi-graphql/

다음과 같이 입력하고 실행해보자.

1
2
3
4
5
6
7
query{
person(personID: 5){
name
birthYear
created
}
}

아래에서,
왼쪽이 쿼리문이고 오른쪽이 쿼리문에 대한 응답 데이터이다.

Read more