본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/1. 변수, 기본 데이터 타입, 연산자

2. Java 자바 - 기본 데이터 타입

기본 데이터 타입 (Primitive)

 

정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입

 

구분

기본 타입

메모리 사용 크기

저장가능한 값 범위

정수

byte

  1byte (8bit)

  -27 ~ 27-1 (-128 ~ 127)

char

  2byte (16bit)

  0 ~ 216-1 (유니코드 \u0000 ~ \uFFFF, 0 ~ 65,535) 

short

  2byte (16bit)

  -215 ~ 215-1 (-32,768 ~ 32,767)

int

  4byte (32bit)

  -231 ~ 231-1

long

  8byte (64bit)

  -263 ~ 263-1

실수

float

  4byte (32bit)

  (+/-)1.4E-45 ~ (+/-)3.4028235E38

double

  8byte (64bit)

  (+/-)4.9E-324 ~ (+/-)1.7976931348623157E308

논리

boolean

  1byte (8bit)

  true, false

 

정수 타입일 때 n 비트크기 일 경우 아래와 같은 범위를 갖는다.

(단, 항상 양수 범위 갖는 char 타입 예외)

 

-2n-1 ~ 2n-1-1

 

자바에서는 정수 연산을 기본적으로 int 로 처리한다.

 

실수형 float, double 의 메모리 사용은 int, long 과 같지만, 부동소수점 방식으로 저장되어

더 큰 범위의 값을 저장할 수 있다.

 

자바에서 실수 연산은 기본적으로 double 로 처리한다.

 

 

byte

 

8 bit 구성으로 -128 에서 127 까지 표현 가능하다.

최상위 비트(MSB : Most Significant Bit, 제일 앞 비트)는 정수 부호 값을 결정한다.

 

2 : 기본 2진법 표현

0

0

0

0

0

0

1

0

 

-2 : 1의 보수에 +1 을 해서 표현한다. (2의 보수)

1

1

1

1

1

1

1

0

 

 

더보기
* 음수 표현 시 2의 보수를 사용하는 이유!

 

음수의 2진수 표현 방식 방법에는 3가지가 존재한다.

 

1. 최상위 비트(부호 비트)를 사용, 0이면 양수, 1이면 음수

 

ex) 3 = 0000 0011

    -3 = 1000 0011 (최상위 비트만 바꾼다.)

 

두 수를 더한다면?

1000 0110 = -6 (0이 나와야 하므로 적용할 수 없다.)

 

0의 표현이 두 가지로 나타날 수 있다.

+0 = 0000 0000

-0 = 1000 0000

 

음수 부 값의 크기 비교 시 서로 맞지 않다.

-3 = 1000 0011

-4 = 1000 0110

(결과적으로 -3 < -4 가 되어버린다.)

 

 

2. 1의 보수 사용 (0을 1로 뒤집은 것이 1의 보수)

 

 

ex) 3 = 0000 0011

     -3 = 1111 1100

 

두 수를 더하면?

1111 1111 = -0 0을 정확하게 표현할 수 있다.

 

음수 부 값의 크기 비교 시 서로 맞는다.

-128 = 1000 0000

-127 = 1000 0001

(-128 < -127)

 

하지만 아직도 0의 표현이 2가지이다.

+0 = 0000 0000

-0 = 1111 1111

 

 

3. 2의 보수 사용 (1의 보수에 1을 더한 값)

1의 보수 표현방식에서 ( - ) 방향으로 1 만큼 쉬프트 시킨다.

 

 

두 수를 더하면?

+1 = 0000 0001

-1 = 1111 1111

 

0 = 0000 0000 으로 만족한다.

(초과된 비트는 사라진다.)

 

음수 부 값의 크기 비교

-128 = 1000 0000

-1 = 1111 1111

(-128 < -1) 일치

 

0의 표현도 한 가지만 존재

0 = 0000 0000

 

따라서 컴퓨터는 음수를 표현할 때 2의 보수를 사용한다.

 

 

최대값 127을 넘어가면 다시 -128부터 시작하게 된다. (overflow) : 오버플로우

 

public class GarbageValueExam {
	public static void main(String[] args) {
    	byte var1 = 125;
        int var2 = 125;
        
        for (int i = 0; i < 5; i++) {
        	var1++;
            var2++;
            System.out.println("var1 : "+var1+ "\t" +"var2 : "+var2);
        }
    }
}

 

char 

 

음수 범위 없이 유니코드(0 ~ 65535) 범위를 저장한다.

문자 직접 저장, 10진수 저장, 16진수 저장이 가능하다.

 

public class CharExam {
	public static void main(String[] args) {
    	char c1 = 'A';       //문자 직접 저장
        char c2 = '65';      //10 진수로 저장
        char c3 = '\u0041';  //16 진수로 저장
        
        char c4 = '가';      //문자 직접 저장
        char c5 = 44032;     //10 진수로 저장
        char c6 = '\uac00';  //16 진수로 저장
        
        int uniCode = c1;    //유니코드 얻기 (int형으로 저장)
        
        System.out.println(c1);    //A
        System.out.println(c2);    //A
        System.out.println(c3);    //A
        System.out.println(c4);    //가
        System.out.println(c5);    //가
        System.out.println(c6);    //가
        System.out.println(uniCode);  //65
    }
}

 

* 문자열을 저장하려면 " " 큰 따옴표로 감싸는 String (참조 변수)를 이용해야 한다.

  String name = "케피";

 

 

* 주의! char 타입 변수에 문자를 대입하지 않고 초기화 할 목적으로 빈 문자를 대입 시

 

    char c = '';      // X 공백(유니코드:32)이 없으면 컴파일 에러 발생!

    char c = ' ';     // O 

 

   참고) String 변수는 "" 연달아 붙인 빈 문자 가능하다.

 

            String str = "";      // O

 

short

 

C언어와 호환을 위해 사용, 자바에서는 잘 사용하지 않음

 

 

int

 

정수 연산의 기본 타입

byte, short 타입을 연산 시 int 타입으로 변환되고, 연산 결과 역시 int 타입이 된다. (자동 타입 변환)

 

어떠한 진수로 입력하더라도 모두 2진수로 변환되어 비트에 저장된다.

 

10 : 00000000 00000000 00000000 00001010 (4byte)

 

public class IntExam {
	public static void main(String[] args) {
    	int var1 = 10;    //10 진수로 저장
        int var2 = 012;   //8 진수로 저장
        int var3 = 0xA;   //16 진수로 저장
        
        System.out.println(var1);  //10
        System.out.println(var2);  //10
        System.out.println(var3);  //10
    }
}

 

long

수치가 큰 데이터를 다루는 프로그램에서 이용

초기화 시 정수값 뒤에 l 이나 L 을 붙일 수 있다. (컴파일러에게 long 타입임을 알린다.)

int 타입 저장 범위를 넘어서는 큰 정수는 l or L을 붙여야 한다.

 

public class LongExam {
	public static void main(String[] args) {
    	long var1 = 10;
        long var2 = 20L;
        //long var3 = 1000000000000 컴파일 에러 (범위 초과)
        long var4 = 1000000000000L;
        
        System.out.println(var1);   //10
        System.out.println(var2);   //20
        System.out.println(var4);   //1000000000000
    }
}

 

 

float, double

 

float : 부호 (1bit) + 지수 (8bit) + 가수 (23bit) = 32bit = 4byte

 

double : 부호 (1bit) + 지수 (11bit) + 가수 (52bit) = 64bit = 8byte

 

기본 타입이 double 이므로, float 타입에 저장하려면 실수 리터럴 뒤에 f 나 F 를 붙여야 한다.

 

float var1 = 3.14;      //붙이지 않으면 컴파일 에러!!

float var2 = 3.14F;     // O

 

정수 리터럴에 10의 지수를 나타내는 e 또는 E가 포함되어 있으면,

실수 타입 변수 (float, double)에 저장해야 한다.

 

double var3 = 3e6      //3000000

double var4 = 2e-3     //0.002

 

public class FloatDoubleExam {
	public static void main(String[] args) {
    	//실수 저장
        double var1 = 3.14;
        float var2 = 3.14F;
        
        //정밀도 테스트
        double var3 = 0.1234567890123456789;
        float var4 = 0.1234567890123456789F;
        
        System.out.println("var1 : "+var1);  //var1 : 3.14
        System.out.println("var2 : "+var2);  //var2 : 3.14
        System.out.println("var3 : "+var3);  //var3 : 0.123456789012345678
        System.out.println("var4 : "+var4);  //var4 : 0.123456789
        
        //e 사용
        int var5 = 3000000;
        double var6 = 3e6;
        float var7 = 3e6F;
        double var8 = 2e-3;
        
        System.out.println("var5 : "+var5);  //var5 : 3000000
        System.out.println("var6 : "+var6);  //var6 : 3000000.0
        System.out.println("var7 : "+var7);  //var7 : 3000000.0
        System.out.println("var8 : "+var8);  //var8 : 0.002
    }
}        

 

 

boolean

 

조건문과 제어문의 실행 흐름 변경하는데 이용

 

public class BooleanExam {
	public static void main(String[] args) {
    	boolean stop = true;
        if(stop) {
        	System.out.println("중지");
        } else {
        	System.out.println("시작");
        }
    }
}