저보다 이전에 프로그래밍을 배우신 분도 계시겠고, 이후에 배우신 분들도 계시겠으며, 어떠한 환경에서거나 프로그래밍을 배우시면서 static 이란 키워드, 정적이란 키워드에 대해서 조금은 거부감을 가지실 것 같아요.
저같은 경우엔 C언어를 처음 배웠을때 교수님께서 case를 많이 안내해주시지 않고 전역변수 사용에 대해 경고를 주셨었습니다.(정적이라고 표현해도 될까요?)(헉 벌써 10년 가까이 흘렀네요 ㅠㅠ)
그때부터 조금 버릇이 들어버린게 있다면 (java에 한해서 접근할게요) static 메소드는 인스턴스 변수에 대한 변경이 없을 경우와 해당 메소드의 호출 빈도수에 대해 고민해보고 결정합니다.
이번에 회사를 그만두게 되면서 코드에 주석을 달게되면서 보게되니.(저는 사용빈도가 적은 게임 운영툴을 개발했었습니다.) 제가 작성한 코드들 중에 static 메소드들은 1. 엑셀파일을 파싱하여 리스트를 만들어주는 메소드 2. in game에서 공지사항등을 접근할 때 필요한 URL을 모두 단축 URL로 만들어주는 메소드 3. 게임서버와 통신해야할 때 필요한 암호화 메소드 4. login 여부를 체크하는 메소드
대략 이런 것 같아요. 경험이 적다보니 혼자 프로젝트를 진행하면서 어떻게보면 제 편의에 기준하여 작성된 코드들인데 다른 분들은 어떤 경우에 static 메소드를 작성하시는지 궁금합니다.
오후부터는 영상이라고 하는데 다들 즐거운 포근한 하루 되세요! :)
5개의 의견 from SLiPP
과거 Singleton 패턴이 유행할 때 인스턴스를 하나만 생성하도록 하기 위해 static method 많이 사용한 경험이 난다.
static method가 꼭 나쁜 것은 아니지만 테스트 하기 어렵다는 이슈와 객체 지향 관점에서는 사용을 최소화하는 것이 좋지 않겠느냐는 의견이 대세인 듯하다. 특히 Singleton 패턴은 Spring과 같은 DI를 지원하는 프레임워크가 등장하면서 필요성을 느끼지 못하는 상황이다.
최근에 내가 static method를 사용하는 경우를 보면 유틸성 라이브러리인 경우를 제외하고는 많지 않은 듯하다. 예를 들어 apache commons lang에서 제공하는 StringUtils와 같은 경우가 대표적이라고 생각한다. 물론 상태를 가질 필요가 없는 부분은 모두 static method로 구현해도 무방할 것으로 생각한다.
@자바지기 오호 저런 과거가 있었는지는 몰랐어요
세번째 문단과 같이 저도 비슷하게 사용중인 것 같아요. 그러다 간혹 제가 작성한 코드를 보면 메소드뿐인 녀석이 있네요;;; 마치 javascript를 사용할때 전역 함수를 쓰듯이 가져다 쓰는 목적이죠. (그래서 이 전에 논의가 되었던 완전한 OOP 언어가 아닌 이유 중 하나가 되는 걸까요 ㅎㅎ) 그리고 두번째 문단에서는 공부가 부족하여 이해가 잘 안됩니다. ㅠㅠ static method 는 테스트 사용에 어렵다는 부분은 이해가 되나 (으엉 TDD ㅠㅠㅠㅠㅠ 계속 되뇌겠습니다 ㅠㅠ) DI 와 같은 개념이 싱글턴패턴과 어떠한 연관이 있는지 잘 모르겠습니다. 아... 적다보니 유추하게 되는게 (-_-;;;) 싱글턴을 사용하게 되면 static method 가 존재하게 되고 이는 테스트를 번거롭게하게 되고 싱글턴을 가져다 쓰는 녀석들이 싱글턴 객체와 커플링이 강하여 역시 테스트가 번거롭게 되고...(응??) 그러하여 DI 가 등장하게 되었... 나요
? TDD 를 안하다보니 이러한 고민이 없었네요. 후아 감사합니다!그냥 제가 썻던 경우만 나열 해 본다면 1. Context를 처리 하는 부분. 2. ThreadLocal 한 처리가 필요한부분. 3. Configuration등 설정 또는 Message, properties같은 처리부분. 4. Util성 class.
같은 부분이 있네요 재성이가 이야기 한것처럼 대부분 Singleton 형식을 지원하기 위한 부분이 대부분인듯 합니다. 요즘은 Spring때문에 이런 부분을 직접 코딩할 부분이 적어지고 있네요...
Number n = Number.of(1); Number n = Number.of(1.1); Number n = Number.of(1L);
추상클래스가 팩토리 메서드 역할을 하는 경우에도 괜찮은거 같아요. 상태도 없고요.
@jhindhal.jhang 답변감사합니다. :) Context 를 처리하고 ThreadLocal 한 처리를 한다는 의미는 흠... 이해가 잘 안되서;;; ThreadLocal 은 경험해본게 ... spring 쓰기전에 servlet 에서 억지로 session 정보를 다른 레이어에 넘겨주기 싫을때 써본정도인데 이 ThreadLocal과 static method 에 대한 연계점을 잘 못찾겠습니다.... 아 고민해보니;;; ThreadLocal 에 저장된 data자체에 접근할 때에 유용하겠...지만;;; 실예가 무엇무엇이 있을까요 ㅠ @benghun 오호.... 답변 감사합니다. 보기만 했던 코드같은데 유용하게 쓰일 것 같아요 ㅎㅎ
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.