2017년 6월 26일 월요일

[Java] 자료형(Data Type)과 변수

자바에서 모든 변수(Variable)는 그에 맞는 Type(형태)를 가지고 있다. 자바에는 총 8개의 원시형(Primitive Type)이 있으며, 정수(Integer)형 4개[int, short, long, byte], 소수(Floating-point)형 2개[float, double], 문자(Character)형 1개[char], Boolean형 1개로 이루어져 있다. 그리고 문자열 형식(String)은 String 객체를 통해 표현한다.

모든 자바의 변수들은 그에 맞는 type(형)을 가진다. 변수의 이름은 언제나 문자로 시작해야하며 문자 1개만 사용해서는 안된다. 다만 '$' 문자는 자바 컴파일러에 의해 사용되기도 하니 사용을 피하도록 하자. 또한 Java reserved word 들은 사용하면 안되는데, 예를들면 int, double, for, if 와 같이 자바에서 구문으로 사용되는것들은 사용할수 없다.

Integer Type(정수형)


정수형이란 소수점 아래로 표현이 불가능한 양수와 음수들을 말한다.


Type저장공간표현 가능 수
long8 bytes-2^63 ~ +2^63
int4 bytes-2^31 ~ +2^31
short2 bytes-2^15 ~ +2^15
byte1 bytes-2^7 ~ +2^7

각 타입의 저장공간에서 가장 첫번째 비트(bit)는 수가 음수인지, 양수인지를 의미하므로, 나머지 비트만큼 수를 표현 할 수 있다. 대부분의 경우에 int 타입이 가장 실용적이며, 이보다 더 큰 수를 저장해야 할 경우에는 long 타입을 이용할 수 있다. short 타입과 byte 타입은 low level file 사용 등의 특별한 경우에 사용된다.

long 타입 정수들은 값의 마지막에 L 또는 l을 붙인다. 16진수들은 수의 첫자리에 0x 또는 0X를 붙이며, 8진수는 수의 첫자리에 0을 붙인다. 또한 Java SE7 부터는 수의 첫자리에 0b, 0B붙이며 2진수로 수를 표현할 수도 있다. 수가 너무 커지거나 길어져서 읽기 힘들면, ','(반점)으로 구분하듯이 '_'(underscore, 밑줄문자)를 이용해 구분할 수도 있다. 이는 단순히 개발자가 쉽게 구분하기 위한 용도이며, 자바 컴파일러는 컴파일시 밑줄문자를 그냥 무시한다.


//값 정의
long lExample1 = 100L, lExample2 = 233l;
int hexaExample1 = 0x143, hexaExample2 = 0X233;
long octExample1 = 010, octExample2 = 034;
int biExample1 = 0b10101, biExample2 = 0B1101;
int million = 1_000_000; // 백만

//값 확인
System.out.println(lExample1);// 100
System.out.println(lExample2);// 233
System.out.println(hexaExample1);// 323
System.out.println(hexaExample2);// 563
System.out.println(octExample1);// 8
System.out.println(octExample2);// 28
System.out.println(biExample1);// 21
System.out.println(biExample2);// 13
System.out.println(million);// 1000000

각 프로세서 별로 맞는 정수형 데이터 타입을 사용해야하는 C, C++와는 달리 자바에서는 그런 걱정을 할 필요가 없다. 이러한 요소는 자바가 Platform-Independent Language(플랫폼 독립 언어)라 불리는 이유 중 하나 이기도 하다.


Floating-Point Type(부동소수형)


말 그대로 소수형이다. 정수형과 달리 소수들도 표현 가능하다. IEEE754 표준에 기초한다.


Type저장공간표현 가능 수
double8 bytes±3.40282347E+38
float4 bytes±1.79769313486231570E+308

double이라는 자료형은 float이 32bit single precision을 쓰고 double 형이 그 2배를 저장할수 있다는 뜻에서 double로 유래됬다. float형 소수는 언제나 숫자 뒤에 F 또는 f가 붙는다. 소수이나 f 또는 F가 붙지 않았다면 double형으로 처리된다. double형에 대해 특별히 표시를 하고 싶다면 D 또는 d를 뒤에 붙이면 된다.

모든 부동소수형(Floating Point) 연산은 IEEE 754기준에 따라 연산된다. 그렇기 때문에 좀 애매한 결과가 나올때도 있는데 예를 들어 "2.0-1.1" 을 연산하게 되면 결과값이 0.9가 나와야 하지만 실제 결과는 0.8999999999999999이 나오게 된다.


이는 2진수에서 10진수로 변환할때 생기게 되는 문제다. 예를들어, 0.5라는 10진수를 2진수로 표현하게 되면 0.1로 표현할 수 있다. 0.75는 0.11이되고, 0.875는 0.111(2^-1 + 2^-2 + 2^-3)이 된다. 2진수 연산이기 때문인데, 그렇기 때문에 모든 분수들은 2의 배수가 분모가 되는 분수들로 표현된다. 우리가 10진수의 세상에서 1/3을 소수형으로 딱 떨어지게 표현하지 못하는것처럼 2진수의 세계에서 1/10을 정확하게 표현하지 못한다. 만약 이런 에러들을 피하고 싶다면 원시 자료형인 double형이나 float형 말고 BigDecimal이라는 클래스를 이용하도록 하자.


System.out.println(2.0-1.1); //0.8999999999999999

BigInteger & BigDecimal


기본적인 정수형과 소수형이 원하는 수를 저장하지 못한다면 자바 라이브러리 java.math 패키지의 BigInteger 클래스와 BigDecimal 클래스를 이용하면 된다.
다만 연산을 위해서는 +,-와 같은 일반 연산자가 아닌 BigInteger, BingDecimal 클래스의 메소드를 이용해야 한다.

BigDecimal a = BigDecimal.valueOf(2.0);
BigDecimal b = BigDecimal.valueOf(0.1);
BigDecimal c = a.divide(b);
System.out.println(c); //20


char Type(문자형)


char형은 말그대로 문자 1개를 표현하기 위해 만들어졌다. 2 byte의 데이터를 저장할 수 있다. char형에 데이터를 어싸인하기 위해서는 작은따옴표('') 사이에 문자 1개를 집어넣어주면 된다. 문자 1개밖에 못저장한다. 2개넣으면 신텍스 에러가 뜬다. 작은따옴표만 사용해야 한다. 아스키(ASCII) 값 65를 가진 알파벳를 어싸인할 때 'A'"A"는 큰 차이가 있다.  작은따옴표('') 사이의 A는 문자형 A 이지만 큰따옴표("")사이의 A 는 String 형 A 이기 때문이다. 그렇기 때문에 큰따옴표를 써도 신텍스 에러가 난다. 유니코드 또는 아스키 코드로 값을 어싸인할수도 있다.


char asciiA = 65; //ASCII 코드 A
char unicodeA = '\u0041'; //UTF-8(유니코드) A
System.out.println(asciiA); //A
System.out.println(unicodeA); //A


boolean Type(boolean형)


boolean 형은 2가지 값 true, false, 둘중 하나밖에 저장하지 못한다. 단순히 논리문의 조건을 저장하기 위해 존재한다.


boolean falseTest = false;
boolean trueTest = true;
System.out.println(falseTest); //false
System.out.println(trueTest); //true

댓글 없음:

댓글 쓰기