이번 포스팅의 경우 static 키워드에 대해 정리하고자 합니다.
static이라는 키워드를 사용하여 Static 변수와 Static 메소드를 만들 수 있는데 다른 단어로 정적필드와 정적 메소드라고 하며 이 둘을 합쳐 정적 멤버(클래스 멤버)라고 합니다.
정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버입니다.
결제 암호화에 대한 EncodeData라는 클래스입니다.
위와 같이 클래스를 만들고 객체를 생성하면 객체마다 객체변수 encodeKey를 저장하기 위한 메모리를 별도로 할당해야 합니다.
하지만 클래스 내용을 보면 key값은 변함이 없고 어떤 객체이던지 동일한 값이어야 적절한 암호화를 진행할 수 있다고 가정하겠습니다.
이렇게 항상 값이 변하지 않는 경우라면 static 사용 시 메모리의 이점을 얻을 수 있습니다.
위와 같이 encodeKey 변수에 static키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점을 볼 수 있습니다.
만약 encodeKey 값이 변경 되지 않기를 원한다면 static 키워드 앞에 final 키워드를 붙이면 됩니다.
위 프로그램을 실행시키면 결과 값은 아래와 같이 나옵니다.
1
1
call1, call2 객체 생성시 count 값을 1씩 증가하더라도 call1과 call2의 count는 서로 다른 메모리를 가리키고 있기 때문에 원하던 결과(1, 2)가 나오지 않습니다. 객체 변수는 항상 독립적인 결과 값을 가지기 때문입니다.
위 사진처럼 실행하였더니 count값이 공유되어 아래와 같이 증가된 결과 값이 나오게 됩니다.
1
2
보통 변수의 static 키워드는 메모리 효율성을 위해 공유하기 위한 용도로 많이 사용합니다.
static 키워드가 메소드 앞에 붙으면 이 메소드는 스태틱 메소드가 됩니다.
getApiCallCount()라는 static 메소드가 추가되었으며 main 메소드에서 getApiCallCount() 메소드는 ApiCallCount.getApiCallCount() 와 같이 클래스를 통해 호출할 수 있게 됩니다.
staic 메소드 안에서는 인스턴스 변수 접근이 불가능합니다.
위 예에서는 apiCallCount는 static 변수이기 때문에 static 메소드에서 접근이 가능한 것 입니다.
보통 static 메소드는 유틸리티 성 메소드를 작성할 때 많이 사용됩니다.
예를 들어 '오늘 날짜 구하기' 등의 메소드를 작성할 때에는 클래스 메소드를 사용하는 것이 유리합니다.
싱글톤 패턴의 경우 static과도 연관이 깊기에 관련해서 아래 경로에 포스팅하였습니다.
https://velog.io/@dev_osj/Singleton