JAVA
[JAVA] static 멤버(static 필드, static 메서드)
정공자씨
2024. 4. 22. 12:01
정적 멤버(static member, class member)
정의
- 클래스에 소속된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메서드
- 클래스에 소속된 멤버이기 때문에 클래스 멤버라고 함
- 특정한 인스턴스에 속해 있는 멤버가 아님
- 즉, 인스턴스와 무관함
종류
- static 필드(class 필드)
- static 메서드
특징
class StaticTest {
static int count; // static 필드
static void printHello() { // static 메서드
System.out.println("hello");
}
}
- 클래스의 인스턴스를 생성하지 않더라도 static 멤버에 접근이 가능
- 즉, 클래스가 정의만 되어도 static 메서드와 static 필드에 접근이 가능
- 클래스명과 도트 연산자(.)를 이용하여 static 멤버에 접근할 수 있음
- StaticTest.count; // 클래스명.필드명
- StaticTest.printHello(); // 클래스명.메서드명
static 멤버의 생성과 소멸
- JVM에 의해서 클래스가 메모리 공간에 올라가는 순간(로드)에 생성되고, 프로그램이 종료되는 시점에 소멸
- 클래스가 메모리 공간에 올라가는 순간에 static 멤버도 함께 올라감
- 해당 클래스의 인스턴스가 여러개 생성되더라도, 클래스가 이미 로드된 경우에는 더 이상 클래스 멤버가 메모리에 로드되지 않음
- 즉, 클래스가 처음 사용될 때에 단 1번만 Method Area 메모리에 로드되며, 다시 로드되지 않음
[ 인스턴스 멤버(instance member) ]
정의
- non static member
- 특정 인스턴스에 속하는 멤버
종류
- 인스턴스 변수
- 인스턴스 메서드
Instance Variable (인스턴스 변수)
- 새로운 인스턴스가 생성될 때마다 heap area 메모리에 생성되는 변수
Instance Method (인스턴스 메서드)
- 인스턴스가 생성된 후에 인스턴스의 참조를 이용하여 호출할 수 있는 메서드
static 필드(class 필드)
class StaticTest {
public static int count; // static 필드, method area 메모리에 할당
int count2; // instance 필드, 인스턴스 생성 시 heap area 메모리에 할당
}
특징
- 필드(멤버변수) 선언 시에 static 키워드를 붙여서 선언
- main() 메서드가 실행되기 전에 method area 메모리 영역에 생성되어 사용이 가능
[ instance 필드 ]
인스턴스의 생성 시(new 연산을 사용하여 인스턴스 생성)에 heap area 메모리에 할당되고, 인스턴스 소멸 시에 메모리 해체됨
사용
- static 필드를 사용할 때는, 참조변수가 필요 없음
- static 필드를 사용할 때는, 클래스명.필드명으로 사용
StaticTest.count
static 메서드(class 메서드)
class StaticTest {
public static int count; // static 필드
public static int counting() { // static 메서드
count++;
}
}
특징
- 메서드의 선언부에 static 키워드가 있는 메서드
- main() 메서드가 실행되기 전에 method area 메모리 영역에 생성되어 사용이 가능
- 인스턴스 생성과 무관하게 사용하는 메서드는 static으로 선언하여 사용
사용
- 클래스의 인스턴스를 생성하지 않고도 접근이 가능하므로, 클래스명으로 접근
- 참조변수를 사용하지 않아도 됨
- static 메서드를 사용할 때는, 클래스명.메서드명으로 사용
StaticTest.counting();
static 메서드에서 다른 메서드, 다른 필드 접근하기
1. static 메서드에서는 인스턴스 필드와 인스턴스 메서드를 사용할 수 없음
- static 메서드는 클래스의 객체를 생성하지 않고도 사용이 가능하지만
- 인스턴스 멤버는 클래스의 인스턴스를 생성한 이후에 사용이 가능하므로
- static 메서드에서는 인스턴스 멤버를 사용할 수 없음
static 메서드 호출 시에, 해당 인스턴스가 생성되어 있지 않을 수 있기 때문에
2. static 메서드에서는 static멤버를 사용할 수 있음
3. static 메서드는 this 포인터 사용 불가
- this는 클래스 내의 멤버변수(필드)를 가리키는 용도
- 해당 멤버변수가 사용 시점에 메모리에 할당 되어 있는지를 알 수 없음
4. 인스턴스 메서드에서는 인스턴스 필드를 사용할 수 있음
- 인스턴스 메서드 호출 시에는 이미 인스턴스가 생성되어 있다는 뜻이고
- 인스턴스 필드 역시 메모리에 생성되어 있음
예제
static 변수, static 메서드 사용하기
public class StaticTest {
static int num;
public static void main(String[] args) { // main() 메서드
//static int num으로 선언하고, main()안에서 share = 20; 해놓으면 전역변수로 정의
num = 20;
int result = func(5, 7);
System.out.println(num); // 12
System.out.println(result); // -2
}
private static int func(int m,int n){ // func 메서드
num = m + n; // 12, func함수 호출로 인해 20이었던 것이 12로 변경
return m - n; // -2
}
}
인스턴스 변수, 인스턴스 메서드 사용하기
public class StaticTest {
int num;
public static void main(String[] args) { // main() 메서드
// static 변수, static 메서드가 아니라면 클래스의 객체 생성하여 사용
StaticTest stTest = new StaticTest();
int num = 30; // main()의 내 지역변수
stTest.num = 20; // 인스턴스변수 사용, 참조변수.변수명로 접근
int result = stTest.func(5, 7); // 인스턴스메서드 사용, 참조변수.메서드명
System.out.println(num); // 30, main()의 내 지역변수 num
System.out.println(stTest.num); // 12, 전역변수 num
System.out.println(result); // -2
}
int func(int m,int n){ // func 메서드
num = m + n; // 12, 전역변수 num
return m - n; // -2
}
}
static 변수(class 변수)와 instance 변수 차이점
출처
https://micropilot.tistory.com/3041
https://aomee0880.tistory.com/141