JAVA

자바 기초부터 차근차근(2)

코드마 2020. 3. 15. 15:36

※ 이전에 이어서 글을 쓰겠다.

※ 이번엔 변수, 자료형에 대해 알아보자.

※ 까먹는 경우가 많으니 자주 사용하거나 자주 보면서 외우도록 하자.


변수와 자료형

데이터의 저장과 참조를 위해 '할당된 메모리 공간'에 붙인 이름을 '변수'라 한다.

 

컴퓨터에 메모리가 있다는 것은 다들 아는 사실이다.

컴퓨터는 자료나 데이터를 사용할 때 메모리에 저장해두었다가 필요할 때 꺼내 쓰는 방식이다.

 

그래서 그 메모리에 접근하기 위해 메모리 공간을 할당받아야 된다. 그래야 사용할 수 있기 때문이다.

 

이때 사용되는 것이 '변수(Variable)'이다.

 

코드상에서 변수라는 것을 선언하면 메모리 공간이 할당된다.

예를 들어보면 다음과 같다.

 

"정수를 저장하기 위해 메모리 공간을 할당하고, 그 메모리공간 이름을 num이라 할게"

 

이 문장을 요약한 것이 코드상에서 'int num' 이다.

(이렇게 보면 코드는 정말 간편한 것 같다;)

 

int는 정수를 저장할 메모리 공간을 할당한다는 뜻이고

num은 메모리 공간에 접근할 때 num이라는 이름을 사용하겠다.라는 뜻이다.

 

이제 코드를 한번 보자.

복습한다 생각하고 다시 한번 처음부터 해석해보자.

(코드를 해석하는 건 나중에 알고리즘이나 자료구조 공부할 때 도움이 많이 된다.)

 

"클래스 codema 안에 main이라는 메소드가 존재한다."

"main 메소드 안에 정수 자료형 int로 num1 변수가 선언되었고 num1에는 10이라는 정수가 저장돼있다."

"마찬가지로 정수 자료형 int로 num2가 20이라는 정수를 저장하면서 한 번에 선언되었다."

"num3는 정수 자료형 num1, num2 두 개를 합한 정수를 저장하였다."

"System.out.pirntln으로 각각의 변수들을 출력하였다."

 

여기엔 분명 생략된 것들도 있다. 하지만 아직, 이 정도만 알아도 충분하다.

(차근차근 배우다 보면 다 알게 될 것이라 생각한다.)

 

그럼 int처럼 정수를 저장하는 자료형 외엔 어떠한 것들이 있는지 보자

자료형 데이터 크기 표현 가능 범위
boolean 참과 거짓 1 바이트 true / false
char 문자 2 바이트  유니코드 문자
byte 정수 1 바이트 -128 ~ 127
short 2 바이트 -32,768 ~ 32,767
int 4 바이트 매우큼
long 8 바이트 아주 매우 큼
float 실수 4 바이트 ± 1.40 *10^-45 ~ 3.40 *10^38
double 8 바이트 매우 큼

 이 자료형들을 '기본 자료형(Primitive Data Type)'이라고 부른다.

(자료형은 다 외워두는 편이 좋다.)

※ 표현 가능 범위는 진한 표시된 것만 외우자. (나중에 다 쓸모가 있음)

※ 크기는 외워둘 필요가 있다. (나중에 자료구조와 알고리즘을 공부할 때 필요함)

 

여기서 의문점이 생길 것이다.

' 그럼 long 형 자료형만 쓰면 int 나 short byte는 안 써도 되는 거 아닌가?'

물론 당연히 맞는 얘기다. long 형으로 모든 걸 표현 가능하니 굳이 다른걸 안 써도 된다.

다만, 컴퓨터의 메모리 크기가 상당히 크다면 말이다.(속도도 한몫한다.)

 

개인의 컴퓨터마다 메모리 크기는 존재하고, 나중에 수백 줄, 수천 줄 코드를 입력하게 되면

long형으로는 메모리 부족 상태가 나타나고 프로그램 실행 시간도 느려진다.

그래서 그럴 땐 표현 가능한 범위를 잘 체크해서 사용하는 것이 좋다. (되도록 적은 메모리를 가지도록)

(하지만 자바는 정수 자료형은 int로 사용한다. 제일 범용성 좋기 때문이라고 생각된다.)

 

이제 코드를 보자.

 

이렇게 진행했을 때 출력 결과는 어떻게 될까?

 

result 값으로 원하는 값은 3.0000002 일 것이다.

하지만 값을 보면 3.0000000019999997 이런 식으로 나온다.

 

기본적으로 컴퓨터의 실수 표현에는 오차가 존재하기 때문에 이러한 값이 나오는 것이다.

 

이해가 안 된다면 다음 예시를 생각해보자.

"1과 2 사이에 존재하는 실수의 개수는 몇 개인가?"

아마 무한대라고밖에 대답할 수 없을 것이다.

 

따라서 실수를 표현할 때 1.000001 은 따지고 보면 1. 00000010000000.... 인 것이다.

소수점 이하 자릿수를 몇 개까지 표현해야 하는 것일까?

이러한 의문을 해결하기 위해서 다음과 같이 정했다고 한다.

"정밀도를 낮추고 근사치의 값을 찾아서 표현한다"

 

이와 같은 이유로 실수에는 오차범위가 존재하게 된 것이다.


이제 예시를 보면서 자료형을 마무리 하자.

 이렇게 이클립스에 소스코드를 작성한 뒤 실행하려고 하면 오류가 발생한다.

 

short 범위 안에 11과 22도 들어가고 둘의 합인 33도 들어가는데 왜 오류가 날까?

그 이유는 간단하다.

"자바는 정수형 연산은 int형으로 진행하기 때문이다."

num1과 num2는 저장이 잘 되었지만

num1 + num2 는 연산자 '+'를 사용했기 때문에 int형으로 계산되어야 하는데

둘 다 short형이기 때문에 오류가 난 것이다.

 

이 계산을 진행하려면 int 형으로 num1과 num2를 형변환 해줘야지 가능하다.

(이후에 배울 것이다.)

 연산을 동반하는 상황에서는 변수를 byte, short로 선언해도 메모리 절약이 별로 되지 않을뿐더러
 데이터 변환 과정만 추가되어 (알고리즘 측면에서) 손실이 발생하므로 int로 선언하자.

 

실수 자료형 : float, double

 

기본적으로 float 은 6자리의 정밀도를 갖고, double은 15자리의 정밀도를 갖는다.

따라서 float은 6자리까지 오차가 발생하지 않고, double는 15자리까지 오차가 발생하지 않는다.

 

그래서 위에서 num1, num2를 저장하고 그대로 출력했을 때는 오차가 발생하지 않았다.

하지만, 연산을 하는데에 있어서는 정밀도 이후의 자릿수까지 계산해야 하기 때문에

오차가 발생할 수 있는 것이다.

 


문자 자료형 : char

 

'문자의 표현에 대한 약속'을 가리켜 문자 셋(character Set)이라고 한다.

char는  2바이트로 문자 하나를 표현한다. (유니코드)

 

다음 코드를 보면서 이해해보자.

 

ch1, ch2는 문자 그대로를 입력해서 저장했다. 

ch3, ch4는 유니코드 값으로써 ch1과 ch2의 값과 동일한 문자가 저장된다.

ch5, ch6는 유니코드 값을 16진수로 표현했다.(16진수는 앞에 0x를 붙인다.)

 

출력 결과를 보면 다음과 같다.

표현 방식만 다를 뿐이지 같은 값을 저장했으므로 결과값도 같다.

정리해보자.

※ char 문자는 작은따옴표('')로 묶어서 표현한다.

※ 문자를 char형 변수에 저장할 때 저장되는 건 문자의 유니코드 값이다.

 

 

논리 자료형 : boolean

 

boolean는 참과 거짓 (true / false) 표현을 목적으로 하는 논리 자료형이다.

 

이건 바로 예제를 보면서 알아보자.

 이 결과값으로 보면 다음과 같다.

"이렇게 사용할 수 있구나"라는 정도로만 알아둬도 충분하다.

(나중에는 분명 이걸 사용하는 일이 많이 있을 것이다.)

 

다음에는 상수와 형변환, 그리고 연산자에 대해 알아보자.