Static 느낌적인 느낌으로는 알지만 개념적으로 설명해보라하면 그!!!!만 외치게 된다는...!! 그걸 오늘 공부해보자
Java에서 static
이란 어떤 값이 메모리에 한번 할당되어 프로그램이 끝날 때까지 그 메모리에 값이 유지된다는 것을 의미한다.
특정한 값을 공유해야하는 경우 static
을 사용하면 메모리의 이점을 얻을 수 있다.
예를 들어 게시글의 좋아요 기능 코드를 보면
public class likeCnt {
int cnt;
public likeCnt(){
this.cnt++;
System.out.println("like = " + this.cnt);
}
public static void main(String[] args){
likeCnt l1 = new likeCnt();
likeCnt l2 = new likeCnt();
}
}
#결과
1
1
인스턴스 변수는 클래스가 생성될 때 메모리 공간이 할당되고 생성자에 있는 값으로 초기화가 된다.
public class likeCnt {
static int cnt;
public likeCnt(){
this.cnt++;
System.out.println("like = " + this.cnt);
}
public static void main(String[] args){
likeCnt l1 = new likeCnt();
likeCnt l2 = new likeCnt();
}
}
#결과
1
2
그러나 static
변수는 어디에서 선언이 되더라도 그 클래스 내에서는 값을 공유한다. 선언되는 순간 하나의 메모리 공간이 할당되기 떄문이다.
처음 예제처럼 인스턴스 변수를 사용하면 l1, l2 객체 생성 시 l1 cnt와 l2 cnt가 서로 다른 메모리 영역을 할당 받는다.
하지만 static
을 사용하면 두 객체가 생성될 때 cnt는 하나의 메모리만을 할당받게 되는 것이다.
static
메소드는 객체의 생성 없이 호출이 가능하고, 객체에서는 호출이 불가능하다.
또 static
메소드 안에서는 인스턴스 변수 접근이 불가능하다.
public class likeCnt {
static int cnt;
//int cnt;
public likeCnt(){
this.cnt++;
System.out.println("like = " + this.cnt);
}
public static int getCnt() {
return cnt;
}
public static void main(String[] args) {
likeCnt l1 = new likeCnt();
likeCnt l2 = new likeCnt();
System.out.println("total = " + likeCnt.getCnt());
}
}
static
으로 선언한 경우 2가 정상 출력되지만, 인스턴스 변수로 선언하여 실행하면 오류가 난다.
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot make a static reference to the non-static field cnt
getCnt() 메소드는 지금 static
으로 선언했기 때문에 l1이나 l2객체로 호출하지 않아도 사용할 수 있다.
- 인스턴스에 공통적으로 사용해야하는 것은
static
을 붙인다.
인스턴스를 생성하면 각 인스턴스들은 서로 다른 메모리들의 주소를 할당받기 때문에 서로 다른 값을 유지한다. 만약 인스턴스들이 공통적인 값을 유지해야 하는 경우라면 static
을 사용하면 된다!
- 전역으로 자주 사용할 메소드를
static
메소드로 만들어 사용한다.
프로젝트 내 공통적으로 사용해야할 메소드를 static
으로 만들면 불필요한 코드의 수를 줄일 수 있다. 이때 인스턴스 변수가 메소드 내부에 필요한가에 대해서도 고려해야한다.
출처
https://wikidocs.net/228
https://velog.io/@lshjh4848/static%EB%B3%80%EC%88%98%EC%99%80-static-%EB%A9%94%EC%84%9C%EB%93%9C-final-xpk2l8e7g0