[Java]Static

김피자·2023년 4월 3일
0

자바

목록 보기
7/9
post-thumbnail

Static 느낌적인 느낌으로는 알지만 개념적으로 설명해보라하면 그!!!!만 외치게 된다는...!! 그걸 오늘 공부해보자


Static

Java에서 static이란 어떤 값이 메모리에 한번 할당되어 프로그램이 끝날 때까지 그 메모리에 값이 유지된다는 것을 의미한다.

특정한 값을 공유해야하는 경우 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메소드는 객체의 생성 없이 호출이 가능하고, 객체에서는 호출이 불가능하다.
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객체로 호출하지 않아도 사용할 수 있다.


결론

  1. 인스턴스에 공통적으로 사용해야하는 것은 static을 붙인다.

인스턴스를 생성하면 각 인스턴스들은 서로 다른 메모리들의 주소를 할당받기 때문에 서로 다른 값을 유지한다. 만약 인스턴스들이 공통적인 값을 유지해야 하는 경우라면 static을 사용하면 된다!

  1. 전역으로 자주 사용할 메소드를 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

profile
제로부터시작하는코딩생활

0개의 댓글