본문 바로가기

Java/이론

[Java] Static / Final

static 멤버 변수는 

주로 객체들의 공통속성을 담아낼 때 사용합니다.

이는 객체가 없어도 쓸수 있는 정보로

클래스명.xxx로 사용가능합니다.

객체를 여러개 찍어내도 static멤버변수는 

하나만 사용하면 됩니다.

따라서 메모리를 절약할 수 있게 됩니다.

static영역의 데이터는 프로그램의 시작부터

종료가 될 때까지 메모리에 남아있게 됩니다.

그렇기 때문에 무분별하게 static을 많이 사용하다보면

메모리가 역으로 부족해질 수 있습니다.

 

예제를 통해 알아보겠습니다.

public class Snack {

String name;

double weight;

int price;

public void printSnack() {

System.out.println("이름 : " + name);

System.out.println("중량 : " + weight);

System.out.println("가격 : " + price);

}

}

과자의 정보를 담고 있는 클래스가 있을 때

과자의 제조자를 고정하고 싶다면 

다음 코드를 추가하여 고정된 멤버변수를 선언할 수 있습니다.

 

static String manufacturer = "puft";

 

현재 main에는 과자 객체가 없다고 가정할 때

static멤버 변수에 접근할 수 있습니다.

 

public class SMain1 {

public static void main(String[] args) {

System.out.println(Snack.manufacturer);

}

}

 

이렇게 객체들에게 전체적으로 통용되는

static 멤버 변수를 클래스명.멤버변수명으로

사용할 수 있습니다.

 

System.out.println(Snack.manufacturer);

System.out.println("==================");

Snack s= new Snack();

Snack s2= new Snack();

s.printSnack();

System.out.println();

s2.manufacturer = "최비버";

s2.printSnack();

 

이런식으로 다른 객체를 만들어서

static 멤버 변수를 각각 출력해보겠습니다.

여기서 s2의 제조자는 "최비버"로 바꾸고

바뀌는지 확인해보겠습니다.

 

 

제조자의 값이 바뀌어 버리네요.

멤버 변수가 바뀌지 않게 하려면

static final String Manufacturer = "puft";

final 키워드를 추가해주면 됩니다.

final은 상수화를 시켜서 바뀌지 않게 하는 기능인데

이때 변수는 대문자로 바꿔줘야합니다.

상수는 대문자로 쓰이기 때문입니다.

다시 실행해보면

 

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

The final field Snack.Manufacturer cannot be assigned

at SMain1.main(SMain1.java:11)

 

이런 에러가 뜨네요.

final변수를 다른 값으로 변경해서 사용했기 때문입니다.

static으로 메소드를 만들어도

객체가 없어도 사용이 가능합니다.

또한 알아두어야 할 점이 static이 아닌 멤버 변수는

static 메소드에 접근이 불가능합니다.

 

public static void printTaste() {

System.out.println(Manufacturer);

System.out.println(this.name);

}

 

예를들어 이런 static method의경우에는 this.name이

static이 아닌 멤버 변수라서 에러가 나게 됩니다.

static으로 선언된 변수나 메소드는 static영역에 저장되는데

다른 멤버 변수들은 stack이나 Heap영역에 저장되기 때문에

접근하는 것이 불가능합니다.

단 static내에서 객체를 선언하게 되면 Heap에 저장되게 됩니다.

 

이번 시간에는 static이라는 기능을 배워봤는데요.

객체를 생성하지 않고 멤버 변수나 메소드에 접근할 수 있어서

메모리를 줄일 수 있다는 장점이 있지만

무분별하게 많이 사용하게 되면

static영역에 메모리가 많이 쌓이게 되기 때문에

메모리가 늘어나게 된다는 것을 배웠습니다.

바뀌지 않는 멤버 변수는 static final을 사용해서

객체를 생성하지 않고도 상수화해서 사용하면

좋을 것 같습니다.

 

'Java > 이론' 카테고리의 다른 글

[Java] A has B  (0) 2024.12.12
[Java] 생성자  (0) 2024.12.11
[Java] JavaDoc  (1) 2024.12.11
[Java] Jar 파일  (0) 2024.12.11
[Java] Garbage Collection  (2) 2024.12.06