언어 자료구조 알고리즘/디딤돌 Java 언어 Part1

2.1 기본 자료형

언제나휴일 2016. 4. 4. 09:10
반응형

출간일 2016년 11월 28일

판매가 2000원

형태 ebook


이 책의 모든 내용은 http://ehpub.co.kr에 공개하고 있습니다.

학습에 도움이 되시면 ebook을 구입하여 소장하시면 감사하겠습니다.

언제나 휴일 출판사의 수익금의 대부분은 아프리카에 기부하고 있습니다.



 2.1 기본 자료형

 

 Java 언어에서 제공하는 기본 자료형에는 논리값을 표현하는 boolean 형식부터 하나의 문자를 표현하는 char 형식, 표현 범위에 따라 정수를 표현하는 byte, short, int, long 형식, 표현 범위와 오차 범위에 따라 실수를 표현하는 float, double 형식을 제공합니다.

 

형태

예약어

메모리 크기

디폴트 값

표현 범위

논리값

boolean

1 비트

false

true 혹은 false

문자

char

2 바이트

'\0'

0~65535

정수

byte

1 바이트

0

-128 ~ 127

short

2 바이트

0

-32768 ~ 32767

int

4 바이트

0

- 2 31 ~ 2 31 -1

long

8 바이트

0

- 2 63 ~ 2 63 -1

실수

float

4 바이트

0.0

-3.4E38 ~ 3.4E38

double

8 바이트

0.0

-1.7E308 ~ 1.7E308

[2.1] 기본 자료형

 

 

 이번 장에서 자료형을 테스트하기 위한 프로젝트를 하나 생성하세요.

 

 앞으로 단위 테스트를 위한 메서드를 정의하고 진입점에서 이를 호출하는 구조로 프로젝트를 만들기로 합시다. 필요에 의해 main 함수의 테스트를 원하는 부분을 제외한 나머지 부분을 주석 처리하면 효과적으로 학습할 수 있습니다.

 

public class Program {

    public static void main(String[] args){

        exBoolean();

        //exChar();

        }

 

    private static void exChar(){

        System.out.println("char 형식");

    }

 

    private static void exBoolean() {

        System.out.println("boolean 형식");

    }

}

[소스 2.1] Program.java

 

 

2.1.1 논리형

 

 논리형은 참과 거짓을 표현하기 위한 자료형으로 예약어는 boolean이며 값으로 표현할 수 있는 것은 true false입니다. 논리형은 앞으로 배울 제어문이나 반복문의 조건식에서 자주 사용합니다.

 

private static void exBoolean() {

    System.out.println("boolean 형식");

    boolean check = false;

    System.out.println("1. check:"+check);

    check = true;

    System.out.println("2. check:"+check);

    check = (3<5);

    System.out.println("3. check:"+check);

    check = (7%2 ==0);

    if(check){

        System.out.println("짝수");

    }

    else{

        System.out.println("홀수");

    }

}

boolean 형식

1. check:false

2. check:true

3. check:true

홀수

[소스 2.1] exBoolean

  

 

2.1.2 문자형

 

 Java 언어에서 문자형은 char 예약어를 사용하며 값을 표현할 때 'a' 처럼 단일 콤마 사이에 표현할 문자를 나타낼 수 있습니다.

 

 C언어가 만들어질 때 미국 표준 문자인 ASCII Code로 문자를 표현하여서 한글이나 중국어 등과 같이 다른 문자 체계를 사용하는 표현이 힘들었는데 Java 언어에서는 다국어를 지원하기 위해 유니코드 방식을 채택하였습니다.

 

 내부적으로 살펴보면 사용하는 문화권에 따라 0~65535 사이의 수에 특정 문자를 매핑하여 값을 기억하는 것인데 개발자 편의를 높이기 위해 단일 콤마 사이에 문자를 나타내어 표현할 수 있게 하였습니다. 'a'처럼 특정 표현을 사용했을 때 약속한 고정 값으로 나타내는 것을 리터럴 상수라 말합니다.

 

 개행 문자나 백 스페이스 등의 특수 문자를 표현하기 위해 약속한 리터럴도 있습니다.

 

리터럴

설명

'\n'

개행(줄 바꿈)

\t

\b

백 스페이스

\\

\

\'

'

\"

"

[ 2.2] 리터럴

 

 참고로 숫자 문자 '0'에서 '9' 48(16진수 0x30)~57로 약속하였고 대문자는 65(0x41)부터 시작하고 소문자는 97(0x61)부터 시작합니다.

 

  Java 코드에서 '1' 49, 0x31은 같은 값입니다.

 

 

private static void exChar() {

    System.out.println("char 형식");

    char c = 0;

 

    c = 49;

    System.out.println("1. c의 값:"+c);

    c = 0x31;

    System.out.println("2. c의 값:"+c);

    c = '1';

 

    System.out.println("3. c의 값:"+c);

    c = 65;

    System.out.println("4. c의 값:"+c);

    c = 0x41;

    System.out.println("5. c의 값:"+c);

    c = 'A';

    System.out.println("6. c의 값:"+c);

}

char 형식

1. c의 값:1

2. c의 값:1

3. c의 값:1

4. c의 값:A

5. c의 값:A

6. c의 값:A

[소스 2.2] exChar

 

 

2.1.3 정수형

 

 Java 언어에서는 정수를 표현하기 위한 형식으로 byte, short, int ,long 형식을 제공합니다.

 

 byte 형식은 1바이트의 메모리를 사용하며 short 2바이트, int 4바이트, long 8바이트를 사용합니다. 1bit 0 1을 표현할 수 있어서 1바이트(8비트)로 표현할 수 있는 가지 수는 2 8승인 256가지입니다.

 

 Java 언어에서 정수 형식은 2진 보수 표기 방식으로 부호 있는 수를 표현하므로 byte 형식으로 표현할 수 있는 정수는 -128~127입니다.

 

 2진 보수 표기 방식은 첫 번째 비트가 0이면 부호가 없는 수이며 나머지 비트를 크기를 나타냅니다. 8비트 메모리에 0010 0011 값이 있으면 1 5 + 1 1 + 1 0승의 크기를 갖는 35를 나타내는 것입니다.

 

 그리고 첫 번째 비트가 1이면 부호가 있는 수이며 나머지 비트를 2진 보수를 취한 값이 크기를 나타냅니다. 2진 보수를 계산할 때는 1진 보수(0 1 1 0으로 변환)를 계산한 후에 1을 더합니다. 예를 들어 8비트 메모리에 1101 1101 값이 있으면 음수입니다. 두 번째 비트부터 101 1101 1진 보수로 변환하면 010 0010 이며 1을 더하면 2진 보수를 계산할 수 있는데 이 값이 010 0011입니다. 따라서 8비트 메모리에 1101 1101은 크기가 35인 음수로 -35를 나타낸 것입니다.

 

 이처럼 계산하면 8비트 메모리에 1111 1111 값이 있을 때 음수이며 111 1111을 이진 보수로 변환하면 1000 0000 이 되어 크기가 128입니다. 따라서 -128을 나타낸 것입니다.

 

 그리고 8비트 메모리에 1000 0000 값이 있을 때도 음수이며 000 0000을 이진 보수로 변환하면 000 0001 이 되어 크기가 1입니다. 따라서 -1입니다.

 

  1바이트인 byte 형식은 음수 부분은 -128에서 -1까지 표현할 수 있습니다.

 

 그리고 첫 번째 비트가 0인 부호 없는 수는 0000 0000에서 0111 1111까지 표현할 수 있으므로 0~127까지 표현할 수 있습니다.

 

 따라서 byte 형식은 -128에서 127까지의 정수를 표현할 수 있습니다.

 

 만약 byte 형식 b변수에 127이 있다고 가정합시다. 이 상태에서 변수 b b+1을 대입하면 어떻게 될까요? 아무런 변환없이 b = b+1;을 표현하면 byte 형식의 표현 범위를 벗어날 수 있기 때문에 컴파일 오류가 납니다. 이 때는 b = (byte)(b+1); 처럼 b+1 표현의 연산 결과를 byte 형식으로 명확히 변환 요청해야 합니다. 이를 명시적 캐스팅이라 부릅니다.

 

 이렇게 명시적 캐스팅을 사용하여 b = b+1; 을 수행하게 작성하여 실행하면 표현 범위를 벗어나 overflow가 발생합니다. 그리고 해당 값을 확인하면 -128임을 알 수 있습니다.

 

 이는 127 8비트 메모리에 0111 1111 순으로 표현하며 여기에 1을 더하면 8비트 메모리에 1000 0000 가 되어 -128이 되는 것입니다.

 

 마찬가지로 -128인 변수 b b = (byte)(b-1);을 표현하면 b의 값은 127로 바뀝니다.

 

private static void exByte() {

    System.out.println("byte 형식");

    byte b = 127;

 

    b = (byte)(b+1);

    System.out.println(b);

   

    b = (byte)(b-1);

    System.out.println(b);

}

byte 형식

-128

127

[소스 2.3] exByte

 

 short, int, long도 표현 범위만 다를 뿐 같은 원리로 값을 메모리에 표현합니다.

  

 

 

2.1.4 실수형

 

 java 언어에서는 실수형을 표현할 때 사용하는 기본 자료형으로 float double을 제공합니다.

 

 float 형식의 값을 표현할 때는 실수 뒤에 f를 추가하여 표시합니다. 예를 들어 0.2라고 표현하면 double 형식의 표현이고 0.2f라고 표현하면 float 형식의 표현입니다.

 

 실수는 0에서 1 사이에도 무한 개의 실수가 존재하여 오차 범위를 갖는 실수를 표현합니다.

 

 예를 들어 float 형식 변수 f 0.6f로 초기화하고 f f+0.1f를 대입하는 것을 반복하면 어떻게 값이 변할까요? 계속 더하다보면 오차가 쌓여 기대하지 않았던 값으로 변하는 것을 알 수 있습니다. 따라서 프로그램에서 실수 데이터를 취급할 때는 오차가 발생할 수 있다는 것을 고려하여야 합니다.

 

private static void exFloat() {

    System.out.println("float 형식");

    float f = 0.6f;

    f = f + 0.1f;

    System.out.println(f);

    f = f + 0.1f;

    System.out.println(f);

}

float 형식

0.70000005

0.8000001

[소스 2.4] exFloat

 

 참고로 float은 첫 번째 비트는 부호 비트, 이후 8개의 비트는 지수부, 나머지 23개 비트는 가수부입니다. double은 첫 번째 비트는 부호 비트, 이후 11개의 비트는 지수부, 나머지 52개 비트는 가수부입니다.

반응형