티스토리 뷰
다음 문서를 참고했다.
Kotlin 언어 배우기
Android에서 일반적인 Kotlin 패턴 사용 - null 허용 여부
iOS 개발자 입장에서, Swift와의 차이점을 중점으로 간략하게 정리해본다.
iOS 개발자라면 익숙한 부분들은 되도록 간단히 보고 넘어갈 것이다.
변수 선언
Swift는 상수 let
변수 var
인데, Kotlin은 상수 val
변수 var
이다.
Swift와 마찬가지 형태로 타입을 할당할 수 있다.
var count: Int = 10
유형 추론
= 타입 추론
Kotlin은 정적으로 입력되는 언어이며, 컴파일 타임에 유형(=타입)이 결정되고 절대 변경되지 않는다.
Null Safety
Swift와 마찬가지이나, nil
대신 null
을 사용한다.
val languageName: String? = null
null 허용 여부
안드로이드 API는 대부분 자바로 작성되어 있는데, 자바는 null 허용 여부 구문에 대해 상대적으로 덜 엄격하다.
자바 클래스에서 정의된 특정 문자열 프로퍼티를 Kotlin에서 참조한다면, 이것이 String에 매핑되는제, String?에 매핑되는지 알지 못한다. -> String!로 표시된다. String!
는 String
또는 String?
를 표시할 수 있고, 컴파일러로 두 유형 중 하나의 값을 할당할 수 있다.
Swiftify 변환기로 objective-c -> swift로 전환된 코드를 보니, NSString이 다 String!으로 전환되었던 것 같은데, 비슷한 느낌인 것 같다.
public class Account implements Parcelable {
public final String name;
public final String type;
private final @Nullable String accessId;
...
}
와 같은 자바에서 정의된 클래스가 있을 때,
accessId
는@Nullable
로 어노테이션 되어 있다. -> Kotlin은 String?로 취급한다.@NonNull
로 어노테이션 되어있다면 Kotlin은String
으로 취급한다.name
은 null을 허용하는String
으로 취급한다.
null 허용 여부 처리
Swift와 매우 유사하다.
- Swift의 강제 언래핑 연산자
!
와 동일하게 Kotlin에선 not-null assertion operator!!
를 사용한다. 왼쪽에 있는 모든 것을 null이 아닌 것으로 취급하므로 만약 null이면 NullPointerException이 발생한다. - Swift와 유사하게 safe-call operator
?.
가 있다. - Swift의
??
와 유사하게 null 사례 처리를 위한 Elvis Operator?:
가 있다. 왼쪽 표현식의 결과가 null이면 오른쪽 값이 할당된다.
조건부
여느 조건문과 동일하게 if/else if/else를 사용할 수 있다.
if (count == 42) {
println("I have the answer.")
} else if (count > 35) {
println("The answer is close.")
} else {
println("The answer eludes me.")
}
Swift와 마찬가지로 조건식을 사용할 수 있다.
val answerString: String = if (count == 42) {
"I have the answer."
} else if (count > 35) {
"The answer is close."
} else {
"The answer eludes me."
}
println(answerString)
조건문의 복잡도가 증가하면 when 표현식으로 교체할 수 있는 부분은 새롭다.
val answerString = when {
count == 42 -> "I have the answer."
count > 35 -> "The answer is close."
else -> "The answer eludes me."
}
println(answerString)
분기는 조건, 화살표, 결과로 나타난다.한 분기에서 다음 분기로는 실행되지 않는다. 이전 코드와 기능적으로 동일하지만 쉽게 읽을 수 있다.
Smart Casting
Swift에서는 if let 등으로 옵셔널 바인딩을 해주어야 하지만, Kotlin에서는 if 문으로 null이 아닌지 체크해주는 것으로 가능하다.
val languageName: String? = null
if (languageName != null) {
// No need to write languageName?.toUpperCase()
println(languageName.toUpperCase())
}
함수
Swift에서는 함수 선언 시 파라미터명이 붙은 경우 호출 시에도 이를 명시해야 했고, 호출 시에 생략하려면 _
를 명시해야 했지만, Kotlin에서는 굳이 파라미터명을 명시하지 않아도 된다.
fun generateAnswerString(countThreshold: Int): String {
val answerString = if (count > countThreshold) {
"I have the answer."
} else {
"The answer eludes me."
}
return answerString
}
val answerString = generateAnswerString(42)
단일 표현식의 결과가 함수에서 반환되는 경우 아래처럼 독특하게 사용할 수도 있는 것 같다.
fun generateAnswerString(countThreshold: Int): String = if (count > countThreshold) {
"I have the answer"
} else {
"The answer eludes me"
}
익명함수(Anonymous Functions)
Swift의 closure.
val stringLengthFunc: (String) -> Int = { input ->
input.length
}
고차함수
다른 함수를 인수로 취할 수 있다. swift와 형태가 동일하다.
fun stringMapper(str: String, mapper: (String) -> Int): Int {
// Invoke function
return mapper(str)
}
stringMapper("Android", { input ->
input.length
})
또는
stringMapper("Android") { input ->
input.length
}
클래스
class Car {
val wheels = listOf<Wheel>()
}
클래스 속성을 초기화하는 방법을 지정하는 Custom constructor를 정의할 수 있다.class Car(val wheels: List<Wheel>)
클래스 함수 및 캡슐화
노출하려는 데이터만 노출하기. 속성을 참조하는 방법을 맞춤설정하려면 맞춤 getter/setter를 제공하면 된다.
프로퍼티의 setter에 액세스 하는 것을 제한하면서 프로퍼티의 getter를 노출하려면 setter를 private으로 지정하면 된다.
Swift와는 형태만 조금 다른 것 같다.
class Car(val wheels: List<Wheel>) {
private val doorLock: DoorLock = ...
var gallonsOfFuelInTank: Int = 15
private set
fun unlockDoor(key: Key): Boolean {
// Return true if key is valid for door lock, false otherwise
}
}
'Kotlin' 카테고리의 다른 글
iOS 개발자가 하는 실전압축 Kotlin 공부 (0) | 2024.02.10 |
---|---|
Kotlin Flow의 개념 (0) | 2024.01.13 |
- Total
- Today
- Yesterday
- http/1
- swift
- collectionViewCell
- 2024년
- IntrinsicContentSize
- CRAWL
- 부스트캠프
- http/1.1
- equaltosuperview
- snapkit
- IOS
- 2023년
- UITest
- 회고
- 유즈케이스
- Autolayout
- Clean Architecture
- CollectionView
- 클린 아키텍처
- Info.plist
- BeautifulSoup
- XCTest
- KeyChain
- 웹모바일
- Kotlin
- 오토레이아웃
- dismiss
- Realm
- 스위프트
- 네트워킹
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |