Y_Ding

코틀린 이해하기 본문

TodayILearned/Android&Kotlin

코틀린 이해하기

YJ_ILY 2023. 9. 14. 23:45

코틀린으로 안드로이드 앱을 개발할 수 있는 이유?

  • 자바의 가상 머신인 JVM에 기반을 둔 언어이기 때문
  • 코틀린으로 작성한 프로그램은 JVM에서 실행 가능

코틀린의 특징

  • 표현력과 간결함
    • 간결한 구문으로 프로그램 작성 가능
  • 안전한 코드
    • 널 안정성을 지원
    • 객체지향 프로그래밍에서 객체는 널 상태일 수 있고, 이때 NullPointException(런타임 오류) 발생 가능
    • 코틀린은 변수를 널 허용과 널 불허용으로 구분해서 선언 / 이 부분을 컴파일러가 해결해줌
  • 상호 운용성
    • 자바와 100% 호환
    • 자바 클래스나 라이브러리 활용 가능
  • 구조화 동시성
    • 코루틴(coroutines) 기법을 이용해 비동기 프로그래밍을 간소화 가능
    • 네트워크 연동이나 데이터베이스 갱신과 같은 작업을 할 때 이용하면 효율적

코틀린 파일 구성

  • 패키지, 임포트, 변수, 함수(메소드), 클래스
  • 변수와 함수는 클래스 안 뿐만 아니라 클래스 밖에서도 선언 가능
  • 어떤 파일에서 선언한 멤버(변수,함수,클래스)를 다른 코틀린 파일에서 참조할 때 같은 패키지로 선언했다면 임포트 없이 사용 가능 / 패키지 경로가 다른 경우는 임포트 구문으로 불러와야 함

 변수

  • 변수명 뒤에 콜론(:)을 추가해 타입 명시 가능
  • 대입하는 값에 따라 타입 유추가 가능할 때에는 생략도 가능
  • 코틀린의 모든 변수는 객체
  • 널 허용과 불허용을 명확하게 구분해서 선언해야 함 (타입 뒤에 물음표를 추가하면 널 허용으로 선언)
val data1: Int = 10
val data2 = 10

var data3 : Int? = 10 // 물음표 추가해서 null 허용
data3 = null
  • 최상위에 선언한 변수나 클래스의 멤버 변수는 선언과 동시에 초깃값을 할당해야 함
  • 함수 내부에 선언한 변수는 초깃값을 할당하지 않아도 되지만 변수를 이용하려면 값을 할당하고 이용해야 함
// 최상위 선언은 선언과 동시에 초깃값 할당이 되어야 함
val data1: Int // 에러
val data2 = 10

// 함수 내부에 선언한 변수는 초깃값을 할당하지 않아도 되지만
// 이용하려면 값을 할당하고 이용
fun someFun() {
	val data3: Int
    println("data3 : $data3") // 값이 할당이 안되어 있음! 에러!
    data3 = 10
    println("data3 : $data3")
}

// 클래스의 멤버 변수는 선언과 동시에 초깃값을 할당해야 함
class User {
	val data4: Int // 에러
    val data5: Int = 10
}

lateinit 과 lazy

         -초깃값을 할당할 수 없는 경우에는 값을 이후에 할당할 것이라고 컴파일러에게 알려주어야 함

lateinit

  • var 키워드로 선언한 변수에만 사용 가능
  • String 타입에서만 사용 가능

lazy

  • 변수 선언문 뒤에 by lazy{ } 형식으로 선언
  • 변수가 최초로 이용되는 순간 중괄호로 묶은 부분이 자동으로 실행
  • 그 결괏값이 변수의 초깃값으로 할당됨
  • 여러 줄로 작성한다면? 마지막 줄의 실행 결과가 변수의 초깃값이 됨

데이터 타입

  • 코틀린의 모든 타입은 객체 타입
  • Int는 기초 데이터 타입이 아닌 클래스
  • 그렇기 때문에 정수 뿐만이 아니라, null을 대입할 수도 있고, 메소드도 호출 가능
fun dataType() {
	var data1 : Int = 10
    	var data2: Int? = null // null 대입
    
    data1 = data1 + 10
    data1 = data1.plus(10) // plus(10) 이라는 객체의 메소드 이용 가능
}

Any

  • 모든 코틀린의 클래스는  Any의 하위 클래스
  • Any 타입으로 선언한 변수에는 모든 타입의 데이터를 할당 가능(String, Int, Boolean...)

Unit

  • 특수한 상활을 표현하려는 목적으로 사용
  • Unit 타입으로 변수를 선언하면 Unit 객체만 대입 가능
  • 주로 함수의 반환 타입으로 사용
  • 함수에서 반환문이 없음을 명시적으로 나타낼 때 사용
Unit 타입 사용
val data1: Unit = Unit

반환문이 없는 함수
fun data() : Unit {
	println(10 + 10)
}

Nothing

  • null이나 예외를 반환하는 함수
  • 주로 함수의 반환 타입에 사용
val data: Nothing? = null

// null을 반환
fun some() : Nothing? {
	return null
}

// 예외를 던짐
fun some() : Nothing {
	throw Exception()
}

함수 선언

함수 선언 형식
fun 함수명(매개변수명 : 타입) : 반환타입 {...}

매개변수에 기본값 선언하기
fun main() {
	fun some(data1: Int, data2: Int = 10) : Int {
    	return data1 * data2
    }
    println(some(10))   // 100
    println(some(10,20)) // 200
}
  • 반환타입 생략 가능 ( 생략하면 Unit 적용)
  • 매개변수에는 var나 val 키워드 사용 불가
  • val 자동 적용, 함수 안에서 매개변숫값 변경 불가능
  • 매개변수에 기본값 선언 가능

컬렉션 타입

  • 여러개의 데이터를 표현하는 방법
  • Array, List, Set, Map

Array

Array 클래스 생성자
<init>(size: Int, init: (Int) -> T)

*배열의 타입은 제네릭으로 표현
*제네릭은 선언하는 곳이 아닌 이용하는 곳에서 타입을 지정하는 기법

배열 선언
val data: Array<Int> = Array(3, {0})
* 0으로 초기화한 데이터를 3개 나열한 정수형 배열

배열 선언과 동시에 값을 할당
val data = arrayOf<Int>(10, 20, 30)
  • 첫 번째 매개변수는 배열의 크기, 두 번째 매개변수는 초깃값을 지정
  • 배열의 데이터를 접근할 때 : 대괄호 이용하거나, set() 이나 get() 함수를 이용

List, Set, Map

  • 인터페이스를 타입으로 표현한 클래스, 컬렉션 타입 클래스라고 함
  • List : 순서가 있는 데이터 집합 , 데이터의 중복 허용
  • Set : 순서가 없음, 데이터의 중복 허용하지 않음
  • Map : 키와 값으로 이루어진 데이터 집합, 순서 없음, 키의 중복 허용하지 않음
  • 가변 클래스 :
    • 초기에 데이터를 대입하면 더이상 변경할 수 없음
    • size(), get() 함수만 제공
  • 불변 클래스(mutable) :
    • 초깃값 대입 이후에도 데이터를 추가하거나 변경 가능
    • size(), get(), add(), set() 함수 이용 가능

'TodayILearned > Android&Kotlin' 카테고리의 다른 글

클래스와 생성자  (1) 2023.09.19
미세먼지 확인 앱 만들기  (0) 2023.09.18
구글 지도앱 만들기  (2) 2023.09.14
사용자 위치 얻기  (0) 2023.09.14
안드로이드 앱의 기본 구조  (2) 2023.09.14