Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버로 어디서든지 참조 가능
Gabage collector의 영역 밖에 존재하여 관여하지 않음
프로그램 시작될때부터 종료될때까지 메모리 값에 유지된 채로 존재
[ static 변수 ]
static이 붙지 않은 메서드나, 변수의 경우 객체가 생성될 때마다 호출되어 서로 다른 값을 가질 수 있음
각 객체들에서 공통적으로 하나의 값이 유지되어야 할 경우 static 사용
예시로 좋아요 개수를 받을 경우
package study;
public class LikeCount {
int count;
public LikeCount() {
this.count++;
System.out.println("좋아요 개수 : " + count);
}
public static void main(String[] args) {
LikeCount lc1 = new LikeCount();
LikeCount lc2 = new LikeCount();
}
}
static 사용하지 않고 lc1, lc2 객체가 생성될 때 lc1의 count와 lc2의 count가 서로 다른 메모리를 할당받아
메모리를 각각 받았으므로 좋아요 개수는 계속 1이 나오는 결과가 나온다
좋아요 개수 : 1
좋아요 개수 : 1
package study;
public class LikeCount {
static int count;
public LikeCount() {
this.count++;
System.out.println("좋아요 개수 : " + count);
}
public static void main(String[] args) {
LikeCount lc1 = new LikeCount();
LikeCount lc2 = new LikeCount();
}
}
이 경우에는 static 변수를 사용하여 lc1, lc2 객체가 하나의 메모리를 공유하게 되어 좋아요 개수가 증가하게 된다
좋아요 개수 : 1
좋아요 개수 : 2
[ static 메소드 ]
객체 생성 없이 사용 가능
프로그램이 시작하면 메모리의 static 영역에 적재되고, 프로그램 종료될 때 해제된다
Static 메서드 내에서 인스턴스 변수 사용 불가능, ststic 변수만 접근 가능
정적 메서드 사용 예시
class Name{
static void print1() { //클래스 메소드
System.out.println("이름 : 홍길동");
}
void print2() { //인스턴스 메소드
System.out.println("이름 : 김상순");
}
}
public class Static_ex {
public static void main(String[] args) {
Name.print1(); //인스턴스를 생성하지 않아도 호출이 가능
Name name = new Name(); //인스턴스 생성
name.print2(); //인스턴스를 생성하여야만 호출이 가능
}
}