Olive Study Room
[Kotlin] 기본 문법 & 필요 지식 본문
- Jet Brains 회사에서 만든 IJ(통합개발환경 툴)를 기반으로 만든 게 Android Studio
- kotlin은 자바를 보완하기 위한 언어
- 2017년에 공식 언어로 지정. -> 구글이 kolin으로 하는 안드로이드 개발에 지원하겠다!
- 현 최신 버전은 4.1.2
Kotlin은 거의 Swift와 비슷하지만 다른 부분들도 있다.
주로 다른 부분을 비교해서 정리했다.
[ 함수 선언 ]
Swift | Kotlin | ||
함수 | 표현 | func | fun |
반환 | -> | : | |
변수 | 표현 | var | var |
타입 선언 | 타입추론 가능 | 타입추론 가능 | |
String | 초기화하지 않아도 됨 | 초기화 필요 다른 타입과 + 연산 가능(string으로 반환) |
|
null | null을 가질 수 없는 타입도 있음 | null을 가질 수 없는 타입도 있음 | |
상수 | 표현 | let | val |
타입 | 정수 | Long 없음 | Long / 8Byte (ex. 123L) |
Short 없음 | Short / 2Byte | ||
실수 | Float / 4 Byte (ex. 3.14) | Float / 4 Byte (ex. 3.14f) | |
반복문 | for | for i in 1...5 {} | for (i in 1..5) {} |
x | until(미만) | ||
조건문 | switch - case | when |
* 8비트 = 1바이트
* bold 처리된 부분이 다른 점
[ Null Safe? ]
- swift optional과 의미와 표현이 같음
- optional이 아닌 변수는 null safe하다고 말함
- ?, 즉 Null Safe일 때 해당 값이 null인 경우 수행되지 않음.
[ 구문식, 표현식 차이 ]
// 구문식
fun sum(a: Int, b: Int): Int {
return a + b
}
// 표현식
fun sum(a: Int, b: Int) = a + b
fun max(a: Int, b: Int) = if(a > b) a else b
[ Scope function(범위 지정 함수) ]
- 코틀린 표준 라이브러리는 간결한 코드를 가능하게 하는 확장 함수를 제공하는데, 확장함수는 람다를 인자로 받는다.
- 람다식이 제공된 객체에서 범위 지정 함수를 호출하면 임시 범위가 형성되고, 이 범위에서 이름 없이 객체에 접근할 수 있다.
- 람다식을 호출하는 방식으로 사용한다.
- 코드를 읽게 쉽도록 한다.
-> 자바에는 없는 함수.
1. apply
객체를 초기화할 때 사용된다. (반환 값이 본인 자체이기 때문!)
// Kotlin. 범위 지정 함수 apply를 사용한 경우
val person = Person().apply {
firstName = "Kim"
lastName = "Peng"
}
// JAVA
Person.person = new Person();
person.firstName = "Kim";
person.lastName = "Peng";
2. with
객체를 받아 객체 속성을 이용한다.
val person = Person("Kim", 23)
with(person) {
print(name)
}
3. let
코드블럭의 수행결과가 반환된다.
null safe하기 위해 사용된다.
// Kotlin. 범위 지정 함수 Let사용
// orEmpty()는 number가 null일 때 sumN이 null이 되는 것을 막고 빈 값을 넣어준다.
val number: Int?
val sumN = number?.let {
"$(sum(10, it))"
}.orEmpty()
// Java
Integer number = null;
String sumN = null;
if (number != null) {
sumN = "" + sum(10, number);
}
4. also
객체가 파라미터로 전달된다.
// Kotlin. 범위 지정 함수 also 사용
// $it으로 사용 가능. value 생략 가능. 생략한 경우 $it 사용
Random.nextInt(100).also { value ->
print("peng's number is $value")
}
// Java
int value = Random().nextInt(100);
System.out.print(value);
5. run
초기화와 함께 값을 계산하거나 초기화한다.
with와 비슷하지만 run은 확장 함수로 사용할 수 있다.
val person = Person()
val result = person.run {
speed = 100
}
- 람다식이란?
- 익명 함수를 지칭하는 용어.
- 람다 대수에 기초를 두고 있다.
- 람다 대수는 수학에서 사용하는 함수를 단순하게 표현하는 방법
- 고차함수에 인자로 전달되거나 고차 함수가 돌려주는 결과 값으로 쓰인다.
- 익명 함수
- 리터럴 방식으로 만들어진 이름이 없는 함수.
- 일급 객체라는 특징을 갖는다.
- Swift에서는 클로저(Closure)라고도 부른다.
- 재사용을 하지 않을 경우 사용한다.
// 일반적인 함수
func printTest(input: String) -> () {
print(input)
}
// 익명 함수
{
(input: String) -> () in
print(input)
}
* 리터럴 방식
일반적으로 데이터를 만드는 방식.
var num: Int = 0
함수를 변수에 담으면 함수 리터럴 방식!
- 순수 함수
- 동일한 인자가 주어질 때 항상 같은 값을 반환하는 함수. -> side-effect(부수 효과)가 없다고 말한다.
- Thread에 안전하고 병렬적인 계산이 가능하다.
- 코드 전체를 이해할 필요가 없다.
func sum(a: Int, b: Int) -> Int {
return a+b
}
- 순수 함수가 아닌 경우
1. 변수가 포함된 경우
var c: Int = 10
func sum(a: Int, b: Int, c: Int) -> Int {
c = b
return a+b+c
}
2. 외부 상태에 영향을 미칠 경우
1과 같이 외부 변수를 변화시키거나 객체를 인자로 받아 객체의 상태가 달라지는 경우 이에 해당한다.
[ Data Class ]
- getter setter 없이 클래스를 선언할 수 있다.
-> 프로퍼티에 직접 접근. but 내부적으로 없는 건 아님. java에서 코트린을 사용하는 경우도 있기때문..
- model 클래스를 생성할 때 사용한다.
[ lateinit ]
- non-null한 타입일 때만 사용.
- 로컬에서는 불가능(전역으로 선언해야함)
- null-safe한 타입으로 선언하면 무조건 초기화를 해줘야함. but 초기값을 입력하지 못할 상황에 lateinit 사용.
'Coding > Android' 카테고리의 다른 글
[Android Studio] RecyclerView (0) | 2021.07.21 |
---|---|
[Android Studio] Fragment, ViewPager2 (0) | 2021.07.20 |
[Android Studio] persistentState: PersistableBundle (0) | 2021.07.17 |
[Android Studio] 레이아웃 (0) | 2021.07.10 |
[Android Studio] 설치, AVD(Android Virtual Device) 세팅, 환경 설명 (0) | 2021.07.09 |
Comments