개발/JAVA

[JAVA] 자바 static의 사용

윤_ve 2021. 2. 20. 23:31

현재 국비 학원에서 자바과정을 들으면서 어제 static의 사용법에 관해 배웠다.

 

내가 수업에서 이해한 바로 설명하자면, static의 영어단어의 뜻은 정적인, 고정적인 이란 뜻인데 객체(인스턴스)의 멤버가 아니라 클래스에 고정되어 있는 멤버이기 때문에 객체의 생성 없이 바로 사용할 수 있는 아주 편리한 녀석이였다.

static 메서드나 static 변수를 사용하면 객체를 만들지 않고도 바로 사용할 수 있다는 것이다.

 

말로 하면 어려울 수 있으니 간단하게 만들어 보았다.

 

1. 객체 생성

위 사진처럼 객체를 이용해서 1234를 출력해보았다.

 

다음은 static의 사용이다.

 

2. static을 사용

이렇게 객체의 생성 없이 호출할 수 있다.

 

JVM에는 ClassLoader이라는 것이 있는데 이 녀석이 .class 파일을 둘러보다가 static이 붙은놈을 발견하면 객체생성이 없어도 메모리를 할당해야하는 멤버라고 보고 바로 Method Area(= Static Area)에 메모리를 할당해버린다. Static Area에 할당되어 있는 모든 메모리들은 모든 객체들이 공유하기 때문에 그 멤버를 어디든지 참조 할 수 있다.

 

구글링을 통해 알아본 단점도 존재한다.

 

단점을 말하기 앞서 우선 가비지 컬렉션에 대해 알아야 한다.

 

간단하게 설명 하자면 Garbage Collection이란 개념이 있는데프로그래머는 heap 메모리(보통 객체가 생성되면 heap에 메모리를 할당한다.)를 사용할 수 있는 만큼 자유롭게 사용하고, 더 이상 사용되지 않는 오브젝트들은 가비지 컬렉션을 담당하는 프로세스가 자동으로 메모리에서 제거하도록 하는 것이 가비지 컬렉션의 기본 개념이다.

 

위에 말했지만 static은 클래스에 포함되므로 Method Area에 메모리가 할당 되기 때문에 위에 설명한 가비지 컬렉션의 영향권 밖에 놓이게 된다. 이렇게 되면 이미 사용되어 더이상 사용되지 않더라도 프로그램 종료까지 메모리가 할당된 채로 존재하게 된다. 쉽게 말하면 남발할 경우 시스템의 성능에 좋지 않다는 말이다.

 

static을 배우면서 두가지 생각이 들었다.

 

첫번째, 엄청 많이, 예를들어 하나의 함수(변수, 메서드 등)을 수천, 수만번(실무를 해본적이 없어 기준을 잘모르겠다.)의 반복이 필요한 프로그램을 만들어야 한다면 매번 인스턴스를 생성할 필요 없이 static처리를 해서 불필요한 코드라인 수를 줄일수 있겠다 였다. 구글링의 결과 멤버 변수, 메서드로 사용이될 때 인스턴스 변수로 (즉, 재초기화가 이뤄지지 않아도 되는 변수나 메서드)필요로 하지 않는 경우에는 static을 사용하면 호출시간이 짧아져 효율적이게 된다는 것이다. 하지만 이말은 곧 재사용성이 떨어진다는 의미도 될수 있겠다.

 

두번째, 객체를 만들지않고 사용하는 것인데 이는 객체지향 언어의 대표인 java에 맞지않는 것이 아닌가라는 생각이 들었다. 이런 의문이 들었을때는 역시 구글링이고 구글링에서 알아본 바로는 static을 실제로 지양해야 한다고 여러 블로그에 설명이 되어있었다. (오랜만에 내 생각이 맞는 말이여서 기분이 좋았었다 당시에는 ㅋㅋ)

 

static은 객체 지향의 페러다임과 상반된다. 객체 지향에서는 객체의 데이터들은 캡슐화가 되있어야 하고 쉽게 접근할 수 없어야 한다. 하지만 static을 선언할 경우 어디서든 가져다 쓸 수 있기 때문에 이는 객체지향의 패러다임과 상반되다고 하는 것이다. 이게 나쁘다는 의미는 아니고 static을 용도에 맞게 잘 사용해야 하고 객체지향적으로 좋은 코드를 짜기를 원하면 남발하면 안된다는 말이다.

 

이렇게 알아봤는데 static이 악이라고 규정하는 개발자들도 있고 또 그렇게 까지 생각하지 않는 개발자들도 있었다. 굳이  어디 편을 들기 보다는 static의 사용에 대해 조금더 신중할 필요는 있다고 생각한다. 이걸 알아보면서 여러가지 기본개념들에 대해서도 알게 되었다. 더욱 많은 공부를 해야겠다는 생각이 들었다.