Instance Method / Static Method

jooog·2021년 10월 9일
0

메서드(method)에는 크게 instance method와 class method로 나뉜다.

간단한 예로 살펴보자

public class MyMath2 {
    long a, b;

    long add() {
        return a + b;
    }

    
    
static long add(long a, long b) {
        return a + b;
    }

}

여기서 하나의 메소드에는 static이 붙었다.

static long add(long a, long b) {
        return a + b;
    }

static이 붙은 메소드는 어떤 의미인걸까?

static이 붙은 메소드는 class영역의 메소드로 인스턴스 메소드와는 다르다.

public class MyTest {

    public static void main(String[] args) {
        System.out.println(MyMath2.add(200L, 300L));
        //클래스 메서드 호출

        MyMath2 mm = new MyMath2();
        mm.a = 100L;
        mm.b = 200L;
        //인스턴스 메서드 호출
        System.out.println(mm.add());
    }
}

static method는 클래스이름.메소드 이름 으로 바로 호출 가능하다.

즉, 인스턴스를 생성하지 않아도 호출이 가능하다.

반면 인스턴스메소드의 경우에는 새로 인스턴스를 생성해서 참조변수를 통해 접근가능하다.

그렇다면 객체 생성없이 사용가능한 static 메서드의 경우 인스턴스 변수(iv)를 사용할 수 있을까?

당연히 사용할 수 없다.

인스턴스 메서드의 경우에는 새로 객체를 생성해서 인스턴스 변수를 사용할 수 있지만 클래스 메서드인 static 메서드의 경우에는 인스턴스 변수를 사용할 수 없다.

static long add(long a, long b) {
        return a + b;
    }

따라서 static 메소드의 매개변수 a,b는 지역변수(lv)를 의미한다.

핵심 정리! static 메서드는 객체를 생성하지 않고 호출 가능한 메서드를 의미한다.

static 메서드는 인스턴스변수(iv)를 사용할 필요가 없는 경우에 사용한다.

   public static void main(String[] args) {
        System.out.println(MyMath2.add(200L, 300L));
        //클래스 메서드 호출

        MyMath2 mm = new MyMath2();
        mm.a = 100L;
        mm.b = 200L;
        //인스턴스 메서드 호출
        System.out.println(mm.add());
    }

코드를 자세히 살펴보면 인스턴스 메소드는 인스턴스 변수를 사용해야하기 때문에 인스턴스생성할 필요가 있다.

하지만 클래스 메서드는 인스턴스 변수를 사용하지 않기 때문에 객체를 생성할 필요가 없는 것이다.

 System.out.println(MyMath2.add(200L, 300L));

매개변수인 200L, 300L은 add 메서드의 지역변수로 사용된다.

메서드 호출

public class PracticeMethod {
    
    int a;
    static int b;
    
    void instanceMethod() {
        System.out.println(a); //인스턴스변수
        System.out.println(b); //클래스 변수
    }
}

인스턴스 메소드 instanceMethod() 에서 인스턴스 변수인 a와 클래스 변수인 b를 사용할 수 있다.

 static void classMethod() {
        System.out.println(a); //error
        System.out.println(b); //클래스 변수
    }

하지만 클래스 메서드인 classMethod() 에서는 인스턴스 변수인 a를 사용할 수 없다.

앞서 살펴봤던 것처럼 클래스 메서드에서는 인스턴스 변수를 사용할 수 없기 때문이다.

인스턴스 변수는 객체생성 후 호출 및 사용이 가능하기 때문에 객체 생성 없이 호출 가능한 static 메서드에서 사용할 수 없는 것은 당연하다

0개의 댓글