[WHY] Static 무엇일까?

ggam-nyang·2022년 9월 20일
0

WHY

목록 보기
1/2

Static이 정확히 뭘까?

Static 변수

public Static{
	public String notStatic;
	public static String staticVariable = "sv";
	public static void main(String[] args) {
		
	}

	public void someMethod() {
	
	}
}

위와 같은 Static 클래스가 존재할 때,
notStatic은 인스턴스 변수, StaticVariable은 클래스 변수이다.

인스턴스 변수는, 객체의 생성과 함께 시작되고 저장된다.
- new 연산자로 생성되고 Heap 영역에 저장된다.

클래스 변수는 클래스의 생성과 함께 저장된다.
- 클래스에 대한 정보와 클래스 변수는 메소드 영역에 저장된다.

즉, 생명 주기도 다르고 저장되는 위치도 다르다.

모든 Static 객체의 notStatic 값이 "no!!"로 동일하다고 했을 때,
100개의 Static 객체가 생성되면 100개의 동일한 notStatic 인스턴스 변수가 생성되고 저장된다.

그러나 static으로 정의한 경우, 1개의 동일한 변수를 바라보게 된다.
(값을 변경할 경우 모든 객체에서 값이 변경되므로 final 키워드를 붙이는게 좋다.)

Static 메소드

클래스 변수와 유사하게, static 메소드도 클래스 생성과 함께 생성된다.
그래서 객체의 생성 없이도, 해당 메소드를 사용할 수 있다.

	public static String join(CharSequence delimiter, CharSequence... elements) {  
	    var delim = delimiter.toString();  
	    var elems = new String[elements.length];  
	    for (int i = 0; i < elements.length; i++) {  
	        elems[i] = String.valueOf(elements[i]);  
	    }    return join("", "", delim, elems, elems.length);  
	}


// 이렇게 사용할 수 있다
String test = String.join(...);

// 이렇게가 아닌!!
String str = new String();
String test = str.join(...);

String에 정의된 join 메소드이다.
이는 static 메소드로, 아래 2줄처럼 String 객체를 생성하지 않고도
메소드를 호출하여 사용할 수 있다.

변수와 마찬가지로 메모리 효율에서 장점이 있다고 생각한다.
객체를 생성하지 않아도 되니까!

당연하게도, static 메소드에서는 static 변수만 참조할 수 있다.
인스턴스 변수는 객체 생성시에 생성되기 때문이다.

(static class는 다음에..!)

급한 정리

결국 static과 아닌 것의 차이는 생성 시점과 저장되는 메모리의 위치가 다름이다.

내 나름의 장단을 생각해보면
장점:

  • 메모리 효율이 올라간다.
  • 객체를 생성하지 않아도 돼서 코드 작성이 편해진다.

단점:

  • 전역 변수처럼 남용할 경우, 오히려 메모리 비효율이 발생할 수 있다.
    (자바 프로그램의 종료와 함께 메모리가 정리되므로 GC가 관리해주는
    heap 영역과는 다르다)
  • final 변수가 아닌 경우, 에러 나기 쉽다..!

자바를 프로덕트 레벨에서 사용하다보면 더 많은 장단을 느끼게 될 것 같다.

WHY?

내 생각에는 static은 결국 저장 위치가 다른게 핵심이고
-> 이에 따라 생명주기도 달라지고
-> 객체 생성 없이 메소드를 사용하고, 변수를 사용하고 등등
효과가 생긴다고 생각한다.

더 알아볼 것:
  • 메모리 계층 구조와 JVM이 관리하는 메모리 계층 구조가 다른지?
    - 다르다면 어떻게 다른건지..? (method 영역이 무엇일까)

  • WHY?가 부실하다... 1주일 뒤 복기하며 조금 더 찾아보기!

profile
개발 꿈나무

0개의 댓글