1. 클래스 메소드: static이 붙어 있는 메소드
클래스 메소드도 클래스변수처럼 객체를 생성하지 않고도 호출이 가능하다.
1) 형태: 클래스명.메소드명(매개변수)
2) 사용시기와 정의
:: 메소드 중에서 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메소드를 사용하지 않는) 메소드를 클래스 메소드(static메소드)로 정의한다. 그렇다고 인스턴스 변수를 사용하지 않는다고 해서 반드시 클래스 메소드로 정의하는 것은 아니지만 특별한 이유가 없는 한 그렇게 하는 것이 일반적이다.
**클래스 영역에 선언된 변수를 멤버변수라고 하는데 이중 static이 붙은 것은 클래스변수(static변수), static이 붙지 않은 것은 인스턴스변수라고 한다. 멤버변수는 인스턴스 변수와 static 변수를 모두 통칭하는 말이다.
3) 특이사항
① 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.
-생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스의 변수(iv)는 서로 다른 값을 유지한다. 그러나 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서 클래스 변수로 정의해야 한다.
② 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
-static이 붙은 변수(클래스변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문.
③ 클래스 메소드(static메소드)는 인스턴스 변수를 사용할 수 없다.
-인스턴스변수는 인스턴스가 반드시 존재햐야만 사용할 수 있지만 클래스메소드는 인스턴스 생성 없이 호출 가능하므로 클래스 메소드가 호출 되었을 때 인스턴스가 존재하지 않을 수도 있다. 그래서 클래스 메소드에서 인스턴스변수의 사용을 금지한다.
-반면에 인스턴스변수나 인스턴스 메소드에서는 static이 붙은 멤버들을 사용하는 것이 가능하다. 인스턴스변수가 존재한다는 것은 static변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.
④ 메소드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
-메소드의 작업내용 중에서 인스턴스변수를 필요로 한다면 static을 붙일 수 없다. 반대로 인스턴스변수를 필요로 하지 않는다면 static을 붙이면 된다. 메소드 호출시간이 짧아지므로 성능이 향상되기 때문이다. static을 붙이지 않은 메소드(인스턴스 메소드)는 실행 시 호출 되어야할 메소드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.
① 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있는지 보고 있다면 static을 붙인다.
② 작성한 메소드 중에서 인스턴스변수나 인스턴스 메소드를 사용하지 않는 메소드에 static을 붙이는 것을 고려한다.
2. 인스턴스 메소드: static이 붙어있지 않은 메소드
인스턴스 메소드는 인스턴스 변수와 관련된 작업을 하는, 즉 메소드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메소드다. 그런데 인스턴스 변수는 인스턴스(객체)를 생성해야만 만들어지므로 인스턴스 메소드 역시 인스턴스를 생성해야지만 호출할 수 있다.
클레스 메소드와 인스턴스 메소드의 특성을 코드로 비교해 보면 다음과 같다.
예제)
class MemberCall {
int iv = 10;
static int cv = 20;
int iv2 = cv;
// static int cv2 = iv; // 에러. 클래스변수는 인스턴스 변수를 사용할 수 없음.
static int cv2 = new MemberCall().iv; // 이처럼 객체를 생성해야 사용가능.
static void staticMethod1() {
System.out.println(cv);
// System.out.println(iv); // 에러. 클래스메서드에서 인스턴스변수를 사용불가.
MemberCall c = new MemberCall();
System.out.println(c.iv); // 객체를 생성한 후에야 인스턴스변수의 참조가능.
}
void instanceMethod1() {
System.out.println(cv);
System.out.println(iv); // 인스턴스메서드에서는 인스턴스변수를 바로 사용가능.
}
static void staticMethod2() {
staticMethod1();
// instanceMethod1(); // 에러. 클래스메서드에서는 인스턴스메서드를 호출할 수 없음.
MemberCall c = new MemberCall();
c.instanceMethod1(); // 인스턴스를 생성한 후에야 호출할 수 있음.
}
void instanceMethod2() { // 인스턴스메서드에서는 인스턴스메서드와 클래스메서드
staticMethod1(); // 모두 인스턴스 생성없이 바로 호출이 가능하다.
instanceMethod1();
}
}
'Java > Basic' 카테고리의 다른 글
변수의 초기화 (0) | 2021.03.23 |
---|---|
생성자(Constructor) (0) | 2021.03.23 |
기본형 매개변수, 참조형 매개변수 (0) | 2021.03.19 |
JVM의 메모리 구조 (0) | 2021.03.19 |
객체지향 (0) | 2021.03.03 |
댓글