[JAVA] 상수와 형변환

Coastby·2022년 9월 21일
0

LIKELION Back-End School

목록 보기
3/61

상수 개념

○ 상수

상수의 개념

  • 값을 딱 한 번 할당하며 변경이 불가능한 변수
  • 키워드 final 선언이 붙음
//반지름이 5인 원의 넓이 구하기에서 파이값 설정
static final double PI = 3.14;

literal (리터럴)의 개념

  • 소스 코드 내에 직접 입력된 값, 변하지 않는 데이터 그 자체 (상수라고도 한다.)
  • 원시 타입과 String이 있다.
    • 정수의 리터럴은 int 타입으로 컴파일되며, 실수의 리터럴은 double 타입으로 컴파일된다.
int a = 10;
int b = 10;

//메모리 주소 비교
System.out.println(a == b);		

//result
true

위와 같이 코드가 실행되면 10(상수)을 Heap 메모리 영역 안에 있는 Constant Pool 이라는 메모리 영역에 할당한다.
그리고 int b가 또 10이라는 같은 값을 호출하게 되면 자바는 전에 10이 할당되었던 메모리를 넘겨주게 된다.
ab의 메모리 주소를 비교하면 같음이 출력된다.

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영역에 이미 할당되어 있는 값을 기르키게 된다.

위의 출력 코드는 문자열의 메모리 주소를 정수값으로 출력한다.
리터럴 방식으로 할당한 문자열인 str1str2는 주소가 같으며,
new 연산자를 통해 생성된 String 객체인 str3str4는 각각 주소가 다른 것을 알 수 있다.

참고 : https://yoo11052.tistory.com/50
https://madplay.github.io/post/java-string-literal-vs-string-object

형변환

⭐️ 형변환 중요함 : 에러의 80%는 형변환을 이해하지 못해서 그런 경우가 많음.

  • 이해는 쉬운데 실수를 많이한다.
  • 컴퓨터는 무식해서 연산 시 데이터 타입을 맞추어야 한다.
    • int + long 을 하려고 하면 한 쪽의 데이터 타입으로 맞춘다.
    • 두 피연산자의 자료형이 일치해야 동일한 방법을 적용하여 연산을 진행할 수 있다.

○ 자동 형변환

  • 자료형의 크기가 큰 방향으로 (바이트보전)

  • 정수보다는 실수형으로 (소수점을 보전하는 쪽으로)

  • 서로 다른 타입의 피연산자가 있을 경우 두 연산자 중 크기가 큰 타입으로 자동 타입 변환된 후 연산을 수행한다.

  • 자바는 정수 연산 시 int타입을 기본으로 한다.

    • JVM이 32bit 시스템이기 때문에, 피연산자를 4byte 단위로 저장한다.
    • 4byte보다 작은 타입 (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

○ 명시적 (강제) 형변환

  • 개발자가 커다란 위험을 무릅쓰고, 강제로 형변환 시킴
  • longint로 형변환 시키면 앞의 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);
profile
훈이야 화이팅

0개의 댓글