public class First{
int count=1; // 인스턴스 변수
public void getReturn(){
System.out.println("Hello"); // 인스턴스 메소드
}
}
위와 같은 코드에서 각각의 변수와 메소드를 우리는 인스턴스 필드라고 부릅니다. 다른 클래스에서 First 클래스의 인스턴스 필드를 사용하기 위해서는 반드시 객체를 생성하여 참조해야만 하기 때문에 보통 인스턴스라는 단어를 붙여 사용합니다.
그렇다면 자바에서 다음과 같이 static이 붙은 변수와 메소드는 어떻게 부를까요?
public class First{
static int count=1; // 정적 변수
public static void getReturn(){
System.out.println("Hello"); // 정적 메소드
}
}
변수와 메소드 앞에 static이 붙은 것 만으로 이름이 정적 필드로 변환되었습니다. 여기서 static은 정적, 다른 말로 '고정된' 이라는 의미를 갖습니다. 정적 필드를 클래스 필드라고도 하는데, 반드시 객체를 생성하여 사용하였던 인스턴스 필드와는 반대로 객체 생성 없이 사용할 수 있는 필드이기 때문에 이러한 이름이 붙었습니다.
정적 필드의 가장 큰 특징 2가지는 다음과 같습니다.
- 객체 생성 없이 사용할 수 있다.
- 객체들이 정적 필드를 공유한다.
먼저 첫번째로 정적 필드는 객체 생성 없이 사용할 수 있습니다.
public class First{
static int count=1; // 정적 변수
int number=2; //인스턴스 변수
public static void getReturn(){
System.out.println("Hello"); // 정적 메소드
}
}
public class Second{
public static void main(String[] args) {
System.out.println(First.count); // 1
System.out.println(First.number); //에러 발생
First.getReturn(); // Hello
}
}
정적 필드들이 별도의 객체 설정없이 '클래스.정적 필드' 의 형식으로 유연하게 활용 가능한 것에 비해 인스턴스 변수는 에러가 발생합니다. 따라서 다음과 같이 별도로 객체를 생성하는 코드를 활용해야만 에러 없이 사용할 수 있습니다.
First first = new First();
System.out.println(first.number); //2
정적 필드의 두 번째 특징은 객체들이 정적 필드들을 공유한다는 점입니다.
public class First{
static int count = 0; // 정적 변수
int number = 0; // 인스턴스 변수
}
public class Second{
public static void main(String[] args) {
First first1 = new First();
First first2 = new First();
first1.count++;
first1.number++;
System.out.println(first2.count); // 1
System.out.println(first2.number); // 0
}
}
먼저 첫 번째 객체인 first1이 count 변수와 number 변수를 각각 1씩 늘려주었습니다. 그 이후 두 번째 객체인 first2 객체가 가지고 있는 변수들의 값을 출력하였는데 count는 1이 number은 0인 결과를 확인할 수 있었습니다. 왜 이러한 차이가 있는 걸까요?
일반적으로 우리가 static을 통해 만든 필드들은 Static 영역에 존재합니다. Static 영역이 일반적인 Heap 영역과 다른점은 Garbage Collector의 관여를 받지 않는다는 점이죠 때문에 계속해서 지워지는 Heap에 비해 Static은 지워지지 않고 값이 남이 있을 수 있는 것입니다.
위 코드에서 객체를 100개 생성하든 1000개 생성하든 static으로 설정되어 있는 count 변수의 값은 모든 객체들이 공유할 것입니다.
public class Third{
public static final String count = 1;
}
*추가로 클래스 내 필드에 static을 사용할 때는 'final' 키워드를 많이 사용하곤 합니다. 이 부분에 대해서는 차후 작성하도록 하겠습니다.
'지식창고' 카테고리의 다른 글
Git의 Repository를 Fork해서 사용하는 방법에 대해 알아보자 (0) | 2022.06.26 |
---|---|
[인텔리제이 에러] Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test (0) | 2022.06.22 |
API란 무엇일까? (0) | 2022.06.09 |
SSR과 CSR의 차이 (0) | 2022.06.08 |
금고를 털어라 알고리즘 문제 방식 (0) | 2022.06.03 |