공용기능인 static 키워드
static
은 ‘정적인’, ‘고정된’ 이라는 뜻을 가지고 있다.
static이 붙은 변수나 메서드는 클래스와 함께 자동으로 메모리의 static 영역에 생성된다.
자동으로 메모리에 올라가기 때문에 객체 생성 없이 사용이 가능하다.
‘고정된’이라는 단어 의미처럼 static 키워드가 변수나 메서드 앞에 붙으면 클래스가 관리하기 때문에 클래스에 고정되어 사용된다고 생각하면 된다. 또한 ‘정적인’이유는 실행 시점에 만들어지고, 종료되면 제거되기 때문이다.
클래스가 관리한다고?
일단, 자바의 메모리구조에 대해 알아야 이해를 할 수 있다.
자바프로그램이 실행되면 JVM은 시스템으로부터 필요한 메모리를 할당받은 후,
메서드영역, 스택영역, 힙영역
으로 나눠 관리한다.
- 메서드 영역
- 프로그램 실행 코드, static 변수 및 메서드, 런타임 상수 풀
- 프로그램 전체에서 공용으로 사용
- 스택 영역
- 메서드 호출하면 지역변수, 매개변수가 프레임 형태로 생성되어 쌓이고, 종료되면 제거
- 힙 영역
new
를 통해, 객체(인스턴스), 배열이 동적으로 생성됨- 참조가 없어지면 가비지 컬렉션(GC)이 메모리에서 제거
스택 자료구조 : LIFO (후입선출), 나중에 들어온게 가장 먼저 나온다.
큐 자료구조 : FIFO (선입선출), 가장 먼저 넣은게 가장 먼저 나온다.
static이 붙은 변수, 메서드는 메모리의 static 영역에 생성된다
[staic 변수]
멤버변수 앞에 static을 붙이면 static 변수
, 정적 변수
, 클래스 변수
라고도 한다.
1
2
3
4
5
6
7
8
9
10
public class Cart {
public static String store = "푸린이네 상점";
private final String product;
public static int price;
public Cart(String product, int price) {
this.product = product;
Cart.price += price;
}
}
1
2
3
4
5
6
7
8
9
public class CartMain {
public static void main(String[] args) {
System.out.println(Cart.store + "에 오신걸 환영해요");
Cart cart1 = new Cart("pen", 2000);
Cart cart2 = new Cart("watch", 10000);
System.out.println(Cart.price);
}
}
실행결과
1
2
푸린이네 상점에 오신걸 환영해요
12000
static 키워드를 변수앞에 붙이게 되면 공용으로 사용하는 변수가 된다.
이때, new Cart() 객체 생성 없이 바로 Cart 클래스명을 적고, 변수 값을 가져올 수 있다.
System.out.println(Cart.store + "에 오신걸 환영해요");
System.out.println(Cart.price);
또한 price
변수는 공용변수이기에 price 값이 누적이 되는것이다.
(static이 붙지 않았다면 객체 생성할때 지정한 price 값이 각각 저장된다)
static 변수 특징
- 참조값이 필요한 인스턴스 변수와는 다르게 static 변수는 참조값이 필요없다.
- 객체 생성 없이 Class명을 통해 바로 변수에 접근가능하다.
- 따라서 클래스 변수라고도 부른다.
- 클래스 변수는 자바프로그램을 실행할때, 딱 1개가 생성된다.
- 하나만 생성되기에 공유하는 목적으로 static 변수가 사용이 된다.
[staic 메서드]
클래스에 있는 메서드에 static을 붙이면 static 메서드
, 정적 메서드
, 클래스 메서드
라고도 한다.
1
2
3
4
5
public class StaticEx {
public static void print() {
System.out.println("안녕하세요");
}
}
1
2
3
4
5
public class StaticMain {
public static void main(String[] args) {
StaticEx.print();
}
}
간단하게 static 메서드인 print()
를 작성해보았습니다.
정적 메서드도 마찬가지로 객체 생성 없이 클래스명으로 바로 호출할 수 있다.
Q. 객체 생성 없이 사용하려면 static을 붙이면 되나요?
A) 네. 객체생성을 하지않아도 단순히 기능만 제공하는것이라면 static 메서드를 사용하면 됩니다.
static 메서드 특징
- 객체 생성 없이 Class명을 통해 바로 정적 메서드에 접근가능하다.
- 따라서 클래스 메서드라고도 부른다.
- static 메서드는 누구나 호출가능하다.
- 접근제어자가 제한되어있다면 호출이 불가능하다.
- static 메서드는 static이 붙은 메서드나 static 변수에서만 사용가능하다.
- static이 붙지 않은 변수나 메서드는 사용 불가하다.
- 유틸리티성으로 작성할때 많이 사용된다.
아래 코드 예제를 보면
static 메서드에서 static이 붙지않은 멤버변수에 접근하려했더니, 컴파일 에러가 발생한다.
java: non-static variable age cannot be referenced from a static context
static 변수가 아니라고 컴파일 에러가 발생한다.
1
2
3
4
5
6
7
8
9
10
public class StaticEx {
public static String person;
private int age;
public static void print() {
System.out.println("안녕하세요" + person + "님");
//age = 12;
//java: non-static variable age cannot be referenced from a static context
}
}
1
2
3
4
5
6
public class StaticMain {
public static void main(String[] args) {
StaticEx.person = "푸린";
StaticEx.print();
}
}