CODING/강의노트-부스트코스-코틀린

[부스트코스]📱코틀린 2-1 기본 자료형과 변수 선언방법 (3) 크기 범위와 기타 자료형

codingTrip 2021. 1. 22. 18:01

안녕하세요? codingTrip입니다.

오늘은 "코틀린 프로그래밍  1/2(함수편)"

1단원 코틀린의 기본을 익혀요!

2장. 변수와 자료형, 연산자

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

시작하겠습니다!

 

 

우리 지난 시간에 마지막에 배운 내용 기억 나시나요?

0.1을 1000번 더했더니 100이 아니라 100.09999.. 이런식으로 나왔었죠?

지수부와 가수부가 제한이 있기 때문에 이런 현상이 나오는 것이라고 설명해주셨습니다.

이처럼 다른 자료형에도 각각 한계가 있습니다.

 

💻 코딩해 보세요! 정수형과 실수 자료형의 최솟값과 최대값 출력하기

▷ MinMax.kt

 

chap02.section02 패키지 위에서 
Alt+Insert

minmax라는 새로운 코틀린 파일을 만듭니다.

package chap02.section02

fun main() {
    println("Byte: ${Byte.MIN_VALUE}~${Byte.MAX_VALUE}")
    println("Int: ${Int.MIN_VALUE}~${Int.MAX_VALUE}")
    println("Short: ${Short.MIN_VALUE}~${Short.MAX_VALUE}")
    println("Long: ${Long.MIN_VALUE}~${Long.MAX_VALUE}")
    println("Float: ${Float.MIN_VALUE}~${Float.MAX_VALUE}")
    println("Double: ${Double.MIN_VALUE}~${Double.MAX_VALUE}")
}

Ctrl+D 줄간복사로 위에 한 줄을 먼저 입력하고 복사를 합니다. 
Alt+Shift+더블클릭을 하면 다중선택이 되어서

두 번째 줄부터 Byte로 된 부분을 Int 등으로 동시에 바꿀 수 있습니다.

(저도 처음 해봤어요. 정말 신기하더라고요.)

실행(설정) Alt+Shift+F10를 누른 뒤,
2번째 MinmaxKt 선택합니다. 단축키로는 2를 누릅니다.

이렇게 출력하면 각각의 범위를 알 수 있습니다.
그 범위를 넘어서면 값이 잘못될 수 있습니다.
값이 넘칠 때에는 비트 연산할 때는 뒤집힙니다.
우리가 실제로 쓸 때는 컴파일러가 알아서 
다른 자료형으로 캐스팅할 수 있습니다.
(캐스팅? Casting 형변환은 프로그래밍에서 자료형을 다른 형태로 변경하는 것이라고 하네요.

출처 ko.wikipedia.org/wiki/%ED%98%95_%EB%B3%80%ED%99%98)
하지만 최소와 최대값을 알아두는게 중요하겠죠

 

👓 2의 보수란?

▷ 자료형의 최소 최대

- 음수는 2의 보수 표현을 사용해 연산됨
  - 절댓값의 이진수에 값을 뒤집고 1을 더함

예를들어 -6을 나타내고자 할 때, 
2진수0110(2)입니다.
이 값을 마이너스로 표현하기 위해
값을 먼저 뒤집습니다.
00001111로 바뀌고 0110은 1001이 됩니다.
여기에 +1을 하면
1111 1010(2)이 됩니다. 
최종적인 이 값이 바로 -6에 해당됩니다.

 

[출처] 부스트코스 코틀린 강의 자료

이것을 사용하는 이유는 무엇일까요?
우리는 제한된 비트를 가집니다. 
Byte의 경우에는 -128로 시작해서 127까지 입니다.
기준선 0을 넘어서면 맨 앞 부호비트가 뒤집힙니다.
맨 앞 비트는 부호비트입니다.
점점 값을 증가시키다가 127이 되었어요. 
그러면 맨 앞은 부호비트이기 때문에
더 이상 여기서 증가시킬 수 없죠. 
그래서 +1하는 순간 부호가 바뀌어서
-128이 되고 또 +1를 하면 -127이 되죠
환형 형태데이터의 한계 때문에 더하기만으로서 음수를 표현합니다.

왜? 제한된 자료형을 음수/양수로 나누어
최대한 사용하며 2의 보수는 가산 회로만으로 뺄셈을 표현할 수 있기 때문

2의 보수라는 방법은 컴퓨터 내부적으로 자주 사용합니다.
사실 상위 프로그래밍 할 때는 몰라도 상관없지만
그래도 내부적으로 어떤 일이 일어나는지는 알아두는 것이 좋습니다.
만일에 임베디드 계열의 비트를 다루는 경우에 유용할 수 있죠.

 

🔎 그 밖의 자료형 알아보기

▷ 논리 자료형
논리형Boolean 자료형을 사용하고요,

크기는 1비트이고, true, false 두 가지 값만 있습니다.

[출처] 부스트코스 코틀린 강의 자료

보통 변수명 앞에 is를 많이 붙입니다.
선언만 할 경우 자료형 Boolean을 반드시 명시해야 한답니다.

▷ 문자 자료형

[출처] 부스트코스 코틀린 강의 자료

문자형Char 자료형을 사용하고요.

크기는 2바이트입니다.
0에서 2의 15승-1까지 표현됩니다.
유니코드로는 u0000부터 uffff까지가 범위입니다. 
우리가 키보드 보면 A부터 Z까지 나열되어 있고 소문자 대문자 등의 기본 세트가 있습니다.
기본 세트 이외에 만일 우리가 다국어로 표현하기 위해서
유니코드로 쓰기 때문에 이 유니코드도 알 필요가 있습니다.

 

💼 문자열 자료형

▷ 문자열

String으로 선언되며 String Pool이라는 공간에 구성

문자열은 문자의 열 즉, 문자가 배열로 있는 것입니다.
예를 들어 문자열은 Hello 이렇게 5개 문자가 들어간 하나의 문자열입니다.

 

[출처] 부스트코스 코틀린 강의 자료

우리가 쓰는 코틀린JVM 공간에서 쓰기 때문에
JVM 메모리 기준을 따릅니다.
Heap이라는 동적공간에 String Pool 안에 들어갑니다.
Helloimmutable입니다.일단 변경 불가입니다.

여기서 잠깐!

선생님께서 헷갈릴 수 있는 부분이라 잠시 멈춰서 자막으로 설명해주셨어요.

var로 선언된 str1의 참조주소가변형으로 바뀔 수 있죠. (다른 것 지정가능)
다만 일단 선언되어 생성된 메모리공간인 Hello는 변경되지 않습니다. (변경 불가능)
값을 변경하려면 또 다른 새로운 공간이 만들어져서 바뀔 수 있습니다.

=는 할당 연산자인 거 아시죠?

왼쪽과 오른쪽이 같다는 것을 비교하려면 아래와 같이 사용해야 해요.

==는 만 비교, ===는 참조까지 비교합니다.
(자바는 ==으로 참조까지 비교할 수 있고 ===연산자는 없다고 하네요.)

첫 번째 println문은 str1과 str2가 같은지 보는 것입니다.
당연히 다르죠? 주소 공간이 다른 곳에 존재하는 메모리를 가르키니까요.
str1과 str3는 똑같은 참조를 가르킴으로 2개는 똑같기 때문에
===을 사용하면 True가 나옵니다.

💻 실습

 

chap02.section02 패키지 위에 마우스를 클릭하고
Alt+Insert

StringTest라는 새로운 파일을 만듭니다.

package chap02.section02

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

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

위처럼 코드를 입력합니다.

실행(설정) Alt+Shift+F10를 누른 뒤,
2번째 MinmaxKt 선택합니다. 단축키로는 2를 누릅니다. 

 

false라는 의미는 서로의 참조주소가 다름을 나타내는 것입니다. 
true라는 의미는 서로의 참조주소가 같은 공간에 있다는 것입니다.

주소는 똑같지만 변수 이름만 다른 것입니다.
var을 val로 지정한다 할지라도 같은 결과가 나온답니다.

 

🧮 표현식에서 문자열

▷ 표현식과 $ 기호 사용하여 문자열 출력하기

[출처] 부스트코스 코틀린 강의 자료

a는 1이라는 정수형으로 할당되었습니다.
하지만 이런 a를 String 자료형에서 다시 쓰게 될 때는 $a을 사용합니다.
문자열 안에서 곧바로 이 정수형에 대한 값을 사용할 수 있습니다. 
a is 1 이런 형태로 함께 문자열이 되는 것입니다.

문자열 자체가 된거죠.

[출처] 부스트코스 코틀린 강의 자료

${a+2}을 보면 a는 1이라고 했으니 1+2라는 수식이 먼저 연산이 되어서 3이 되고,

최종값이 String이 되어서 str2에 담겨지게 됩니다.

 

만약 출력 시 "" 마크를 같이 보여주고 싶으면
역슬레시 \를 함께 사용하면(\") ""을 보여줄 수 있답니다.

 

 

자, 이번 시간에 이렇게 마무리가 되었네요.

정말 짧은 강의 시간 동안 많은 것들을 배운 것 같습니다.

게인적으로 저는 ==과 ===가 신기했어요.

자바에서는 ===라는 기호가 없었거든요.

 

선생님께서 우리들이 헷갈릴 수 있는 점을 집어서

잠시 멈춘 상태로 자막으로 넣어주신 점이 좋았어요..  
강의를 들으면서 순간 이게 무슨 소리지? 하고 의아했거든요.

캐스팅? 임베디드 계열의 비트? 

선생님께서 강의 중간에

잠시 지나가시는 말씀으로 하셨던 용어인데요.

이런 표현은 그냥 지나칠 수도 있지만

잘 모르는 사람들에게는 생소하기에

작게 자막으로나마 알려주시면 좋을 것 같아요.

검색을 해도 제가 이해한 게 맞는 건지 잘 모르겠더라고요.

 

다양하게 용어와 개념을 배우니까

머리는 조금 아프지만 마음은 뿌듯하네요.

 

그럼 다음 시간에 만나요.

 

 

부스트코스 서포터즈 3기 codingTrip