티스토리 뷰

반응형

# static 메서드와 인스턴스 메서드

메서드 앞에 static이 붙어 있으면 클래스 메서드이고, 붙어 있지 않으면 인스턴스 메서드이다. 

또한 인스턴스 변수(iv)의 사용 여부에 따라 나눌 수 있다. 

 

인스턴스 메서드(im)

- 인스턴스 메서드 호출 방법은 인스턴스 생성 후 , '참조 변수. 메서드 이름();'으로 호출한다. 

- 인스턴스 메서드는 인스턴스 멤버(im, iv)와 관련된 작업을 하는 메서드이다. 

- 메서드 내에서 인스턴스 변수(iv)를 사용할 수 있다. 

- 인스턴스 메서드는 매개변수가 없으므로, 인스턴스 변수(iv)를 써서 값을 받는다

 

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

- static 메서드 호출 방법은 객체 생성 없이 '클래스 이름. 메서드 이름();'으로 호출한다. 

   → 객체 생성을 안 하기 때문에 참조 변수 대신 클래스 이름을 쓰는 것이다. 

- 인스턴스 멤버(iv,im)와 관련 없는 작업을 하는 메서드이다. 

- 메서드 내에서 인스턴스 변수(iv) 사용이 불가하다.

- 작업에서 필요한 값은 매개 변수(입력 값)로 받는다.  

 

* static은 언제 붙여야 할까?

- 속성 (멤버 변수) 중에서  공통 속성에 static을 붙인다. 

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

 

 

* static메서드 vs 인스턴스 메서드

  Static 메서드 인스턴스 메서드
인스턴스(객체) 생성 생성X 생성O
메서드 내에서 iv 사용 사용 불가 사용 가능
작업에 필요한 값을 받는 방식 매개 변수(입력 값) 인스턴스 변수 사용

 

예제) stsic 메서드와 인스턴스 메서드 

class MyMath2{
	long a, b; 
    
	//인스턴스 메서드
	long add() {return a + b;}  
	long subtract() {return  a - b;}
	long multiply() {return a * b;}
	double divide() {return a / b;}
	
    //static 메서드(클래스 메서드)
	static long add(long a, long b) {return a + b;} //a,b는 지역변수
	static long subtract(long a, long b) {return  a - b;} 
	static long multiply(long a, long b) {return a * b;} 
	static double divide(long a, long b) {return a / (double)b;} 
	
}

class Ex6_9 {

	public static void main(String[] args) {
		//클래스 메서드 호출
		System.out.println(MyMath2.add(200L, 100L));
		System.out.println(MyMath2.subtract(200L, 100L));
		System.out.println(MyMath2.multiply(200L, 100L));
		System.out.println(MyMath2.divide(200L, 100L));
		
		MyMath2 mm = new MyMath2(); 
		
		
		mm.a = 200L;
		mm.b = 100L;
		
		//인스턴스 메서드 호출
		System.out.println(mm.add()); 
		System.out.println(mm.subtract());
		System.out.println(mm.multiply());
		System.out.println(mm.divide());
	}

}

* 출력 결과

300
100
20000
2.0
300
100
20000
2.0

인스턴스 메서드는 매개변수 없이도  인스턴스 변수인 'long a, b;'를 사용하여 메서드를 작업할 수 있다. 

반면에 클래스 메서드는 'add(long a, long b), mutiply(long a, long b)'등은 인스턴스 변수 없이 매개변수를 통해

작업을 수행한다. 

 

클래스 메서드 호출 시에는 객체 생성 없이 '클래스이름.메서드이름()'을 써서 호출한다. 

→ MyMath2.add(200L, 100L); //클래스 메서드 호출

인스턴스 메서드를 호출하기 위해서는 먼저 인스턴스(객체)를 생성해야 한다. 

→ MyMath2 mm = new MyMath2(); // 인스턴스 생성

인스턴스 생성 후, '참조변수.메서드이름()'을 사용하여 호출한다. 

→ mm.add();

 

# 메서드 간의 호출과 참조

같은 클래스에 속한 멤버들 간에는 별도의 인스턴스(객체) 생성 없이 서로 참조 또는 호출이 가능하다. 

단, 클래스 멤버가 인스턴스 멤버를 참조 또는 호출하는 경우에는 인스턴스(객체)를 생성해야 한다. 

그 이유는 인스턴스 멤버(iv,im)가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 

클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문이다. 

class TestClass2 {
	int iv;         //인스턴스 변수 
	static int cv;  //클래스 변수
	
	void instanceMethod() {		//인스턴스 메서드 - 객체 생성 후 사용 가능
		System.out.println(iv); // 인스턴스 변수 사용가능
		System.out.println(cv); // 클래스 변수를 사용가능
	}
	
	static void saticMethod() { //static 메서드 - 객체 생성없이 호출 가능
		System.out.println(iv); // error -  인스턴스 변수 사용 불가
		System.out.println(cv); // 클래스 변수 사용가능
	}
}

즉, 인스턴스 메서드는 항상 static메서드를 호출할 수 있지만, static 메서드는 인스턴스 메서드를 호출할 수 없다. 

 

 

# 정리(Q&A)

Q. static메서드는 staitc메서드 호출이 가능한가?

→ YES!

  같은 메서드끼리는 호출이 가능하다. 

 

Q. static 메서드는 인스턴스 변수 사용가능?

  NO!

인스턴스 변수는 객체(iv묶음)를 생성해야 사용이 가능한데

    static메서드는 언제나 호출이 가능(객체 생성 없이 사용) 하기 때문에 인스턴스 변수를 사용할 수 없다.

 

Q. static 메서드는 인스턴스 메서드 호출 가능?

  NO!

위의 질문의 답변과 같음.

 

Q. ? ststic메서드는 인스턴스 멤버(iv,im)를 쓸 수 없나요?

 static 메서드 호출 시 객체(iv묶음)가 있을 수도 없을 수도 있기 때문이다. 

   static 메서드는 항상 호출 가능

반응형