Development Tip

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

yourdevel 2020. 10. 11. 11:25
반응형

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


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

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

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

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

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

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


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

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


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

예를 들면 :

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

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

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

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


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

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

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

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

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

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

참조 : geeksforgeeks


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

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

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


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

Myclass.get();

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

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

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

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

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

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


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

즉, 인스턴스 또는 객체 (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
    }
}

In first class, add() will return the sum of data passed by a specific object. But the static method can be used to get the sum from any class not independent if any specific instance or object. Hence, for generic methods which only need arguments to work can be made static to keep it all DRY.


Instance method vs Static method

  1. Instance method can access the instance methods and instance variables directly.

  2. Instance method can access static variables and static methods directly.

  3. Static methods can access the static variables and static methods directly.

  4. Static methods can’t access instance methods and instance variables directly. They must use reference to object. And static method can’t use this keyword as there is no instance for ‘this’ to refer to.


The static modifier when placed in front of a function implies that only one copy of that function exists. If the static modifier is not placed in front of the function then with every object or instance of that class a new copy of that function is made. :) Same is the case with variables.

참고URL : https://stackoverflow.com/questions/11993077/difference-between-static-methods-and-instance-methods

반응형