본문 바로가기
CS/Kotlin

변수와 자료형, 연산자

by upswp 2022. 3. 17.
안녕하세요 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는 언제든 필요한 자료형으로 자동 변환 (스마트 캐스트)