코틀린 언어의 특징
* 변수나 함수를 소스 최상위에 선언 가능
* 코틀린 변수는 var(가변), val(불변)으로 선언
* 코틀린의 모든 타입은 객체다
* List, Set, Map 타입은 가변과 불변으로 구분해서 사용
* if, when 조건문을 표현식으로 사용 가능
변수와 함수
변수 선언
var 변수명: 타입 = 값 (대입값으로 타입 유추 가능할 경우, 타입 선언 생략 가능)
* 최상위 선언한 변수는 초깃값 할당 필수, 함수 내부 선언 변수는 초깃값 필수X
기초 타입: Int, Long, Short, Float, Double, Char, Boolean, Byte
키워드
val (value): 초깃값 할당 이후 변경 불가
var (variable): 초깃값 할당 이후 변경 가능
초깃값 할당 미루기
lateinit: 변수 선언 맨 앞에 위치
* 기초 타입 객체(정수형, 실수형, boolean, byte)에는 사용 불가
lazy { }: 변수 선언 맨 뒤에 위치
* 변수 이용 시점에 중괄호 속 코드 실행, 마지막 줄 실행 결과가 초깃값으로 설정
타입
Any: 코틀린 최상위 클래스, 모든 타입의 데이터 할당 가능
Unit: 반환문이 없음을 명시적으로 나타낼 때 사용
Nothing: null이나 예외를 반환하는 함수
+) 타입 뒤에 ? 추가 시 널 허용(null값 대입 가능)
문자열 템플릿: $
ex. $변수명, ${10 + 20}
함수 선언
fun 함수명(매개변수명: 타입): 반환 타입{ … }
* 반환 타입 생략 시 자동으로 Unit 타입 적용
* 매개변수는 자동으로 val 키워드 적용, 함수 내에서 매개변수값 변경 불가, 매개변수에 기본값 설정 가능
함수 호출
함수명(매개변숫값) > 순서대로 할당
함수명(매개변수명 = 매개변숫값) > 지정한 대로 할당
배열(Array)
ex. val data1: Array<Int> = Array(3, { 0 })
> <Int>: 정수 배열, <String>: 문자열 배열 …
> 첫번째 매개변수(3): 배열의 크기
> 두번째 매개변수({ 0 }): 초깃값 지정함수
* 기초 타입 데이터라면 Array<Int>, Array<Float> 대신 IntArray, FloatArray 등의 클래스로 이용도 가능
array0f(): 배열 선언 시 값 할당 가능
ex. val data1 = array0f<Int>(1, 2, 3)
* 마찬가지로 기초 타입 데이터라면 intArray0f() 등으로 사용 가능
컬렉션 타입 클래스
List: 순서 O, 데이터 중복 허용
Set: 순서 X, 데이터 중복 불허
Map: 키와 값으로 이루어짐, 키의 중복 불허(타입은 키와 값 두 개를 지정해야 함)
> Pair(키, 값) 또는 키 to 값 사용
* lisf0f(), set0f(), map0f() 함수는 불변(immutable) 클래스, size(), get() 함수만 제공
* mutableLisf0f(), mutableSet0f(), mutableMap0f() 함수는 가변(mutable) 클래스, add(), set() 함수까지 제공
데이터 접근
data1[1] = 15 ↔ data1.set(1, 15)
data1[0] ↔ data1.get(0)
add(인덱스, 값)
set(인덱스, 값)
조건문과 반복문
코틀린에서 if~else 표현식 사용 가능
ex.
var data1 = 10
val result = if (data > 0){
println("data > 0")
true
} else {
println("data <= 0")
false
}
* true와 false는 각각 참일 때, 거짓일 때 반환값
* 표현식으로 사용할 경우 else 생략 불가능
조건문 when
ex.
var data = 10
when(data){
10 -> println("data = 10")
20 -> println("data = 20")
else -> {
println("data is not valid data")
}
}
* 정수가 아닌 다른 타입 데이터도 사용 가능
+) 10, 20 대신
is String: data가 문자열 타입이라면(is: 타입 확인 연산자)
20, 30: data 값이 20 또는 30이라면
in 1..10: data 값이 1~10 사이의 값이면(in: 범위 지정 연산자)
* 데이터 명시((data)) 생략하고 조건만 명시 가능
* 표현식으로 사용 가능, 단 else 생략 불가능
반복문 for
for (i in 1..10){ … }: // 1부터 10까지 1씩 증가
for (i in 1 until 10{ … }: // 1부터 9까지 1씩 증가
for (i in 2..10 step 2{ … }: // 2부터 10까지 2씩 증가
for (i in 10 downTo 1){ … }: // 10부터 1까지 1씩 감소
// *숫자 대신 컬렉션 타입 데이터 개수만큼 반복
for (i in 리스트명.indices): // 인덱스값을 i에 가져옴
for ((index, value) in 리스트명.withIndex()): // 인덱스와 실제 데이터값 함께 가져옴
반복문 while
조건이 참일때 중괄호 안 영역 반복 실행
클래스와 생성자
클래스 선언
class User{ }
오버라이딩(overriding): 상위 클래스의 변수나 함수를 같은 이름으로 하위 클래스에서 다시 선언
상위 클래스 선언 앞에 open 키워드 & 하위 클래스 선언 앞에 override 붙이기
데이터(data) 클래스
객체 비교 시, 객체 자체가 아니라 객체의 데이터를 비교
일반적으로 주 생성자에 val, var 키워드로 매개변수 선언하여 클래스의 멤버 변수로 활용
오브젝트 클래스
익명 클래스(anonymous class)를 만들 목적으로 사용
선언과 동시에 객체를 생성한다는 의미
val obj = object: Super(){
var data = 10
fun main(){
println(data)
}
}
* object: 타입() 까지 입력해서 선언할 것 (보편적)
컴패니언 클래스
멤버 변수나 함수를 클래스 이름으로 접근할 때 사용
객체를 생성하지 않고도 클래스 이름으로 특정 멤버 이용 가능(일반적으론 객체를 생성해서 접근)
// 일반적인 접근
class Myclass{
var data = 10
fun some(){
println(data)
}
}
fun main(){
val obj = MyClass() // 객체 생성
obj.some() // 객체명으로 접근
}
// 컴패니언 클래스의 접근
class Myclass{
companion object{
var data = 10
fun some(){
println(data)
}
}
}
fun main(){
MyClass.some() // 클래스명으로 접근 가능
}
람다 함수와 고차 함수
타입 별칭(typealias): 함수, 데이터 타입을 선언할 때 사용
typealias FunType = (Int, Int) -> Boolean
fun main(){
val someFun: FunType = {no1: Int, no2: Int -> no1 > no2}
}
람다 함수: 익명 함수 정의 기법, 함수를 간단하게 정의할 때 이용
// 람다 함수 선언
{ 매개변수 -> 함수 본문 }
// 선언과 호출 #1
val sum = {no1: Int, no2: Int -> no1 + no2}
sum(10, 20)
// 선언과 호출 #2
{no1: Int, no2: Int -> no1 + no2} (10, 20)
// 선언과 호출 #3
val sum: (Int, Int) -> Int = {no1: Int, no2: Int -> no1 + no2}
* 함수 본문의 마지막 표현식은 함수의 반환값
* 함수명으로 호출이 불가, 보통 변수에 대입하여 사용
* 매개변수 없을 경우, 생략 가능(화살표까지 생략 가능)
* 유추가 가능한 경우, 매개변수 혹은 변수 선언 시 타입 생략 가능
고차 함수: 함수를 매개변수로 전달받거나 반환하는 함수
fun some(arg: (Int) -> Boolean): () -> String{
val result = if(arg(10)){
"valid"
}
else{
"invalid"
}
return {"some result : $result"}
}
fun main(){
val result = some({no -> no > 0})
println(result())
}
// 실행결과
some result : valid
'Programing > Android(Kotlin)' 카테고리의 다른 글
[Android/Kotlin] 리사이클러뷰(Fragment) 구현 (0) | 2023.08.28 |
---|---|
[카카오맵 API/Kotlin] 앱에 지도 화면 띄우기 (0) | 2023.08.25 |
[Udemy] 퀴즈 앱(Android 및 Kotlin 개발 완전 정복) (0) | 2023.07.21 |
[Udemy] 계산기(Android 및 Kotlin 개발 완전 정복) (0) | 2023.07.12 |
[Udemy] 분 단위 나이 계산기(Android 및 Kotlin 개발 완전 정복) (0) | 2023.06.26 |