BLOG main image
분류 전체보기 (42)
잡담 (6)
활용 (17)
language (3)
project (14)
design (2)
자료정리 (0)
결혼 준비 (0)
Ganoderma Lucidum
Ganoderma Lucidum
66,201 Visitors up to today!
Today 34 hit, Yesterday 46 hit
daisy rss
tistory 티스토리 가입하기!
2013/03/08 13:11

아래 코드의 문제점을 명확하게 말할 수 있는가? 그렇지 않다면 필자 처럼 자바의 inner class 에 대한 이해가 떨어졌던 것 일 수도 있다.

class Factory {
    private int a;
    public class B {
    }

    public static B makeB() {
        return new B(); // 문제 코드
    }
}

이 코드는 팩토리 메소드 패턴을 구현하다가 문법에러를 만나는 코드이다.

필자는 코드를 작성하면서 B b = Fastory.makeB(); 따위의 코드를 상상 했었다.근데 이 코드에는 문제점이 있었고 컴파일 되지 않았다. 왜일까? static한 팩토리 메소드에서 static 하지 않은 클래스B 를 생성하려고 하기 때문이다.

살펴보면 당연한 문제인데 inner class 를 그냥 일반 클래스로 생각했으면 원인을 모를 문제이다.
자바는 nested 된 innerClass 는 자신을 포함(nest)한 클래스의 멤버 변수에 접근 가능하다. 따라서 netsted 된 클래스는 nest 한 클래스의 인스턴스에 접근 가능해야 한다.

이제 위의 코드를 다시 보면 문제점이 보일 것 이다. makeB 로 생성된 b instance 에서 variable a 는 어떤 instance 의 a 인가? 모른다. 따라서 compile 타임 에러인 것이다.

그렇다면 어던 해결 책이 있는가? 세가지 방법이 있다.

첫번째는 모두 static 하게 만드는 것이다. static 한 메소드에 static 한 변수 static 한 factory 로 만든다. 이러면 모두 static 하므로 instance 가 필요하지 않다.

두번째 방법은 factory method 객체를 Singleton 으로 만들어서 하나는 이미 존재하게 만드는 것이다.

세번째 방법은 외부에서 생성한 인스턴스를 명시적으로 지정해서 inner class 를 만드는 방법이다. 자바치고 좀 해괴한 문법이 나온다.
factory = new Factory();
factory.new B();

필자는 코드상에 좀 변칙적인 싱글톤이 이미 구현되어 있었으므로 두번째 방법을 따라서 코드를 정리했다.


Trackback Address :: http://beonit2.tistory.com/trackback/67 관련글 쓰기
Name
Password
Homepage
Secret
prev"" #1 #2 #3 #4 #5 ... #42 next

티스토리 툴바