//반지름이 5인 원의 넓이 구하기에서 파이값 설정
static final double PI = 3.14;
int a = 10;
int b = 10;
//메모리 주소 비교
System.out.println(a == b);
//result
true
위와 같이 코드가 실행되면 10
(상수)을 Heap 메모리 영역 안에 있는 Constant Pool 이라는 메모리 영역에 할당한다.
그리고 int b
가 또 10
이라는 같은 값을 호출하게 되면 자바는 전에 10
이 할당되었던 메모리를 넘겨주게 된다.
a
와 b
의 메모리 주소를 비교하면 같음이 출력된다.
String str1 = "hoon";
String str2 = "hoon";
String str3 = new String("hoon");
String str4 = new String("hoon");
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str2));
System.out.println(System.identityHashCode(str3));
System.out.println(System.identityHashCode(str4));
//result
1694819250
1694819250
932583850
212628335
String의 경우 원시타입이 아닌 참조 타입이지만 자바는 특별한 방식으로 String을 처리한다. 바로 String Constant Pool이라는 영역을 따로 관리하고 있다.
원시타입과 마찬가지로 같은 값을 호출할 시에 새로운 메모리를 할당하지 않고 String Constant Pool영역에 이미 할당되어 있는 값을 기르키게 된다.
위의 출력 코드는 문자열의 메모리 주소를 정수값으로 출력한다.
리터럴 방식으로 할당한 문자열인 str1
과 str2
는 주소가 같으며,
new
연산자를 통해 생성된 String 객체인 str3
와 str4
는 각각 주소가 다른 것을 알 수 있다.
참고 : https://yoo11052.tistory.com/50
https://madplay.github.io/post/java-string-literal-vs-string-object
⭐️ 형변환 중요함 : 에러의 80%는 형변환을 이해하지 못해서 그런 경우가 많음.
int
+ long
을 하려고 하면 한 쪽의 데이터 타입으로 맞춘다.자료형의 크기가 큰 방향으로 (바이트보전)
정수보다는 실수형으로 (소수점을 보전하는 쪽으로)
서로 다른 타입의 피연산자가 있을 경우 두 연산자 중 크기가 큰 타입으로 자동 타입 변환된 후 연산을 수행한다.
자바는 정수 연산 시 int
타입을 기본으로 한다.
byte
, char
, short
)는 int
로 변환되어 연산이 수행된다.int
로 반환된다. long
타입이 있다면 long
으로 변환되어 연산되고, 결과도 long
으로 반환된다.short num1 = 1;
short num2 = 2;
//Error!!
//short num3 = num1 + num2;
//int에 대입
int num3 = num1 + num2;
//또는 강제 형변환하여 short에 대입
short num3 = (short) num1 + num2;
자바는 실수 연산 시 double
타입을 기본으로 한다.
double
타입이 있다면, 다른 피연산자도 double
이 되고, 연산 결과도 double
타입으로 반환된다.float
끼리 연산하면 결과는 float
이 되는 듯하다.float
은 오차가 많이 발생하므로 연산할 때는 double을 사용하도록 하자.float num1 = 1.2f;
float num2 = 2.35f;
float num3 = num1 + num2;
System.out.println(num3);
//result
3.55
long
을 int
로 형변환 시키면 앞의 4바이트가 잘려버린다.long num1 = 31473947392L;
int num2 = (int) num1;
System.out.println(num2);
//result
1409176320
Scanner sc = new Scanner (System.in);
//문자열 중 첫번째 알파벳 선택
char ch = sc.nextLine().charAt(0);
int num = (int) ch;
System.out.println(num);
Scanner sc = new Scanner (System.in);
//정수를 char로 형변환
char character = (char) sc.nextInt();
System.out.println(character);