변수와 자료형, 연산자


본 게시글은 부스트코스의 코틀린 기본프로그래밍을

시청한 후 학습한 정보를 기록하는 목적의 게시글입니다.

부스트코스

 

다 함께 배우고 성장하는 부스트코스

부스트코스(boostcourse)는 모두 함께 배우고 성장하는 비영리 SW 온라인 플랫폼입니다.

www.boostcourse.org

코틀린 기본프로그래밍(1/2)

 

코틀린 프로그래밍 기본1/2(함수편)

부스트코스 무료 강의

www.boostcourse.org

본 게시글은 부스트코스 서포터즈 3기 활동 게시글입니다.


#2-1. 기본 자료형과 변수 선언방법 (1) 불변형, 기본형

- 들어가기 전에

본격적으로 변수와 자료형에 대해 이야기할 시간입니다. 변수란 값을 넣을 수 있는 상자 정도로 비유할 수 있습니다. 코틀린에는 많은 언어에서 사용하는 기본형과 특수한 형의 자료형이 있으므로 함께 알아봅시다.

- 핵심 키워드

  • 불변형(val) 및 가변형(var) 선언
  • 카멜표기법
  • 기본형과 참조형

 

1) 자료형과 변수의 선언

  • val(value) - 불변형 //값의 선언 이후 수정 불가
  • var(variable) - 가변형
val username: String = "Kildong"
//선언키워드 변수이름 : 자료형 = "값"

문자열 내에 변수나 식을 ${변수나 식}을 통해 나타낼 수 있다.

fun main(){
    val username: String = "Kildong"
    println("username: $username")
}

 

2) 변수명의 예

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

!변수 선언 시 유의 사항

  • 변수 이름은 숫자로 시작할 수 없다
  • 변수 이름에는 while, if와 같이 코틀린에서 사용되는 키워드는 사용할 수 없다
  • 여러 단어를 사용하여 변수 이름을 지을 경우 카멜 표기법(Camel Expression)을 사용하여야 한다.

 

3) 카멜 표기법

변수 명의 단어가 변경되는 시점에서 첫글자를 대문자로 선언하는 것.

  • camelCase
  • numberOfBooks
  • myFirstNumber

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

  • AnimalCategory
  • CarEngine

 

4) 기본형과 참조형

기본형(Java) : 가공되지 않은 순수한 자료형

ex) int, ling, float, double 등

코틀린에서는 기본형 자료형을 사용하지 않는다!

더보기

 보통 프로그래밍 언어의 자료형은 기본형 자료형과 참조형 자료형으로 구분하며 코틀린은 참조형 자료형을 사용합니다.

 기본형(Primitive Data Type)은 말 그대로 가공되지 않은 순수한 자료형을 말하며 프로그래밍 언어에 내장되어 있습니다. 참조형(Reference Type)은 객체를 생성하고 동적 공간에 데이터를 둔 다음 이것을 참조하는 자료형을 말합니다 . 자바에서는 int, long, float, double 등 기본형과 String, Date와 같은 참조형을 모두 사용하지만 코틀린에서는 코딩할 때는 참조형만 사용하며 이것은 다시 코틀린의 성능 최적화에 따라 JVM에 실행하기 위해 코틀린 컴파일러에서 기본형으로 대체됩니다.

참조형 : 동적 공간에 데이터를 둔 다음 이것을 참조하는 자료형

Int, Long, Float, Double

>> 참조형 변수는 클래스 형태로 만들어진 ` 객체 `이다. (동적 메모리 공간에 위치)

 

5) 기본형과 참조형의 원리

기본형이라 함은 Stack 메모리에 값이 저장되어 있고,

참조형이라 함은 Stack 메모리 내에 주소가 저장되어 있으며,

그 주소는 Heap의 특정한 공간(사용자가 지정해줄 순 없다.)에 위치해 있다.

https://nickolasteixeira.medium.com/stack-vs-heap-whats-the-difference-and-why-should-i-care-5abc78da1a88

결국 코틀린은 이러한 참조형 데이터를 이용하는 언어이다.

여기서 메모리 Stack에 대해 개념적으로 보충이 필요하다면, 아래의 게시글들을 참조하자.

What is Memory Stack in Java?

 

Java Stack and Heap: Java Memory Allocation Tutorial

In this JavaScript Unit Testing tutorial, we will learn: What is JavaScript? JavaScript is a...

www.guru99.com

Java Stack and Heap - Java Memory Management

(www.youtube.com/watch?v=450maTzSIvA&feature=emb_logo)

! 메모리 스텍 (in Java) 정리

Stack Memory : Java의 스택은 메서드, 지역 변수 및 참조 변수를 포함하는 메모리 섹션

Heap Memory : Heap은 객체를 초함하고 참조 변수도 포함할 수 있는 메모리 섹션

  • 메서드가 호출되면 스택 맨 위에 프레임이 생성
  • 메서드 실행이 완료되면 제어 흐름이 호출 메서드로 돌아가고 해당 스택 프레임이 flush
  • 스택에 로컬 변수가 생성됩
  • 인스턴스 변수는 힙에 생성되며 해당 변수가 속한 개체의 일부
  • 참조 변수는 스택에 생성

 

#2-1. 기본 자료형과 변수 선언방법 (2) 정수형과 실수형

- 들어가기 전에

본격적으로 변수와 자료형에 대해 이야기할 시간입니다. 변수란 값을 넣을 수 있는 상자 정도로 비유할 수 있습니다. 코틀린에는 많은 언어에서 사용하는 기본형과 특수한 형의 자료형이 있으므로 함께 알아봅시다.

- 핵심 키워드

  • 정수형(Byte, Short, Int, Long)
  • 실수형(Float, Double)
  • 부호없는 자료형
  • 실수형의 표현범위 제한
     

1) 정수형 자료형 알아보기

정수형 - 음수가 사용되는 부호 있는 자료형

  • Long 8byte
  • Int 4byte
  • Short 2byte
  • Byte 1byte

정수형 - 부호 없는 자료형

 

  • ULong 8byte
  • UInt 4byte
  • UShort 2byte
  • UByte 1byte

 

 

 

2) 자료형 사용의 예

자료형 생략

val num05 = 127 //Int형으로 추론
val num06 = -32768 //Int형으로 추론
val num07 = 2147483647 // Int형으로 추론
val num08 = 1234567898764321 //Long형으로 추론

접미사 접두사 사용

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

작은 값의 사용

val exp08:Byte = 123 // 명시적으로 자료형을 지정
val exp09 = 32767 // 명시적으로 자료형을 지정하지 않으면 short형의 범위의 값도 Int형으로 추론
val exp10:Short = 32767 //명시적으로 자료형을 지정

 

3) 부호없는 자료형

부호없는 자료형의 선언 역시 접미사 혹은 접두사를 통해 선언할 수 있다.

또 숫자 사이 구분자로 언더바(_) 표기가 허용된다.

 

4) 실수 표현형

  • Double 8바이트
  • Float 4바이트
val exp01 = 3.14 // 기본적으로 Double형으로 추론
val exp02 = 3.14F // 식별자 F에 의해 Float형으로 추론

 

5) 부동 소숫점의 표현

https://www.boostcourse.org/mo132/lecture/61118

 

6) 공간제약에 따른 부동 소숫점 표현의 제한

fun main() {
    var num : Double = 0.1
    
    for(x in 0..999) {
        num += 0.1
    }
    
    println(num) //100.099999999_999859
}

num의 값이 100이 나올 것 같지만, 실제로는 소수점부가 포함된 수가 출력됨을 알 수 있다.

! 읽어 볼 거리

Floating point math in different programming languages

 

Floating point math in different programming languages

I know that floating point math can be ugly at best but I am wondering if somebody can explain the following quirk. In most of the programing languages I tested the addition of 0.4 to 0.2 gave a sl...

stackoverflow.com

 

#2-1. 기본 자료형과 변수 선언방법 (3) 크기 범위와 기타 자료형

- 들어가기 전에

본격적으로 변수와 자료형에 대해 이야기할 시간입니다. 변수란 값을 넣을 수 있는 상자 정도로 비유할 수 있습니다. 코틀린에는 많은 언어에서 사용하는 기본형과 특수한 형의 자료형이 있으므로 함께 알아봅시다.

- 핵심 키워드

  • 각 자료형의 최대 최솟값
  • 2의보수
  • 논리 자료형(Boolean)
  • 문자 자료형(Char)
  • 문자열 자료형(String)
  • String Pool

 

1) 각 자료형 최대 최솟값 알아보기 예제

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)
}

프로그램을 효율적으로 만들려면 메모리 공간을 효율적으로 활용하여야 한다.

따라서, 각 데이터 타입별 데이터 최댓값과 최솟값을 알고 있다면 유용하게 사용할 수 있다.

비단 암기하기 보다는 코틀린에서 직접 출력하는 방법을 익히도록 하자.

 

2) 2의 보수란?

2의 보수란? - 위키 백과

 

2의 보수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 2의 보수(--補數, 영어: two's complement)란 어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수이다. 2의 보수는 대부분의 산술연산에서 원래 숫자의 음수처럼 취급

ko.wikipedia.org

Byte란 자료형에 변수 127이 들어있을 때 여기에 1을 더하게 된다면,

비트 연산에 의해 가장 상단의 비트인 부호 비트가 바뀌고 값은 -128이 된다.

비트 연산 - 위키 백과

 

비트 연산 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기

ko.wikipedia.org

2진수 음수 표현

http://www.ktword.co.kr/abbr_view.php?m_temp1=4088

 

3) 그 밖의 자료형

- 논리 자료형

참, 거짓을 표현하는 자료형으로써 조건을 검사할 때 주로 사용된다.

(다른 언어와 마찬가지로 true, false 두 가지 값만 가지고 있다.)

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

 

- 문자 자료형

Char은 문자를 표현하기 위해 사용하며 문자 자료형의 값은 작은따옴표(')로 감싸 표현한다.

문자 자료형은 1개의 문자만 저장할 수 있다. 

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

//ASCII코드
val ch = 'a'
println(ch + 1) // b

val chNum: Char = 65 // 에러! 숫자를 사용하여 선언하는 것은 금지

//정수를 사용한 문자의 저장
val code: Int = 65
val chFromCode: Char = code.toChar() // code에 해당하는 문자를 할당
println(chFromCode) // 결과는 A

컴퓨터는 문자 자료형의 값을 저장할 때 문자 세트를 참고하여 번호로 저장한다.

단, 문자를 선언할 때 번호가 아닌 문자로 선언하여야 한다.

! 문자 세트 - ASCII 코드

 

ASCII - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 1972 프린터 사용 설명서에 개시된 아스키 코드 차트표 미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII( , 아스키)는 영문

ko.wikipedia.org

 

4) 문자열 자료형

문자 자료형은 한개의 문자만 저장할 수 있는 한계가 있었다.

여러 문자를 저장하기 위해서는 문자 자료형을 사용할 필요가 있다.

문자열 자료형은 문자 자료형에서 더 나아가 여러 문자를 배열하여 저장할 수 있는 자료형이다.

자형인 Char은 char과 같은 기본형으로 처리되지만,

문자열 자료형은 기본형에 속하지 않는 배열 형태로 되어있는 특수한 자료형이다

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

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

https://www.boostcourse.org/mo132/lecture/61254

str1, str3에는 같은 문자열이 저장되어 있다.

이 경우는 Hello를 메모리에 두 번 저장하는 것보다 이미 저장된 값을 활용하는 것이 효율적일 텐데,

코틀린은 힙 메모리 영역의 String Pool이라고 부르는 공간에 문자열인 Hello를 저장해두고

이 값을 str1, str3이 참조하게 된다,

결과적으로 str3의 참조 주소는 str1과 동일해 참조 비교를 위해 연산자 ===를 사용하면 true가 반환된다. 

 

5) 표현식과 문자열

var a = 1
val 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\"")
}

위 코드는 이스케이프 문자를 사용해 큰따옴표를 문자열 안에 표기하고 있는데,

이스케이프 문자는 역슬래시를 붙여 표현하는 특수 문자 표기법이다.

val special = "\"hello\", I have \$15"
println(special) // "hello", I have $15

Escape ${something} in a Kotlin String

 

Escape ${something} in a Kotlin String

What is the correct way of defining a Kotlin string that includes the characters for declaring a template substitution, but not have this evaluated as a template? For example: "${something}" just

stackoverflow.com

Kotlin - Doc

 

Basic Types: Numbers, Strings, Arrays - Kotlin Programming Language

 

kotlinlang.org

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기