Good Morning

Java 내부 클래스 사용법과 최적화 방법 본문

Back-End/Java

Java 내부 클래스 사용법과 최적화 방법

욘쥰 2024. 9. 27. 13:05

Java에서 내부 클래스(Inner Class)를 사용할 때 발생할 수 있는 문제와 그 해결 방법에 대해 알아보겠습니다. 특히 static 메서드에서 내부 클래스를 사용할 때 주의해야 할 점과 다양한 해결 방법을 살펴보겠습니다.

문제 상황

다음과 같은 코드가 있다고 가정해 봅시다:

public class Ex7_8 {
    public static void main(String[] args) {
        Buyer b = new Buyer();
        b.buy(new Tv1());
        b.buy(new Computer());
        System.out.println("현재 남은 돈은" + b.money +"만원입니다");
        System.out.println("현재 보너스점수는" + b.bonusPoint +"점입니다");
    }

    class Product {
        // ... (생략)
    }

    class Tv1 extends Product {
        // ... (생략)
    }

    class Computer extends Product {
        // ... (생략)
    }

    class Buyer {
        // ... (생략)
    }
}

이 코드는 컴파일 오류를 발생시킵니다. 그 이유는 static 메서드인 main에서 non-static 내부 클래스의 인스턴스를 직접 생성하려고 했기 때문입니다.

해결 방법

이 문제를 해결하기 위한 세 가지 주요 방법이 있습니다:

1. 내부 클래스를 static으로 선언

public class Ex7_8 {
    public static void main(String[] args) {
        Buyer b = new Buyer();
        b.buy(new Tv1());
        b.buy(new Computer());
        // ... (생략)
    }

    static class Product {
        // ... (생략)
    }

    static class Tv1 extends Product {
        // ... (생략)
    }

    static class Computer extends Product {
        // ... (생략)
    }

    static class Buyer {
        // ... (생략)
    }
}

이 방법의 장점은 간단하고 직관적이라는 것입니다. 단점은 내부 클래스가 외부 클래스의 non-static 멤버에 접근할 수 없다는 것입니다.

2. 외부 클래스의 인스턴스를 통해 내부 클래스 생성

public class Ex7_8 {
    public static void main(String[] args) {
        Ex7_8 ex = new Ex7_8();
        Buyer b = ex.new Buyer();
        b.buy(ex.new Tv1());
        b.buy(ex.new Computer());
        // ... (생략)
    }

    class Product {
        // ... (생략)
    }

    class Tv1 extends Product {
        // ... (생략)
    }

    class Computer extends Product {
        // ... (생략)
    }

    class Buyer {
        // ... (생략)
    }
}

이 방법의 장점은 내부 클래스가 외부 클래스의 모든 멤버에 접근할 수 있다는 것입니다. 단점은 코드가 약간 더 복잡해진다는 것입니다.

3. 내부 클래스를 외부로 이동

이 방법은 각 클래스를 독립적인 파일로 분리하는 것입니다.

// Ex7_8.java
public class Ex7_8 {
    public static void main(String[] args) {
        Buyer b = new Buyer();
        b.buy(new Tv1());
        b.buy(new Computer());
        // ... (생략)
    }
}

// Product.java
public class Product {
    // ... (생략)
}

// Tv1.java
public class Tv1 extends Product {
    // ... (생략)
}

// Computer.java
public class Computer extends Product {
    // ... (생략)
}

// Buyer.java
public class Buyer {
    // ... (생략)
}

이 방법의 장점은 코드 구조가 명확해지고, 각 클래스의 재사용성과 유지보수성이 향상된다는 것입니다.

결론

각 방법에는 장단점이 있으며, 상황에 따라 적절한 방법을 선택해야 합니다. 일반적으로 실제 프로젝트에서는 세 번째 방법(클래스 분리)이 가장 좋은 선택일 수 있습니다. 하지만 학습 단계나 간단한 예제에서는 첫 번째나 두 번째 방법도 충분히 유용할 수 있습니다.

코드의 목적, 프로젝트의 규모, 팀의 코딩 스타일 등을 고려하여 가장 적합한 방법을 선택하는 것이 중요합니다. 어떤 방법을 선택하든, 코드의 가독성과 유지보수성을 항상 염두에 두어야 합니다.