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 메서드의 경우 인스턴스 변수(iv)를 사용할 수 있을까?
당연히 사용할 수 없다.
인스턴스 메서드의 경우에는 새로 객체를 생성해서 인스턴스 변수를 사용할 수 있지만 클래스 메서드인 static 메서드의 경우에는 인스턴스 변수를 사용할 수 없다.
static long add(long a, long b) {
return a + b;
}
따라서 static 메소드의 매개변수 a,b는 지역변수(lv)를 의미한다.
핵심 정리! static 메서드는 객체를 생성하지 않고 호출 가능한 메서드를 의미한다.
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 메서드에서 사용할 수 없는 것은 당연하다