[03. 코틀린 시작하기]
[03-1. 코틀린 언어 소개]
[코틀린 Kotlin]
-코틀린 : 젯브레인스에서 오픈소스 그룹을 만들어 개발한 프로그래밍 언어.
-코틀린으로 안드로이드 앱 개발 가능한 이유는 자바 가상 머신 JVM 기반 언어이기 때문
-코틀린 컴파일러가 (.kt) 파일 컴파일하면 자바 바이트 코드 만들어짐
-즉, 코틀린 파일 컴파일하면 자바 클래스가 만들어지고 이를 JVM 이 실행함
[코틀린 개발 장점]
-표현 간결함
-널 안정성 지원 언어 : null허용/불허용 구분 선언하므로 널 안정성 확보
-상호 운용성 : 자바-코틀린 혼용가능. 호환가능
-구조화 동시성 : 코루틴 기법 사용시 비동기 프로그래밍 간소화 가능
[코틀린 파일 구성] : .kt 파일
-코틀린 파일명은 클래스명과 다르게 선언해도 O
-package(패키지) : 클래스 파일 위치/이름 파일 위치와 상관없어도 됨
-import(임포트) : 외부 파일 멤버(변수/함수/클래스) 사용을 위해 포함시킴
-코틀린 파일 컴파일하면 자동으로 ‘파일명+Kt’ 이름의 클래스에 포함됨
-따라서, 자바에서 코틀린의 멤버 참조 시, 해당 클래스 이름으로 접근하여 사용 O
ex.) User.kt 파일 -> 컴파일 -> UserKt.class -> 자바에서 해당 클래스로 접근하여 사용
두 개의 다른 코틀린 파일이 있다고 가정. 한 파일에서 다른 파일의 멤버 참조를 원하는 상황. 1) 동일 패키지 소속 파일 멤버 참조 시 -> 별도의 import 없이 사용 O 2) 다른 패키지 소속 파일 멤버 참조 시 -> import로 사용할 멤버 지정 필요 |
[코틀린 소스 테스트 방법] : 간단 소스
-코틀린 언어로 작성된 간단한 소스 파일 실행을 원할 경우
[New -> Kotlin CLass/File -> File] -> 소스파일의 main() 있는 곳 실행
[03-2. 변수와 함수]
[변수 선언] 키워드 : val , var
val : 최초 할당된 초기값 변경 불가 변수. (불변)
var: 최초 할당된 초기값 변경 가능 변수. (가변)
val 변수명:타입 = 값 var 변수명:타입 = 값 |
[타입 지정과 타입 추론]
1) 변수 명시적 타입 지정
val data1: Int = 10
2) 변수 자동 타입 지정 (대입값으로 타입 추론 가능할 경우 생략O)
val data1 = “문자열”
[초기값 할당]
-최상위 선언 변수/ 클래스의 멤버 변수 : 선언과 동시에 초기값 할당 필수
-함수 내부 선언된 변수 : 필수 X -> 단, 내부에서 이용할 변수에는 값 할당 후 사용해야 함
[초기화 미루기] : lateinit / lazy 키워드
-선언과 동시에 초기값 할당이 필수인 변수에 대해 그럴 수 없는 경우에 한해서 컴파일러에게 초기화를 미루겠다고 알려줘야 함
lateinit 키워드:이후에 초기값 할당 명시적 선언
-var 변수에만 사용 가능
-Int/Long/Short/Double/Float/Boolean/Byte 등 기초 타입에는 사용 불가
lateinit var data3 : String |
lazy 키워드 : 변수 선언 뒤에 by lazy { } 형식 선언
-해당 변수 사용할 때 lazy로 선언된 { } 중괄호 내부가 자동 실행 되어 그 결괏값이 변수 초깃값으로 할당됨
-lazy 문의 { } 내부 여러 줄 작성된 경우 -> 마지막 줄 실행 결과를 초깃값으로 할당
val data4 : int by lazy { println(“in lazy .....”) 10 } |
[데이터 타입] : 코틀린의 모든 변수는 ‘객체’
▷[기초 타입 객체] : Int/Short/Long/Double/Float/Byte/Boolean
-기초 데이터를 객체로 표현한 타입
▷[문자/문자열 객체] : Char/ String
-Char(문자) : ‘ ’ 작은 따옴표로 감싸서 표현
-String(문자열) : “” 큰 따옴표 / “““ 삼중 따옴표로 감싸서 표현
<문자열 템플릿> -String 타입 데이터에 변수값 or 어떤 연산식의 결과값 포함해야 할 경우. 즉, 문자열로 출력할 경우, 내부에 연산 결과값 넣거나 할 때 형식지정자 대신 $ 기호 사용함 val name : String = “kkang” println(“name : $name, sum: ${sum(10)}, plus: ${10+20}”) |
▷[Any 타입] : 모든 타입 할당 가능한 최상위 클래스
-Any타입으로 선언된 변수에는 모든 타입의 데이터 할당 가능
ex. val data1: Any = 10
▷[Unit 타입] : 함수 반환 타입이 없음을 명시적 지정
-보통 반환 타입 없는 함수는 타입 생략 O -> 이 경우 자동으로 Unit 적용됨
-명시적 지정 원할 경우 Unit 타입으로 반환 타입 명명
ex. fun some() : Unit { ... }
▷[Nothing 타입] : null/예외 반환하는 함수
-Nothing 타입 변수에는 null만 대입 가능
-함수 반환 타입이 Nothing 타입이면 의미없는 값을 반환하는 함수를 의미
ex. fun some() : Nothing { ...}
▷[널 허용/불허용]
-null : 객체 생성됐으나 값이 할당되지 않은 경우 -> null
-코틀린은 모든 타입이 객체이므로, null을 가질 수 있기 때문에 널 허용/불허용 구분 필요
변수 선언 시 타입 뒤에 물음표(?) 여부로 구분 1) 널 허용 : 타입 뒤 물음표 O ex. var data: Int ? = 10 (널 허용 변수) 2) 널 불허용 : 타입 뒤 물음표 X ex. var data : Int = 100 (널 불허용 변수) |
[함수 선언] : fun 키워드
-함수 매개변수에는 val 자동 적용되므로 따로 키워드 선언 X
fun 함수명(매개변수명:타입) : 반환 타입 { ... } |
-함수 안에서 매개변숫값 변경 불가능
-함수의 매개변수에 기본값 선언 가능
ex. fun some(data1: Int, data2: Int = 10) : Int { ... } 로 선언한 경우
이후, 해당 함수 호출할 때 data2에 해당하는 인수 안줘도 기본값 적용된다.
[매개변수가 여러개일 경우 호출 방법]
1) 순서대로 인자 전달
-some(10, 20)
2) 매개변수명 지정하여 호출 : 명명된 매개변수
-이 경우 순서 안지켜도 됨
-some(data2 = 20, data1 = 10) 으로 호출 가능
[컬렉션 타입]
-여러 데이터 표현하는 방법
-Array/List/Set/Map
▷[Array] : 배열 타입
-배열 내부 데이터 접근 시 1) [] 대괄호 사용
2) set(). get() 함수 이용
val data1 : Array<Int> = Array(3, {0}) //0으로 초기화한 3개 정수형 배열 선언 //제네릭으로 내부 데이터 타입 선언 Array<Int> //Array 생성자로 값 지정 -> 첫 매개변수 = 배열 크기 -> 두 번째 매개변수 = 람다식 결과값을 초기값으로 지정. |
▷[기초 타입 배열]
-다만, 기초 타입 배열에 대해서는 각 기초 타입에 해당하는 배열 클래스를 이용할 수도 O
-BooleanArray/ByteArray/CharArray/DoubleArray/FloatArray/IntArray/LongArray...
val data1 : IntArray(3, {0}) |
-arrayOf() 함수 : 배열 선언과 동시에 값 할당 함수
val data1 = arrayOf<Int> (10, 20, 30) //크기 3인 배열 선언과 동시에 값 할당 |
-기초 타입 대상 arrayOf() 함수
ex. intArrayOf() / booleanArrayOf() /byteArrayOf() / byteArrayOf() / longArrayOf()
▷[List/Set/Map] : 컬렉션 인터페이스 타입으로 표현한 '컬렉션 타입 클래스'
List | 순서 O 데이터 중복 O 데이터 집합 |
Set | 순서 X 데이터 중복 X 데이터 집합 |
Map | 순서 X 키 중복 X 키와 값으로 이루어진 데이터 집합 |
-컬렉션 타입 클래스: 가변/불변 클래스로 나뉨
가변 클래스 :초기 대입한 데이터 변경 가능한 클래스 타입 불변 클래스 :초기 대입한 데이터 변경 불가한 클래스 타입 |
-가변 클래스 타입에 대해서만 add(), set() 함수 이용하여 데이터 조작 가능
-가변 클래스 : MutableList/MutableSet/MutableMap
-listOf() 함수 : List 객체 만들고 매개변수에 초기값 대입함 -MutableListOf() 함수 : List 객체 만든 후 내부 데이터 추가/변경 간으 -setOf() 함수 -MutableSetOf() 함수 -mapOf() 함수 -MutableMapOf() 함수 |
[03-3. 조건문과 반복문]
[조건문] : 조건에 따른 흐름 제어문
▷[if-else문]
-표현식으로도 사용 O (결과 반환하는 식)
-각 영역의 마지막 줄에 해당한느 결괏값을 반환
val result = if (data > 10) {
println(“data > 10”)
true //이 조건식 참인 경우 반환값
}else {
printfln(“data > 0 && data <= 10) {
false
}
▷[when 문]
-표현식으로도 사용 O (결과 반환하는 식)
when (data) {
“hello” -> println(“이 구문 실행”)
“world” -> println(“이 구문 실행”)
else -> {
println(“data”)
}
[반복문]
▷[for 문]
for(i in 1..10) { sum += I } |
-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씩 감소하며 반복
[indices] : 증감 조건에 컬렉션 타입 데이터 개수만큼 반복하게 설정도 가능
fun main() { var data = arrayOf<Int>(10. 20, 30)
for(i in data.indices) {
print(data[i])
if(i !== data.size – 1) printf(“,”)
}
}
[withIndex() 함수] : 컬렉션 타입 인덱스 + 데이터 함께 가져옴
fun main() { var data = arrayOf<Int>(10,20,30)
for((index, value) in data.withIndex()) {
print(value)
if(index !== data.size –1) print(“,”)
}
}
▷[while 문] : 조건문 참인 동안 { } 내부 반복 실행
while (x < 10) {
sum += ++x
}
[참고] : Do It 안드로이드 앱 프로그래밍 with 코틀린 |
'App(앱)_관련 공부 모음 > [교재] Andorid App_Kotlin 기반' 카테고리의 다른 글
06. [뷰를 이용한 화면 구성] (0) | 2022.03.07 |
---|---|
05. [코틀린의 유용한 기법] (0) | 2022.03.04 |
04.[ 코틀린 객체지향 프로그래밍] (0) | 2022.03.04 |
02. [안드로이드 앱 개발 기본 지식] (0) | 2022.03.01 |
01. [Android Studio] 기본 환경설정 (0) | 2022.02.28 |