공부/Java

클래스 메소드(static 메소드)와 인스턴스 메소드

동곤영 2022. 6. 12. 16:59

변수에서 그랬던 것과 같이, 메소드 앞에 static이 붙어 있으면 클래스 메소드

 

붙어 있지 않으면 인스턴스 메소드이다.

 

그렇다면 클래스를 정의할 때, 어느 경우에 static을 사용해서 클래스 메소드로 정의해야하는 것일까?

 

인스턴스 메소드는 인스턴스 변수와 관련된 작업을 하는, 즉 메소드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메소드이다. 그런데 인스턴스를 생성해야만 만들어지므로 인스턴스 메소드 역시 인스턴스를 생성해야만 호출할 수 있는것이다. 

 

반면에 메소드 중에서 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메소드를 사용하지 않는) 메소드를 클래스 메소드(static메소드)로 정의한다.

class MyMath2 {
	long a, b;
    
    // 인스턴스 변수 a, b만을 이용해서 작업하므로 매개변수가 필요없다.
    long add() { return a + b; }
    long subtract() { return a - b; }
    
    // 인스턴스 변수와 관계없이 매개변수만으로 작업이 가능하다.
    static long add(long a, long b) { return a + b; }
    static long subtract(long a, long b) { return a - b; }
}

class MyMathTest2 {
	public static void main(String args[]) {
    	// 클래스 메소드 호출. 인스턴스(객체) 생성없이 호출 가능
    	System.out.println(MyMath2.add(200L, 100L));
    	System.out.println(MyMath2.subtract(200L, 100L));
    
    	MyMath2 mm = new MyMath2(); // 인스턴스를 생성
    	mm.a = 200L;
    	mm.b = 100L;
    
    	// 인스턴스 메소드는 객체 생성 후에만 호출이 가능함.
    	System.out.println(mm.add());
    	System.out.println(mm.subtract());
    }
}

 

인스턴스메소드인 add(), subtract()는 인스턴스 변수인 a와 b만으로 작업이 가능하기 때문에, 매개변수를 필요로 하지 않으므로 매개변수를 선언하지 않았다.

 

반면에 add(long a, long b) , subtract(long a, long b)는 인스턴스 변수 없이 매개변수만으로 작업을 수행하기 때문에

static을 붙여서 클래스 메소드로 선언하였다.

 

그래서 클래스메소드는 객체생성없이 바로 호출이 가능했고, 인스턴스 메소드는 인스턴스를 생성한 후에야 호출이 가능한 것을 확인할 수 있다.

 

출처 : JAVA의 정석 남궁 성 지음