정적 메서드와 인스턴스 메서드의 차이점


89

나는 교과서에서 나에게 주어진 텍스트를 읽고 있었는데 그것이 말하는 것을 정말로 이해하지 못합니다. 기본적으로 정적 메서드 또는 클래스 메서드에 "modifier"키워드 static이 포함되어 있다는 것을 알 수 있습니다. 하지만 그게 무슨 뜻인지 정말 모르겠어요?

누군가 정적 또는 클래스 메서드가 무엇인지 정말 간단한 용어로 설명해 주시겠습니까?

또한 인스턴스 메서드가 무엇인지에 대한 간단한 설명을 얻을 수 있습니까?

이것이 그들이 교과서에서 내게주는 것입니다.

정적 수정 자의 존재 여부에 대한 중요한 실제 의미가 있습니다. 공용 클래스 메소드는 Java가 속해있는 클래스의 정의를 처리하는 즉시 호출되고 실행될 수 있습니다. 인스턴스 메서드의 경우는 그렇지 않습니다. 공용 인스턴스 메서드를 호출하고 실행하려면 먼저 해당 메서드가 속한 클래스의 인스턴스를 만들어야합니다. 공용 클래스 메서드를 사용하려면 클래스 만 있으면됩니다. 반면에 공용 인스턴스 메서드를 사용하려면 먼저 클래스의 인스턴스가 있어야합니다.

다른 메서드의 정의 내에서 정적 메서드가 호출되는 방식은 두 메서드가 동일한 클래스에 속하는지 여부에 따라 다릅니다. 위의 예에서 factorial과 main은 모두 MainClass 클래스의 메서드입니다. 결과적으로 main 정의에서 factorial의 호출은 단순히 메소드 이름 "factorial"을 참조합니다.

답변:


162

Java의 기본 패러다임은 클래스를 작성하고 해당 클래스가 인스턴스화된다는 것입니다. 인스턴스화 된 개체 (클래스의 인스턴스)에는 동작에 영향을주는 속성 (멤버 변수)이 연결되어 있습니다. 인스턴스가 메서드를 실행하면 이러한 변수를 참조합니다.

그러나 특정 유형의 모든 개체는 멤버 변수에 전혀 의존하지 않는 동작을 가질 수 있습니다. 이러한 방법은 정적으로 만드는 것이 가장 좋습니다. 정적이므로 메서드를 실행하는 데 클래스의 인스턴스가 필요하지 않습니다.

이렇게하면 정적 메서드를 실행할 수 있습니다.

MyClass.staticMethod();  // Simply refers to the class's static code

그러나 비 정적 메서드를 실행하려면 다음을 수행해야합니다.

MyClass obj = new MyClass();//Create an instance
obj.nonstaticMethod();  // Refer to the instance's class's code

더 깊은 수준에서 컴파일러는 클래스를 함께 배치 할 때 메서드에 대한 포인터를 수집하여 클래스에 연결합니다. 이러한 메서드가 실행되면 포인터를 따라 가고 맨 끝에서 코드를 실행합니다. 클래스가 인스턴스화되면 생성 된 개체에는 상속 계층 구조의 특정 클래스에 대해 호출 될 메서드를 가리키는 "가상 메서드 테이블"에 대한 포인터가 포함됩니다. 그러나 메서드가 정적이면 "가상 메서드 테이블"이 필요하지 않습니다. 해당 메서드에 대한 모든 호출은 정확히 동일한 코드를 실행하기 위해 메모리에서 정확히 동일한 위치로 이동합니다. 따라서 고성능 시스템에서는 인스턴스 변수에 의존하지 않는 경우 정적 메서드를 사용하는 것이 좋습니다.


2
익숙해 보이는 코드 예제에 대해 대단히 감사합니다. 그래서 지금 이해합니다
Panthy

4
@Rohan 그것을 보는 또 다른 좋은 방법은 어떤 것 static(클래스, 메소드 또는 필드)이 실제로 어떤 것에 속하지 않는다는 것입니다. 그것은 단지 조직적인 목적을 위해 클래스에서 놀고 있다는 것 입니다.
gobernador

1
또한 정적 필드는 데이터 객체로 사용됩니다 (데이터를 보유하므로 변경할 수 없지만 그 안의 데이터를 조작 할 수 있습니다.) 정적 메서드는 정적 필드에서만 호출 할 수 있으며 이후에는 일정하게 유지되거나 변경되지 않는다는 동일한 개념을 전달합니다. 인스턴스화하지 않거나 !!
user2416728

1
@ user2416728 댓글이 매우 혼란 스럽습니다. 정적 필드 변경할 있지만 해당 범위는 실행 환경에 대해 전역입니다. 따라서 해당 필드에 액세스 할 수있는 코드는 동일한 데이터에 액세스 할 수 있습니다. 이는 데이터가 일정하게 유지되는 것과 동일하지 않습니다 ( 'final'수정자가 사용되지 않는 한).
Nathaniel Ford

2
aye, "not change">> 나는 인스턴스화 될 수 없음을 의미한다!
user2416728

19

static으로 선언되지 않은 메서드와 변수를 인스턴스 메서드 및 인스턴스 변수라고합니다. 인스턴스 메서드 및 변수를 참조하려면 먼저 클래스를 인스턴스화해야 함은 해당 클래스의 개체를 먼저 만들어야 함을 의미합니다. 정적의 경우 클래스를 인스턴스화 할 필요가 없습니다 u는 마침표를 사용하여 클래스 이름으로 메서드와 변수에 액세스 할 수 있습니다. (.)

예를 들면 :

Person.staticMethod();           //accessing static method.

비 정적 메서드의 경우 클래스를 인스턴스화해야합니다.

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.

8

정적 메서드, 변수는 개체 인스턴스가 아닌 전체 클래스에 속합니다. 정적 메서드 인 변수는 클래스의 특정 인스턴스가 아닌 전체 클래스와 연결됩니다. 각 개체는 정적 메서드, 변수의 공통 복사본을 공유합니다. 생성 된 객체 수에 관계없이 클래스 당 하나의 복사본 만 있습니다.


8

정적 메서드와 인스턴스 메서드의 차이점

  1. 인스턴스 메서드는 호출되기 전에 클래스의 개체를 만들어야하는 메서드입니다. 정적 메소드는 클래스의 객체를 생성하지 않고 호출 할 수있는 Java의 메소드입니다.

  2. 정적 메소드는 static 키워드로 선언됩니다. 인스턴스 메서드에 정적 키워드가 없습니다.

  3. 정적 메서드는 클래스에 대한 단일 복사본으로 존재하는 것을 의미합니다. 그러나 인스턴스 메서드는 해당 클래스에 대해 생성 된 인스턴스 수에 따라 여러 복사본으로 존재합니다.

  4. 정적 메서드는 클래스 참조를 사용하여 호출 할 수 있습니다. 인스턴스 또는 비 정적 메서드는 개체 참조를 사용하여 호출됩니다.

  5. 정적 메서드는 인스턴스 메서드와 인스턴스 변수에 직접 액세스 할 수 없습니다. 인스턴스 메서드는 정적 변수 및 정적 메서드에 직접 액세스 할 수 있습니다.

참조 : geeksforgeeks


4

인스턴스 메소드 => 특정 클래스의 특정 인스턴스에서 호출됩니다. 메소드가 호출 된 클래스를 알고 싶어합니다. 그것이 일어나는 방식에는 'this'라는 보이지 않는 매개 변수가 있습니다. 'this'안에 이미 값으로 설정된 인스턴스 클래스의 멤버가 있습니다. '이것은'변수가 아닙니다. 값이며 변경할 수 없으며 값은 호출 수신자를 참조합니다. 예 : TV (실제 프로그램)를 수리하기 위해 수리공 (인스턴스 방법)을 호출합니다. 그는 도구 ( 'this'매개 변수)와 함께 제공됩니다. 그는 TV를 고치는 데 필요한 특정 도구를 제공하며 다른 것도 고칠 수 있습니다.

에서 정적 메소드 => '이'같은 것은 존재하지 않는다. 예 : 동일한 수리공 (정적 방법). 그에게 전화 할 때는 전기공과 같은 수리공을 지정해야합니다. 그리고 그는 와서 당신의 TV 만 고칠 것입니다. 그러나 그는 다른 것을 고칠 도구가 없습니다 ( 'this'매개 변수가 없습니다).

정적 메서드 는 일반적으로 클래스의 인스턴스 ( 'this'에서)의 데이터가 필요하지 않고 인수만을 사용하여 의도 된 목적을 수행 할 수있는 작업에 유용합니다.


2

개체의 동작은 해당 클래스의 변수와 메서드에 따라 다릅니다. 클래스를 생성 할 때이를위한 객체를 생성합니다. 정적 메소드의 경우 정적 메소드가 필요하지 않습니다. 즉, 모든 객체가 동일한 사본을 가지므로 객체가 필요하지 않습니다. 예 :

Myclass.get();

인스턴스 메서드에서 각 개체는 다른 동작을 가지므로 개체 인스턴스를 사용하여 메서드를 호출해야합니다. 예 :

Myclass x = new Myclass();
x.get();

1

메서드의 상태가 변경되지 않거나 인스턴스 변수를 사용하지 않는 경우.

인스턴스없이 메서드를 호출하고 싶습니다.

제공된 인수에서만 작동하는 경우.

유틸리티 함수는 정적 메서드의 좋은 인스턴스입니다. 즉, math.pow (),이 함수는 다른 값에 대한 상태를 변경하지 않습니다. 그래서 그것은 정적입니다.


1

간단히 말해, 정적 메서드와 정적 변수는 인스턴스 메서드와 인스턴스 변수가 인스턴스 또는 개체 수준 인 클래스 수준입니다.

즉, 인스턴스 또는 객체 (new ClassName () 사용)가 생성 될 때마다이 객체는 인스턴스 변수의 자체 복사본을 유지합니다. 동일한 클래스의 5 개의 다른 객체가있는 경우 인스턴스 변수의 5 개의 다른 복사본이 있습니다. 그러나 정적 변수와 메서드는 다섯 개체 모두에 대해 동일합니다. 생성 된 각 개체에서 공통적으로 사용해야하는 경우 정적으로 만드십시오. 작동하는 데 개체 별 데이터가 필요하지 않은 메서드가 필요하면 정적으로 만드십시오. 정적 메서드는 정적 변수에서만 작동하거나 전달 된 인수를 기반으로 데이터를 반환합니다.

class A {
    int a;
    int b;

    public void setParameters(int a, int b){
        this.a = a;
        this.b = b;
    }
    public int add(){
        return this.a + this.b;
   }

    public static returnSum(int s1, int s2){
        return (s1 + s2);
    }
}

위의 예에서 add ()를 다음과 같이 호출 할 때 :

A objA = new A();
objA.setParameters(1,2); //since it is instance method, call it using object
objA.add(); // returns 3 

B objB = new B();
objB.setParameters(3,2);
objB.add(); // returns 5

//calling static method
// since it is a class level method, you can call it using class itself
A.returnSum(4,6); //returns 10

class B{
    int s=8;
    int t = 8;
    public addition(int s,int t){
       A.returnSum(s,t);//returns 16
    }
}

첫 번째 클래스에서 add ()는 특정 객체가 전달한 데이터의 합계를 반환합니다. 그러나 정적 메서드를 사용하면 특정 인스턴스 나 개체에 관계없이 모든 클래스에서 합계를 얻을 수 있습니다. 따라서 작동하는 데 인수 만 필요한 제네릭 메서드의 경우 모든 DRY를 유지하기 위해 정적으로 만들 수 있습니다.


0

인스턴스 방법과 정적 방법

  1. 인스턴스 메서드는 인스턴스 메서드와 인스턴스 변수에 직접 액세스 할 수 있습니다.

  2. 인스턴스 메서드는 정적 변수 및 정적 메서드에 직접 액세스 할 수 있습니다.

  3. 정적 메서드는 정적 변수와 정적 메서드에 직접 액세스 할 수 있습니다.

  4. 정적 메서드는 인스턴스 메서드와 인스턴스 변수에 직접 액세스 할 수 없습니다. 객체에 대한 참조를 사용해야합니다. 그리고 정적 메소드는 'this'에 대한 인스턴스가 없기 때문에이 키워드를 사용할 수 없습니다.


-2

함수 앞에 놓인 정적 한정자는 해당 함수의 복사본이 하나만 있음을 의미합니다. 정적 수정자가 함수 앞에 배치되지 않으면 해당 클래스의 모든 객체 또는 인스턴스와 함께 해당 함수의 새 복사본이 만들어집니다. :) 변수도 마찬가지입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.