[Java] static에 관한 생각

java에서 static키워드를 사용하면 객체를 생성하지 않고 클래스의 필드와 메서드를 바로 사용할 수 있다.

그래서 객체에 할당될 메모리를 절약하거나, 코드의 길이를 줄일 수 있다.

여기까지는 자바 개념만 배우면서도 알 수 있는 내용이다.

 

 

그런데 이번에 웹 프로젝트 코드를 짜면서 '어떤 경우에 static으로 사용하고, 어떤 경우에 인스턴스를 생성해서 사용해야 할지 기준에 대한 명확한 이해가 가지 않았다. 내 머리로는 객체지향적 관점에서 클래스명으로 접근한다는 것은 클래스, 즉 설계적 관점에서 접근한다는 의미이고, 인스턴스로 접근한다면 그 '고유한 객체'만의 속성에 접근한다는 의미이지 않을까? 정도까지만 생각이 가능했다.

 

Human.getAgeAvg();

Human human1 = new Human("Kim");
human1.getAge();

> '인간의 평균 수명'과 '어떤 인간의 수명' 정도의 차이?

 

 

static의 무분별한 사용을 자제해야 하는 이유

 

1. static변수는 전역 상태를 상징한다. 전역 상태의 변수는 코드 여러 부분에서 영향을 받을 수 있게 되고, 변화를 추적하거나 테스트하기가 쉽지 않다. 반면에 이를 인스턴스로 호출하면 변수의 상태 추론이 쉽다.

2. static은 객체지향적이지 않다. static변수는 각 객체의 데이터들이 캡슐화되어야 한다는(Encapsulization) 원칙을 위반한다. static은 따라서 메소드나 변수가 유효한 범위를 가지고 있지 않는 경우에만 사용되어야 한다.

3. static은 메모리적으로도 손해를 본다. 인스턴스가 아니므로 가비지 컬렉터에 의한 메모리 회수가 이루어지지 않고, 프로그램 실행 내내 메모리를 차지하게 된다.

 

 

그렇다면?

 

그러므로 각 인스턴스에 해당되는 고유한 속성에 접근하는 경우, 전역적 접근방법이 객체지향적 설계에 위반되므로, 인스턴스의 생성과 관련이 없는 것이 명확한 경우에만 (spring엔티티 개발로 예를 들면, 여러가지 연관관계가 복잡하게 얽혀있어 생성메소드를 별도로 만들어주어야 하는 경우, 혹은 앞서 얘기했듯 클래스(객체)의 고유한 속성에 관한 메소드) 사용하면 되겠다.