Java

Java* 사용 제한자 static

해보구 2024. 4. 22. 16:46

Static이 무엇인가?

정적(static)은 ‘고정된’ 이란 의미를 가지고 있습니다.

static이라는 키워드는 필드와 메서드에 붙일 수 있는데,

다른 말로 정적 필드와 정적 메서드 라고도 하며 이 둘을 합쳐 정적 멤버라고 합니다.

(클래스 멤버라고도 한다.)

 

tips

static 그니까 똑같은 값인데 궂이 여러개 만들 일 없는거
// 정적 메서드(static) : 모든 객체가 공유하며 객체 생성없이 접근 가능
// static 은 this 가 있을 수 없음.
// static 데이터는 객체 생성 없이 접근 가능, new 안해도 사용가능

 

 

 

static 필드

public class MyClass {
		public int a; //인스턴스 필드
    public static int b; //정적 필드
}

클래스에 일반 필드 하나와 static필드를 하나씩 작성해 보았다.

main 메서드에서 MyClass 객체를 생성한 후에 값을 변경해 본다.

 

 

 

Count c1 = new Count();

c1.a += 5;
c1.b += 5;

System.out.println("인스턴스 변수 c1.a: " + c1.a); //5
System.out.println("정적 변수 c1.b: " + c1.b); //5

아직까지 큰 차이는 없다. 하나 더 생성해 본다.

 

 

 

Count c2 = new Count();
		
c2.a += 7;
c2.b += 7;

System.out.println("인스턴스 변수 c2.a: " + c2.a); //7
System.out.println("정적 변수 c2.b: " + c2.b); //12

변화가 생겼다. 인스턴스 변수인 a는 7인 반면 static변수 b는 7이 아닌 12를 가지고 있다.

한 개만 더 해보자

 

 

 

 

Count c3 = new Count();
		
c3.a += 8;
c3.b += 8;

System.out.println("인스턴스 변수 c3.a: " + c3.a); //8
System.out.println("정적 변수 c3.b: " + c3.b); //20

System.out.println("정적 변수 c1.b: " + c1.b); //20
System.out.println("정적 변수 c1.b: " + c2.b); //20

 

 

객체의 필드는 각 객체마다 고유하게 가지고 있는 값이다.

그렇기 때문에 객체를 생성할 때마다 그 객체들 내에 a라는 필드가 각각 존재하는

것이기 때문에 값이 다 다른 것을 확인할 수 있다.

하지만 static이 붙은 정적 변수는 값이 계속 누적되는 것을 확인할 수 있다.

왜냐하면, static이 붙은 변수는 객체마다 생성되는 것이 아닌, 따로 생성되어서

모든 객체가 공유하는 전역 변수로서 동작하기 때문이다.