실전에서의 형 변환
숫자 계산과 객체 지향 프로그래밍 계층 구조를 비롯한 실제 상황에 형 변환을 적용합니다.
실전에서의 형 변환은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
실전에서의 형변환
형변환은 실제 Java 코드에서 숫자 계산, 객체 지향 계층 구조, 제네릭 컬렉션, 기존 API 등 여러 곳에 사용됩니다. 이 단원에서는 실용적인 방식과 주의할 점을 다룹니다.
업캐스팅: 다형성
업캐스팅은 하위 형식을 상위 형식으로 변환하는 것입니다. 항상 안전하고 암시적으로 수행되므로 형변환 연산자가 필요하지 않습니다. 이를 통해 다형성을 구현할 수 있습니다.
class Payment {}
class CreditCardPayment extends Payment {
public void authorizeCard() {}
}
CreditCardPayment cc = new CreditCardPayment();
Payment p = cc; // implicit upcast — always safe
// p.authorizeCard(); // Compile error — Payment doesn't have this method
// need downcast to access subclass methods다운캐스팅: 하위 형식 멤버에 접근하기
다운캐스팅은 상위 형식 참조를 원래의 하위 형식으로 되돌리는 것입니다. 명시적인 형변환이 필요하며 객체가 실제로 해당 하위 형식이 아니면 ClassCastException이 발생합니다.
Payment p = new CreditCardPayment();
// Downcast to access CreditCardPayment-specific method
if (p instanceof CreditCardPayment cc) {
cc.authorizeCard(); // safe with pattern matching
System.out.println("Card authorized");
}
// Unsafe downcast without check:
try {
BankTransfer bt = (BankTransfer) p; // ClassCastException!
} catch (ClassCastException e) {
System.out.println("Wrong type!");
}계산에서의 숫자 형변환
정수 나눗셈에서는 소수 부분이 버려집니다. 정확한 결과를 얻으려면 나누기 전에 double로 형변환하십시오. 이는 Java에서 가장 흔한 산술 버그 중 하나입니다.
int totalRevenue = 1000;
int months = 3;
// Integer division — truncates!
double wrong = totalRevenue / months;
System.out.println(wrong); // 333.0 (not 333.33)
// Correct: cast one operand to double first
double correct = (double) totalRevenue / months;
System.out.println(correct); // 333.3333333333333컬렉션에서의 형변환 (제네릭 이전)
기존 코드에서는 원시 컬렉션에 객체를 저장하는 경우가 많습니다. 형식이 지정된 값을 가져오려면 다운캐스팅이 필요하므로 항상 먼저 instanceof로 확인하십시오.
import java.util.*;
// Legacy raw list (pre-Java 5 style)
List legacyList = new ArrayList();
legacyList.add("Alice");
legacyList.add(42);
for (Object item : legacyList) {
if (item instanceof String s) {
System.out.println("Name: " + s.toUpperCase());
} else if (item instanceof Integer n) {
System.out.println("Score: " + (n * 2));
}
}인터페이스를 사용한 형변환
객체는 자신이 구현하는 모든 인터페이스로 형변환할 수 있으므로, 해당 인터페이스가 필요한 상황에서 사용할 수 있습니다.
interface Printable { void print(); }
interface Saveable { void save(); }
class Report implements Printable, Saveable {
public void print() { System.out.println("Printing report"); }
public void save() { System.out.println("Saving report"); }
}
Object obj = new Report();
if (obj instanceof Printable p) p.print();
if (obj instanceof Saveable s) s.save();배열을 사용한 형변환
배열 형식은 고유한 계층 구조를 이룹니다. String[]은 Object[]의 하위 형식입니다. 배열 형변환에도 객체와 같은 규칙이 적용됩니다.
String[] names = {"Alice", "Bob"};
Object[] objs = names; // upcast — implicit
objs[0] = "Charlie"; // OK — still a String
try {
objs[0] = 42; // ArrayStoreException at runtime!
} catch (ArrayStoreException e) {
System.out.println("Cannot store Integer in String[]");
}
// Downcast back
String[] restored = (String[]) objs;전자상거래 예: 결제 분기 처리
실제 사례로, 결제의 실행 중 형식에 따라 올바른 결제 처리기로 분기할 수 있습니다.
interface Payment { double amount(); }
record CreditCard(String last4, double amount) implements Payment {}
record CryptoPayment(String wallet, double amount) implements Payment {}
record BankWire(String iban, double amount) implements Payment {}
static void process(Payment p) {
switch (p) {
case CreditCard cc -> System.out.println("Charging card *" + cc.last4());
case CryptoPayment cp -> System.out.println("Sending to wallet " + cp.wallet());
case BankWire bw -> System.out.println("Wiring to IBAN " + bw.iban());
}
}
process(new CreditCard("4242", 99.99));
process(new CryptoPayment("0xABCD", 0.05));일반 수학 연산을 위한 숫자 형식으로의 형변환
Number 상위 클래스는 상위 형식인 Number로 업캐스팅하고 doubleValue()를 호출하여 모든 숫자 형식에 일반적인 숫자 연산을 수행할 수 있게 합니다.
import java.util.List;
List<Number> numbers = List.of(1, 2.5, 3L, 4.0f);
double sum = 0;
for (Number n : numbers) {
sum += n.doubleValue(); // works for int, double, long, float
}
System.out.printf("Sum: %.1f%n", sum); // 10.5안전한 형변환 유틸리티 메서드
잘못된 형변환이 발생해도 예외를 던지는 대신 빈 Optional을 반환하는 재사용 가능한 유틸리티 메서드입니다. 처리 흐름 방식의 코드에 특히 유용합니다.
import java.util.Optional;
public static <T> Optional<T> safeCast(Object obj, Class<T> clazz) {
return clazz.isInstance(obj)
? Optional.of(clazz.cast(obj))
: Optional.empty();
}
// Usage
Object val = "hello";
safeCast(val, String.class)
.ifPresent(s -> System.out.println(s.toUpperCase())); // HELLO
safeCast(val, Integer.class)
.ifPresentOrElse(
n -> System.out.println(n),
() -> System.out.println("Not an Integer") // prints this
);피해야 할 일반적인 실수
다음과 같은 형변환 실수에 주의하십시오:
- 나누기 전에 형변환하는 것을 잊는 경우:
int/int는 항상 정수를 반환합니다 - instanceof로 확인하지 않고 다운캐스팅하는 경우 → ClassCastException
- 안전한 업캐스팅과 위험한 다운캐스팅을 혼동하는 경우
- 래퍼 형식을 형변환하는 경우:
(int) longVal과longVal.intValue()의 차이
// Mistake 1: integer division
double avg = 7 / 2; // 3.0 — WRONG
double fixed = 7.0 / 2; // 3.5 — correct
// Mistake 2: unwrapping Long as int
Long bigId = 1234567890123L;
// int id = (int) bigId; // compiles but truncates!
long id = bigId; // correct
System.out.println(avg); // 3.0
System.out.println(fixed); // 3.5
System.out.println(id); // 1234567890123빠른 확인
다음 코드의 출력은 무엇입니까?
int a = 7; int b = 2; double result = (double) a / b; System.out.println(result);
복습: 실전에서의 형변환
핵심 정리:
- 업캐스팅(하위 형식 → 상위 형식)은 암시적으로 수행되며 항상 안전합니다
- 다운캐스팅(상위 형식 → 하위 형식)에는 명시적인 형변환이 필요하므로 먼저 instanceof를 사용하십시오
- 패턴 매칭 instanceof는 하나의 표현식에서 확인과 형변환을 함께 수행합니다
- 정수 나눗셈에서 소수 부분이 버려지는 것을 방지하려면 나누기 전에 분자를 double로 형변환하십시오
- 형식에 따른 깔끔한 분기 처리에는 패턴 매칭 switch를 사용하십시오
- 예외 대신 Optional을 사용하려면 안전한 형변환 유틸리티를 작성하십시오
AI 튜터와 함께 Java을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 104
- 레슨
- 374
자주 묻는 질문
“실전에서의 형 변환” 강의는 무료인가요?
네 — “실전에서의 형 변환” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“실전에서의 형 변환”에서 뭘 배우나요?
숫자 계산과 객체 지향 프로그래밍 계층 구조를 비롯한 실제 상황에 형 변환을 적용합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“실전에서의 형 변환” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 기본형과 참조형
- 확장 변환과 축소 변환
- instanceof 연산자
- 실전에서의 형 변환