티스토리 뷰

Java & Kotlin

java primitive type

필자A 2022. 7. 23. 16:22

 

 

 

 

 

 

 

안녕하세요 오늘은 Java primitive type에 대하여 여행을 떠나볼까요?

 

 

 

 

 

 

안녕 primitive type 원시 타입!

 

목차

0. 특징

1. 요약

2. 타입에 대한 설명 ( int, boolean 제외)

 

 


 

 

0. 특징

 

 

primitive type은 기본적으로 not null의 특징이 있어

조금 더 안전하지 않을까(?) 생각도 됩니다.

하지만 특수한 상황에 있어 wrapper 형식이 필요할 때도 있습니다.

 

외부 프로그램(DB)과 연동 시 외부에서는 null을 허용할 수도 있으며

제네릭을 사용할 시 wrapper 형식이 필요합니다.

 

primitive type과 references type을 혼용 시에도 주의가 필요합니다.

 

 

 

 

(references type은 주소를 비교)

Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
System.out.println(i1 == i2);

--> result : false

(js의 원시형은 같은 값의 경우 같은 메모리 주소를 사용합니다. java에서는 잘 모르겠네요...)
int i3 = 1;
int i4 = 1;
System.out.println(i3 == i4);

--> result : true

 + boxing, unboxing을 위한 resources 가 많이 필요함

 

 

 

 

 

 

1. 요약

 

 

타입 메모리 사용크기 저장되는 값 범위 default size
byte 1byte -128 ~ 127 0
char 2byte 0 ~ 65,536 \u0000
short 2byte -32,768 ~ 32,767 0
int 4byte -2,147,483,648(-2^31) ~ 2,147,483,647(2^31 -1) 0
long 8byte -9,223,372,036,854,775,808(-2^63) ~ 9,223,372,036,854,775,807(2^63 -1) 0L
float 4byte 1.4E-45 ~ 3.4028235E38 0.0f
double 8byte -1.7976931348623157E+308 ~ -4.9E-324 0.0d
boolean 1bit   false

 

 

 

 

 

2. 타입에 대한 설명

 

 

 

 

1. byte

 

타입 이름처럼 1byte의 메모리 사용 크기를 가집니다.

8비트 256가지를 표현할 수 있으나, 음수와 양수 모두를 표현하기 위하여

최상위 비트 1개는 부호로 사용하여 2의 7승(-128) ~ 2의 7승 -1(127)을 표현 가능합니다.

-1은 0도 표현하기 때문입니다.

작업의 목적에 있어서 의미론적으로도 사용합니다.

https://namu.wiki/w/8비트

 

 

 

2.char

 

그리고 한 개의 문자를 처리하는 데 사용됩니다. (EX 'a', 'b' )

모든 유니코드를 표현할 수 있습니다.

 

unicode to String(unicode 가 2byte이기 때문에 parseInt 16을 넣어줍니다.)

String hello1 = "\\u0048\\u0065\\u006C\\u006C\\u006F";
String e = hello1.replace("\\","");
String[] arr = e.split("u");
String text = "";
for(int i = 1; i < arr.length; i++){
    int hexVal = Integer.parseInt(arr[i], 16);
    text += (char)hexVal;
}

 

 

 

 

3.short

 

2byte의 사용 크기를 가지며

-32768 ~ 32767 범위의 숫자를 표현합니다.

javapoint에서는 메모리를 아끼고 싶을 때 사용할 수 있다고 합니다!

int 보다 1/2의 메모리 사용 크기를 가집니다.

 

 

다루는 데이터가 작으면 int 말고 short, byte를 써야 할까?

사용할 필요는 없고 오히려 곱셈 연산에 있어서 성능 저하가 있다고 합니다.

🐥모르겠으면 int를 사용하는 게 짜세인 것 같습니다.🐥

In java, is it more efficient to use byte or short instead of int and float instead of double?

https://stackoverflow.com/questions/14531235/in-java-is-it-more-efficient-to-use-byte-or-short-instead-of-int-and-float-inst

 

 

 

6. long

8byte가 필요하며

int 값 범위 약 -21억 ~ 21억의 범위 밖의 수를 표현 시 사용됩니다.

 

 

 

7.float, double

 

부동소수점, IEEE 754 표준을 따르고 있습니다.(많은 곳에서 사용되는 표준)

4byte(32bit)가 필요하며 

1bit 부호 비트

8bit 지수부

23bit 가수부

로 자리 잡게 됩니다.

 

double은

 

부동소수점, IEEE 754 표준을 따르고 있습니다.(많은 곳에서 사용되는 표준)

8byte(64bit)가 필요하며

1bit 부호 비트

11bit 지수부

52bit 가수부

로 자리 잡게 됩니다.

java에서는 실수 연산은 기본적으로 double을 사용합니다.

 

 

아래 두 개는 dobule, float의 연산 결과입니다.

부동소수점의 계산 방식에 있어서 가수부에 2를 무한하게 곱하는 방식이기에

근삿값으로 결과를 나타내는 단점이 있어 실제 업무에 있어 주의가 필요합니다.

java에서는 BigDecimal을 사용할 수도 있습니다.

 

 

 

float

 

 

double s = 0;
for(int i =0; i < 100; i++)
{
    s += 0.1;
}
System.out.println(s);
---> reuslt : 9.99999999999998

 

double

 

 

float s2 = 0;
for(int i =0; i < 100; i++)
{
    s2 += 0.1;
}
System.out.println(s2);
--> result : 10.000002

 

BigDecimal

 

 

BigDecimal s = new BigDecimal(0);
for(int i =0; i < 100; i++)
{
    s = s.add(new BigDecimal("0.1"));
}
--> result : 10.0

 

 

 

☠️ new BigDecimal()의 인자로 String type을 추천합니다. 

BigDecimal 생성자로 부동소수점을 사용하는 타입을 넘길 경우

이미 오차가 발생한 채로 넘어간다고 합니다. String type이 인자로 넣는 게 프로그램의 신뢰성에 도움이 된다고 봅니다. 

 

result : 10.0000000000000005551115123125782702118158340454101562500

반응형

'Java & Kotlin' 카테고리의 다른 글

Java Arithmetic Operator  (0) 2022.07.25
Java Type AutoCasting  (0) 2022.07.25
Java Equals, HashCode  (0) 2022.07.17
kotlin 기본 사용법  (0) 2022.07.16
builder pattern 연습해보기  (0) 2022.06.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함