본문 바로가기
멀티캠퍼스 풀스택 과정/Java의 정석

자바의 정석2-5 static 메서드와 instance 메서드

by 이쟝 2021. 12. 31.

static 메서드: 메서드에 static이 붙은 것(클래스 메서드) 

인스턴스 메서드: static이 붙지 않은 것

 

class MyMath2 {
	long a, b; // 인스턴스 변수(클래스 전체 사용 가능) 
	
	long add() {  // 인스턴스 메서드(iv를 사용)
		return a + b; // a와 b는 인스턴스 변수
	}
	
	static long add(long a, long b) { // 클래스 메서드(static메서드):iv사용 무, g a와 b는 지역 변수
		return a + b; // a와 b는 지역변수(인스턴스 메서드보다 지역변수가 더 가까워서)

	}
}

 

인스턴스 메서드(instance method)

- (1) 인스턴스(객체)생성 , (2)‘참조변수.메서드이름();’으로 호출

- 인스턴스 멤버(iv, im: instance method)와 관련된 작업을 하는 메서드

- 메서드 내에서 인스턴스 변수(iv) 사용가능

 

static 메서드(클래스 메서드)

- 객체생성없이 ‘클래스이름.메서드이름();’으로 호출

- 인스턴스 멤버(iv, im)관련 없는 작업을 하는 메서드(메서드 내에서 인스턴스 변수(iv) 사용 불가)

- 작업에 필요한 값들을 모두 매개변수로 받기 때문에 iv가 필요 없음

- 객체 iv의 묶음인데 iv가 필요 없다는 뜻은 객체가 필요 없다는 뜻

-> Math.random( ), Math.round( ) 등등

 

static 메서드와 instance 메서드의 차이 -> iv 사용 여부!!!


예제:

1) MyMath2라는 클래스를 만든 뒤 add라는 메서드 이름으로 더하기 연산을 하는 인스턴스 메서드와 클래스 메서드를 만듦

2) main 메서드에서 클래스 메서드와 인스턴스 메서드를 각각 호출해보기

 

public class staticAndInstance {

	public static void main(String[] args) {
		
		System.out.println(MyMath2.add(200L, 100L)); //클래스메서드 호출(객체생성 없이 호출)
		MyMath2 mm = new MyMath2();  //인스턴스 생성
		mm.a = 200L;
		mm.b = 100L;
		System.out.println(mm.add());  //인스턴스메서드 호출
	}
}
class MyMath2 {
	long a, b;
	
	long add() {  // 인스턴스 메서드
		return a + b;
	}
	
	static long add(long a, long b) {  // 클래스 메서드(static메서드) 
		return a + b;
	}
}

static을 붙여야 하는 경우

1) 변수의 경우 속성(멤버변수) 중에서 공통 속성에 static을 붙인다. (앞부분에서 나옴, 개별 속성은 iv)

 

 

2) 메서드의 경우 인스턴스 멤버(iv, im)를 사용하지 않는 메서드에  static을 붙인다.

 


메서드 간의 호출과 참조

1) static 메서드는 인스턴스(iv)를 사용할 수 없다.

 

class TestClass2 {
	int iv;  // 인스턴스 변수(객체 생성 후 사용가능)
	static int cv;  // 클래스 변수(언제나 사용가능)
	
	void instanceMethod() {     // 인스턴스 메서드(객체 생성 후 호출가능)
		System.out.println(iv); // 인스턴스 변수를 사용할 수 있음
		System.out.println(cv); // 클래스 변수를 사용할 수 있음
	}
	
	static void staticMethod() { // static 메서드(항상 호출 가능)
//		System.out.println(iv);  // 에러!! 인스턴스 변수를 사용할 수 없음
		System.out.println(cv);  // 클래스 변수는 사용할 수 있음
	}
}

 

2) static 메서드는 인스턴스 메서드(im)를 호출할 수 없다.

 

class TestClass {
	void instanceMethod() {}        // 인스턴스 메서드
 	static void staticMethod() {} // static메서드 

 	void instanceMethod2() {   // 인스턴스메서드
 		instanceMethod();      // 다른 인스턴스메서드를 호출함
 		staticMethod();        // static메서드를 호출함
 	}
 	
 	static void staticMethod2() {  // static메서드
// 		instanceMethod();          // 에러!! 인스턴스메서드를 호출할 수 없음
 		staticMethod();            // static메서드를 호출함
 	}
}

 

-> static 메서드가 인스턴스 멤버를 사용할 사용할 없는 이유는 static메서드 호출시 객체(iv묶음) 없을 수도 있기 때문에!(static 객체가 있든지 없든지 항상 호출 가능)