2017-10-22 3 views
1

인스턴스 변수는 개체 당 하나이며 모든 개체에는 인스턴스 변수의 자체 복사본이 있습니다.정적 변수와 인스턴스 변수의 성능 차이

정적 변수는 클래스 당 하나이며 모든 클래스의 개체는 동일한 정적 변수를 공유합니다.

class MyStaticClass{ 
    private static int myStaticInt; 

    public static int getMyStaticInt() {return myStaticInt;} 
} 

class MyInstanceClass{ 
    private int myNonStaticInt; 

    public int getMyNonStaticInt() {return myNonStaticInt;} 
} 

중 하나를 사이에 성능 차이가 있나요? 다른쪽에 전화하는 것이 더 비쌉니까?

int i = MyStaticClass.getMyStaticInt(); 

OR은 :

int i = new MyInstanceClass().getMyNonStaticInt(); 
+3

그들은 동등하지 않으므로 질문은 의미가 없습니다. – EJP

답변

2

그것은 성능의 문제가 아니다. 정적 변수와 인스턴스 변수는 다른 용도로 사용됩니다. 전화 할 때마다 new MyInstatnceClass()myNonStaticInt 인스턴스 변수를 가진 새로운 MyInstatnceClass 인스턴스를 생성하기 때문에

int i = new MyInstatnceClass().getMyNonStaticInt(); 

사용

, 거의 확실하게 쓸모가 없다. 생성 된 인스턴스에 대한 참조를 유지하지 않으므로 동일한 인스턴스 변수를 두 번 검색 할 수 없으므로 쓸모가 없습니다.

클래스의 모든 인스턴스에서 변수의 복사본 하나를 공유해야하는 경우 변수는 static 변수입니다.

그런데 후자의 호출은 클래스를 처음으로 액세스하는 경우 클래스를로드하고 초기화하는 것 외에도 MyInstatnceClass 클래스의 인스턴스를 만들고 초기화하는 작업이 포함되어 있기 때문에 더욱 광범위합니다.

반면에 MyStaticClass.getMyStaticInt()은 해당 클래스의 첫 번째 액세스 인 경우 MyStaticClass 클래스 만로드하고 초기화합니다. 이 클래스의 인스턴스를 만들 필요는 없습니다.

+0

@ Program-Me-Rev 변수 및 getter 메서드의 이름을 변경해도 내 대답에는 영향을 미치지 않습니다. 'int i = new MyInstatnceClass(). getMyNonStaticInt();'여전히 의미가 없습니다. – Eran

+0

@Eran 답장을 보내 주셔서 감사합니다. trypo err을 만들었습니다. 나는 int i = new MyInstatnceClass(). getMyNonStaticInt();를 의미했다. 미안하게 만든 오류에서 비롯되는 첫 번째 부분을 제외하고는 내 대답에 답이됩니다.답변 감사합니다. –

+0

이 답변의 정보는 정확하지만 OP에 실제로 대답하지는 않습니다. 정적 또는 인스턴스 메서드 호출이 다른 메서드보다 성능이 좋고 저렴하다는 것을 알고 싶습니다. 메서드 유형이 유용하지 않습니다. 에 대한. 이 예제의 객체 인스턴스화는 평가할 내용의 일부가 아닙니다. 문법적으로 올바른 것으로 만들기 위해 필요한 보일러 판일뿐입니다. – errantlinguist

1

인스턴스 메소드는 다형성으로 overridden 일 수 있기 때문에 매우 순진한 JVM 구현은 적어도 적절한 메소드 호출을 찾으려면 virtual mehod table을 먼저 사용해야합니다. 그러나 클래스 자체는 이 아니며 다형성 및 클래스 메서드를 재정의 할 수 없습니다. 이로 인해 they have a simpler lookup mechanism.

실제 세계의 JVM은 엄청나게 똑똑하고 어느 메소드가 오버라이드되지 않을지를 알 수 있고이 조회를 최적화 할 수 있습니다. 즉, 존재하지 않는 JVM을 가진 가장 고안된 인스턴스를 제외한 모든 인스턴스에서 성능에 차이가 있습니다. 대신 정적 메서드를 사용하여 단일 인스턴스가 아닌 객체 전체 클래스와 관련된 기능을 나타낼 수 있습니다.

관련 문제