별의 공부 블로그 🧑🏻‍💻
728x90
728x170

자료형과 변수

자료형과 변수

자료형

  • Int
  • String
  • Float
  • ...

 

변수

  • val (Value) : 불변형(Immutable)
  • var (Variable) : 가변형(Mutable)

 

변수의 선언

val username:   String = "Kildong"
선언 키워드 변수 이름   자료형  

 

변수 선언 예

val username = "Kildong"   // 자료형을 추론하여 String 으로 결정
var username               // 자료형을 지정하지 않은 변수는 사용할 수 없음.
val init: Int              // 사용 전 혹은 생성자 시점에서 init 변수를 초기화 해야 함.
val number = 10            // number 변수는 Int 형으로 추론

 

여기서 주의할 점은, var username 과 같이 자료형을 지정하지 않은 변수는 사용할 수 없다는 점이다. 다음과 같이 끊어서도 사용할 수도 없다.

var username
username = "Kildong"    // Compile Error!

 

변수 이름 생성 규칙

  • 변수 이름은 123abc 와 같이 숫자로 시작하면 안 된다.
  • 변수 이름에는 while, if 와 같이 코틀린에서 사용되는 키워드는 사용할 수 없다.
  • 변수 이름은 의미 있는 단어를 사용하여 만드는 것이 좋다.
  • 여러 단어를 사용하여 변수 이름을 지을 경우, 카멜 표기법(Camel Expression)을 사용하라.

 

변수명

  • 일반 변수, 함수명 등은 단봉 낙타와 같은 카멜 표기법을 사용한다.
camelCase
numberOfBooks
myFirstNumber
manyVariableCamelCase
myFunction

 

  • 클래스, 인터페이스 등은 쌍봉 낙타 혹은 파스칼 표기법(Pascal Expression)을 사용한다.
AnimalCategory
CarEngine

 

자료형 알아보기

기본형(Primitive Data Type)

  • 가공되지 않은 순수한 자료형으로 프로그래밍 언어에 내장
  • int, long, float, double

 

참조형(Reference Type)

  • 동적 공간에 데이터를 둔 다음 이것을 참조하는 자료형
  • Int, Long, Float, Double

 

당연히 기본형이 성능이 더 좋다! 코틀린에서는 참조형만 사용하도록 하고 있는데, 사용 시 컴파일 과정에서 기본형으로 변환된다. 코틀린에서는 참조형을 선언해서 사용하지만, 컴파일 과정을 거치면 기본형 같이 사용한다.

 

기본형과 참조형의 동작 원리 이해하기

  • 자바의 기본형과 참조형의 원리
int a = 77;    // 기본형
Person person = new Person();    // 객체 참조형으로, person 객체를 위해 참조 주소(A12)를 가진다.

이미지 출처 : 코틀린 프로그래밍 기본 1 (부스트코스)

 

 

기본형 자료형은 스택(Stack) 영역에 쌓이게 되고, 참조형 자료형은 힙(Heap) 영역에 쌓이게 된다.
정적 자료형스택에, 동적 자료형에 쌓인다는 것을 기억하자!

 

  • 코틀린에서는 코딩 시 참조형만 사용되며, 코틀린 컴파일러가 자동적으로 최적화한다.
  • 컴파일 과정을 거친 후 기본형이 사용된다.

 

정수 자료형 

  • 음수가 사용되는 부호 있는 정수 자료형
형식 자료형 크기 값의 범위
정수 자료형 Long 8 Bytes (64 Bits) $-2^{63} ~ 2^{63}-1$
Int 4 Bytes (32 Bits) $-2^{31} ~ 2^{31}-1$
Short 2 Bytes (16 Bits) $-2^{15} ~ 2^{15}-1(-32,768~ 32,767)$
Byte 1 Byte (8 Bits) $-2^{7} ~ 2^{7}-1(-128 ~ 127)$

 

  • 부호 없는 정수 자료형 (1.3버전 실험적)
형식 자료형 크기 값의 범위
부호 없는
정수형
ULong 8 Bytes (64 Bits) $0 ~ 2^{64}-1$
UInt 4 Bytes (32 Bits) $0 ~ 2^{32}-1$
UShort 2 Bytes (16 Bits) $0 ~ 2^{16}-1(0 ~ 65,535)$
UByte 1 Byte (8 Bits) $0 ~2^{8}-1(0 ~ 255)$

 

  • 코틀린의 정수 자료형은 부호가 있는 것과 부호가 없는 것으로 나눌 수 있다.
  • 숫자 크기에 상관 없이 기본은 모두 Int 형으로 추론된다.

 

자료형 사용 예

  • 자료형 생략
val num05 = 127                    // Int 형으로 추론
val num06 = -32768                 // Int 형으로 추론
val num07 = 2147483647             // Int 형으로 추론
val num08 = 9223372036854775807    // Long 형으로 추론

 

  • 접미사, 접두사 사용
val exp01 = 123             // Int 형으로 추론
val exp02 = 123L            // 접미사 L을 사용해 Long 형으로 추론
val exp03 = 0x0F            // 접두사 0x를 사용해 16진 표기가 사용된 Int 형으로 추론
val exp04 = 0b00001011      // 접두사 0b를 사용해 2진 표기가 사용된 Int 형으로 추론

 

  • 작은 값의 사용
val exp08: Byte = 127       // 명시적으로 자료형을 지정 (Byte)
val exp09 = 32767           // 명시적으로 자료형을 지정하지 않으면 Short 형 범위의 값도 Int 형으로 추론
val exp10: Short = 32767    // 명시적으로 자료형을 지정 (Short)

 

  • 부호 없는 정수 자료형
val uint: UInt = 153u
val ushort: UShort = 65535u
val ulong: ULong = 46322342uL
val ubyte: UByte = 255u

 

  • 큰 수를 읽기 쉽게 하는 방법 (가독성 향상)
    • 읽기 쉽게 하기 위해 언더 스코어(_)를 포함해 표현
val number = 1_000_000
val cardNum = 1234_1234_1234_1234L
val hexVal = 0xAB_CD_EF_12
val bytes = 0b1101_0010

 

실수 자료형

형식 자료형 크기 값의 범위
실수형 Double 8 Bytes (64 Bits) 약 $4.0E-324 ~ 1.7E+308$ (IEEE754)
Float 4 Bytes (32 Bits) 약 $1.4E-45 ~ 3.4E+38$ (IEEE754)

 

val exp01 = 3.14     // Double 형으로 추론 (기본)
val exp02 = 3.14F    // 식별자 F에 의해 Float 형으로 추론

 

이미지 출처 : 코틀린 프로그래밍 기본 1 (부스트코스)

 

  • 코틀린은 자료형을 명시하지 않으면 Double 형으로 추론한다.
  • 만약 Float 형으로 지정하고 싶으면 간략하게 식별자 F를 실수 옆에 붙이는 방법을 사용하면 된다.
var doubleNum = 0.03    // Double 형으로 추론
var floatNum = 0.03F    // Float 형으로 추론

 

  • 실수의 개수는 무한하지만 메모리 공간은 유한하다. 그래서 메모리에 모든 실수를 표현하기는 어렵다.
  • 이러한 메모리의 단점을 극복하기 위해 실수를 표현할 때 부동 소수점(Floating-Point) 방식을 사용한다.
    • 부동 소수점 방식은 실수를 가수, 지수로 나누어 표현하는 방식이다.
      • $3.14 × 10^{16} = 3.14E+16$
val exp03 = 3.14E-2    // 왼쪽으로 소수점 2칸 이동, 0.0314
val exp04 = 3.14e2     // 오른쪽으로 소수점 2칸 이동, 314

 

  • 컴퓨터는 음수를 표현하기 위해 2의 보수라는 개념을 사용하고 있다.
    • 컴퓨터의 연산기는 덧셈 기능의 회로만 있으며, 덧셈 기능을 뺄셈으로 구현하기 위해서 만들어진 규칙이다.

 

부동 소수점의 이해

  • 32비트와 64비트의 부동 소수점 표현

이미지 출처 : 코틀린 프로그래밍 기본 1 (부스트코스)

 

  • Float
    • 1 Bit : 부호
    • 8 Bits : 지수
    • 23 Bits : 가수
  • Double 형
    • 1 Bit : 부호
    • 11 Bits : 지수
    • 52 Bits : 가수

 

부동 소수점의 표현

  • $-12.375_{(10)}$ 의 표현
    • 음수 : $-$
      • 127 (bias) 기준으로 구분
    • 절댓값 : $12.375$
      • $1100.011_{2}$
      • $1.100011 × 2^{3}$
      • 정수부의 1 생략
      • $100011$을 가수부에 표현
      • $2^{3}$ 은 진수부에 다음과 같이 표현한다.
        • $127(bias) + 3 = 130_{(10)} = 10000010$

 

소수를 이진법으로 나타내는 방법은 다음과 같다.
참고 사이트 : https://woo-dev.tistory.com/93

 

IEEE 방식의 부동 소수점 제한

  • 공간 제약에 따라 부동 소수점 연산의 단점이 존재한다.
fun main() {
    var num: Double = 0.1
    
    for (x in 0..999) {
        num += 0.1 
    }
    
    println(num)     // 100.0.9999999999859
}

 

0.1을 1000번 더하면 100이 나와야 하지만, IEEE 방식의 부동 소수점 방식으로 계산을 할 경우 정확하지 않은 결과값이 출력된다.

 

정수 자료형과 실수 자료형의 최솟값과 최댓값 출력하기

  • MIN_VALUE 또는 MAX_VALUE 자료형 요소를 이용하여 자료형의 최솟값최댓값을 확인할 수 있다.
fun main() {
    println("Byte min: " + Byte.MIN_VALUE + " max: " + Byte.MAX_VALUE)
    println("Short min: " + Short.MIN_VALUE + " max: " + Short.MAX_VALUE)
    println("Int min: " + Int.MIN_VALUE + " max: " + Int.MAX_VALUE)
    println("Long min: " + Long.MIN_VALUE + " max: " + Long.MAX_VALUE)
    println("Float min: " + Float.MIN_VALUE + " max: " + Float.MAX_VALUE)
    println("Double min: " + Double.MIN_VALUE + " max: " + Double.MAX_VALUE)
}
Byte min: -128 max: 127
Short min: -32768 max: 32767
Int min: -2147483648 max: 2147483647
Long min: -9223372036854775808 max: 9223372036854775807
Float min: 1.4E-45 max: 3.4028235E38
Double min: 4.9E-324 max: 1.7976931348623157E308

 

2의 보수란?

자료형의 최소 최대

  • 음수는 2의 보수 표현을 사용해 연산된다.
    • 절댓값의 이진수에 값을 뒤집고 1을 더한다.
  • 예) $-6_{(10)}$
    • 6의 2진값 : $0000 0110_{(2)}$
    • 값 뒤집기 : $1111 1001_{(2)}$
    • 1을 더하기 : $1111 1010_{(2)}$
  • 2의 보수를 사용하는 이유?
    • 제한된 자료형을 음수/양수로 나누어 최대한 사용하며, 2의 보수는 가산 회로만으로 뺄셈을 표현할 수 있기 때문

이미지 출처 : 코틀린 프로그래밍 기본 1 (부스트코스)

 

그 밖의 자료형

논리 자료형

형식 자료형 크기 값의 범위
논리형 Boolean 1 Bit true, false

 

val isOpen = true           // isOpen은 Boolean으로 추론
val isUploaded: Boolean     // 선언만 한 경우 자료형(Boolean) 반드시 명시

 

문자 자료형

형식 자료형 크기 값의 범위
문자 Char 2 Bytes (16 Bits) $0 ∼ 2^{16}-1$ (\u0000 ~ \uFFFF)

 

val ch = 'c'     // ch는 Char로 추론
val ch2: Char    // 선언만 한 경우 자료형(Char) 반드시 명시

 

문자열 자료형

  • String 으로 선언되며 String Pool 이라는 공간에 구성
fun main() {
    var str1: String = "Hello"
    var str2 = "World"
    var str3 = "Hello"
    
    println("str1 === str2: ${str1 === str2}")
    println("str1 === str3: ${str1 === str3}")
}
- 코틀린에서 == 는 값만 비교하지만, === 는 '참조'까지 비교한다.
- 자바 == 으로 참조까지 비교할 수 있고, === 연산자는 없다.

- var로 선언된 str1의 참조 주소는 가변형으로, 바뀔 수 있다. (다른 것 지정 가능)
- 다만, 일단 선언돼 생성된 메모리 공간의 Hello 는 변경되지 않는다. (변경 불가능)

 

표현식에서 문자열

  • 표현식$ 기호를 사용하여 문자열 출력하기
var a = 1
var s1 = "a is $a"    // String 자료형의 s1을 선언하고 초기화. 변수 a가 사용됨.

 

  • 사용 예제
fun main() {
    var a = 1
    val str1 = "a = $a"
    val str2 = "a = ${a + 2}"    // 문자열에 표현식 사용

    println("str1: \"$str1\", str2: \"$str2\"")
}
str1: "a = 1", str2: "a = 3"

 

참고 사이트

 

코틀린 프로그래밍 기본 1

부스트코스 무료 강의

www.boostcourse.org

 

728x90
그리드형(광고전용)
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️
starrykss
starrykss
별의 공부 블로그 🧑🏻‍💻


📖 Contents 📖