
안녕하세요. 디버깅하는 노인입니다.
오늘은 본격적으로 Java 프로그래밍의 기초부터 공부해보도록 하겠습니다.
컴퓨터가 생겨난 근본적인 부분부터 출발해보죠.
컴퓨터가 생겨난 배경은 사람이 반복적으로 처리해야할 계산이나 작업을 대신하고 빠르게 처리하기 위해서 탄생했습니다.
그래서 컴퓨터의 원초적인 기능은 데이터 처리죠.
이 세상에는 다양한 데이터가 존재합니다.
대표적으로 문자와 숫자가 있죠.
제가 지금 쓰고 있는 글도 문자들이 모여 작성된 하나의 데이터 집합입니다.
그리고 우리가 일상생활에서 숫자를 더하기, 빼기, 곱하기, 나누기를 하는 것도 데이터 처리의 일종입니다.
그렇다면 우리는 어떻게 데이터를 처리하고 연산하는 것일까요?
첫 번째, 먼저 데이터를 인식합니다.
어떤 글이나 숫자를 보았을 때 우리는 그것이 영어인지 한글인지 혹은 숫자인지를 구별할 수 있습니다.
인간이 만들어놓은 규칙에 따라 해당 데이터를 인식할 수 있죠.
두 번째, 정해진 규칙에 따라 연산합니다.
우리는 미리 정의해놓은 연산 규칙에 따라 더하기, 빼기, 곱하기, 나누기를 합니다.
세 번째, 결과를 도출합니다.
만약 1 + 1 이라는 연산을 하게 되면 2라는 값이 머릿속으로 도출되게 됩니다.
머릿속에서 어떠한 작용을 하는 지는 잘 모르지만 어쨋건 우리가 교육 받은 대로 값을 도출하고 그 값을 이용하게 되는 거죠.
만약 이 연산을 하는 주체가 우리가 아닌 컴퓨터라면 어떨까요?
컴퓨터는 데이터를 인식할 때 이것이 숫자인지 문자인지 모릅니다.
12sdflkjw2353sdf.,/;\][
위의 데이터를 보았을 때 무슨 데이터인지 알 수가 없죠.
우리는 컴퓨터에게 어떤 것은 문자이고 어떤 것은 숫자인지를 알려줘야 합니다.
그래서 프로그래밍에서 제일 먼저 데이터 타입에 대해서 배우게 됩니다.
컴퓨터에게 우리가 입력할 데이터가 숫자인지 문자인지 명확하게 알려준 뒤에 우리가 정해놓은 규칙에 따라 연산 혹은 데이터를 처리하도록 하는 거죠.
자바 프로그래밍에서는 이렇게 컴퓨터에게 데이터를 알려주기 위해서 몇 가지의 데이터 타입을 미리 정의하고 있습니다.
@ 데이터 타입
1. 정수 데이터 타입(Integer Types)
정수는 우리가 수학시간에 배웠듯 양(+), 음(-)의 값으로 이루어진 숫자를 의미 합니다.
자바에서는 이 정수 타입을 4가지로 분류 하였습니다.
아래의 표를 보시면 좀 더 자세히 알 수 있습니다.
종류 |
저장 공간 |
데이터 범위 |
byte |
1 byte |
-128 ~ +127 |
short |
2 byte |
-32,768 ~ +32,767 |
int |
4 byte |
약 -21억 ~ + 21억 |
long |
8 byte |
약 -900경 ~ +900경 |
" 왜 4가지로 분류를 했나요? "
정수 타입이면 한가지로 쓸 것이지 왜 4가지로 분류를 했을까요?
그 이유는 컴퓨터의 성능 한계(메모리 한계) 때문입니다.
1970년대에 지구를 떠난 보이저 1호가 태양계를 벗어나 인터스텔라 영역으로 들어갔다는 소식을 들어보셨을 겁니다.
그 보이저 1호가 가지고 있는 컴퓨터 성능이 현재 우리 스마트폰에 있는 성능보다 한참 뒤떨어집니다.
현재는 많은 전자 기기들이 큰 용량의 메모리와 성능을 가지고 있어서 특별히 문제될 것이 없었지만
예전에는 큰 용량의 메모리를 가질 수 없었기 때문에 적은 용량의 메모리를 효율적으로 이용하기 위해 정수 타입을 데이터들을 4가지로 분류했습니다.
만약에 나는 어떤 변수에다가 10이라는 숫자를 저장하고 싶다고 가정한다면
byte 타입에 넣어서 메모리를 1byte만 소모 하면 되는 데 굳이 long에다가 넣어서 메모리를 소모할 필요 없는 것이죠.
한정적인 메모리를 효율적으로 이용하게끔 하는 것은 개발자의 가장 기초적인 덕목이기도 합니다.
하지만, 현재는 메모리가 일반 컴퓨터에서는 4GB가 넘기 때문에 덜 신경 쓰는 것이 사실 입니다.
2. 부동소수점 타입 혹은 실수 타입(Floating-Point Types)
부동소수점 타입이라고 하니 말이 거창한 것 같지만 소수점을 가지는 숫자를 의미 합니다.
0.17
이런 숫자들을 일컫죠.
부동 소수점 타입에도 2가지 종류가 있습니다.
1) float
- float는 소수점을 가지는 수 중에서도 4bytes 정도 저장할 수 있는 소수점을 의미 합니다.
범위는 (+) (-) 3.40282347E + 38F입니다.
2) double
-double은 소수점을 가지는 수 중에서 float보다 더 큰 소수점을 가지는 숫자를 담을 때 적합합니다.
범위는 약 (+)(-) 1.79769313486231570E + 308 입니다.
"범위를 꼭 다 알아야 하나요?"
답은 다 알 필요 없습니다.
실제 일반적인 프로그래밍에서는 int와 double을 자주 쓰는 편입니다.
다만, 한정적인 컴퓨터 자원을 사용해야 한다거나 엄청나게 큰 수를 연산해야 할 경우에는 범위를 아셔할 필요가 있습니다.
예를 들어, 연구소에서 큰 숫자를 처리하는 프로젝트라던지, 우주로 쏘아올릴 우주선의 컴퓨터라든지.
이러한 것들이 아니면 범위를 꼭 정확하게 알 필요는 없습니다.
그렇지만, 프로그래밍을 하다가 보면 어느정도 범위가 머릿속에 들어갈 것입니다. ㅎㅎㅎ 걱정 안하셔도 됩니다.
@ 실제 자바 프로그래밍을 통해서 데이터 크기 알아보기
그럼 우리가 알아봤던 데이터 타입에 대해서 선언하는 방법과 그 크기를 실제 컴퓨터로부터 출력 받아보는 시간을 가져보겠습니다.
먼저 인텔리 제이를 실행합니다.

현재 우리는 인텔리제이 15 커뮤니티 에디션을 쓰고 있습니다.

어제 작성한 JavaStudy라는 프로젝트가 자동으로 나오게 됩니다.
저는 이 JavaStudy 프로젝트에서 그대로 진행하도록 하겠습니다.
다른 프로젝트를 만들기 원한다면 이전 회차 강좌를 보시면 프로젝트 생성 방법에 대해서 설명이 나와있습니다.
프로젝트 생성 : http://ilanglang.tistory.com/8

먼저 변수에다가 값을 넣어 생성하는 방법에 대해서 알아보겠습니다.
위 사진과 같이 변수를 생성하는 방법은 다음과 같습니다.
[데이터 타입] [변수명] = [값] ;
데이터 타입은 앞서 설명드렸다시피 int, double과 같은 타입을 말합니다.
변수명은 원하시는 이름을 넣어주시면 됩니다.
저 같은 경우 number1, 2, 3 ... 이런 식으로 변수를 순서대로 선언했습니다.
그러면 이제 위와 같이 쭉 적어주세요.
쭉 적다가 보시면 이상하게 float number5 = 0.1;에서 빨간 줄이 쳐집니다.
빨간 줄이 그려진다는 것은 해당 코드에 문제가 있을 때 인텔리제이가 개발자에게 알려주는 신호입니다.
그러면 근본적인 이유를 알고 고쳐야겠죠?
빨간 줄이 그어진 부분에 마우스를 올려봅시다.

적합하지 않은 타입입니다
인텔리제이가 적합하지 않은 타입이라고 이야기 합니다.
앞서 소수점을 포함한 숫자는 float 타입에 해당함에도 불구하고 왜 이러한 오류가 나는 것일까요?
그 이유는?
자바에서는 부동소수점 데이터를 입력했을 때 기본적으로 double 형을 적용합니다.
개발자가 선언한 타입과 실제 데이터의 타입이 일치 하지 않으면 위와 같이 오류가 발생하게 됩니다.
"왜 기본적으로 double형을 적용하는가요?"
데이터 타입을 결정할 때 데이터 타입이 명확하지 않을 경우 기본 자료형을 적용하게 됩니다.
숫자가 만약 정수형일 경우 기본 데이터 타입은 int로 적용이 되며
소수점을 포함한 실수일 경우에는 기본 데이터 타입을 double로 적용하기 때문입니다.
기본 자료형이 없을 경우 어떠한 숫자에 대해 명확하지 않아 컴퓨터가 오류를 일으킬 수 있기 때문에 명확히 하고자 이러한 현상이 나타나는 것이죠.
그렇다면 이를 해결하는 방법은 어떠한 방법이 있을까요?
방법은 간단합니다.
1) 타입 캐스팅(Casting)
- 타입 캐스팅은 데이터 타입 간에 변환을 할 경우 사용하게 됩니다.
깊게는 들어가지 않고 그냥 어떠한 형태인지 보여드리겠습니다.
float number6 = (float) 0.1;
위 내용을 보시면 (float)라고 되어 있는 부분이 보이실 겁니다.
이 부분이 바로 캐스팅입니다.
0.1이라는 숫자의 기본 타입은 double로 되어있으나 이를 float로 바꾸겠다는 의미 입니다.
그래서 double에서 float로 타입이 변형되어 오류가 사라지도록 하는 것이죠.
2) 접미사 붙이기
- 선언한 데이터에다가 접미사(꼬리에 붙이는 문자)를 붙여서 해당 데이터가 float 임을 증명하는 방법이 있습니다.
float number7 = 0.1f;
0.1이라는 숫자에다가 f 라는 문자를 넣은 것이 보이시나요?
f 혹은 대문자 F를 붙여도 무방합니다.
이렇게 하면 컴퓨터에게 0.1이라는 숫자를 float 형으로 넣겠다고 한 것도 동일합니다.
따라서, 타입이 불일치 해서 발생하는 오류는 사라지게 되는 것이죠.
"이것도 외워야 하는가요?"
아닙니다. ㅎㅎㅎ 프로그래밍은 외워서 하는게 아니라서 외우실 필요는 없습니다.
다만, 꼭 기억하셔야 할 것은 내가 선언한 타입과 입력되는 값의 타입이 반드시 일치해야 한다는 것만 기억하세요.
타입이 불일치 하는 예를 보여드리겠습니다.
아직 배우지 않았지만 문자열을 선언할 때는 String이라는 것을 사용하게 됩니다.
그래서 문자열 선언하는 방법은 다음과 같습니다.
String hello = "안녕하세요";
String이라는 문자열 데이터 타입을 선언하고 hello라는 변수명을 지어주고 "안녕하세요" 라는 문자열 값을 넣어줬습니다.
이렇게 해서 hello를 출력하게 되면 "안녕하세요"라는 문구가 출력이 됩니다.
만약에 String에다가 숫자를 넣으면 오류가 발생합니다.

아까 보신 오류와 일치 하죠?
적합하지 않은 타입이라고 보여집니다.
그 이유는 String은 반드시 문자만 받을 수 있는 데
지금 입력받은 값은 int 형 숫자이기 때문에
적합하지 않다고 오류가 출력되고 있습니다.
다시 정리하면 선언한 데이터 타입과 입력한 데이터 타입은 꼭 일치해야 합니다.
다음으로 넘어가볼까요?
그렇다면 이번엔 아까 제가 알려드린 데이터 타입들의 최대, 최소 수치를 보셨을 겁니다.
제가 이 데이터 타입의 최대, 최소값을 제대로 알려드렸을까요?
답은 컴퓨터가 알고 있습니다.
인텔리제이를 통해서 알아보도록 하죠.
이전 시간에 봤던 System.out.println(); 명령을 통해서 byte의 최대, 최소값을 알아봅시다.

위 코드를 실행하면 어떤 결과가 출력이 될까요?
결과 출력을 보기 전에 간단하게 코드를 설명드리겠습니다.
먼저 System.out.println();은 괄호 안에 있는 내용을 콘솔(Console)로 출력하겠다는 의미 입니다.
그리고 괄호 안에 있는 Byte는 Byte.java라는 자바 프로그래밍 내에 내장되어 있는 클래스 입니다.
Byte라는 개념도 미리 정의된 개념인거죠.
더 깊이는 들어가지 않겠습니다. 앞으로 가면 갈 수록 더 깊이 들어갈 예정이니까요 ㅎㅎㅎ
Byte라는 클래스 안에 들어가보면 MAX_VALUE와 MIN_VALUE가 정의 되어 있습니다.

인텔리제이에서는 자바를 구성하는 세부 소스 파일들도 볼 수 있죠.
위 사진에서 보시다시피 byte의 최대 값은 127, 최소값은 -128로 구성되어 있습니다.
따라서, 이 값을 출력하게 되면 아래와 같이 출력이 될 것입니다.

최대값은 127, 최소값은 -128
그렇다면 다른 데이터 타입들은 어떨까요?
쭉 작성해보도록 하겠습니다.

Byte 뿐만 아니라 int 그리고 double도 최대, 최소값을 구하는 소스 코드 입니다.
출력결과를 한번 봅시다.

제가 알려드린 숫자들과 거의 비슷하게 출력이 되었죠? ㅎㅎㅎㅎㅎ
이런식으로 해당 데이터 타입의 최대값과 최소값을 구하는 방식을 알아보았습니다.
다시금 말씀드리지만 최대, 최소값을 외우실 필요가 전혀 없습니다.
일반적인 프로그래밍에서 특히, Java에서는 int를 제일 많이 사용하고 때때로 float와 double도 혼합해서 사용하기 때문에 굳이 외우실 필요가 없습니다.
프로그래밍 하시다가 한정적인 컴퓨터 자원을 이용해야한다든지 메모리가 부족이 발생할 경우에는 변수 선언 및 데이터 타입 설정시 세세하게 하시면 됩니다.
앞으로 공부에서 더 깊이 들어가게 되면 또 다시 설명드리겠습니다.
오늘은 여기까지 입니다.
긴 글 읽어주셔서 감사합니다.