코딜기
[Java] static (static 필드, static 메서드) 본문
반응형
static이란?
- static이라는 키워드는 필드와 메서드에 붙일 수 있습니다.
- 모든 객체가 공유해도 문제가 없는 필드나 메서드에 붙입니다.
- 객체에 소속된 멤버가 아니라 static이 저장되는 공간이 따로 있다고 생각하면 이해가 쉬울 것입니다.
static 사용 (필드)
- 간단한 예제 코드로 static을 사용해 보겠습니다.
- Count라는 클래스를 하나 만들고 내부에 변수 두 개를 선언하는데, 하나에만 static을 추가하겠습니다.
public class Count {
public int a; //인스턴스 필드
public static int b; //정적 필드
}
- 이후 main 메서드에서 Count 객체를 생성한 후에 값을 변경해 보겠습니다.
Count c1 = new Count();
c1.a += 5;
c1.b += 5;
System.out.println("c1.a: " + c1.a);
System.out.println("c1.b: " + c1.b);
- 또 다른 새로운 객체를 생성한 후 값을 변경해 보겠습니다.
Count c2 = new Count();
c2.a += 7;
c2.b += 7;
System.out.println("c2.a: " + c2.a);
System.out.println("c2.b: " + c2.b);
- 더 정확한 이해를 위해 위의 과정을 한번 더 반복해 보겠습니다.
Count c3 = new Count();
c3.a += 8;
c3.b += 8;
System.out.println("c3.a: " + c3.a);
System.out.println("c3.b: " + c3.b);
- 'static'으로 선언되지 않은 인스턴스 변수 'a'는 각 객체가 생성될 때마다 객체 내에 새롭게 생성되어 해당 객체에서만 사용됩니다.
- 반면, 'static'으로 선언된 클래스 변수 'b'는 객체가 생성될 때마다 새로운 공간에 생성되는 것이 아니라, 클래스가 처음 로딩될 때 메모리의 메서드 영역에 한 번만 생성됩니다.
- 이 변수는 모든 객체가 공유하는 변수로서 동작하며, 특정 객체에 종속되지 않고 클래스 전체에서 공통으로 사용됩니다.
- 따라서, 'static' 변수는 객체 생성과는 관련이 없으므로, 객체를 통해 호출하지 않고 클래스 이름을 통해 호출하는 것이 좋습니다.
- 인스턴스 필드처럼 'static' 필드를 호출하면 코드의 가독성을 떨어뜨리고 혼란을 야기할 수 있습니다.
public class Main {
public static void main(String[] args) {
Count c1 = new Count();
c1.a += 5; // -> a는 static 변수가 아니므로 객체를 통해서 접근
Count.b += 5; // -> b는 static 변수이기 때문에 클래스 이름을 통해서 접근
}
}
static 사용 (메서드)
- 인스턴스 메서드 내부에서는 정적(static) 변수와 인스턴스 변수를 모두 사용할 수 있습니다.
- 반면, static 블록(정적 메서드나 정적 초기화자) 내부에서는 static 변수나 static 메서드만 사용할 수 있습니다.
- 따라서 static 블록 내부에서는 'this' 키워드를 사용할 수 없습니다.
- static 블록에서 non-static 멤버를 사용하려면, 반드시 객체를 생성한 후 그 객체를 통해 접근해야 합니다.
public class Count {
public int a; // 인스턴스 필드
public static int b; // static 필드
// 일반 메서드
public int method1() {
return this.a + Count.b;
}
// static 메서드
public static int method2() {
//this.a = 10; (x)
Count ccc = new Count();
return ccc.a + Count.b;
}
}
반응형
'Language > Java' 카테고리의 다른 글
[Java] 상수 (Constant) (0) | 2024.08.29 |
---|---|
[Java] final (final 필드, final 메서드) (0) | 2024.08.27 |
[Java] 캡슐화 (Encapsulation) (0) | 2024.08.27 |
[Java] 정보은닉(Infomation Hiding) (1) | 2024.08.26 |
[Java] 생성자(Constructor) (0) | 2024.08.26 |
Comments