static 이란?
클래스 인스턴스와 연결되지 않고 클래스 자체에 속하는 클래스 수준 변수, 메서드 또는 중첩 클래스를 선언하는 데 사용됩니다. static 요소는 클래스의 모든 인스턴스에서 공유되며 클래스의 인스턴스를 만들 필요 없이 클래스 이름을 통해 직접 액세스할 수 있습니다.
정적인 정보라고도 말할 수 있습니다. 인스턴스 변수같은 경우는 인스턴스가 생겨야지만 생성되는 동적인 정보라면, static은 프로그램 실행시에 저장되는 정보라 정적인 정보라고 합니다.
예시
class A{
int i; // instance variable
static int j; // static variable or class variable
public void test() {
System.out.println("객체 멤버 메서드");
}
public static void test2() {
System.out.println("static 메서드");
}
}
public class TestStatic1 {
public static void main(String[] args) {
A a=new A();
System.out.println(a.i);//객체 생성해야 인스턴스 변수 사용가능
System.out.println(A.j);//static 은 class 명으로 접근하면 사용가능
a.test();
A.test2(); //static method는 객체 생성없이 class 명으로 접근 가능
}
}
Class A 에 대한 static 변수와 instance 변수에 대하여 알아봅시다.
i 는 instance변수이고, j는 static 변수입니다.
아래 main 메소드를 확인해보시면 i는 객체를 생성하지 않으면 값이 출력이 되지 않는데 반해 , j 는 Class의 static 변수이기 때문에 A Class를 그냥 불러와서 j를 호출하면 값이 출력됩니다.
아래의 메소드도 같은 원리입니다.
final
class Test{
final int MAX_VALUE=111;// final 상수
void a() {
//MAX_VALUE=222;//재할당 불가 error
}
final void b() {} // final method는 자식클래스에서 오버라이드 불가
}
class SubTest extends Test{
void a(){ // 부모 a 메서드를 오버라이드
//
}
//void b() {}
}
final class Test2{} // final class 는 subclassing , 자식 클래스가 상속 불가
//class Test3 extends Test2{} // error
public class TestFinal {
public static void main(String[] args) {
}
}
final 변수 , 메소드, class 는 모두 재할당이나 상속 override 불가합니다. 그냥 final을 쓰면 변경이 불가능해지는 유일한 상수가 되는 느낌입니다. 1이 1인것처럼 final로 정의한 변수는 그냥 그 자체가 되는 겁니다. 위의 예시의 주석을 하나씩 풀어가면서 에러를 확인해보면 바로 이해가 됩니다.
원리
static은 class가 생성되지도 않았는데 실행이 되는 것을 보면서 이런 생각이 들었습니다. heap메모리에 저장이 되지 않았는데 어떻게 실행이 되는것인지 궁금해졌습니다.
알아보니 static메모리? static area? metaspace? 에 저장이 된다고 합니다.
프로그램이 실행이 되면서 저장되고 프로그램이 끝나야만 메모리에서 삭제되기 때문에 프로그램 실행 중에는 언제든 불러올 수 있습니다.
추상적이지만 그냥 그러한 메모리 공간이 생성된다고 생각하면 참 간단합니다.
그래서 위의 예제를 예를 들자면 static으로 선언한 친구들은 몽땅 static 메모리 구역에 저장되어서 프로그램이 끝날 때까지 저장되어있다고 생각하면 됩니다.
소감
메모리 영역은 특히나 추상적인 개념이라서 이해하는데 시간이 조금 걸릴 수 있지만, 그냥 방이 생기는구나라고 생각하고 이해하면 편합니다. 그냥 있는 곳인데 우리 눈에는 보이지 않는 곳이라고 생각하면 조금 쉽습니다.
static 관련해서는 프로그램을 만들어봐야 언제 사용될지 알 수 있겠습니다. 잠깐 생각해봤는데, 글로벌하게 사용할 수 있는 변수나 메소드에 대하여 사용하면 되겠습니다.
출처
https://m.blog.naver.com/heartflow89/220954420688
'코딩 개발 > Java' 카테고리의 다른 글
Java - Interface (feat. abstract) (0) | 2023.04.11 |
---|---|
Java - abstract (추상클래스, 추상 메소드) (0) | 2023.04.09 |
Java - 다형성(Polymorphism) (0) | 2023.04.09 |
Java - 상속(Inheritance) (0) | 2023.04.09 |
Java - Array(배열) (0) | 2023.04.07 |