2022. 5. 22. 14:54ㆍJava
◎ 클래스 메서드
-> 메서드 앞에 static이 붙은 메서드
-> 클래스 변수처럼 객체를 생성하지 않고도 "클래스 이름. 메서드이름(매개변수)"의 형식으로 호출이 가능
-> 인스턴스와 관련이 없는 메서드를 클래스 메서드로 생성한다.
◎ 인스턴스 메서드
-> 반드시 객체를 생성해야 호출이 가능
-> 메서드 작업을 하는데 있어서 인스턴스 변수를 필요로 하는 메서드
-> 인스턴스 변수는 인스턴스를 생성해야만 만들어지기 때문에 인스턴스 메서드도 인스턴스를 생성해야 호출이 가능한 것이다.
◎ 정리
-> 클래스 설계 시, 멤버변수 중 모든 인스턴스에 공통적으로 사용되는 것에 static을 붙인다.
-> static이 붙은 클래스 변수는 클래스가 메모리에 올라갈 때 이미 자동으로 생성되기 때문에 클래스 변수는 인스턴스를 생성하지 않아도 된다.
-> 인스턴스 변수는 인스턴스가 반드시 존재해야 사용 가능하기 때문에 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
-> 메서드 내 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
-> 사용 예
class Math{
long x, y;
// 인스턴스 메서드
long add() {return x + y;} // 덧셈
long sub() {return x - y;} // 뺄셈
long mul() {return x * y;} // 곱셈
double div() {return x / y;} // 나눗셈
// 클래스 메서드
static long add(long x, long y) {return x + y;}
static long sub(long x, long y) {return x - y;}
static long mul(long x, long y) {return x * y;}
static double div(double x, double y) {return x / y;}
}
public class MathTest {
public static void main(String[] args) {
// 클래스 메서드 호출 -> 인스턴스 생성 없이 호출
System.out.println("======= 클래스 메서드 호출 =======");
System.out.println(Math.add(250L, 180L));
System.out.println(Math.sub(250L, 180L));
System.out.println(Math.mul(250L, 180L));
System.out.println(Math.div(250.0, 180.0));
System.out.println();
// 인스턴스 메서드 호출 -> 인스턴스 생성 후 호출
Math m = new Math();
m.x = 250L;
m.y = 180L;
System.out.println("======= 클래스 메서드 호출 =======");
System.out.println(m.add());
System.out.println(m.sub());
System.out.println(m.mul());
System.out.println(m.div());
}
}
-> 결과
◎ 클래스 멤버와 인스턴스 멤버간 참조와 호출
-> 같은 클래스에 속한 멤버들 간에는 인스턴스 생성 없이 서로 참조와 호출이 가능하다.
-> 클래스 멤버가 인스턴스 멤버를 참조, 호출하려는 경우에는 인스턴스 멤버가 존재하는 시점에는 클래스 멤버는 항상 존재하지만 클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수 있기 때문에 인스턴스를 생성해야 한다.
public class MemberEx {
int iv = 1;
static int cv = 7;
int iv2 = iv;
// static int cv2 = iv; -> 클래스변수는 인스턴스 변수를 사용할 수 없다.
static int cv2 = new MemberEx().iv; // 클래스 변수가 인스턴스 변수를 사용하려면 인스턴스를 생성해야 한다.
static void staticMethod() {
System.out.println(cv);
// System.out.println(iv); 인스턴스 생성 후 참조 가능
MemberEx m = new MemberEx();
System.out.println(m.iv);
}
// 인스턴스 메서드는 클래스 메서드와 인스턴스 메서드 모두 사용 가능
void instanceMethod() {
System.out.println(cv);
System.out.println(iv);
}
static void staticMethod2() {
staticMethod();
// instanceMethod(); 클래스 메서드가 인스턴스 메서드를 호출 하려면 인스턴스를 생성하고 호출해야 한다.
MemberEx m = new MemberEx();
m.instanceMethod();
}
// 인스턴스 메서드는 인스턴스 생성 없이 클래스 메서드와 인스턴스 메서드 모두 호출 가능
void instanceMethod2() {
staticMethod();
instanceMethod();
}
}
★ 참고 및 출처
자바의 정석