최근 Mash-Up 동아리 Spring 파트에 합류했습니다.
한 달 후 진행될 프로젝트에 투입이 되는데, 현업자 분들께서 대부분 Kotlin과 Spring을 조합하여 일명 Kopring으로 프로젝트를 진행한다고 하셔서, 미리 Kotlin을 학습 중입니다.
인프런의 Java 개발자를 위한 Kotlin 입문 강의를 보며 정리했습니다.
아직 Kotlin이 익숙치 않아 틀린 부분이 있을 가능성이 매우 높습니다.
만약 틀린 점을 발견해주신다면 소중한 댓글 부탁드립니다!
1강. 코틀린에서 변수를 다루는 방법
바꿀 수 있는 변수: var
바꿀 수 없는 변수: val
- 단 최초 한 번은 값을 바인딩 할 수 있음
Kotlin이 연산을 할 때는 내부적으로 primitive type으로 바꾸고, 그 외에는 Reference Type을 사용
var number5 = 10L
var number6 = 1_000L
Kotlin에서는 기본적으로 null이 들어갈 수 없고
Kotlin에서 null이 변수에 들어갈 수 있다면 타입?
를 사용
var number7: Long? = 1_000L
number7 = null
Kotlin에서는 객체를 인스턴스화 할 때 new 키워드를 사용하지 않는다.
var person = Person("임준형")
타입을 명시적
으로 지정하지 않아도 타입이 추론
된다!
2강 코틀린에서 null을 다루는 방법
Kotlin에서는 null이 가능한 타입을 완전히 다르게 취급한다
null이 가능한 타입만을 위한 기능
Safe Call
null이 아니면 실행하고, null이 아니면 실행하고, null이면 실행안함(그대로 null)
val str: String? = "ABC"
// str.length // 불가능
str?.length // 가능
Elvis 연산자
앞의 연산결과가 null이면 뒤의 값을 사용
val str: String? = "ABC"
str?.length ?: 0
str이 null이면 0, 위 상황에선 3 출력
Nullable 타입이 들어오지만 어떤 경우에도 Null이 아닐 경우
!!
fun startsWith(str: String?): Boolean {
return str!!.startsWith("A")
}
하지만 만약 null이 들어오면? NPE가 발생함. 정말 아닐때만 사용해야함
플랫폼 타입
Java나 Android등 외부 플랫폼에서 데이터를 끌어다 쓸 때 @Nullable
가 없거나 @NotNull
이 없다면 Kotlin은 알 방법이 없음
그러다 실제로 null이 나오면 런타임시 NPE 발생
3강 코틀린에서 Type을 다루는 방법
Java: 기본 타입간 변환은 암시적으로 이루어짐
Kotlin: 기본 타입간 변환은 명시적으로 이루어져야만 함
타입캐스팅 차이
Java의 instanceof
는 Kotlin의 is
, 부정할 때는 !is
로 표현
Java의 (Type)과 같은 다운캐스팅
은 Kotlin의 as
, as
는 생략가능하며 스마트캐스트
라고 부름
as
사용시 Null일 수 있는 타입인 ?
를 붙여서 사용하고, NPE가 발생하지 않게하도록 유도, 안전한 타입형변환
fun printAgeIfPerson2(obj: Any?) { // Null이 들어오면 NPE 발생, as에 ? 사용
val person = obj as? Person
println(person?.age) // ? 사용
}
Any
Java의 Object 역할
모든 Primitive Type의 최상의 타입은 Any
Any
는 null을 포함하지 않으므로
표현하려면 Any?
사용
Any에 equals
, hashCode
toString
존재
Unit
Java의 void와 동일한 역할
void와 다르게 Unit은 그 자체로 타입 인자로 사용 가능
Nothing
실제로 잘 사용 x
함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할
무조건 예외를 반환하는 함수, 무한 루프 등
String interpolation / String indexing
Java에서는 StringBuilder를 사용
Kotlin에서는 ${변수}
를 사용하면 값이 들어감
System.out.println(String.format("이름 : %s", person.name))
println("이름 : ${person.name}")
val person = Person("임준형", 25)
val log = "사람 이름은 ${person.name}이고 나이는 ${person.age}세입니다."
Kotlin에서는 문자열을 .trimIndent()
를 사용하여 문자열을 쉽게 조작
val str = """
ABCD
""".trimIndent()
println(str)
// ABCD 출력
Java에서 문자열의 특정 부분을 .toCharAt(i)
로 나타내지만 Kotlin에서는 str[0]
와 같이 배열로 나타냄
4강 코틀린에서 연산자를 다루는 방법
대부분 거의 똑같음
Kotlin에서는 Java와 다르게 객체를 비교할 때 비교 연산자를 사용하면 자동으로 compareTo를 호출
동등성과 동일성
동등성: 객체의 값
이 다른가
동일성: 객체의 주소
가 같은가(완전히 같은 객체인가)
Java에서 동등성은 equals, 동알성은 == 사용
Kotlin에서 동등성에 ==, 동일성에 === 사용, 당연히 equals 가 오버라이딩 되어있을 경우
in / !in
컬렉션이나 범위에 포함되어 있다, 포함되어 있지 않다.
a..b
a부터 b까지의 범위 객체를 생성한다.
반복문에서 자세히 다룸
Kotlin에서는 연산자를 직접 오버로딩할 수 있다
'Kotlin > 입문편' 카테고리의 다른 글
Java 개발자를 위한 Kotlin 입문 3. 코틀린에서의 OOP와 FP (0) | 2024.04.24 |
---|---|
Java 개발자를 위한 Kotlin 입문 2. 코틀린에서 코드를 제어하는 방법 (0) | 2024.04.23 |