Static
static은 고정이란 의미
static을 사용함으로써 정적 필드, 정적 메소드를 선언 할 수 있다.
정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이다.
그렇기에 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스 별로 관리된다.
따라서 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있다.
static 키워드를 통해 생성된 정적 멤버들은 heap 영역이 아닌 static 영역에 할당된다.
Static | Heap |
---|---|
* 주로 클래스들이 할당 | * 주로 객체들이 할당 |
* Garbage Collector 관여 x | * Gartbage Collector 관여 |
* 모든 객체가 메모리를 공유 | * 메모리를 공유하지 않음 |
Static 영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 된다.
그렇기에 Static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 약 영향을 줄 수 있다.
인스턴스로 생성할 것인지 정적으로 생성할 것인지는 공용으로 사용하느냐 아니냐로 판단할 수 있다.
필드와 메소드 선언 시 static이란 키워드를 붙이면 정적으로 생성 , 그냥 생성한다면 자동으로 인스턴스로 생성된다.
Static 필드 사용 예시
class Number {
static int num = 0 ; // 클래스 필드
int num2= 0 ; // 인스턴스 필드
}
public class static_ex{
public static void main(String[] args) {
NUmber number1 = new Number(); // 첫번째 number
Number number2 = new Number(); // 두번째 number
number1.num++; // 클래스 필드 num을 1 증가 (클래스 필드는 저장소를 같은 곳으 쓰고 있는 점 유의)
number2.num2++; // 인스턴스 필드 numdmf 1 증가 (인스턴스 필드는 선언 때 마다 새로 생성 됨을 알기)
System.out.println(number2.num); // 클래스 필드를 출력하므로 number2도 number1의 클래스 필드 num을 가르킴
System.out.println(number2.num2); // number1 의 인스턴스 필드와는 다른 num2 를 가르킴
}
}
num++ 의 경우는 클래스 필드 값을 증가 시키고 있다.
number1.num 과 number2.num 이 같은 num의 저장소를 가르키고 있으므로 어떤 num을 호출 하던지 증가된 num값이 반영된 num을 호출 및 출력 할 수 있다.
num2++ 의 경우는 인스턴스 필드 값을 증가 시키고 있다.
number1.num2와 number2.num2는 다른 필드를 가르키고 있다.(인스턴스 필드는 객체(인스턴스)가 생성될 때 마다 새로 생성되기 때문에 각각 다른 저장소를 가지고 있는 것)
그렇기 때문에 number1.num2를 증가 시킨 뒤 number2.num2값을 출력 및 호출하면 증가 되지 않은 number2.num2값이 출력 및 호출 되는 것이다.
Static 메소드 사용 예시
class Name {
static noid print() {
System.out.println("나는 클래스 메소드") ;
}
void print2() {
System.out.println("나는 인스턴스 메소드") ;
}
}
public class Static_ex {
public static void main(String[] args) {
Name.print(); // 인스턴스를 생성하지 않아도 호출 가능 (클래스 메소드 )
Name name = new Name(); // 인스턴스 생성
name.print2(); // 인스턴스를 생성해야만 호출 가능 (인스턴스 메소드 이므로)
}
}
정적 메소드는 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성된다.
그렇기에 정적 메소드는 인스턴스를 생성하지 않아도 호출을 할 수 있다.
정적 메소드는 유틸리티 함수를 만드는데 유용하게 사용된다.
** 유틸리티 함수 : 여러 계산과 처리를 대신하는 일반 함수 , 반복적으로 사용을 하므로 static 선언을 해두면 수시로 호출하여 사용 하기 용의 (인스턴스를 사용 때 마다 생성해서 사용할 필요가 없음)
static의 의미는 아는데 코딩을 할 때 그냥 습관적으로 붙여서 만드는 경우가 많다 ..
그래서 인스턴스 필드라 생각하고 처리하다가 오류를 못 찾는 경우가 꽤나 있다.
이번에 자격증 실기 시험을 봤을 때 이 내용이랑 관련된 문제가 나왔었는데
문제로 보니까 꽤나 헷갈려서 확신해서 쓰질 못했던 기억이 있어서 한번 정리해본다.
참조 ) 링크텍스트