정적(static)이란?
- 정적 멤버 (클래스 멤버)
- 정적 필드(Static 변수)
- 정적 메소드(Static 메소드)
- 정적 멤버는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이기에 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스 별로 관리된다.
- 정적 멤버는 인스턴스(객체)의 생성 없이 호출할 수 있다.
- 자바 프로그램을 실행시 정적 멤버를 찾아서 먼저 메모리에 할당시킨다.
정적 멤버 생성
- 정적 멤버들은 Heap영역이 아닌 static영역에 할당된다.
- static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있다.
- Garbage Collector가 관여하지 않기에 프로그램 종료시까지 메모리가 할당된 채로 존재하기에 시스템 성능에 악영향을 줄 수 있다.
정적 필드 사용 예시
class Number{
static int num1 = 0;
int num2 = 0;
}
public class Static_ex{
public static void main(String[] args){
Number number1 = new Number();
Number number2 = new Number();
}
number1.num1++;
number1.num2++;
System.out.print(number2.num1);
System.out.print(number2.num2);
- Number라는 클래스 안에 클래스 변수 num과 인스턴스 num2를 생성하였다.
- 두개의 Number 인스턴스 number1과 number2를 생성하였다.
- number1에서 num1과 num2를 각각 씩 증가시켰다.
- number2에서 num1과 num2를 각각 출력하였다.
- 출력시켰을 때, num1은 1, num2는 0을 출력한다.
- num1(정적변수)는 모든 인스턴스가 하나의 저장공간을 공유하기에 항상 같은 값을 가진다.
- num2(인스턴스 변수)는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 가진다.
정적 메소드 사용 예시
class Name{
static void print1(){
System.out.println("내 이름은 강서월 입니다.");
}
void print2(){
System.out.println("내 이름은 강은서 입니다.");
}
}
public class Static_ex{
public static void main(String[] args){
Name.print1();
Name name = new Name();
name.print2();
}
}
- 정적 메소드는 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성되어 인스턴스를 생성하지 않아도 호출이 가능하다.
- 인스턴스 메소드는 인스턴스를 생성해야만 호출이 가능하다.