클래스의 인스턴스가 아닌 클래스에 속하며 클래스의 변수, 메서드 등을 공유하는데 사용됨. 이를 통해 해당 클래스로 만들어지는 객체 사이에서 중복되는 메서드, 속성을 효율적으로 정의할 때 쓰이며 단순히 전역변수가 아니라 클래스 내의 static키워드로 선언하여 이 클래스의 객체들끼리 사용되는 메서드 또는 속성이라는 것을 나타내주는 명시성이라는 장점이 생기므로 쓰임.
public class Person {
// 멤버변수(속성)
String name;
int IQ;
int str;
private static final String GUDOC = "큰돌의 터전";
// constructor
public Person(String name, int IQ, int str){
this.name = name;
this.IQ = IQ;
this.str = str;
}
public Person(){
this.name = "alanwalker";
this.IQ = 100; this.str = 100;
}
// 메서드
public void levelup(){
this.IQ = this.IQ + 1;
this.str = this.str + 1;
System.out.println(this.name + "의 지능과 힘이 증가했습니다! " + this.IQ + " / " + this.str); }
// public void talk(Person a, Person b){
// System.out.println(a.name + " & " + b.name + "이 대화를 시작했다!");
// }
private static void talk(Person a, Person b){
System.out.println(a.name + " & " + b.name + "이 대화를 시작했다!");
}
public static void main(String[] args) {
Person a = new Person(); // 객체 >> 인스턴스
a.levelup();
Person b; // 객체
b = new Person("큰돌", 1000, 1); // 인스턴스
b.levelup();
Person.talk(a, b);
System.out.println(Person.GUDOC);
}
}
static의 단점
static으로 선언된 변수, 블록, 메서드 등은 선언과 동시에 미리 heap 영역이 아닌 method area 메모리 영역에 할당이 되며 프로그램이 종료될 때 까지 GC에 의해 메모리가 회수되지 않기 때문에 만약 클래스가 객체로 쓰이지 않는다면 메모리 낭비를 불러올 수 있음.
출처 인프런 CS 지식의 정석