http://tech.thegajago.com/2016/02/20/%EC%99%9C-%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-static%EC%9D%98-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%A7%80%EC%96%91%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94%EA%B0%80/
여기 좋은글이 있네요.
" Static 변수는 global state(역주: 전역 상태. 프로그램 혹은 한 모듈 전체의 상태)를 상징합니다. Global state는 추론과 테스트가 매우 까다롭습니다. 가령 코드에서 static 변수를 사용한다고 하면, 이 변수의 상태는 코드 여러 부분에서 영향을 받을 수 있게 되고 따라서 변화를 추적하기가 어려워집니다. 반면에 이를 객체화하여 인스턴스로 생성하면 테스트 중에 그 변수가 어떤 상태를 가지고 있는지 추론하는 것이 보다 간단해집니다. "
특히 이 문구가 참 마음에 드네요, 객체지향이 추구하는 목적? 목표?를 다시금 깨닫게 해주는 문구입니다.
그런데 여기선 static 의 사용을 지양하라는 글이 대부분이지만, 이것은 쓰지말라는 것을 의미하는게 아니에요. static키워드는 그 나름대로의 장점을 가지고 있기 때문에 잘만 사용하면 개발자로 하여금 편리성을 제공해주기 때문이죠. 또 아무리 객체지향을 부르짖는다 해도 프로그래밍에서 객체로 표현되기 어렵거나 표현 안하는것이 더 좋을때도 있거든요
그렇기에 우리는 항상 무언가를 사용할때 그것이 가지는 특징(장점, 단점 혹은 문제점)을 이해하고, 단점을 줄이고 장점을 극대화 할수있는 최적의 사용법을 공부해야 합니다.
static의 적절한 사용 예는 기본서나, Effective Java, 그 밖에 다른 자바 서적들을 많이 읽다보면 자연스레 익히게 될거에요. 특히 자바 개발자라면 Effective Java는 필독서이니 꼭 보세요 다른 언어도 Effective시리즈는 꼭 읽어야 된다고 생각합니다.
하나 더 첨언하자면 쓰다보니 클래스변수(정적변수라고도 함, C의 정적변수하고 자바의 정적변수는 아주 조금 다름)에 대한 이야기에서 static이라는 키워드에 대한 이야기로 변모했는데, static은 변수 뿐 아니라 함수, 클래스 에도 적용할 수 있고, 클래스변수 (정적변수)와 마찬가지로 그들의 경우도 잘 이용하면 static을 쓰지 않는 경우 보다 더 나은 방법을 제공하기 때문에 언급하였습니다.