확장 변환과 축소 변환
자동 확장 변환과 명시적인 축소 캐스트를 안전하게 수행하는 방법을 학습합니다.
확장 변환과 축소 변환은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Java의 형 변환
Java에서는 호환되는 형 사이에서 값을 변환할 수 있습니다. 방향은 두 가지입니다:
- 확대 변환 — 더 큰 형으로 변환(안전하며 자동)
- 축소 변환 — 더 작은 형으로 변환(위험하며 명시적인 캐스트 필요)
확대 변환
확대 변환은 값을 호환되는 더 큰 형에 할당할 때 자동으로 발생합니다. 대상 형이 원본의 모든 값을 표현할 수 있으므로 데이터가 손실되지 않습니다.
확대 변환 순서: byte → short → int → long → float → double
byte b = 42;
short s = b; // byte → short (widening)
int i = s; // short → int (widening)
long l = i; // int → long (widening)
float f = l; // long → float (widening)
double d = f; // float → double (widening)
System.out.println(d); // 42.0축소 변환
축소 변환은 캐스트 연산자 (type)를 사용해 명시적으로 수행해야 합니다. 값이 대상 형에 맞지 않으면 잘리거나 손상될 수 있습니다.
double price = 99.99;
int wholePart = (int) price; // narrows — decimal truncated
System.out.println(wholePart); // 99 (not rounded!)
long bigNum = 130L;
byte small = (byte) bigNum; // 130 overflows byte (max 127)
System.out.println(small); // -126 (unexpected!)축소 변환 중 오버플로
축소 변환 중 값이 오버플로되면 Java는 모듈러 산술을 사용해 값을 순환시킵니다. 예외가 발생하지 않으므로 직접 방지해야 합니다.
int million = 1_000_000;
byte narrowed = (byte) million;
System.out.println(narrowed); // 64 (wraps around)
// Safe narrowing: check bounds first
if (million >= Byte.MIN_VALUE && million <= Byte.MAX_VALUE) {
byte safe = (byte) million;
} else {
System.out.println("Value doesn't fit in byte!");
}char와 int 변환
char는 유니코드 코드 포인트를 나타내는 16비트 부호 없는 정수입니다. int로는 자동으로 확대 변환되지만, int에서 char로 변환하려면 명시적으로 캐스트해야 합니다.
char letter = 'A';
int code = letter; // widening: char → int
System.out.println(code); // 65
int nextCode = code + 1;
char nextLetter = (char) nextCode; // narrowing: int → char
System.out.println(nextLetter); // B
// Useful for Caesar cipher shifts
char shifted = (char) ('a' + 3);
System.out.println(shifted); // d부동 소수점에서 정수로 변환할 때의 절삭
부동 소수점 수를 정수로 캐스팅하면 0을 향해 절삭되며 반올림되지 않습니다. 반올림이 필요하면 Math.round()를 사용합니다.
double pos = 3.9;
double neg = -3.9;
System.out.println((int) pos); // 3 (not 4)
System.out.println((int) neg); // -3 (not -4)
System.out.println(Math.round(pos)); // 4
System.out.println(Math.round(neg)); // -4문자열을 숫자로 변환
String을 숫자로 파싱할 때는 형변환이 아니라 래퍼 메서드를 사용합니다. 숫자가 아닌 문자열을 전달하면 NumberFormatException이 발생합니다.
String input = "42";
int parsed = Integer.parseInt(input);
double parsedD = Double.parseDouble("3.14");
System.out.println(parsed + 1); // 43
System.out.println(parsedD); // 3.14
try {
int bad = Integer.parseInt("abc");
} catch (NumberFormatException e) {
System.out.println("Not a valid number!");
}숫자를 문자열로 변환
숫자를 String으로 변환하는 방법에는 String.valueOf(), Integer.toString() 또는 ""을 사용한 문자열 연결이 있습니다.
int score = 95;
String s1 = String.valueOf(score); // "95"
String s2 = Integer.toString(score); // "95"
String s3 = score + ""; // "95" (concat trick)
System.out.println(s1.getClass().getSimpleName()); // String
// Converting to different bases
System.out.println(Integer.toBinaryString(42)); // 101010
System.out.println(Integer.toHexString(255)); // ff표현식에서의 승격
산술 표현식에서 Java는 피연산자를 자동으로 승격합니다:
byte,short,char는 연산 전에int로 승격됩니다- 피연산자 중 하나가
long이면 결과는long입니다 - 피연산자 중 하나가
float또는double이면 결과는 더 넓은 형식이 됩니다
byte x = 10;
byte y = 20;
// byte z = x + y; // compile error! sum is promoted to int
int z = x + y; // correct
long a = 100L;
float b = 2.5f;
double result = a * b; // long * float → double
System.out.println(result); // 250.0복합 대입 연산자
+=, -=, *=와 같은 복합 연산자에는 암시적인 축소 형변환이 포함됩니다. 따라서 byte 및 short 변수로 간결한 코드를 작성할 수 있습니다.
byte count = 100;
// count = count + 1; // compile error — int result needs cast
count += 1; // OK — compound op casts automatically
System.out.println(count); // 101
short total = 1000;
total *= 2; // implicit narrow cast included
System.out.println(total); // 2000실전: 안전한 정수 파싱
실제 개발에서 자주 사용하는 방식은 사용자 입력을 안전하게 파싱하고, 범위를 검증한 다음, 필요한 정확한 형식으로 축소하는 것입니다.
public static byte parseAsByte(String input) {
int value = Integer.parseInt(input); // can throw NumberFormatException
if (value < Byte.MIN_VALUE || value > Byte.MAX_VALUE) {
throw new IllegalArgumentException(
"Value " + value + " out of byte range");
}
return (byte) value;
}
// Usage
System.out.println(parseAsByte("100")); // 100
System.out.println(parseAsByte("200")); // IllegalArgumentException빠른 확인
다음 코드의 출력은 무엇입니까?
double d = -7.8; int i = (int) d; System.out.println(i);
복습: 확대 변환과 축소 변환
핵심 정리:
- 확대 변환은 자동으로 수행되며 안전합니다: 바이트형→쇼트형→정수형→긴 정수형→단정도 부동소수점형→
double - 축소 변환에는 명시적인 형변환이 필요하며 데이터가 손실되거나 오버플로가 발생할 수 있습니다
char는int로 확대되며, 형변환을 사용하면int를 다시char로 축소할 수 있습니다- 부동소수점에서 정수로 변환하면 반올림하지 않고 0을 향해 소수 부분을 버립니다
Integer.parseInt/Double.parseDouble을 사용하여String을 숫자로 변환합니다- 복합 연산자(
+=,*=)에는 암시적인 축소 형변환이 포함됩니다
자주 묻는 질문
“확장 변환과 축소 변환” 강의는 무료인가요?
네 — “확장 변환과 축소 변환” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“확장 변환과 축소 변환”에서 뭘 배우나요?
자동 확장 변환과 명시적인 축소 캐스트를 안전하게 수행하는 방법을 학습합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“확장 변환과 축소 변환” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 기본형과 참조형
- 확장 변환과 축소 변환
- instanceof 연산자
- 실전에서의 형 변환