안녕하세요 Samuel 입니다.
본 자료는 Do it! 코틀린 프로그래밍 (Kotlin Programming)을 수강하며 모든 내용이 아닌, 새롭게 알게된 내용이나 기억하고자 하는 내용을 정리한 요약본입니다. 공부하려고 결제한 인강인데 아까워서라도 끝까지 봐볼라구요! 😎
변수와 자료형 연산자
코틀린 패키지
패키지 정의
- 자바 프로젝트처럼 디렉터리와 매치 되어야 하는것은 아니다.
- import의 이름이 충돌하면 as 키워드로 로컬에서 사용할 이름을 변경해서 충돌을 피할 수 있다.
- import는 클래스 뿐만 아니라 다른것도 임포트 할 수 있다.
- 최상위레벨 함수와 프로퍼티, 오브젝트 선언의 함수와 프로퍼티 , 열거형 상수
// import의 이름이 충돌하면 as 키워드로 로컬에서 사용할 이름을 변경해서 충돌을 피할 수 있다.
import com.example.edu.Person
// com.example.edu.Person을 User로 지정
import com.example.edu.Person as User
//자바 프로젝트처럼 디렉터리와 매치 되어야 하는것은 아니다.
package com.example.edu
//위의 패키지는 edu를 나타내지만 아래의 클래스는 Person으로 디렉터리와 매치 되어야 하는것은 아니다.
class Person(val name: String, val age:Int)
...
kotlin-stdlib-sources.jar (기본패키지 : 코틀린 표준 라이브러리)
패키지 이름 | 설명 |
kotlin.* | Any, Int, Double 등 코어 함수와 자료형 |
kotlin.text.* | 문자와 관련된 API |
kotlin.sequences.* | 컬렉션 자료형의 하나로 반복이 허용되는 개체를 열거 |
kotlin.ranges.* | If문이나 For문에서 사용할 범위 관련 요소 |
kotlin.io.* | 입출력 관련 API |
kotlin.collections.* | List, Set, Map 등의 컬렉션 |
kotlin.annotation.* | 애노테이션 관련 API |
자료형 알아보기
기본형 (Primitive data type)
- 가공되지 않은 순수한 자료형으로 프로그래밍 언어에 내장
- int, long, float, double 등
- 다른 언어의 경우 기본형 타입의 자료형을 사용할 수 있음. ex ) Java
참조형 (Reference type)
- 동적 공간에 데이터를 둔 다음 이것을 참조하는 자료형
- Int, Long, Float, Double 등
- 실제로 코틀린을 거치게 되면은 코틀린은 참조형을 기본형으로 바꿔준다. → 프로그래머가 할일은 없다.
- Kotlin은 참조형을 사용함
기본형과 참조형의 동작 원리 이해하기
- 자바의 기본형과 참조형의 원리
- 기본형으로 선언된 변수 a는 Stack에 저장이 되며 , 블록 안에서 존재하기 때문에 지역변수로 선언된다.
- 객체 참조형으로 선언된 person은 Stack에는 객체의 참조 주소가 담겨져 있으며, 실제 값은 Heap에 저장되어 있다.
- 여기서 Heap은 동적할당영역으로 객체를 생성해서 특정 공간에 둔다.
- person을 사용할때는 Stack의 주소를 통해서 동적메모리에 담긴 객체를 사용할 수 있게 된다.
- 장점으로 속도로 보게된다면, Stack안에 바로 선언되어 있는 기본형 변수 a가 빠르다.
- 하지만 단점으로 기본형과 참조형을 혼합해서 사용하다보면 서로 자료를 비교하는 부분에서 문제가 발생할 수 있다. → Kotlin에서는 이러한 문제를 해결할 수 있다.
- Kotlin에서는 컴파일러를 통하게 되면은 해당 참조형에 대한 자료형이 기본형으로 바뀌어 사용되기 때문에 최적화에 대한 문제를 프로그래머가 고민할 이유가 없다.
{
int a = 77; //기본형
Person person = new Person(); // 객체 참조형으로 person 객체를 위해 참조 주소 (A12)를 가진다.
}
자료형 검사와 변환
세이프 콜과 엘비스 연산자를 활용해 null을 허용
더 안전하게 NPE를 막는 방법
- str1?.length?: -1
fun main() {
var str1 : String? = "Hello Kotlin"
str1 = null
println("str1 : $str1 length: $str1?.length ?: -1 }") // 세이프 콜과 엘비스 연산자를 활용
기본형과 참조형 자료형의 비교 원리
이중 등호 (==)와 삼중 등호(===)의 사용
- == 값만 비교하는 경우
- === 값과 참조 주소를 비교할때
val a : Int = 128
val b : Int = 128
println(a == b) // true
println(a === b) // true
더보기
💡 a와 b는 Int로 선언되어 있으므로 Int는 컴파일 후 기본형 (int)으로 바뀌며 실행할 때는 결국 스택에 들어가므로 스택에 주소가 아닌 값(128)이 동일해 주소가 동일한 것과 같은 true가 반환된다. (따라서 Int와 같은 기본형으로 바뀌는 자료형은 ===와 같은 연산은 제 역할을 하지 않는다.)
참조 주소가 달라지는 경우
/*
* a는 스택에 b는 128에 대한 주소가 담김
*/
val a : Int = 128
val b : Int? = 128
println(a == b) // true
println(a === b) // false
더보기
💡 코틀린에서는 참조형으로 선언한 변수의 값이 -128 ~ 127 범위에 있으면 캐시에 그 값을 저장함
해당 범위는 작기때문에 성능을 위해서 빠른 처리를 위해 캐시에 넣어둔다. ( 캐시에 넣어두면 해당 범위의 값에 대해서는 모두 같은 주소지를 가지고 있기 때문에 비교 연산이 True가 나온다. 그렇기 때문에 참조형에 값에 따라 비교연산의 결과가 다른 결과를 가져올 수 있다.
is 키워드를 사용한 검사
val num = 256
if( num is Int) { // num이 Int형일때
println(num)
}else if (num !is Int) { // num이 Int형이 아닐때, !(num is Int)와 동일
printlnt("Not a Int")
}
묵시적 변환
- Any
- 자료형이 정해지지 않은 경우
- 모든 클레스의 뿌리 - Int 나 String 은 Any 형의 자식 클래스이다.
- Any는 언제든 필요한 자료형으로 자동 변환 (스마트 캐스트)
'CS > Kotlin' 카테고리의 다른 글
[공식문서 + 구글링] 코틀린 let, with, run, apply, also 차이 비교 정리 (0) | 2022.03.04 |
---|---|
함수형 프로그래밍의 특징은? (0) | 2022.02.18 |