Java를 처음 배우게 되는 것 중에 하나는 static
이라는 키워드일것입니다. 또한 Java에 Main 클래스에서 항상 존재하는 static
키워드는 누구나 익숙하실 겁니다. 하지만 생각보다 static
키워드에 대해서 어쩔때 쓴다 정도는 모두 알고 계시지만 깊이있는 특성을 모르시는 분들이 많습니다. 저 또한 무분별하게 사용했었던 적이 있습니다. static
키워드의 특성을 자세히 알게 되면 조금 더 활용성 높게 사용하실 수 있습니다. 심지어 취업 면접을 보면서 static
키워드에 대해서 심도 있게 아는지에 대한 면접질문을 많이 받았을 정도로 중요한 부분이라 생각합니다. 지금부터 자세히 알아보도록 하겠습니다.
static에 대해서
처음 Java를 배우시는 분들이 익숙하면서 어쩔때 사용하는지 모르는 키워드는 static
키워드라 생각합니다. 왜냐하면 Java 프로젝트를 처음 만들고 마주하는 것은 다음과 같은 화면이기 때문이죠.
public static void main(String[] args) {
System.out.println("Hello World!");
}
저 또한 대학교시절 Java를 처음 배우면서 main
함수에 코딩을 하면서 연습을 했었습니다. 그러다가 자바 메소드에 대해서 알게 되면서 만들어서 사용하려고 하면 빨간줄이 찍 그어지면서 메소드를 호출할 수 없게 되고, 이를 해결하려고 방금 만든 함수에 static
키워드를 붙임으로써 사용이 되는구나하면서 넘어갔던 적이 있습니다. 하지만 이와 같이 작동이 되어야 하는 이유는 생각보다 간단한 이유입니다.
static
키워드를 붙인 멤버변수나 메소드와 안 붙인 멤버변수나 메소드와의 차이점은 메모리에 적재되는 시기에서부터 시작됩니다. 기본적으로 Java는 객체지향언어로 클래스를 작성하고 해당 클래스를 인스턴스화(객체화)해서 사용하는 형태로 이루어집니다. 여러분들께서 클래스를 작성하고 사용하기 위해서는 new MyClass()
와 같은 형태로 인스턴스를 생성하고 사용을 하시는 이유가 해당 클래스로 인스턴스를 생성하고 생성된 인스턴스로 사용하시기 때문입니다. 그렇기 때문에 인스턴스를 생성하지 않고는 사용하실 경우 에러를 뿜뿜하신다는 것은 모두 알고 계실 것입니다. 이말은 즉, 인스턴스 생성을 할 때 해당 객체가 메모리가 적재 된다는 것을 아실 수 있으십니다.
그렇타면, Java를 배우면서 한번쯤은 모두 써보셨을 만한 Math 클래스는 어떤가요? 실습예제대로 따라하시다보니 잘 모르실 수도 있으시지만 Math 클래스 같은 경우에는 new Math()
와 같은 인스턴스 생성을 하지 않고 바로 Math.abs()
와 같은 형태로 바로 사용하셨을 겁니다. 그렇타면 Math 클래스는 어떻게 사용이 가능한걸까요?
static의 메모리 적재 시기
일단 결론부터 말씀드리면 Math 클래스는 모두 static
키워드로 이루어져 있기 때문에 가능합니다. 맞습니다. static
키워드를 붙인 멤버변수나 메소드는 인스턴스를 생성하지도 않아도, JVM이 클래스를 읽어들일 때 이미 자동적으로 메모리에 적재가 일어납니다. 그렇기 때문에 static
키워드를 붙인 멤버변수나 메소드는 인스턴스 생성을 하지 않고도 사용이 가능한 것입니다. 그렇타면 main(String[] args)
메소드가 static
이 붙는 이유가 이해가 되시나요? 맞습니다, main(String[] args)
는 자바 어플리케이션이 실행될 때 처음으로 실행되는 메소드이기 때문에 메모리에 적재가 되어있어야 실행이 가능하기 때문입니다. 이제 static
을 붙였을 때의 기본적인 원리를 알게되었습니다. 인제 이러한 원리로 인해 어떤 특성을 갖게 되는지 알아 볼까요?
static의 특성 및 사용
클래스의 인스턴스 간 공유변수
클래스를 작성하고 여러 인스턴스를 만들어 사용할 때 모두 똑같은 값을 유지해야하는 경우가 있습니다. 이럴 때 해당 멤버 변수를 static
으로 선언하시면 됩니다. 해당 클래스에서 static
키워드가 붙은 해당 멤버 변수는 인스턴스가 생성되기 전에 메모리를 할당 받기 때문에 모든 인스턴스가 똑같은 멤버변수를 바라보게 됩니다.
static 키워드가 붙은 메소드는 static이 것만 사용 가능하다!
그렇습니다. 결론부터 말하면은 static
이 붙은 메소드는 static
이 붙은 멤버변수나 메소드만 사용이 가능합니다. 왜그럴까요? 생각보다 간단한 원리입니다. static
키워드가 붙은 메소드는 인스턴스가 생성되기도 전에 메모리에 적재돼고 사용이 가능해야 합니다. 하지만 해당 메소드 내부에서 static
이 붙지 않은 메소드나 멤버변수를 사용하게 되면? 당연히 에러가 찍 나올 겁니다. 왜냐하면 메모리에 적재되지도 않은 멤버변수나 메소드를 호출하려고 했기 때문입니다. 그렇기 때문에 static
키워드가 붙은 메소드는 사용하는 것들도 static
이 붙어야합니다.
필자의 주관적인 사용 방법
static
키워드에 대해서 알아 보았습니다. 그렇타면 언제 사용하는 것이 좋을까요? 우선 위에서 말씀 드렸듯이 인스턴스간에 공유하는 값이나 공통된 값을 유지해야하는 경우에는 static
사용을 고려하면 되겠습니다.
또한, 작성한 메소드가 멤버변수를 사용하지 않고 파라미터만 사용(메소드 내 변수만)하는 경우 메소드에 static
키워드를 고려해보는 것이 좋지 않을까 싶습니다. static
키워드를 붙인 메소드는 호출시간이 안 붙인 메소드에 비해 짧기 때문입니다. 기본적으로 static
키워드를 안 붙인 메소드는 해당 인스턴스의 메소드를 찾는 과정이 일어나기 때문에 비교적 오래 걸리기 때문입니다.
나아가 위와 같은 이유로 유틸리티성이 강한 클래스에 static
을 붙이는 것을 고려해보는 것이 좋습니다. 유틸리티성이 강한 클래스는 인스턴스를 하지 않고도 여러 곳에서 호출이 일어나기 때문에 조금더 호출시간을 줄이고 빠르게 사용하기 위함입니다.
static
키워드에 대해서 깊이있게 아는 것이 중요하다 생각합니다. 조금이나마 알기 쉽게 또 도움이 될 수 있는 포스트였으면 좋겠습니다. 추가적으로 깊이 있는 내용이 필요하다면 댓글을 달아주시면 저 또한 많은 도움이 돼지 않을까 싶습니다.