일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준
- 코딩테스트
- AWS
- 소프트웨어
- 부트캠프
- 자바
- 국비
- 개발자블로그
- 스파르타내일배움캠프TIL
- 항해
- 중심사회
- MySQL
- java
- 개발자스터디
- 개인공부
- 프로그래머스
- 99일지
- wil
- 내일배움캠프
- Spring
- 99클럽
- Python
- Flutter
- 컴퓨터구조론 5판
- 스파르타내일배움캠프WIL
- 스파르타코딩클럽
- 운영체제
- til
- 스파르타내일배움캠프
- 컴퓨터개론
- Today
- Total
컴공생의 발자취
JAVA 자동 형변환 & 강제 형변환 본문
💡 오늘의 학습 키워드
- 형변환
* 자동 형변환 (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 코딩테스트
'💡 코테' 카테고리의 다른 글
자바 char 배열 정렬 (Sorting) 및 형변환 (char Array to String && Array to String) (3) | 2024.04.02 |
---|---|
자바 동적 배열 선언 및 형변환 (long to String) (0) | 2024.04.01 |
문자열에서 index 위치의 문자 반환 및 형변환 (char to int & String to Array) (0) | 2024.03.30 |
자료형의 크기와 범위 (0) | 2024.03.29 |
문자열 함수(반복, 자르기) (0) | 2024.03.28 |