Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
http://chortle.ccsu.edu/java5/Notes/chap08/ch08_5.html 컴퓨터 메모리는 비트의 패턴을 저장한다. 이러한 비트들의 패턴에 관계를 두어서 더 쉽게 사용할 수 있도록 만들고 있는데, 이를 데이터 타입이라고 한다.

이번장에서는 다음과 같은 내용들을 다룰 것이다.
  • 데이터 타입
  • Primitive Data (원시 데이터 타입)과 객체 (Objects)
  • 자바에서 사용하는 Primitive Data Type
  • Numberic 데이터 타입
  • 문자 와 boolean 데이터 타입
  • Type Wrappers
문제 다음은 종이의 일부분이다. 이 종이에는 단어가 있는데, 이 단어가 의미하는 바가 무엇인가.

attachment:mixPaper.gif

데이터 타입

해답 무엇을 의미하는지 말하기 힘들다.

문제의 종이에서 당신은 어떤 것을 얻을 수 있는가. 아마도 찢어진 부분을 예측할 수 없기 때문에, MIX가 의미하는 바를 알지 못할 것이다. 영어 단어 mix일 수도 있고, 라디오에서 한때 명성을 떨쳤던 Tom Mix의 일부분일 수도 있다. 혹은 MTV Dance MIX의 일부분일 수도 있고, BLOODY MARY MIX일지도 모른다. XIW를 뒤집어 놓은 것일 수도 있다. 아니면 우리가 모르는 상형문자의 일부분일 수도 있다.

컴퓨터 메모리에는 비트의 패턴이 저장된다. 이것이 무엇의 의미할지는 순전히 어떻게 쓰여질지에 따라 달려있다. 마치 MIX가 어떻게 쓰이는지에 따라서 여러가지 의미를 가지는 것과 마찬가지이다. 이렇게 어떻게 쓰일지를 결정하는게 바로 데이터 타입이다.

Data Type
  • 데이터가 어떻게 표현되고 사용될지를 결정한다.
  • 데이터 타입에 따라 컴퓨터가 어떻게 데이터를 다룰지 알 수 있다.
  • 컴퓨터에 저장된 모든 값은 데이터타입에 의해서 표현될 수 있다.
예를 들어보자. 0000000001100111

위의 데이터는 컴퓨터 메모리 어딘가에서 찾아낸 16비트의 패턴이다. 이것은 어떻게 표현될 수 있을가 ?

만약 위의 데이터 타입을 자바에서 사용하는 데이터 타입중의 하나인 short라고 정의 한다면, 이 값은 103으로 표현될 것이다. 문제 다음 16비트 패턴은 어떻게 표현될 수 있는가. 0000000000000000

많은 종류의 데이터 타입이 있다.

0000000000000000 비트 패턴은 0 (zero)로 표현될 수 있을 거라고 생각할 것이다. 그러나 항상 그런건 아니며, 우리가 보기에 그 용도가 명확해 보이는 비트패턴이라도 자동적으로 그 의미를 결정할 수는 없다. 프로그래머인 인간이 일일이 결정해주어야 한다.

만약 위의 비트패턴을 위한 데이터 타입을 short로 했다면, 비트패턴의 값은 숫자 0으로 표현될 것이다. 여기에 또다른 패턴이 있다. 1111111110011001 short로 표현될경우 -103이 될 것이다.

기본적으로 컴퓨터의 메모리에 있는 데이터는 무한히 많은 형식으로 표현이 될 수 있다. 표현할 수 있는 데이터 타입이 무한히 많다면, 유연하겠지만 프로그램을 작성하기에 너무 복잡할 것이다. 반면 데이터 타입이 너무 적다면, 프로그램이 간단해지긴 하겠지만, 활용범위가 너무 좁아질 것이다. 그래서 너무 많지 않은 수준에서 프로그래머가 사용하기에 적당한 데이터 타입이 준비되어야 한다.

그러나 모든 기계가 다양한 데이터 타입을 준비해야 하는 건 아니다. 간단한 전자 계산기라면, 단지 부동소숫점을 가진 숫자위한 하나의 데이터 타입만 존재하면 될것이다. 전자 계산기를 디자인 하는 엔지니어는 비트패턴이 어떻게 숫자로 표현될지를 결정하기만 하면 된다. 우리가 사용하는 컴퓨터는 특수한 용도가 아닌 범용기계이기 때문에 전자 계산기보다는 다양한 종류의 데이터 타입이 필요해진다. 문제 1960년대에 오디오 데이터를 다룰 수 있는 기능을 가진 컴퓨터가 있었을까 ?

Primitive Data Type

1960년대에도 오디오 데이터를 다루는 컴퓨터가 있었다. 그러나 이것은 비트패턴을 오디오 데이터로 표현하기 위한 전용의 프로그램이 필요했다.

이렇게 자신만의 독특한 방법을 가지고 비트배열을 표현하는 식으로 데이터를 이용하는 것은 좋지 않은 방법이다. 범용성을 크게 해치기 때문이다. 가능하면 퍼즐을 맞추듯이 몇개의 기본적인 구성요소만을 가지고, 원하는 것을 만들 수 있는 모델을 사용하는게 훨씬 유리하다. 자바는 데이터를 표현하기 위한 가장 기본적인 몇가지 내장된 데이터 타입을 가지고 있다. 이것을 primitive data type라고 한다. 자바는 8개의 primitive 데이터 타입을 가지고 있다. byte short int long float double char boolean

대소문자를 반드시 구분하기 바란다. byte는 primitive 데이터 타입이지만 BYTE는 아니다. 몇개의 예외도 있지만 대부분의 컴퓨터 언어는 대소문자를 엄격히 구분한다.

primitive data type에서 primitive는 "다른 커다란 데이터를 조합하기 위해서 사용되는 기본이 되는 구성요소"라는 뜻으로 컴퓨터 과학에서 매우 자주 사용된다. 아주 큰 문제를 풀 경우라도 하더라도, 기본적으로는 이 8개의 primitive 데이터 타입과 이들의 연산을 통해서 이루어진다.

문제 Int는 primitive 데이터 타입인가.?

Objects (객체)

자바는 내부적으로 많은 종류의 데이터 타입을 내장하고 있다. 그리고 프로그래머의 필요에 따라서 새로운 데이터 타입을 만들 수 있도록 지원하고 있다. 어쨋든 자바에서 다루는 모든 데이터는 원시 데이터 타입객체두개의 분류중 하나에 속한다. 일단 우리는 원시 데이터 타입에는 8개의 종류만 있다는 것을 알고 있다. 그러니 나머지 데이터 타입은 모두 객체라고 볼 수 있을 것이다.

attachment:dataSplit.gif

자바에서 객체는 매우 중요한 요소로 몇장의 장을 할애해서 설명을 하겠지만, 일단은 간단히 다루도록 하겠다. 다음은 원시 데이터 타입과 객체의 차이점이다.
  • 원시 데이터 타입은 값이 작고 바이트의 크기가 고정되어 있을 때 사용한다.
  • 8개의 원시 데이터 타입만이 존재한다.
  • 프로그래머는 새로운 원시 데이터 타입을 생성할 수 없다.
  • 객체는 많은 메모리 바이트를 사용하는 큰 데이터블럭을 위해서 사용한다.
  • 객체는 많은 구성요소로 이루어진다.
  • 객체 데이터 타입은 class라고 부른다.
  • Java Development kit에는 유용하게 사용할수 있는 많은 클래스가 미래 정의되어 있다.
  • 프로그래머는 프로그램의 요구에 따라 새로운 클래스를 생성할 수 있다.
원시 데이터 타입은 너트나 볼트와 같은 것으로 볼 수 있다. 반면 객체는 엔진 혹은 자동차와 같은 (너트오 볼트로 구성된)완전한 기계다. 우선은 이정도로 알고 넘어가도록 하자. 몇장만 더 읽다 보면 자세한 내용을 다룰 것이다. 문제 컴퓨터 프로그램에서 숫자는 중요한 기본이 되는가?

숫자형 원시 데이터 타입

Number(숫자)는 자바에서 매우 중요하며, 3개의 원시 데이터 타입중에서 6개가 숫자와 관련된 데이터 타입이다.

이들 숫자 데이터 타입에서도 가장 기본이 되고 (널리 사용되는) 타입은 크게 integerfloating point 로 나뉜다.. integer 타입은 소숫점이 없는 정수숫자를 위한 타입이며, floating point는 소숫점을 가진 데이터 타입이다. 컴퓨터는 정수를 위한 비트패턴을 유지할 수 있지만, 소숫점을 가진 숫자의 비트패턴을 알 수가 없으므로, 프로그램 수준에서 다시 해석해야 한다. 이런 이유로 integer 와 float 를 표현하는 방식은 완전히 다르다.

  • 정수형 원시 데이터 타입들
|| Type || Size || 범위 ||
byte 8bits -128 ~ +127
short 16bits -32768 ~ 32767
int 32bit 약 -20억 ~ 20억
long 64bit 약 -10E18 ~ +10E18
  • 부동소숫점 원시 데이터 타입들
|| Type || Size || 범위 ||
float 32bit -3.4E+38 to +3.4E+38
double 64bit -1.7E+308 to 1.7E+308
각 원시 타입은 고정된 bit크기를 가진다. 이는 표현할 수 있는 숫자의 크기에 한계를 가진다는 얘기가 된다. 예를 들어 short타입은 16비트의 크기를 가지며, 약 30,000 정도의 숫자를 표현할 수 있다.

가장 큰 숫자를 담을 수 있는 데이터형은 64비트의 크기를 가지는 long으로 10^18 정도의 큰 수를 표현할 수 있다.

또한 이들 데이터들은 음수와 양수를 모두 표현할 수 있도록 되어 있다. 여러분이 이들 데이터 타입의 범위를 뛰어넘는 숫자를 표현해야 한다면, 이들 데이터 타입을 이용할 수 없다. 이럴 경우에는 더 큰 숫자를 처리할 수 있는 클래스를 만들어야 한다.

문제 1,0234,004를 다루기 위한 프로그램을 작성하고자 한다. 데이터 타입을 위해서 short를 사용할 수 있는가 ?

큰 값을 다루기 위해서는 많은 비트가 필요하다

큰 범위의 숫자를 다루기 위해서는 그만큼 많은 비트를 필요로 한다. 당신은 프로그램을 작성할 때 사용할 숫자의 범위를 예측해서 거기에 맞는 데이터형을 사용할 필요가 있다. 예를 들어서 나이를 입력받는 프로그램을 작성한다면 byte형이면 충분할 것이다. 물론 long 형을 사용할 수도 있긴 하지만, 다루어야할 비트의 크기가 커진만큼 메모리의 소비량과 수행속도에 있어서 손해를 볼 것이다.

최근의 프로그램들은 수백만 수천만의 데이터 아이템을 다룬다. byte로 충분한걸 long으로 썼을 경우 고작해야 6바이트 정도일 수 있겠지만, 백만 데이터를 다루어야 한다고 가정하면, 6백메가의 낭비가 발생하게 된다.

당신은 프로그램을 쓸때, 숫자가 어떤 비트 타입으로 들어갈지를 결정해줘야할 필요가 있다. 이것을 literal이라고 부른다. "literal"은 타이핑한 값이 프로그램의 일부로 그대로 들어가게 됨을 의미한다. 예를 들어서, 다음의 숫자들은 4byte int형 숫자로 표현될 것이다. 125 -32 16 0 -123987

그렇지만 long형 숫자를 입력하기 원한다면 숫자의 마지막에 'L' 혹은 'l'을 붙여줘야 한다. 그러면, 이 숫자 데이터는 long형으로 해석되어서 비트값으로 저장된다. 125L -32L 16L 0l -123987l

문제 다음은 integer literal 인가 ? 197.0

Floating Point Type

프로그램에서 197.0을 그대로 사용하게 되면, 컴파일러는 이 숫자를 floating point원시 데이터 타입으로 사용하게 된다. 그래서 메모리 상에는 197.0의 floating point 비트 패턴이 들어가게 된다. 이 비트 패턴은 197과는 전혀 다르다. floating point는 두개의 원시 데이터 타입을 가지고 있다.

float 데이터 타입은 "single-precision floating point"라고 불리우기도 한다. double데이터 타입은 "double-precision floating point"라고 부른다. 이들 데이터 타입은 자주 쓰이는 프로그래밍 언어중 하나인 FORTRAN에서 유래되었다.

프로그램에서 floating point literals는 소숫점을 표시함으로써 이루어진다. 123.0 -123.5 -198234.234 0.00000381

Literal 정책에 의해서 위의 값들은 자동적으로 double타입으로 들어가게 된다. 거의 대부분의 경우 floating point 숫자는 double로 다루게 됨으로 큰문제가 없을 것이다. 만약 floating point 숫자를 32bit float형으로 다루기를 원한다면, 숫자의 마지막에 특별한 접미사를 붙여줘야 한다.

문제 double 대신 float 를 사용하게 될경우, 메모리상의 비트패턴에 큰 변화가 있는가 ?

Explict Floating Point Literals

그렇다면 float literal은 어떻게 적용시킬 수 있는가. 이 문제는 숫자의 접미사에 F 혹은 f를 붙여주는 것으로 해결할 수 있다. 123.0f -123.5F -198234.234f 0.00000381F

기본적으로 소숫점 데이터는 double literal되지만, 이를 명확히 해주고 싶을 수가 있는데, 이 경우 접미사로 D 혹은 d를 붙여주면 된다. 123.0d -123.5D -198234.234d 0.00000381D

문제 다음 코드는 문제가 있다고 생각이 들지 않는가 ? double rats = 8912D;

Scientific 표시

다음 두 경우를 보도록 하자.
double rats = 8912 ;
과
double rats = 8912.0 ;
첫 번째 코드는 수행은 될것이다. 그러나 부주의한 코드다. integer literal이 double에 대입하기 위해서는 반드시 그에 맞도록 변환시켜주어야 한다. 그러므로 첫번째 코드는 두번째 코드처럼 double literal이 적용되도록 값을 초기화 시켜주어야 한다.

때때로 과학표기가 필요한 경우가 발생할 것이다. 다음의 예는 모든 double-precision literals에 적용된다. 1.23E+02 -1.235E+02 -1.98234234E+05 3.81E-06 E는 10승을 하라는 의미다. 1.23E+02는 1.23에 10^2을 곱해주라는 의미가 된다.

이 밖에도 E는 소숫점의 위치를 간편하게 나타내기 위한 목적으로 사용할 수 있다. 만약 E뒤에 붙은 기호가 양수라면 소숫점을 오른쪽으로, 음수라며 왼쪽으로 숫자만큼 이동시키면 된다. 즉 3.81E-06은 0.00000381 과 같다.

문제 1.9345E+03을 과학표기가 아닌 일반 표기로 바꾸어 보라

Floating Point Number의 정확도

1/3은 다음과 같은 결과를 보여준다는 것을 잘 알것이다. 0.33333333333333333333333.......... 3이 무한대로 반복되는 값을 보여준다. 그러나 float형은 32bit 데이터 타입이므로 3을 무한대로 표시할 수는 없다.

float데이터 타입은 23 bit의 정확도를 가진다. float는 32비트 데이터 형이 아니던가? 라는 생각이 들 것이다. 32비트에서 1비트는 양수인지 음수인지를 판단하기 위해서 쓰이며, 나머지는 숫자의 크기를 나타내기 위해서 사용된다. 23bit의 정확도는 대략 7-8자리까지에 한정된다.

문제 1230.00089F 는 정확히 표현될 수 있는가.?

Double 형의 정확도

float는 7-8자리에 대한 정확도만을 보장한다. 그런데 1230.00089는 소숫점을 제외하고 모두 9개의 숫자를 가지고 있다. 그래서 마지막 9가 반올림되어서 1230.0008F이 저장된다. 아래의 프로그램을 컴파일 한 후 테스트 해보기 바란다.
import java.io.*;

class Test
{
  public static void main(String[] args)
  {
    float a = 1230.00089F;
    System.out.println("Data "+String.valueOf(a));
  }
}

double은 64bit를 이용한다. 그래서 float보다 더큰 -1.7E+308 to +1.7E+308 범위의 숫자를 저장할 수 있으며, 15자리까지의 정확도를 보장한다. 자바 프로그램에서 2.345와 같은 literal을 적용시켰다면, 이것은 자동적으로 double로 간주된다. 그러므로 float형으로 충분하다고 판단되면 직접 literal을 적용시켜줘야 한다. 위의 프로그램에서 1230.00089를 정확히 제어하기 위해서는 다음과 같이 프로그램을 수정해야 할 것이다.
double a = 1230.00089D;

문제 8개의 원시 데이터 타입중 하나로 문자를 다룰 수 있을까?

char 원시 데이터 타입

http://chortle.ccsu.edu/java5/Notes/chap08/ch08_13.html

문자는 컴퓨터에서 일반적으로 사용되는 데이터이다. 문자를 위한 원시 데이터 타입의 이름은 char이다. char 타입은 16비트의 크기를 가진다. C와 같은 언어가 8비트의 크기를 가지는 것과는 약간다르다. 16비트를 가지게 됨으로 인해서 데이터량이 커지긴 했지만 대신 더 많은 다양한 언어들을 표현할 수 있게 되었다. 실제 자바는 유니코드를 이용함으로써 세상의 거의 대부분의 언어를 표현할 수 있다.

다음은 16비트 패턴의 예이다. 000000000110011 위의 값은 16비트 char형으로 표현될 경우 문자 'g'를 나타낸다. 만약 이것을 integer형으로 표현하면 103이 될것이다. 실제로 integer 데이터 타입에는 16비트 크기를 가지는 short데이터 타입이 있다.

char 데이터는 대소문자를 엄격히 구분하며, 서로 다른 비트 패턴을 가지고 있다. char데이터 타입에는 구둣점이나 쌍따움표, 공백문자, 탭과 같은 특수문자들도 포함된다.

원시 데이터 타입 char은 단일 문자를 표현할 수 있으며, 폰트와 같은 다른 어떤 정보도 포함하지 않는다. 그러나 대부분의 경우 단일 문자만을 사용하는 프로그램이 드물기 때문에, char데이터를 포함하는 객체를 이용해서 문자열 단위로 사용하게 된다.

문제 다음 3개의 데이터는 서로 다른가 ? 0 O o

Character Literals

프로그램에서 문자 literals는 따움표로 둘러싸는 것으로 나타낸다.
  'm'     'y'     'A'
알파벳과 같은 일반 문자외에 줄이나 탭을 바꾸는 제어 문자도 존재하는데 이들은 역슬레쉬 문자와 함께 사용된다.
  '\n'    '\t'

비록 두개의 문자가 사용된 것으로 보이겠지만, 실제 프로그램에서는 단일 문자로 사용이된다. 역슬레쉬는 단지 컴파일러에게 제어문자를 사용하겠다는 것을 알려주기 위한 목적으로만 사용된다. 첫번째 문자는 줄을 바꾸기 위해서 사용되는 개행문자 이며, 두번째 문자는 문자와 문자사이를 일정간격으로 구분하기 위해서 사용되는 탭문자다.

주의 : 아래의 데이터는 문자 literal 이 아니다.
"Hello"
쌍따움표가 사용된 데이터는 String이며, 이것은 원시 데이터 타입이 아닌 객체다.

문제 아래의 char literal은 무엇이 잘못되었는가
"W"

boolean 원시 데이터 타입

이제 boolean 원시 데이터 타입에 대해서 알아보겠다. 이것은 참/거짓 (true/false)를 나타내기 위해서 사용하는 데이터 타입으로 아래의 두개의 상태중 하나만 가질 수 있다. true false

자바 프로그램에서 truefalse라는 단어는 boolean값을 의미한다. boolean이라는 이름은 true/false의 값만으로도 많은 것을 할 수 있다는 것을 발견해낸 19세기 과학자인 George Boole에 의해서 만들어졌다.