Java Academy · 강의

실전에서의 형 변환

숫자 계산과 객체 지향 프로그래밍 계층 구조를 비롯한 실제 상황에 형 변환을 적용합니다.

레슨 4/413개 단계

실전에서의 형 변환은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 기본형과 참조형
  2. 확장 변환과 축소 변환
  3. instanceof 연산자
  4. 실전에서의 형 변환
← Java Academy(으)로 돌아가기