티스토리 뷰

문득 궁금해졌다.

 

inner class로는 static class가 가능한데, outer class에는 static이 오는 것이 불가능할까?

* 제일 바깥의 클래스, top-level class를 얘기하는 것

public static class OuterClass { // (X)
    public static class InnerClass { // (O)
        
    }
}

 

static을 왜 쓰는지, static의 특징이 무엇인지부터 알아야 한다..

 

1. static 키워드가 붙은 멤버(메서드/변수)모든 인스턴스가 공유해서 사용하도록 하기 위해 사용되어진다.

-> 특정 인스턴스에 종속되어있는 것이 아니다.

 

2. static 멤버에 접근하기 위해 인스턴스를 생성하지 않아도 된다.

- 클래스 이름과 점( . ) 을 이용해 static 멤버를 곧바로 사용할 수 있다.

- 이는 JVM이 클래스 로더를 이용해 Method 영역에 static 멤버들의 정보를 로딩해뒀기 때문이다.

-> 이는 다시말하면, "static 키워드가 없는 멤버는 인스턴스가 반드시 필요하다"는 뜻이기도 하다.

 

다시 풀어서 이야기 하면

자신을 멤버로 갖는 클래스의 인스턴스 없이 홀로 존재할 수 있다면 static이 붙고, 필요하다면 non-static으로 표현하는 것이다.

이 두가지 상태를 구분할 수 있도록 만들어주는 것이 static 키워드의 역할이다.

 

// 나를 멤버로 갖는 클래스가 없는데요???
public class TopLevelClass {

    // TopLevelClass 멤버.
    // 나를 멤버로 갖는 TopLevelClass 인스턴스가 필요한가요?
    public String str2; // 네
    public static String str1; // 아니요
    public static class InnerClass { // 아니요

        // InnerClass 멤버.
        // 나를 멤버로 갖는 InnerClass 인스턴스가 필요한가요?
        public String str2; // 네
        public static String str1; // 아니요
        public static class InnerInnerClass { // 아니요

            // InnerInnerClass 멤버.
            // 나를 멤버로 갖는 InnerInnerClass 인스턴스가 필요한가요?
            public static String str1; // 아니요
            public String str2; // 네
        }
    }
}

 

그럼 여기서, TopLevelClass에도 static을 붙일 수 있을까?

static 키워드는 나를 멤버로 갖는 클래스의 인스턴스 도움이 필요한지 유무를 표시해준다고 했다.

 

근데?

TopLevelClass는 더이상 나를 멤버로 갖는 바깥 클래스가 존재하지를 않는다. 더이상 나를 품어줄 사람이 없는 것이다

 

애초에 자바가 만들어질 때 부터 outer class(TopLevelClass)는 내부의 멤버들과는 다르도록 만들어졌다.

 

https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html

 

 

자바 공식 문서에서도 static 키워드는 오직 멤버 클래스에서만 사용할 수 있다고 명시가 되어있다.

top level 클래스, 지역 클래스, 익명 클래스는 static 키워드를 붙일 수 없도록 제한하고 있다.

 

outer class (TopLevelClass)는 클래스 로더에 의해서 Method 영역에 로딩되는 것이지 개발자가 왈가왈부 할 수 있는 것부터가 아니다. 애초에 static 키워드는 거기 붙이도록 만들어 진 것이 아니기 때문이다.

 

 

<결론>

static 키워드의 사용 의도와 다르기 때문에 사용할 수 없다.
애초에 거기 쓰라고 만들어진게 아니다.

 


뭔가 좀 부질없는 질문에 이상한 답변이 된 것 같다;;

시원한 해결이 되려나 모르겠다.

 

 

<참고>

https://stackoverflow.com/questions/7370808/why-cant-a-top-level-class-be-static-in-java

https://stackoverflow.com/questions/18036458/why-cant-we-have-static-outer-classes

https://dzone.com/articles/why-an-outer-class-cant-be-static

 

(+) https://sedangdang.tistory.com/250?category=999852 

 

자바의 JVM과 클래스 로더를 알아보자

자바 언어는 JVM(Java Virtual Machine)을 사용해 플랫폼에 독립적인 개발을 가능하게끔 해준다 (Write Once, Run Anywhere) JVM - JRE(Java Runtime Enviroment) - JDK(Java Development Kit) 순서로 포함되어..

sedangdang.tistory.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함