[Kotlin] 2. 변수와 자료형, 연산자

문상훈·2022년 7월 12일
0

Kotlin

목록 보기
3/7

🛴 02. 변수와 자료형, 연산자

📌 02-1 코틀린 패키지

코틀린 프로젝트, 모듈, 패키지, 파일의 관계 이해하기

코틀린 프로젝트여행 🚞에 비유하면, 모듈목적지 🗽🌆, 패키지여행용 가방👜🎒, 파일가방 속에 넣은 짐 👙🎲🎧

📦 HelloKotlin
 ┣ 📂com.example.edu
 │ㅤ│ㅤ┕ 📑 control.kt
 │ㅤ┕ HelloKotlin.kt
 ┣ 📂OtherModule
 │ㅤ┕ㅤ📑 Other.kt
  • 대규모 프로젝트를 진행할 때는 기능을 모듈로 분리하여 관리

  • 코틀린 파일은 .kt 확장자를 가지며, 파일의 맨 위에는 이 파일이 어떤 패키지에 포함된 것인지 코틀린 컴파일러가 알 수 있도록 패키지 이름을 선언해야 한다.

  • default 패키지는 src 폴더에 따로 패키지 이름이 지정되지 않은 파일이다.

    • 패키지 이름을 선언하지 않으면 그 파일은 자동으로 default 패키지에 포함된다.
      📍 src 폴더에 저장된 Hello.Kotlin.kt 파일은 defalut 패키지에 포함된 것이다.
  • 코틀린은 자바처럼 클래스 이름과 파일 이름이 동일해야 하고 public 클래스는 하나만 사용해야 하는 등의 규칙이 없다.
    📍 코틀린에서는 파일 이름과 클래스의 선언개수를 신경쓰지 않음
    📍 같은 파일에 있는 여러 개의 클래스는 모두 그 파일에서 지정한 패키지로 인식

패키지를 만들어야 하는 이유

📍 같은 파일명이라도 패키지가 다르면 오류가 발생하지 않는다.


코틀린 프로젝트에 패키지 만들기

패키지 이름 정하기

  • 패키지 이름은 특수문자나 숫자로 시작하면 안된다.
  • 여러 단계의 분류가 필요하면 점(.)을 붙여 이름을 지으면 된다.
    📍 패키지 이름을 지을때는 다른 이름과 중복되지 않도록 웹사이트 주소 이름을 짓는 방식을 많이 사용한다.
    📍 주소 이름이 acaroom.com이라면 pacakage com.acaroom !!

패키지 만들어 코틀린 파일 추가하기


📂kotlin 밑에 new package com.example.edu를 만들어준 결과

-> '.' 을 기준으로 하위 폴더가 생성되어 있는 것을 확인할 수 있음

📍 여기서 주목할 것

  1. 파일 이름과 클래스 이름이 같으면 Project창에서 파일의 확장자를 표시하지 않음
    📑 Person.kt
package com.example.edu

class Person (val name: String, val age: Int)
  • 파일의 이름과 Person class의 이름이 Person으로 같아 Project 창에서 .kt 가 생략 됨
    📑 File1.kt
class Person (val name: String, val age: Int)
  • 여기선 생락되지 않고 .kt가 나타남
  1. 패키지만 다르면 같은 이름의 class를 만들어도 오류가 나지 않음 !!

기본 패키지 활용하기

기본 패키지 : 코틀린으로 프로그램을 만들 때 자주 사용하는 클래스와 함수 등을 미리 만들어 놓은 것

  • 패키지는 import로 선언하여 사용 -> 기본 패키지는 선언하지 않아도 사용 가능
패키지 이름설명
kotlin.*Any, Int, Double 등 핵심 함수와 자료형
kotlin.text.*문자와 관련된 API
kotlin.sequences.*컬렉션 자료형의 하나로 반복이 허용되는 개체를 열거
kotlin.ranges.*if문이나 for문에서 사용할 범위 관련 요소
kotlin.io.*입출력 관련 API
kotlin.collections.*List, Set, Map 등의 컬렉션
kotlin.annotation.*애노테이션 관련 API

사용자 클래스 가져오기

import 패키지 이름
📍 가져온 패키지에서 같은 이름의 class가 있는 경우에는 뒤에 as 별명을 붙여주면 됨


📌 02-2 변수와 자료형

변수값을 넣을 수 있는 상자 📦

변수를 선언하고 자료형 추론하기

  • val : 최초로 지정한 변수의 값으로 초기화 더이상 값을 바꿀 수 없음
  • var : 최초로 지정한 변수의 초깃값이 있더라도 값을 바꿀 수 있음

변수를 선언하는 방법

val username: String = "Jimuk" // 선언키워드 변수명 자료형 값 
  • 코틀린은 자료형을 추론함
  • 자료형을 지정하지 않은 변수는 반드시 자료형을 추론할 값을 지정해야 함
    자료형을 안 적을거라면 값이라도 넣어라

변수 이름 지을 때 주의사항

  1. 변수이름은 숫자로 시작하면 안된다 123abc ❌
  2. 코틀린에서 사용되는 키워드는 쓸 수 없다 while, if ...
  3. 의미 있는 단어를 사용해서 만드는 것이 좋다.
  4. 여러 단어를 사용하여 변수 이름을 지을 때 카멜 표기법을 사용하는 것이 좋다.

카멜 표기법? 🐪🐫
👉 여러 단어로 된 변수 이름을 지정할 때 첫 번째 글자는 소문자로 쓰고 나머지는 각 단어의 첫 번째 글자를 대문자로 써서 구별하는 방법 numberOfBooks


자료형 알아보기

코틀린의 자료형은 참조형 자료형을 사용한다.

  • 기본형 : 가공되지 않은 순수한 자료형, 프로그래밍 언어에 내장
  • 참조형 : 객체를 생성하고 동적 메모리 영역에 데이터를 둔 다음 이것을 참조하는 자료형
    📍 코틀린에선 참조형만 사용한다.

    참조형으로 선언한 변수는 성능 최적화를 위해 코틀린 컴파일러에서 다시 기본형으로 대체됨
    -> 코틀린에서는 참조형을 기본형으로 고려하는 등의 최적화를 신경쓰지 않아도 됨

기본형과 참조형의 동작원리

  • 기본형 : 메모리인 스택에 값이 저장 / 값이 저장된 메모리의 크기도 고정
  • 참조형 : 스택에 참조 주소가 저장 / 실제 객체는 동적 메모리인 Heap에 저장
    java는 기본형과 참조형을 둘 다 사용하는데, 기본형이 참조형보다 코드 수행 시간이 빠르다.

    🤔 참조형만 사용하는 코틀린은 속도가 더 느릴까? 🤷‍♂
    코틀린은 컴파일 과정을 거치며 참조형이 기본형으로 바뀐다.
    -> 코틀린 컴파일러가 자동으로 최적화를 수행

📚 정수 자료형

자료형크기
Long8 byte (64bit)
Int4 byte(32bit)
Short2 byte (16bit)
Byte1 byte (8bit)
  • 보통 자료형은 Int로 추론되기 때문에 다른 자료형을 쓰고 싶으면 직접 자료형을 명시하면 됨
val ex01: Byte = 127
val ex02: Short = 6321

🔍 부호가 없는 경우

자료형크기
ULong8 byte (64bit)
UInt4 byte(32bit)
UShort2 byte (16bit)
UByte1 byte (8bit)

코틀린에서는 언더스코어로 자릿값을 구분할 수 있다.
val number = 1_000_000_000 -> 값이 길어 읽기 힘들 때 사용 (값에 영향을 주지 않음)

📚 실수 자료형

자료형크기
Double8 byte (64bit)
Float4 byte (32bit)
  • 자료형을 명시하지 않으면 Double형으로 추론함 -> 식별자에 F를 붙으면 Float형으로
val ex03 = 3.14F

📚 논리 자료형

자료형크기값의 범위
Boolean1 bittrue, false

📚 문자 자료형

자료형크기
Char2 byte (61bit)
  • 컴퓨터가 문자 자료형을 저장할 때 문자세트 (아스키코드 표, 유니코드 표)를 참고하여 번호로 저장한다.
    컴퓨터는 A를 65로 저장
    📍 코틀린에서 문자 자료형을 선언할 때는 문자 값으로 A로 선언

문자열 자료형 알아보기

문자열 자료형 : 문자 자료형에서 더 나아가 여러 문자를 배열하여 저장할 수 있는 자료형
📍 문자 자료형인 Char는 char와 같은 기본형으로 처리되지만, 문자열 자료형은 기본형에 속하지 않는 배열 형태로 이루어진 특수한 자료형

문자열 자료형 선언과 저장 방식 이해하기

fun main() {
    var str1: String = "Hello"
    var str2: String = "World"
    var str3: String = "Hello"

    println("str1 === str2: ${str1 === str2}")
    println("str1 === str3: ${str1 === str3}")
}

str1 === str2: false / str1 === str3: true

📍 코틀린은 Heap영역에 String Pool이라는 공간에 문자열 Hello를 저장해두고 str1, str3가 참조하도록 만듦
-> 메모리 공간을 재활용함

  • 변수의 값이나 표현식을 문자열 안에 넣어 출력하려면 $ 기호를 사용하면 된다.
var a = 1
var s1 = "a is $a"
var s2 = "a is ${a +2}"

a is 1 / a is 3 출력

  • ", $를 출력하고 싶을 땐 \, {} 를 사용한다.
  • 다중 문자열 출력할 땐 """ 로 감싼다.
  • 자료형에 별명을 붙이고 싶을 땐 typealias 키워드를 사용한다.
typealias Username = String
val user Username = "Jimuk"

📌 02-3 자료형 검사하고 변환하기

  • 코틀린은 변수를 사용할 때 반드시 값이 할당되어 있어야 한다는 원칙이 있다.
  • 코틀린에서는 null인 상태인 변수를 허용하려면 ?를 사용해 선언해야 한다.
  • NullPointerException (NPE) : 변수나 객체의 초기화가 이루어지지 않은 상태에서 그 변수에 접근할 때 발생하는 예외 오류

null을 허용한 변수 검사하기

  • 변수에 null 할당을 허용하려면 자료형 뒤에 ?를 명시한다.
fun main() {
    var str1: String? = "Hello Kotlin"
    str1 = null
    println("str1: $str1")
}

null 허용 여부에 따라 StringString?은 서로 다른 변수이다.

세이프 콜과 non-null 단정 기호를 활용하여 null을 허용한 변수 사용하기

  • 세이프 콜 : null이 할당되어 있을 가능성이 있는 변수를 검사하여 안전하게 호출하도록 도와주는 기법
    • 변수이름 뒤에 ?.를 붙여주면 된다.
    • null이 아니면 str1의 값을 읽고, null 이면 null을 그대로 출력한다.
      📍 null인지 아닌지 검사하겠다.
  • non-null : 변수에 할당된 값이 null이 아님을 단정하므로 컴파일러가 null 검사 없이 무시한다.
    • 변수이름 뒤에 !!.를 붙여주면 된다.
    • 변수에 null이 할당되어 있어도 컴파일은 잘 진행된다. but 실행 중에 NPE를 발생시킨다.
      📍 일단 null이 아니라고 생각한다.

세이프 콜과 엘비스 연산자를 활용해 null을 허용한 변수 더 안전하게 사용하기

  • 엘비스 연산자 : 변수가 null인지 아닌지 검사하여 null이 아니라면 왼쪽 식을 그대로 실행하고 null이라면 오른쪽 식을 실행한다.
    • ?:
      옆으로 보면 엘비스 머리 같아서 이렇게 생겼단다 .. 귀여운 개발자들..
      📍 null이 아니면 왼쪽, null이면 오른쪽
fun main() {
    var str1: String? = "Hello Kotlin"
    str1 = null
    println("str1: $str1 length: ${str1?.length ?: -1}")
}

str1: null length: -1 : null이라 오른쪽 식 출력


자료형 비교하고 검사하고 변환하기

  • 코틀린의 자료형은 모두 참조형으로 선언한다.
  • 코틀린에서는 자료형이 서로 다른 변수를 더하거나 뺄 수 없다.
    • 자바에서는 가능
      int a = 1;
      double b = a;
      결국 b에는 1이 아닌 1.0이 할당된다.
    • 코틀린에서는 자료형 변환 메서드를 사용한다.
      val a: Int = 1
      val b: Double = a.toDouble()
      toByte, toFloat, toLong, toDouble, toShort, toChar, toInt

기본형과 참조형 자료형의 비교 원리

  • == (이중등호) : 단순히 값만 비교
  • === (삼중등호) : 참조 주소를 비교

📍 null을 허용한 변수는 같은 값을 저장해도 이중 등호와 삼중 등호를 사용한 결과값이 다르다.

Int형으로 선언하면 기본형으로 변환되어 스택에 값 저장
Int?형으로 선언하면 스택에 힙의 참조주소가 저장

스마트 캐스트 알아보기

스마트 캐스트 : 컴파일러가 자동으로 형변환을 한다. 대표적으로 Number형이 있다.

  • Number형을 사용하면, 숫자를 저장하기 위한 특수한 자료형 객체를 만든다.
    📍 저장되는 값에 따라 정수형, 실수형 등으로 자료형이 변환됨

자료형 검사하기

  • is 키워드 사용

as에 의한 스마트 캐스트

as : 형 변환이 가능하지 않으면 예외를 발생시킨다.

묵시적 변환

Any형 : 자료형이 특별하게 정해지지 않은 경우에 사용한다.
📍 필요한 자료형으로 자동 변환된다.


📌 02-4 코틀린 연산자

기본 연산자

📚 산술 연산자 +, -, *, /, %
📚 대입 연산자 -,+=, -=, *=, /=, %=
📚 증가, 감소 연산자 ++, --
📚 비교 연산자 >, <, >=, <=, ==, != , ===, !==

  • ===, !== 는 참조주소가 같은지 다른지 비교하는 연산자이다.

📚 논리 연산자 &&, ||, !
📚 비트 연산자 shl, shr, ushr, and, or, xor, inv

  • 연산 속도가 빠르다는 장점이 있다.
profile
내가 왜 개발잔거지

0개의 댓글