기본 타입과 연산
기본 타입
자바의 '기본(primitive) 타입'에는 다음과 같은 타입들이 있다:
정수 타입:
byte,short,int,long실수 타입:
float,double문자 타입:
char논리 타입:
boolean
각 타입은 다음과 같은 크기를 가진다:
byte: 8비트short: 16비트int: 32비트long: 64비트float: 32비트double: 64비트char: 16비트boolean: 가상 머신에 따라 다름
이들은 모두 '숫자'를 표현하는 데 사용되며, boolean은 참/거짓 값을 표현하는 데 사용되고, char는 유니코드 문자를 표현하는 데 사용된다.
'C#'과는 다르게 자바에서 기본 타입들은 '객체'가 아니다. 즉 '암묵적'으로 Object 클래스를 상속하지 않는다. 따라서, 기본 타입들은 아무런 '메소드'를 가지지 않는다. 예를 들어, 다음과 같은 코드는 컴파일 오류가 발생한다.
반면에 'C#'에서는 다음과 같은 코드가 가능하다.
자바의 기본 타입들은 Object를 상속하지 않기 때문에 다음과 같은 코드도 당연히 컴파일 오류를 발생시킨다.
참고로 'C#'에서는 다음과 같은 코드가 가능하다.
부호없는 숫자 타입
자바에는 '부호없는(unsigned) 숫자 타입'이 없다. 자바의 모든 정수 타입(byte, short, int, long )은 부호가 있다. 하지만, char 타입은 0부터 65535까지의 '부호 없는 16비트 유니코드 값'을 저장할 수 있다.
char 타입
char 타입은 부호가 없는 숫자 타입이라고 생각할 수도 있지만, 사실은 문자를 표현하기 위한 타입이다. 따라서, char 타입에 저장된 값을 숫자로 사용할 수는 있지만, 문자로 사용하는 것이 더 적합하다. 예를 들어, 다음과 같은 코드는 문자를 출력한다.
하지만, 다음과 같이 char 타입의 값을 숫자로 사용할 수도 있다.
char 타입의 값을 숫자로 사용할 때는 주의해야 한다. char 타입의 값을 숫자로 사용할 때는 int 타입으로 변환된다. 따라서, char 타입의 값을 byte나 short 타입의 변수에 저장하려면 캐스팅을 사용해야 한다. 예를 들어, 다음과 같은 코드는 컴파일 오류가 발생한다.
다음과 같이 캐스팅을 사용하면 컴파일 오류를 피할 수 있다.
'영문 알파벳' 문자에 대해서 char 타입의 값을 숫자로 취급한 후 + 연산을 수행하면, 문자의 다음 문자를 얻을 수 있다. 예를 들어, 다음과 같은 코드는 'A' 문자의 다음 문자인 'B'를 얻는다.
Java 8부터 Integer와 Long 클래스는 부호 없는 연산을 지원하는 메소드가 제공되긴 한다. 예를 들어, divideUnsigned, compareUnsigned 등의 메소드를 사용하여 부호 없는 연산을 수행할 수 있다. 이는 주로 비트 연산이나 해시 코드 계산 등에서 유용하게 사용된다. 다음과 같이 사용할 수 있다.
숫자 타입 연산의 결과값 프로모션 규칙
자바에서는 숫자 타입 연산의 결과값을 프로모션(promotion) 규칙에 따라 타입을 변환한다. 프로모션 규칙은 다음과 같다.
피연산자의 타입이
double이면, 다른 피연산자의 타입을double로 변환하고 연산을 수행한다.피연산자의 타입이
float이면, 다른 피연산자의 타입을float로 변환하고 연산을 수행한다.피연산자의 타입이
long이면, 다른 피연산자의 타입을long로 변환하고 연산을 수행한다.피연산자의 타입이
int이면, 다른 피연산자의 타입을int로 변환하고 연산을 수행한다.피연산자의 타입이
char,byte,short이면,int로 변환하고 연산을 수행한다.
'5'번 항목은 유의할 필요가 있다. 예를 들어, byte 타입과 byte 타입의 연산 결과는 byte가 아니라 int` 타입으로 변환된다. 따라서, 다음과 같은 코드는 컴파일 오류 이다.
위 코드는 다음과 같이 수정해야 한다.
또는 다음과 같이 캐스팅을 사용할 수도 있다.