Java] Primitive Type Training

1. String + int + int

1
2
3
4
5
6
7
8
9
// 1번
System.out.println("Test" + 1 + 2); //Test12
//2번
System.out.println(1 + 2 + "Test"); //3Test
//3번
System.out.println(1 + "Test" + 2); //1Test3

// 1번이 Test3이라고 나오게 하기 위해선
System.out.println("Test" + (1 + 2)); //Test3

Python에서는 <class 'str'><class 'int'>의 합이 될 경우에는 TypeError: can only concatenate str (not “int”) to str가 발생한다.

Problem

1
2
3
4
5
6
System.out.println(true + ""); //true
System.out.println('A' + 'B'); //131
System.out.println('1' + 2); //51
System.out.println('1' + '2'); //99
System.out.println('J' + "ava"); //Java
//System.out.println(true + null); //오류발생

2. 선언과 초기화

1
2
3
4
5
6
7
8
// 선언
int num;

// 초기화
num = 5;

// 선언과 초기화
int num = 5;

3. 보수(1의 보수, 2의 보수)

1의 보수는 원래의 값의 비트를 반전 시킨 값이다.

5에 1의 보수와 2의 보수를 구해보자.

본래값 5 0(부호) 0 0 0 0 1 0 1
1의 보수 1 1 1 1 1 0 1 0
2의 보수 1 1 1 1 1 0 1 1

2의 보수: 1의 보수 + 1

본래의 값의 비트와 2의 보수를 더하면 0이 나온다.

4. 소수점 정확하지 않을 때

소수를 bit로 다 담을 수가 없기에 오류가 생길 때도 있다.

이건 python도 피해갈 수 없는 문제이다.

그러면 어떻게 해야 조금 더 원하는 답에 가까운 답을 얻을 수 있을까? 아니, 어떻게 원하는 답을 얻을 수 있을까?

1
2
3
4
5
6
7
8
9
double num = 2.0 - 1.1;
System.out.println(num); //0.8999999999999999
System.out.printf("%.2f\n", num); //0.90
System.out.println(String.format("%.2f", num)); //0.90
System.out.println(0.9 - num); //1.1102230246251565E-16

double res = Double.parseDouble(String.format("%.2f", num));
System.out.println(res); //0.9
System.out.println(0.9 - res); //0.0

이를 해결하기 위해 필자는 formatting을 한 이후에 그 값을 이용하는 방법을 사용하였다.

5. Primitive Type

- Short / Int

1
2
3
4
5
6
7
short num1 = 5;
short num2 = 2;
System.out.println(((Object)num1).getClass().getTypeName()); //java.lang.Short
System.out.println(((Object)(num1 + num2)).getClass().getTypeName()); //java.lang.Integer

short num3 = (short)(num1 + num2);
System.out.println(((Object)num3).getClass().getTypeName()); //java.lang.Short

Java의 정수형 기본 타입은 int형이다. 그렇기에 short + short값에 대해서 int형으로 바뀌게 되어 저장된다.

그렇다면 byte와 short는 왜 사용하는 것일까?

Java에서 속도측면에서만 본다면 int형이 기본이기에 int형으로 사용하는 것이 더 빠르다.

그러나, 메모리측면에서 본다면 byte와 short를 쓰는 것이 맞다.

현재의 컴퓨터 성능으로 본다면 우리는 속도를 선택해야하는 것이 맞는 것인데 그러면 어느 시점에 사용하는 것일까?

답은 간단하다. 빅데이터 시대인 지금에 맞게 엄청난 데이터를 다루는 일이 있다면 메모리를 신경써야한다. 예를 들어서 영상의 3D 그래픽 정보나 노래와 같은 음원 정보를 저장할 때 쓰인다. 이와 같은 경우, 실수형일 때는 기본형 double이 아닌 float형을 쓰는 것이 더 낫다.

1
2
3
4
5
6
7
8
9
float num1 = 3.14f;
double num2 = 1234e-3;
double num3 = 5.43f;
long num4 = 1000000000L;

System.out.println(num1); //3.14
System.out.println(num2); //1.234
System.out.println(num3); //5.429999828338623
System.out.println(num4); //1000000000

형변환에 대해서 알게 된다면 float형태일 때 f를 써서 표현하는 것으로 알고 있는데 어떻게 double에 들어갈 수 있는지 이해할 수 있다.(자동 형 변환)

- Reference Type의 메모리 크기는?

참조 변수의 메모리 크기는 4byte로서 주소값을 가지고 있다. 해당 주소값을 가지고 Heap영역에 접근하여 값을 사용한다.

- Problem] 다음 중 main Method의 선언부로 알맞은 것은? (모두 고르시오)

1
2
3
4
5
1. public static void main(String[] args)
2. public static void main(String args[])
3. public static void main(String[] arv)
4. public void static main(String[] args)
5. static public void main(String[] args)

답은 md파일에서도 말해주고 있다…

답: 1, 2, 3, 5