static이란
자바를 하다보면 static이라는 키워드를 심심찮게 볼 수있다. 자바에서 static이 붙은 변수나 메소드를
정적 변수(메소드), 클래스 변수(메소드), 스태틱 변수(메소드) 등 여러 이름으로 부른다.
반대로 static이 붙지 않은 변수(메소드)는 객체 변수(메소드), 인스턴스 변수(메소드)라 한다.
그렇다면 staitc이 붙은 정적 멤버(변수, 메소드)을 사용하는 이유, 특징은 무엇인가.
정적 멤버는 기본적으로 공유한다는 데에 포커스를 두고 접근하면 되겠다.
쉽게 말해 정적 멤버로 만들어지면 누구나가 사용할 수 있으며 그 상태 또한 공유 되는것이다.
예를들어 같은 반 철수와 영희가 있다. 여기서 반에 있는 칠판은 정적 변수이고, 철수와 영희가 각자 가지고 있는 공책은 객체 변수라 할 수 있다.
영희와 철수는 정적 변수인 칠판을 공유하여 사용할 수 있고, 영희가 칠판에 1이라는 숫자를 쓰면 철수 한테도 칠판에 숫자 1이 공유되어 지우거나 다른 숫자를 쓰거나 할 수 있다.
반대로 객체 변수인 공책은 철수와 영희 각자의 것으로 영희가 자신의 공책에 어떤 수를 쓰던 철수의 공책에는 아무런 변화가 생기지 않는다.
객체변수와 클래스변수의 특징
객체 변수
- static이 붙어있지 않는 변수
- 새로운 객체를 생성할 때 마다 각각의 객체가 개별적으로 가지고 있는 변수
- 객체가 생성 될 때 마다 Heap영역의 객체 내부에 변수의 메모리를 할당한다.
클래스 변수
- static이 붙은 변수
- Class의 객체가 따로 만들어 지지 않더라도 Class의 선언과 동시에 JVM의 Method영역에 메모리를 할당 받는 변수
- 같은 Class에 의해 생성된 객체들이 공용으로 사용하는 변수
- 객체를 생성하지 않아도 클래스 이름으로 바로 접근이 가능한 변수
static 사용 예제
class 교실 {
static int 칠판 = 0;
int 공책 = 0;
}
class 철수 extends 교실{
String 공책;
void 글쓰기() {
공책 = "철수가 공책에 쓴 글";
교실.칠판 += 1;
}
}
class 영희 extends 교실{
String 공책;
void 글쓰기() {
공책 = "영희가 공책에 쓴 글";
교실.칠판 += 1;
}
}
public class Class {
public static void main(String[] args) {
철수 su = new 철수(); // 철수가 탄생했다.
영희 hee = new 영희(); // 영희가 탄생했다.
su.글쓰기();
// 철수가 글을 쓴다.
// 자신의 공책에 글을 쓴다.
// 칠판위의 숫자 0에 1을 더한다.
System.out.println(su.공책);
System.out.println("칠판의 숫자 : " + 교실.칠판);
// 칠판은 정적 변수이기 때문에 별도의 객체 생성없이 사용가능하다.
// 철수가 칠판에 1을 더했기 때문에 칠판에 숫자 1이 남아있다.
hee.글쓰기();
// 영희가 글을 쓴다.
// 자신의 공책에 글을 쓴다.
// 철수와 마찬가지로 칠판에 숫자 1을 더한다.
System.out.println(hee.공책);
System.out.println("칠판의 숫자 : " + 교실.칠판);
// 영희는 칠판에 숫자 1만 더했는데 철수와 칠판이 공유되기 때문에 철수가 이전에 더했던
// 숫자 1에 더해서 최종적으로 칠판에는 숫자 2가 남아있다.
}
}
'프로그래밍 > Java' 카테고리의 다른 글
[Java]Getter와 Setter (0) | 2021.04.02 |
---|---|
[Java]상속 (0) | 2021.04.02 |
[Java]import (0) | 2021.03.30 |
[Java]패키지 (0) | 2021.03.30 |
[Java]this와 this() (0) | 2021.03.26 |