정적(Static) 이란?
정적(static)은 고정된이란 의미를 가지고 있습니다. Static이라는 키워드를 사용하여 Static변수(정적 필드)와 Static메소드(정적 메소드)를 만들 수 있습니다.( 이 둘을 합쳐 정적 멤버 또는 클래스 멤버라고 합니다.) 정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버입니다.
정적 멤버 생성
Static 키워드를 통해 생성된 정적멤버들은 메모리 구조상에서 Data영역에 저장되며 이는 메모리상에 한번 할당되면 프로그램이 종료될때 해제된다는 것을 의미한다. Class가 여러번 생성되어도 클래스 내부 Static변수는 딱 한번만 생성된다.
- 주로 클래스들이 할당
- Garbage Collector가 관여하지 않음
- 모든 객체가 메모리를 공유
모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가지지만 Garbage Collector의 관리 영역 밖에 존재하기에 Static 영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 됩니다. 그렇기에 Static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 악영향을 줄 수 있습니다.
정적 멤버 선언
static int num = 0;
public static void static_method(){}
정적 필드 사용 예시
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증가시킴
number1.num2++; //인스턴스 필드 num을 1증가시킴
System.out.println(number2.num); //두번째 number의 클래스 필드 출력 -> 1출력
System.out.println(number2.num2); //두번째 number의 인스턴스 필드 출력 -> 0출력
}
}
인스턴스 변수(num2)는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 가지지만 정적 변수(num)는 모든 인스턴스가 하나의 저장공간을 공유하기에 항상 같은 값을 가집니다.
class Name{
static void 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(); //인스턴스를 생성하여야만 호출이 가능
}
}
또한 정적 메소드는 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성됩니다. 그렇기에 정적 메소드는 인스턴스를 생성하지 않아도 호출을 할 수 있습니다. 정적 메소드는 유틸리티 함수를 만드는데 유용하게 사용됩니다.
'Backend > Java' 카테고리의 다른 글
[JAVA] UUID란? 사용이유, 사용법 (0) | 2024.02.22 |
---|---|
직렬화와 역직렬화 (0) | 2024.01.26 |
equals()와 hashCode() (0) | 2023.04.08 |
[StringUtills] String의 null / 빈 값 / 공백 처리하기 (0) | 2023.02.27 |
[Jackson] Json 날짜 타입 매핑하기 (0) | 2022.02.10 |