컴공생의 발자취

[ 99클럽 코테 스터디 4일차 TIL ] JAVA 자동 형변환 & 강제 형변환 본문

💡 코테/99클럽

[ 99클럽 코테 스터디 4일차 TIL ] JAVA 자동 형변환 & 강제 형변환

MNY 2024. 3. 31. 23:41
728x90
반응형
💡 오늘의 학습 키워드

- 형변환
    * 자동 형변환 (Promotion)
    * 강제 형변환 (Casting)

 

형변환 (Type Conversion)

: 하나의 타입을 다른 타입으로 바꾸는 것

 

* 자동 형변환 (Promation)

: 자동 타입 변환은 묵시적 / 암시적 형변환 이라고도 불리우며, 프로그램 실행 도중에 컴파일러가 자동적으로 타입 변환이 일어나는 것을 말한다. 단, 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때만 자동 타입 변환이 발생한다.

즉, 기존의 값을 최대한 보존할 수 있는 큰 타입으로 자동 형변환이 가능하다고 이해하면 된다.

// 큰 범위의 타입에 작은 범위의 타입 넣기
int small_type = 10;
float big_type = small_type;

System.out.println(big_type);

// result : 10.0

// error!
// 작은 범위의 타입에 큰 범위의 타입 넣기
float err_big_type = 10;
int err_small_type = err_big_type;

 

* 연산식은 어떻게 형변환이 될까?

데이터 연산은 기본적으로 같은 타입의 피연산자 간에만 수행되기 때문에, 서로 다른 타입의 피연산자가 있을 경우 두 연산자 중 크기가 큰 타입으로 자동 변환된 후 연산을 수행한다.

 

* 강제 형변환 (Casting)

: 강제 형변환은 명시적 형변환이라고 불리우며, 사용자가 타입 캐스트 연산자( ex : (double) 24 )를 사용하여 값의 타입을 강제적으로 변환하는 것을 말한다.

작은 크기의 타입은 큰 크기의 타입으로 자동 형변환 되지만, 반대로 큰 크기의 타입은 작은 크기의 타입으로 자동 형변환 할 수 없다.

int big1 = 1000;
byte small1 = (byte) big1; // byte의 범위 밖의 값이므로 데이터 손실

int big2 = 100;
byte small2 = (byte) big2; // byte의 범위 안의 값이므로 데이터 손실 발생 없음

float big_type = 24.3;
int small_type = (int) big_type; // 소수 값이 버려짐
System.out.println(small_type);

// result : 24

 

* 형변환 안전장치

모든 기본 타입에 대해 최댓값(max)과 최소값(min)을 다음과 같이 상수로 제공하고 있다. (boolean과 char 타입 제외)

기본 타입 최대값 상수 최소값 상수
byte byte.MAX_VALUE byte.MIN_VALUE
short short. MAX_VALUE short. MIN_VALUE
int int. MAX_VALUE int. MIN_VALUE
long long. MAX_VALUE long. MIN_VALUE
float float. MAX_VALUE float. MIN_VALUE
double double. MAX_VALUE double. MIN_VALUE

 

오늘의 회고

문제  : [콜라즈 추측]

  • 어떤 문제가 있었고, 나는 어떤 시도를 했는지

입력된 수가 짝수일 경우 2를 곱하고, 홀수일 경우 3을 곱하고 1을 더해준다.

이것을 1이 될때까지 반복하며 횟수가 500이 넘어갈 경우 -1을 리턴하는 문제이다.

 

처음엔 반복횟수를 가지고 있을 변수를 선언하고 

while문을 이용해서 짝수, 홀수 그리고 원하는 조건을 충족하는 경우 이렇게 3개를 조건으로 줬다.

마지막엔 횟수가 500이 넘을 경우 리턴 값을 -1로 해줬다.

 

하지만, 입력값의 변수를 그대로 사용해서 특정 값의 경우 계산되면서 값의 증가로 인해 int의 범위를 넘어 제대로 된 값이 나오지 않았다. 그래서 입력값과 같은 값은 long으로 선언된 변수에 넣어주고 계산했다.

 

  • 어떻게 해결했는지
// 변수 : 반복 횟수, 형변환 변수

// 입력 수 = 1 -> 반복X
// 입력 수 = 짝수 -> 2로 나누기
// 입력 수 = 홀수 -> 3을 곱하고 1 더하기 (0은 홀수로 취급?)
// 입력 수 = 1이 될 때까지 반복

// result 반복한 횟수
// 반복 횟수가 500이상 일 경우 result -1

class Solution {
    public int solution(int num) {
        int answer = 0;
        int loop_num = 0;
        long change_num = 0;
        
        change_num = num;
        while(loop_num < 500) {
            if (change_num == 1)
                break;
            else if (change_num%2 == 0)
                change_num /= 2;
            else 
                change_num = change_num * 3 + 1;
            loop_num++;
        }
        
        answer = loop_num;
        if (loop_num >= 500) {
            answer = -1;
        }
        
        return answer;
    }
}

 

  • 무엇을 새롭게 알았는지

오늘은 형변환에 대한 고찰이었다고 생각한다. 이번 문제와 같이 어떠한 특정 값에서는 그 값이 계산되며 증가될 것을 예상하고 문제를 풀이해야 하는데 이런 부분들을 놓치고 있다는 걸 깨달았다. 이로 인해 자동 형변환과 강제 형변환에 대해 알아보는 계기가 되었으며, 정리하며 이전보다 자세하게 알게되었다.

 

내일 학습할 것은 무엇인지

  • 빅분기 자격증 공부
  • 클럽99 코딩테스트

 

728x90
반응형