CodeGym /행동 /JAVA 25 SELF /Java에서 명시적 및 암시적 형 변환

Java에서 명시적 및 암시적 형 변환

JAVA 25 SELF
레벨 6, 레슨 5
사용 가능

1. 암시적(자동) 형 변환

Java(다른 언어들과 마찬가지로)에서 변수는 엄격한 타입을 갖습니다 — 변수가 int로 선언되면 정수만 저장할 수 있고, double이면 부동소수점 수만 저장할 수 있습니다. 그러나 실제 프로그램에서는 한 변수의 값을 다른 타입의 변수로 “옮겨”야 하는 상황이 자주 생깁니다. 예를 들어:

  • 메서드에서 int를 받았지만, 소수 계산을 위해 이를 double로 사용하고 싶다.
  • 문자 코드를 숫자(int)로 저장하고 있는데, 실제 문자(char)를 얻고 싶다.
  • double로 계산된 결과가 있지만, 정수 결과(int)가 필요하다. 예를 들어, 사과의 개수를 출력하려는 경우.

Java에는 두 가지 기본적인 변환 방식이 있습니다: 암시적(자동) 및 명시적(수동).

이것이 무엇인가요?

암시적 변환은 데이터 손실이 없고 안전한 경우 Java가 여러분의 개입 없이 자동으로 한 타입의 값을 다른 타입으로 변환하는 것을 의미합니다.

이는 더 작은 타입의 값을 더 큰 타입의 변수에 대입할 때 발생합니다. 예를 들어, int에서 double로, char에서 int로, float에서 double로의 변환이 그렇습니다.

비유: 물이 든 컵(int)과 양동이(double)가 있다고 상상해 보세요. 컵의 물을 양동이에 붓는다면 물이 넘치지 않고 모두 담깁니다. 이런 경우 Java는 자동 변환을 허용합니다.

예시: int → double

int apples = 5;
double applesWeight = apples; // int는 자동으로 double이 됩니다

System.out.println(applesWeight); // 5.0

예시: char → int

Java에서 모든 문자는 사실 Unicode 표의 숫자입니다. 따라서 char에서 int로의 변환은 자동으로 일어납니다:

char letter = 'A';
int code = letter; // 'A'는 65로 변환됩니다(Unicode 문자 코드)

System.out.println(code); // 65

암시적 변환 표

원본 암시적으로 변환 가능한 대상
byte
short, int, long, float, double
short
int, long, float, double
char
int, long, float, double
int
long, float, double
long
float, double
float
double

중요: 암시적 변환은 오직 “확장” 방향(작은 타입에서 큰 타입으로)으로만 동작합니다.

2. 명시적(수동) 형 변환 (type casting)

명시적 변환은 더 큰 타입에서 더 작은 타입으로, 혹은 호환되지 않는 타입들 사이에서 값을 변환하려고 할 때 필요합니다. 이 경우 Java는 데이터 손실 가능성을 인지하고 있음을 명확히 표시할 것을 요구합니다.

비유: 양동이(double)에서 컵(int)으로 물을 붓는다면 일부가 넘칠 수 있습니다. Java는 여러분이 “네, 일부 데이터가 사라질 수 있음을 이해합니다!”라고 명시하길 요구합니다.

문법


target_type variable = (target_type) expression;
명시적 캐스팅 문법 (cast)

예시: double → int

double price = 12.99;
int roundedPrice = (int) price; // 소수 부분은 그냥 버려집니다!

System.out.println(roundedPrice); // 12

주의: 반올림은 일어나지 않습니다! 소수점 이하를 “잘라낼” 뿐입니다. 반올림이 필요하면 Math.round()를 사용하세요.

예시: int → char

int code = 66;
char letter = (char) code; // 66은 문자 'B'입니다

System.out.println(letter); // B

예시: double → float

double d = 3.1415926535;
float f = (float) d; // 일부 정밀도가 손실됩니다

System.out.println(f); // 3.1415927 (소수점 이하 자릿수가 더 적음)

3. 숫자와 문자(char와 숫자) 사이의 변환

왜 가능한가요?

Java에서 문자(char)는 사실 Unicode 표의 숫자입니다. 따라서 int로 자유롭게 변환할 수 있고, 그 반대도 가능합니다.

예시: char → int

char ch = 'Ω';
int code = ch;

System.out.println(code); // 937

예시: int → char

int code = 8364;
char symbol = (char) code;

System.out.println(symbol); // €

실습: 알파벳 출력

for (int i = 65; i < 65 + 26; i++) {
    System.out.print((char) i + " ");
}
// 출력: A B C D ... Z

4. 정수와 부동소수점 사이의 변환

int → double (암시적)

int count = 10;
double avg = count; // 암시적 확장

System.out.println(avg); // 10.0

double → int (명시적)

double score = 8.75;
int rounded = (int) score;

System.out.println(rounded); // 8

수학 규칙대로 반올림하려면?

소수 부분을 단순히 “버리는” 것이 아니라 가장 가까운 정수로 반올림하려면 Math.round()를 사용하세요:

double price = 8.75;
int rounded = (int) Math.round(price);

System.out.println(rounded); // 9

5. “축소” 변환에서 무슨 일이 일어나나요? 데이터 손실

예시: int → byte

int big = 300;
byte small = (byte) big;

System.out.println(small); // 44 (!)

왜 44일까요? byte는 -128부터 127까지의 값을 저장하며, 숫자가 범위를 벗어나면 256을 기준으로 모듈로 절단(나머지 처리)됩니다.

예시: double → int

double d = 1e20;
int i = (int) d;

System.out.println(i); // -2147483648 (int의 최소값)

큰 수는 int 범위에 담기지 않기 때문에 결과가 “이상하게” 보일 수 있습니다.

6. 연산 중 변환: “혼합” 타입

예시: int + double

int a = 3;
double b = 2.5;
double result = a + b; // int는 자동으로 double이 됩니다

System.out.println(result); // 5.5

예시: char + int

char ch = 'A'; // 65
int offset = 2;
char next = (char) (ch + offset);   // char는 자동으로 int가 됩니다

System.out.println(next); // C

7. 숫자와 문자열 사이의 변환

이는 엄밀히 말해 “형 변환”은 아니지만, 숫자를 문자열로 혹은 그 반대로 바꾸는 작업은 매우 자주 필요합니다.

int → String

int x = 123;
String s = Integer.toString(x);
// 또는: String s = "" + x;

String → int

String s = "456";
int x = Integer.parseInt(s);

8. 자주 발생하는 오류와 유의사항

오류 №1: double → int 시 소수 부분 손실. 초보자는 종종 (int) 3.99가 4가 될 거라고 생각합니다. 실제 결과는 3이며, 소수 부분은 그냥 버려집니다. 올바르게 반올림하려면 Math.round()를 사용하세요.

오류 №2: 암시적 “축소”는 동작하지 않음. 아무렇게나 int x = 300; byte b = x; 라고 쓸 수 없습니다 — 컴파일러 오류가 발생합니다. (byte) x처럼 명시해야 하지만, 값이 byte 범위를 넘으면 예상치 못한 결과가 나올 수 있습니다.

오류 №3: 호환되지 않는 타입 간 변환. (int) "123"처럼 쓸 수 없습니다 — 문자열을 숫자로 바꾸려면 Integer.parseInt()를 사용해야 합니다.

오류 №4: char와 int 관련 문제. int에서 char로의 변환은 실제로 Unicode에 존재하는 값에 대해서만 올바르게 동작합니다. 너무 큰 값을 전달하면 예상치 못한 문자가 나올 수 있습니다.

오류 №5: 표현식에 혼합 타입을 사용. 표현식에 int와 double이 함께 들어 있으면 결과는 항상 double입니다. 정수를 기대하고 있었다면 프로그램의 로직에 예상치 못한 영향을 줄 수 있습니다.

오류 №6: 반올림은 형 변환이 아닙니다! (int) x는 반올림이 아니라 단순히 소수 부분을 버리는 것입니다. 반올림이 필요하면 Math.round()를 사용하세요.

1
과제
JAVA 25 SELF, 레벨 6, 레슨 5
잠금
총 중량에서 만들 수 있는 정수 개수 계산 📦
총 중량에서 만들 수 있는 정수 개수 계산 📦
1
과제
JAVA 25 SELF, 레벨 6, 레슨 5
잠금
스파이를 위한 비밀 메시지 재인코딩 🕵️‍♀️
스파이를 위한 비밀 메시지 재인코딩 🕵️‍♀️
1
과제
JAVA 25 SELF, 레벨 6, 레슨 5
잠금
오래된 기상 센서의 제한 🌡️
오래된 기상 센서의 제한 🌡️
1
과제
JAVA 25 SELF, 레벨 6, 레슨 5
잠금
혼합 과목의 평균 점수 계산 🎓
혼합 과목의 평균 점수 계산 🎓
1
설문조사/퀴즈
실수, 레벨 6, 레슨 5
사용 불가능
실수
실수와 char
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION