정적 (Static) 메서드 정의
Java에서는 Static 변수와 메서드를 만들 수 있는데, 이를 정적 필드와 정적 메서드라고 부르며 이 둘을 합쳐서 정적 멤버(클래스 멤버)라고 합니다.
정적 필드와 정적 메서드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이므로 클래스 로더가 클래스를 로딩해서 메서드 메모리 영역에 적재할 때 클래스별로 관리합니다. 따라서 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있습니다.
[장점]
1. static 키워드를 붙이면 메모리 할당을 딱 한 번만 하게 되어 메모리 사용에 이점을 볼 수 있음. 그렇기에 항상 값이 변하지 않는 경우라면 static 키워드를 사용하는 것이 좋음
2. static으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유하게 된다.
정적 멤버 생성
Static 키워드를 통해 생성된 정적 멤버들은 Heap 영역이 아닌 Static 영역에 할당됩니다. Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가지지만 Garbage Collector의 관리 영역 밖에 존재하기 때문에 Static 영역에 있는 멤버들은 프로그램의 종료 시까지 메모리가 할당된 채로 존재하게 됩니다. 그렇기 때문에 Static을 남발하게 되면 시스템 성능에 악영향을 줄 수 있습니다.
Garbage Collector: 메모리 관리 기법 중 하나로 프로그램이 동적으로 할당한 메모리 영역 중 더 이상 필요하지 않은 영역을 해제하는 기능.
정적 멤버 선언
필드나 메서드를 생성 시 인스턴스로 생성할 것인지 정적으로 생성할 것인지에 대한 판단 기준은 공용 사용 유무에 따르면 됩니다. 그냥 생성한다면 자동으로 인스턴스로 생성되며 정적으로 생성하려면 필드와 메서드 선언 시 static 이라는 키워드를 추가적으로 붙이면 됩니다.
static int num = 0;
public static void static_method(){}
[정적 필드 사용 예시]
class Number {
static int num = 0;
int num2 = 0;
}
public class Static_example {
public static void main(String[] args) {
Number number1 = new Number();
Number number2 = new Number();
number1.num++;
number2.num2++;
System.out.println(number2.num); // 1
System.out.println(number2.num2); // 0
}
}
Number 라는 클래스 안에 클래스 변수 num과 인스턴스 변수 num2를 생성하였고, 두 개의 Number 인스턴스 number1 과 number2를 생성했을 때 number1에서 num1과 num를 증가시켰지만 number2에서 출력하였을 때 num1은 1, num2는 0을 출력하였습니다.
이런 현상이 발생하는 이유는 인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 가지지만 정적 변수는 모든 인스턴스가 하나의 저장 공간을 공유하기에 항상 같은 값을 가지기에 나타난 현상입니다.
class Exam {
static void print() {
System.out.println("Hello World1 !!!");
}
void print2() {
System.out.println("Hellow World2 !!!");
}
}
public class Static_example {
public static void main(String[] args) {
Exam.print(); // Hello World1 !!!
Exam exa = new Exam();
exa.print2(); // Hellow World2 !!!
}
}
정적 메서드는 클래스가 메모리에 올라갈 때 정적 메서드가 자동적으로 생성됩니다. 그렇기에 정적 메서드는 인스턴스를 생성하지 않아도 호출을 할 수 있습니다. 정적 메서드는 유틸리티 함수를 만드는데 유용하게 사용됩니다.
'개발 & 데이터베이스 > JAVA' 카테고리의 다른 글
[JAVA] 얕은 복사와 깊은 복사에 대해서 알아보기 (0) | 2022.12.26 |
---|---|
자바 String, StringBuffer, StringBuilder 차이 (0) | 2022.11.12 |
자바 파일 복사하는 4가지 방법 (0) | 2022.10.14 |
자바 이클립스 설정: 탭(Tab)을 공백(space) 4개로 변경하기 (0) | 2022.10.11 |
자바 해당 경로에 있는 모든 파일 압축하는 방법 (0) | 2022.10.11 |