[Java] static 메서드와 인스턴스 메서드
# 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 메서드는 항상 호출 가능