
1. 코틀린 언어 소개
1. 코틀린의 등장 배경
- 코틀린은 젯브레인스에서 오픈소스 그룹을 만들어 개발한 프로그래밍 언어이다.
- 2017년 구글에서 안드로이드 공식 언어로 지정했다.
- JVM 기반을 둔 언어로, 코틀린 컴파일러가 .kt파일은 컴파일하면 자바 바이트 코드가 만들어집니다.
| 코틀린 소스 -- 코틀린 컴파일 --> 자바 바이트 코드 --> 자바 가상 머신 |
2. 장점
- 간결한 구문으로 프로그램을 작성
- NULL 안정성 safety 지원
- 자바와 호환가능
- 코루틴 기법으로 비동기 프로그래망을 간소
3. 파일 구성
// 패키지
package com.example.test3
// 임포트
import java.text.SimpleDateFormat
import java.util.*
// 변수
var data = 10
// 함수
fun formaDate(data: Date): String {
val sdformat = SimpleDateFormat("yyyy-mm-dd")
return sdformat.fotmat(date)
}
// 클래스
class User {
var name = "hello"
fuc sayHello() {
println("name : $name")
}
}
2. 변수
1. 변수 선언하기
- 변수는 val, var키워드로 선언
- val은 초깃값이 할당되면 바꿀 수 없는 변수
- var은 초깃값 할당된 후에도 값을 바꿀 수 있다.
fun main() {
println("Hello, world!!!")
// 변수 선언
var data1 = 10 // variabla(변수): 변경이 가능하다.
val data2 = 20 // value(상수): 변경 불가변경 불가
data1 = 30
//data2 = 40 // 오류
}

2. 타입 지정과 타입 추론
- : (콜론)으로 추가타입을 명시한다.
fun main() {
// 변수선언 : 타입
var data3:Int = 20
// Int, Short, Long, Double, Float, Byte, Boolean, Char, String
// ( 타입의 첫글자가 대문자)
println(data3)
println("data3 = $data3" )
}

3. 초깃값 할당
- 최상위에 선언한 변수나 클래스의 멤버변수는 선언과 동시에 초깃값을 할당해야 하며, 내부에 선언한 변수는 선언과 동시에 초깃값을 할당하지 않아도 된다.
fun main() {
println("Hello, world!!!")
// 변수 선언
var data1 = 10 // variabla(변수): 변경이 가능하다.
// var data1:Int 10
val data2 = 20 // value(상수): 변경 불가변경 불가
data1 = 30
//data2 = 40 // 오류
// 변수선언 : 타입
var data3:Int = 20
// 기본타입: Int, Short, Long, Double, Float, Byte, Boolean, Char, String
// ( 타입의 첫글자가 대문자)
println(data3)
println("data3 = $data3" )
var data4 : Int // 기본타입을 먼저 정의하고 초기값을 준다
data4 = 40 // Int, Short, Long, Double, Float, Byte, Boolean // Char, String 제외
data5 = "android"
println("$data5 programming")
}


4. 초기화 미루기
- lateinit키워드 사용
- var로 선언된 변수에만 적용가능
- Int, Short, Long, Double, Float, Byte, Boolean에는 적용 x // Char, String 제외
- be lazy {}형식으로 선언
- 소스에서 변수가 최초로 이용되는 순간 중괄호로 묶인 부분이 자동으로 실행되어 그 결괏값이 변수의 초깃값으로 할당
- 중괄호 부분을 여러 줄로 작성한다면 마지막 줄의 실행결과가 변수의 초깃값
// 초기값 설정 늦추기
lateinit var data5 : String //(나중에 초기값을 주겠다.)
val data6 : Int by lazy{ // 변수만 선언하고 불릴때 data6에 6으로 초기화 된다.
println("lazy init...")
6 // return 값 => data6
} // 변수선언에 필요한 코드 넣기
5. 데이터 타입
- 코틀린의 모든 변수는 객체 -> 기초 데이터 타입이 primitive가 아니라 클래스
- 기초 타입 객체: Int, Short, Long, Double, Float, Byte, Boolean

- 문자와 문자열: Char, Sting
- println("name : " $name)

- Any: 모든 타입
- Unit: 반복문이 없는 함수
- 널 허용/불허용
// 널(NILL)
//var data7 :Int = null // 오류: 코들린은 널값을 초기값으로 설정 안됨.
var data7:Int? //널을 허용
data7 = null
var data8:String? = null
data8 = "digital"
if(data8 == null){
println("null")
}
else{
println(data8.length)
}


// 전체 코드
/**
* You can edit, run, and share this code.
* play.kotlinlang.org
*/
// 초기값 설정 늦추기
lateinit var data5 : String //(나중에 초기값을 주겠다.)
val data6 : Int by lazy{ // 변수만 선언하고 불릴때 data6에 6으로 초기화 된다.
println("lazy init...")
6 // return 값 => data6
} // 변수선언에 필요한 코드 넣기
fun main() {
println("Hello, world!!!")
// 변수 선언
var data1 = 10 // variabla(변수): 변경이 가능하다.
// var data1:Int 10
val data2 = 20 // value(상수): 변경 불가변경 불가
data1 = 30
//data2 = 40 // 오류
// 변수선언 : 타입
var data3:Int = 20
// 기본타입: Int, Short, Long, Double, Float, Byte, Boolean, Char, String
// ( 타입의 첫글자가 대문자)
println(data3)
println("data3 = $data3" )
var data4 : Int // 기본타입을 먼저 정의하고 초기값을 준다
data4 = 40 // Int, Short, Long, Double, Float, Byte, Boolean // Char, String 제외
data5 = "android"
println("$data5 programming")
println(data6)
// 널(NILL)
//var data7 :Int = null // 오류: 코들린은 널값을 초기값으로 설정 안됨.
var data7:Int? //널을 허용
data7 = null
var data8:String? = null
data8 = "digital"
//data8 = null
if(data8 == null){
println("null")
}
else{
println(data8.length)
}
println(data8!!.length)
//var data9:String!! //절대 null이어서는 안된다.????
var data9 : Any = 7
println("data9 = $data9")
data9 = "software"
println("data9 = $data9")
}
3. 함수
1. 함수 선언하기
- fun 키워드 fun 함수명(매개변수명:타입): 반환타입 {...}
- 반환 타입 생략시 Unit타입이 적용
- 함수의 매개변수에는 var, val키워드 사용 , val이 자동으로 적용
fun sum1(data1: Int): Int{
return data1 + 10
}
fun main() {
var result = sum1(5)
println(result)
}
매개변수 2개
fun sum1(data1: Int): Int{
return data1 + 10
}
fun sum2(data1: Int, data2: Int = 10): Int{
return data1 + data2
}
fun main() {
var result = sum1(5)
println(result)
var result2 = sum2(5,6)
println(result2)
var result3 = sum2(5)
println(result3)
}
람다함수
- 람다 함수는 익명 함수 정의 기법
- 람다 함수 선언과 호출: fun 함수명 (매개변수) { 함수 본문 } , { 매개변수 -> 함수 본문 }
- 매개변수의 타입을 유추할 수 있다면 타입 선언을 생략할 수 있습니다.
var result4 : (Int,Int)->Int = { data1:Int, data2:Int -> data1+data2 }
println(result4(3,5))

널 안정성
- null: 객체가 선언되었지만 초기화되지 않은 상태
- NullPointException 발생
- 널 안정성: 널 포인트 예외가 발샐하지 않도록 코드를 작성하는 것
- ? 연산자: 코틀린에서는 변수 타입을 널 허용과 널 불허로 구분
- !! 연산자 : 예외, 객체가 널일 때 예외를 일으키는 연산자


2. 컬렉션 타입: 배열
- Array클래스
- array( 배열의 크기, 초깃값 지정 함수)
- 배열의 데이터 접근할 때는 대괄호를 이용해도 되고 set()이나 get()함수를 이용할 수도 있습니다.
- 기초 타입의 배열: 기초타입을 Array가 아닌 클래스를 이용할 수 있다 + ArrayOf() 함수를 이용하면 선언하면서 배열 값 할당도 가능boleanArayOf(), byteArayOf(),charArayOf(),doubleArayOf(), floatArayOf(),intArayOf(),longArayOf(),shortArayOf()
var data1 : Array<Int> = Array(3,{0})
data1[0] = 10
data1.set(1,20) // data1[1] = 20
println( "data1 = ${data1[0]}, ${data1.get(1)}" )
var data2: IntArray = IntArray(3,{0})

- List: 순서가 있는 데이터 집합으로 데이터의 중복을 허용합니다.
- Set: 순서가 없으며 데이터 중봅을 허용하지 않습니다.
- Map: 키와 값으로 이루어진 데이터 집합으로 순서가 없으며 키의 중복을 허용하지 않습니다.

2025-03-12
// 0) 배열
var arr1: Array<Int> = Array(3,{0})
var arr2: IntArray = IntArray(3, {0})
// ShortArray, LongArray, DoubleArray,.....
arr1[0] = 20
arr1.set(1,30) // arra[1] = 30
println(arr1.get(1))
println("arr1[1] = ${arr1[1]}")
// 1) 배열
var arr3 = arrayOf<Int>(10,3,20)
arr3[1] = 15
var arr4 = intArrayOf(40,50,60)
arr4[2] = 100
println(arr4[2])
// 2) 리스트 : 초기값 변경이 안된다.
var list1 = listOf<Int>(10,20,30)
// list1[0] = 5 or list1.set(0,5) => error
println(list1.size) //리스트의 길이 출력
// 3) mutable 리스트
var list2 = mutableListOf<Int>(10,20,30)
println(list2.size)
list2.add(3,40)
println(list2.size)
list2.set(3,35)
println(list2[3])
30
arr1[1] = 30
100
3
3
4
35
4. 조건문
- if문에 명시한 조건을 만족하면 if부분을 실행하고, 그렇지 않으면 else 부분을 실행
// 조건문 : if ~ else ~
var data1 = 10
if (data1 > 0) {
println("positive")
}
else if(data1 < 0) {
println("negative")
}
else {
println("zero")
}
// data1의 값에 따라 달라진다. => 조건문이 변수에 들어가는 것이 가능하다.
var data2 = if (data1 > 0) {
println("positive")
1 //마지막 값이 data2에 지정된다.
}
else if(data1 < 0) {
println("negative")
-1
}
else {
println("zero")
0
}
println(data2)

- When문에서는 조건을 데이터 타입, 범위 등으로 다양하게 명시할 수 있습니다.
var data1 = 10
// 2) 조건문 : switch ~ case : when
when(data1){
// (조건) -> (실행)
1 -> println("1")
20,30,40 -> println("> 10") // ,는 or을 의미한다.
is Int -> println("Int형 타입입니다.") // 타입도 조건으로 가능
in 1..10 -> println("1~10") // in 시작..끝 : 1에서 10 까지 사이의 값
else -> println("ELSE") // 아무것도 만족하지 않는 경우
}
var data3 = when (data1){
1 -> "1"
20,30,40 -> "> 10"
in 1..10 -> "1~10"
is Int -> "Int형 타입입니다."
else -> "ELSE"
}
println(data3)
5. 반복문
- for 문은 제어 변수값을 증감하면서 특정 조건이 탐일 때까지 구문을 반복해서 실행합니다.
- for(in 1..10) {...}→1부터10까지1씩증가
- for(in 1 until 10) {...}→1부터9까지1씩증가(10은미포함)
- for(in 2..10 step 2) {...}→2부터10까지2씩증가
- for(in 10 downTo 1) {...}→10부터1까지1씩감소
// 3) 반복문 for
var sum = 0
//for( i in 1..10 step 1){
for( i in 10 downTo 0 step 3){
sum = sum + i
println("$i : $sum")
}
// 3) 반복 + 배열(리스트)
var arr1 = arrayOf<Int>(10,20,30)
println(arr1[2])
// for(i in 0..2){
for(i in arr1.indices){
println(arr1[i])
}
- while문은 조건이 참이면 중괄호 {}로 지정한 영역을 반복해서 실행

6. 클래스
1. 클래스 선언
- class키워드
- {} 생략가능
- 클래스의 멤버는 생성자, 변수, 함수, 클래스로 구성
- 생성자는 constructor라는 키워드로 선언
- 객체 생성하며 객체로 클래스의 멤버에 접근 ( new키워드 사용 x )

// 객체지향적인 접근: class
open class User (val name:String){
/*
var name = "mobile"
constructor(val name:String){
this.name = name
}
*/
open fun someFunc(){
println(name)
}
class innerClass {}
}
class SpecialUser(name:String): User(name){
override fun someFunc(){ // ㅅㅂ 못들음...;;
println("override... $name")
}
}
data class UserData(var name:String, var age:Int, var addr:String)
//
class MyUser{
companion object{
var dataC = 10
fun someFun(){
println("companion : $dataC")
}
}
}
fun main() {
// 클래스 지정 후 접근
var user1 = User("lee")
user1.someFunc()
var user2 = SpecialUser("kim")
user2.someFunc()
var user3 = UserData("home", 20, "seoul")
println("$user3")
//var list2 = MutableList<UserData>
var user4 = object{
var dataObj = 10
fun someObjFunc(){
println("object.. $dataObj")
}
}
user4.dataObj = 20
user4.someObjFunc()
//var user5 = MyUser()
//user5.someFunc
MyUser.dataC = 34
MyUser.someFun()
}
lee
override... kim
UserData(name=home, age=20, addr=seoul)
object.. 20
companion : 34
2. 상속과 생성자
- 코틀린에서 어떤 클래스를 상속받으려면 선언부에 콜론(:)과 함께 상속받을 클래스 이름을 입력
- 코틀린의 클래스는 다른 클래스 상속 x ( open 키워드 사용하면 사용가능 )
- 상위 클래스를 상속받은 하위 클래스의 생성자에서는 상위 클래스의 생성자를 호출해야 합니다.

3. 오버라이딩 - 재정의
- 상위 클래스에 정의된 멤버 (변수, 함수)를 하위 클래스에서 자신의 멤버처럼 사용할 수 있다
- 오버라이딩: 상위 클래스에 정의된 변수나 함수를 같은 이름으로 하위클래스에서 다시 선언하는 것

4. 접근 제한자
- 접근제한자: 클래스의 멤버를 외부의 어느 범위까지 이용하게 할 것인지를 결정하는 키워드

5. 데이터 클래스
- data키워드로 선언
- VO클래스를 편리하게 이용할 수 있는 방법 제공

- 객체의 데이터를 비교하는 aquaks()함수

6. 오브젝트 클래스
- 익명 클래스를 만들 목적으로 이용
- 선언과 동시에 객체를 생성한다는 의미에서 Object 키워드 사용
- Object : 클래스의 상위 or 인터페이스 입력

7. 컴패니언 클래스
- 멤버 변수나 함수를 클래스 이름으로 접근하고자 할때 사용
- companion 키워드

'SPECIALIZED > Android' 카테고리의 다른 글
| 6. 뷰를 배치하는 레이아웃 (0) | 2025.03.27 |
|---|---|
| 5. 뷰를이용한화면구성 (0) | 2025.03.27 |
| 4. XML소개 (0) | 2025.03.24 |
| 3. 안드로이드 프로그래밍 - 안드로이드앱의 기본구조 및 세팅 (0) | 2025.03.19 |
| 1. 안드로이드 프로그래밍 - 개발환경준비하기 - 코틀린 (0) | 2025.03.14 |