본문 바로가기
안드로이드

[코틀린 Kotlin 스터디] 코틀린 기초 시작하기

by kkomaeng 2022. 1. 8.

안녕하세요, 꼬맹입니다. 부스트코스 코틀린 프로그래밍 기본1을 수강하며 정리하였습니다.


사용 가능한 플랫폼

- JVM: 모바일 앱 개발 가능

- JS: 브라우저에서 동작하는 앱 개발 가능

- Native: 윈도우, IOS, ANDROID 등 멀티 플랫폼 용 앱 개발 가능

 

코틀린의 장점

- 정적 언어: 자료형에 대한 오류를 미리 잡을 수 있음, 컴파일러가 타입을 검증

- NPE에서 자유로움: 널 포인터 익셉션으로 인한 중단 예방

- 자바와 완벽하게 상호운영이 가능

- 간결하고 효율적인 코드

- 함수형, 객체 지향 모두 가능

- 세미콜론 생략 가능

 

코틀린의 실행 진입점 main()

- 자바는 최소 하나의 클래스와 그 안에 실행가능한 main()함수가 필요함

- 코틀린은 main()함수만 있으면 실행 가능

fun main(){ //fun은 function
	println("Hello")
}

 

변수 선언

- val (value) - 불변형

- var (variable) - 가변형

fun main(){
	//선언키워드 변수이름: 자료형 = 값
	var userName: String = "kkomaeng"
	//var userName = "kkomaeng" 처럼 추론 가능한 값이 있을 시 자료형 생략 가능
    
    //var userId (x)
    var userId: String //(o) 뒤에서 꼭 초기화 필요
    
}

- 변수 이름은 숫자로 시작 불가능

- 변수 이름에 if, while 같은 키워드 사용 금지

- 이름 짓기는 카멜 표기법 사용

- 일반변수, 함수명 등 -> userName (카멜 표기법)

- 클래스, 인터페이스 등 -> UserName (파스칼 표기법)

 

문자열 표현식

fun main(){
	var a = 1
	var s1 = "a is $a" //== "a is 1"
	var s2 = "a is ${a + 1}" // == "a is 2"
}

 

null

- 코틀린의 변수 선언은 기본적으로 null 비허용, 초기화 안할 경우 컴파일 단계에서 오류, null을 허용하는 선언이 따로 필요함

fun main(){
	var str1: String
    println(str1) // 초기화 안했다고 에러 발생
    
    var str2: String?
    println(str2) // ?를 붙이면 null 허용, null이 출력됨
}

 

세이프콜 ?, non-null 단정 기호 !!, 엘비스 연산자 ?:

- 세이프콜 ? -> null이어도 NPE가 뜨지 않도록 함

- 단정기호 !! -> null이 반드시 아닐 경우 붙임, 근데 null이면 에러 호출

- 엘비스 연산자 ?: -> null인지 아닌지 검사하여 null이 아니면 왼쪽, null이면 오른쪽 식 수행 

fun main(){
	var str: String?
    str = null
    println("str: $str, length: ${str?.length}") // 둘 다 null 출력
    
    //println("length: ${str.length}")
    //str을 참조할 때 세이프콜하지 않을 경우 ?나 !!를 반드시 붙이라고 에러 출력
    
    println("str: $str, length: ${str!!.length}") // null인데 단정기호 써서 에러 발생
    
    var len = str?.length ?: -1 //null 아니면 길이로 정의 null이면 -1로 정의
}

 

자료형 변환

- 코틀린은 기본형(int, float..) 말고 참조형(Int, Float..)만 사용

- 서로 다른 자료형은 변환 과정을 반드시 거쳐야 함

fun main(){
	var a: Int =1
    var b: Double = a // 자료형 불일치 오류 발생
    var c: Int = 1.1 // 자료형 불일치 오류 발생

	var b:Double = a.toDouble() //변환 메소드를 사용하여 할당하는 올바른 방법
 	// 변환 메소드는 보통 to자료형()으로 생김
    
    var c = 1L + 3 // 자료형을 명시하지 않을 경우 추론하여 결정, 1L은 Long 타입, 결과도 Long 타입
}

 

자료형 비교, 검사

- 이중 등호 == : 값만 비교 (반대는 !=)

- 삼중 등호 === : 값과 상관없이 참조 주소까지 비교 (자바는 ==가 ===와 같음) (반대는 !==)

- is 키워드 : 자료형 검사

fun main(){
	val a:Int = 128
	val b:Int = 128
	val c:Int? = 128
    
	println(a==b) //true
	println(a===b) //true
	println(a==c) //true
	println(a===c) //false
    
	if(a is Int){
		print(a) //128
	}else if(a !is Int){
		print("Not Int")
	}
}

- 참조형의 경우 객체로써 힙에 메모리가 할당되기 때문에 a와 b의 주소 값이 같음, b와 c의 주소 공간은 다름 

 

스마트 캐스트

- Number형을 사용하면 숫자 값에 알맞은 자료형으로 스마트 캐스트됨

- Any형은 모든 클래스의 뿌리, 언제든 필요한 자료형으로 스마트 캐스트됨

fun main(){
	var test:Number = 12.2 // Float
 	test = 12 // Int
 	test = 120L // Long
 	test += 12.0f // Float
}

댓글