정수형 타입들은 어떻게 활용하나 ?
정수형 타입 short, int, long
다른 정수형 타입들은 어떻게 활용될까? 라는 의문점으로 출발
앞에서 byte에대해서 알아보았다 그러면 short, int, long 형은 언제 사용할까 ?
byte로 표현하기 부족하고, int로 표현하기에는 너무 공간 낭비가 심하다고 생각되는 경우에는 어떤 것을 사용하는 것이 좋을까 ?
이런 경우에 short
를 사용하는 것이다.
short 범위 -32,768 ~ 32,767 byte보다 제공할 수 있는 데이터의 범위가 크면서 int보다는 작다.
일반적인 웹 애플리케이션을 개발할 때에는 byte, short보다 int, long을 많이 사용한다고 한다.
이유는 데이터를 저장할 목적이 아닌 계산하기 위한 목적으로 byte나 short를 사용하면 원하지 않는 계산이 될 수도 있기 때문이다.
Long에 대한 규칙 이야기
- ➡️Long에 대한 규칙
21 public void checkOtherTypes() {
22 short shortMax = 32767;
23 int intMax = 2147483647;
24 long longMax = 9223372036854775807;
25 }
- 왜 이런 컴파일 Error가 뜰까 ??
자바의 규칙을 지키지 않았기 때문이다.
- 어떤 규칙?
기본적으로 자바에서는 숫자를 명시하면 int로 생각한다.
long 타입의 숫자를 명시적으로 지정해 줄 때에는 반드시 숫자가 가장 뒤에 L을 붙어줘야만 한다.
숫자가 int의 범위 내에 있다면 전혀 문제가 없다. 그런데 int의 범위를 넘어 섰을 때에는 L를 붙여서 쓴다.
- ➡️좋은 예시
21 public void checkOtherTypes() {
22 short shortMax = 32767;
23 int intMax = 2147483647;
24 long longMax = 9223372036854775807L;
25 }
결과는 잘 된다.
- 다른 타입에 최대값에 +1을 했을 경우
public void checkOtherType() {
short shortMax = 32767;
int intMax = 2147483647;
long longMax = 9223372036854775807L;
System.out.println(shortMax);
System.out.println(intMax);
System.out.println(longMax);
System.out.println("--------");
shortMax = (short)(shortMax + 1);
intMax = intMax + 1;
longMax = longMax + 1;
System.out.println("shortMax + 1 = " + shortMax);
System.out.println("intMax + 1 = " + intMax);
System.out.println("longMax + 1 = " + longMax);
}
결과
32767
2147483647
9223372036854775807
--------
shortMax + 1 = -32768
intMax + 1 = -2147483648
longMax + 1 = -9223372036854775808
소수값 처리
소수값을 표현하는 타입은 float와 double은 모두 소수점 값을 처리하기 위해서 사용된다.
float와 double은 32비트 64비트로 제공할 수 있는 범위를 갖고 있고 그 범위를 넘어서면 그 값의 정확성을 보장하지 않는다. 그렇기 때문에 돈 계산과 같이 중요한 부분에서는 사용을 지양한다.
자바에서는 정확한 계산이 요구 될 때에는 java.math.BigDecimal 클래스를 사용한다고 한다.
실수형 타입 | 부호 | 지수의 길이 | 가수의 길이 | |
---|---|---|---|---|
float | 1자리 | 8자리 | 23자리 | = 32 비트 |
double | 1자리 | 11자리 | 52자리 | = 64 비트 |
실수형 타입 | 유효 자릿수 |
---|---|
float | 소수 부분 6자리까지 오차없이 표현할 수 있다. |
double | 소수 부분 15자리까지 오차 없이 표현할 수 있다. |
- Oracle의 자바 설명서(Java Tutorial)에서는 float와 double의 정의를 이렇게한다.
- float : single - precision 32-bit IEEE 754 floating point
- double : double - precision 64-bit IEEE 754 floating point
- 번역해보면
- float : 단일 정확도를 가지는 32비트 IEEE 754 부동 소수점
- double : 단일 정확도를 가지는 64비트 IEEE 754 부동 소수점
- 참고하면 좋다 .. 👍 IEEE 754
나머지 남은 char와 boolean
➡️자바에서 Unicode는 2 byte를 사용하기 때문에 ASCII가 할당된 값들이 먼저 나오고, 그 다음에 미리 정해져 있는 유니코드들이 존재한다.
- char의 값을 지정하는 방법 3가지
- ‘ ‘(홀따옴표) 사용
- ₩u0000 → ₩u와 16진수 값을 넣는 것.
- 형변환을 이용해서 지정
기본 자료형의 기본값
자바의 모든 자료형은 지정하지 않으면 기본값을 사용한다.
그런데 지역 변수로 기본자료형을 사용할 때에는 기본 값이 자동으로 적용되지 않는다. 그렇기 때문에 값을 지정해줘야 한다.
메소드 안에서 정의한 변수에 값을 지정하지 않고 사용하려고 하면, 컴파일도 되지 않는다.
반면에 인스턴스 변수, 클래스 변수, 매개 변수는 값을 지정하지 않아도 컴파일이 되기는 한다. 하지만, 이렇게 값을 지정하지 않고 개발하는 것은 매우 안 좋은 습관이다. 그 변수의 값이 기본 값이라고해도 명시적으로 기본값을 지정해주는 습관을 들이자.
public class PrimitiveTypesSecond {
int intDefault;
byte byteDefault;
short shortDefault;
long longDefault;
float floatDefault;
double doubleDefault;
char charDefault;
boolean booleanDefault;
public static void main(String[] args) {
PrimitiveTypesSecond second = new PrimitiveTypesSecond();
second.defaultValues();
}
public void defaultValues(){
System.out.println("byteDefault = " + byteDefault);
System.out.println("shortDefault = " + shortDefault);
System.out.println("intDefault = " + intDefault);
System.out.println("longDefault = " + longDefault);
System.out.println("floatDefault = " + floatDefault);
System.out.println("doubleDefault = " + doubleDefault);
System.out.println("charDefault = " + charDefault);
System.out.println("booleanDefault= " + booleanDefault);
}
}
- 모든 기본자료형의 기본값들
결과 :
byteDefault = 0
shortDefault = 0
intDefault = 0
longDefault = 0
floatDefault = 0.0
doubleDefault = 0.0
charDefault =
booleanDefault= false
charDefault
는 공백(space)이 출력된다. 실제로 ‘₩u0000’ 값이 출력된 것이다.
그리고 boolean의 기본값은 false이다.
기본 자료형 회고록
오늘 배운 것들은 기초에 해당한다. 하지만 여러번 보면서 익히고 보이지 않았던 것들을 보면서 더 성장하는 것이다. 항상 안주해있는 것 보다는 기초한다고 창피해하지말고 새로운 출발에 있어서 부끄러워하지말자.
아무리 기초여도 모르는 것이 있을 수도 있다. 모르는 것이 있으면 해결해보고 안되면 커뮤니티를 통해서 해결해 나아가자.
다시 시작하는 것을 두려워말라.
다시
의 말의 뜻은 다시 일까? 라는 의미를 던지며 글을 마치겠습니다.