모든 객체가 함께 사용하는 변수나 메서드를 만들때 사용
객체를 만들지 않아도 클래스 이름만으로 바로 사용가능
모든 객체가 같은 값을 공유
static 변수와 메서드는 한 번만 생성되고 Method Area(메서드영역) 에 저장
class Person {
// static 변수
static int population = 0;
// static 메서드
static void printPopulation() {
System.out.println("현재 인구 수: " + population);
}
}
stem.out.println("static 변수: " + Person.population);
System.out.println("static 메서드: " + Person.printPopulation);
객체생성 없이 사용가능

static 키워드는 변수, 메서드에 붙여서 사용
static 키워드로 선언된 변수와 메서드는 MethodArea에 저장
각 객체(인스턴스)는 클래스영역에 저장된 데이터를 활용할 수 있음
객체를 만들때마다 생성되는 변수와 메서드
객체를 생성한 후에만 사용가능하고 각 객체가 개별값 가짐
인스턴스 변수와 메서드는 heap영역에 위치
class Person {
String name;
void printName() { // 인스턴스 메서드
System.out.println("나의 이름은 " + this.name + "입니다.");
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "gygim";
p1.printName(); // p1 객체의 메서드 실행
Person p2 = new Person();
p2.name = "Steve";
p2.printName(); // p2 객체의 메서드 실행
}
}

앞에 static이 붙고 객체를 생성하지 않고도 바로 활용 가능
하나의 공간을 같이 쓰기 때문에 하나에서 증가하면 값이 증가
class Person {
static int population = 0; // 클래스 변수
}
public class Main {
public static void main(String[] args) {
// 객체 생성 전에도 클래스 레벨에서 직접 접근가능
System.out.println("현재 인구 수: " + Person.population);
Person p1 = new Person();
Person p2 = new Person();
// 모든 객체가 하나의 값을 공유
System.out.println("현재 인구 수: " + Person.population);
}
}

클래스 변수를 활용할 때 주의사항
static 변수와 메모리는 프로그램이 종료될 때까지 유지됨
그러므로 공유가 필요한 곳에서만 활용해야함
예시)

final Circle c1 = new Circle(2);
이처럼 참조변경은 불가하지만 내부값은 변경 가능한 경우를 위해
안에있는 속성들도 final 할당 해줘야함
불변객체의 값 변경이 필요한 경우

public class Bird extends Animal implements Fly
요런식
public static final이 자동으로 할당되기 때문에
객체생성없이 다른 곳에서 사용 가능