[질문]자바로 프로그램을 만들고 있습니다 + 변수만 모아놓은 클래스는 어떤가요?
글쓴이: GunSmoke / 작성시간: 목, 2009/02/19 - 11:34오전
그동안 공부한 기본적인 지식을 동원해서 자바로 프로그램을 만들고 있습니다.
정말 재미있게 시작했습니다만... 프로그램의 덩치가 커지기 시작하면서 고민이 생겼습니다. 어떤 기능을 하나 추가하게되면 메쏘드 붙이고 인스턴스 변수 하나 선언하고... 자꾸 이러다보니 전혀 객체지향적이지 않은 자바 프로그램이 되어가고 있네요. 완전히 함수 하나 추가하고 변수하나 추가하는 식입니다. 물론 추가되는 작업마다 전체 코드는 한번씩 다시 손을 봐줘야하구요.
ㅠ,.ㅠ 입문서 대신 다른 책을 찾아봐야겠어요. 추천해주시면 고맙겠습니다.
객체지향 프로그래밍의 적, 클래스 변수는 가능한 줄이기 위해서 아예 변수들만(거의 모든 변수들을) 따로 모아놓은 클래스를 하나 만들어서 사용하고 있습니다. 이렇게 하는 것이 올바른 방법일까요?
public class Example { private ExData ed = new ExData(); public void go() { ed.a = 얼마; ed.b = 얼마; ed.c = hereWeGo(ed.a, ed.b); ... } } public ExData { int a; int b; int c; ... }
add) ps. '클래스 변수'라 함은 원래 static 변수를 말하는 것이나 제가 질문중 내부 클래스와 메쏘드에서 동시에 사용할 수 있도록 (마치 C의 전역변수같이) 메인 클래스 꼭대기에 선언된 변수들로 잘못 이해해서 질문을 했음을 밝힙니다.
Forums:
모을때는
그냥 변수가 아니라 스태틱 변수들있죠?
그런걸 모아놓아서 사용하면 편해요.
---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.
http://jihwankim.co.nr
여러 프로그램 소스들이 있습니다.
필요하신분은 받아가세요.
아니요. 결론부터
아니요. 결론부터 말씀드리자면 별로입니다.
지금 당장은 어느 변수가 어디에 쓰이는지 잘 알기에 괜찮을지 모르겠지만 그 코드를 후임자가 보거나
아니면 자신이 짠 코드라도 한두달 묵혀두고 다시 볼일이 생겼을때 해당 변수가 어디서들 사용하고 있는지
가물가물 해집니다. 그리고 디버깅 할일이 생겨서 그 변수들을 추적해야할 일이 생긴다면....
또한 변수 네이밍을 할때도 곤란해집니다. tmp1,2,3 이럴수는 없으니까요..
그리고 다른데서는 쓰지도 않는 변수들 때문에 매번 (비교적)큰 용량의 메모리를 할당해서 사용해야하므로 낭비입니다.
변수는 가능한 사용하는 시기에 선언하시는게 좋으며 코드와 붙여놓으시는걸 추천합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
_
변수들 간에 겹치는 부분이 있다면(예를 들어 int x,y; int x2,y2; 식으로) 그 부분은 따로 빼내는 게 좋지만, 그런 게 아니라면 별로라고 생각합니다. 오히려 그럴 때는 하나의 클래스가 너무 많은 걸 처리하는 건 아닌지를 의심할 필요가 있어요.
다만, 프로그램의 전체 설정을 담는 Configuration 클래스를 만들어서 쓰는 경우는 몇 번 본 것 같아요.
저도 변수를 모아둔
저도 변수를 모아둔 클래스를 선언하는 것 그다지 추천드리고 싶지 않습니다.
언뜻 보기엔 굉장히 정돈되어있고 편리할 것 같지만 그 클래스를 모든 클래스에서 상속 혹은 인스턴스 선언으로 사용하게 되므로 결국엔 변수 몇 개 불러쓰기 위해서 너무 큰 희생(?)을 치르게 되겠죠.
저도 참 안되고 어렵고 기능도 기능이지만, 일단 '성격'에 따라 클래스를 한 번 분류한 후에, '관계를 설정'하고 각 클래스에 씌여질 '변수의 범위와 접근'에 대해 고민하신 후 '클래스 변수(static)을 꼭 써야하는지 아닌지'를 판단하시고 코딩을 시작하신다면 좋을 것 같습니다.(헉헉...)
잘 아시겠지만 UML이 많은 도움을 주리라 생각합니다. '기능 구현'에 너무 중점을 두면 객체는 저 멀리 산으로 가게될 가능성이 높더군요. 일단은 그림을 그려보세요. :)
**
+1 Effective Java. 서술형이라 첨엔 '뭐 이딴...'(전 일본판을 보고 있습니다)이라고 생각했지만, 어느새 글쓴이의 깊은 경험과 잔잔한 말투(?)에 빠져들게 되더군요. 참 많은 것을 생각하게 하는 책입니다. :)
- Why don't you come in OpenSolaris? I hope you come together.
--
I think to myself...what a emerging world.
effective JAVA, 추천
effective JAVA, 추천 감사합니다.
effective c++는 본 적 있는데 같은 깨달음을 얻을 수 있는 책이었으면 좋겠군요.
UML에 대해 아는 바가 전혀 없습니다.
UML을 객체들의 관계도를 그림으로 그려주는 멋진 툴 정도로 이해하고 있습니다만...
UML을 이해하는데 도움이 될만한 자료나 서적을 추천해주신다면 어떤게 좋을까요?
大逆戰
大逆戰
가끔.. 저도..
c의 include를 통해 ini 파일을 읽어들이는 것처럼 java에서 쓰고 싶을 때가 있습니다.
그럴 때 class 를 만들고 모든 변수를 static 및 pulic 으로 선언해서 쓸 때가 있습니다.
변수를 쓸 때 class 이름이 붙기 때문에.. 전역변수처럼 사용할 수 있고 다른 것과 확연하게 구별도 되고...
그렇게 씁니다.
아직은 갈 길이 멀다
프로그램의 설계에
프로그램의 설계에 있어 캡슐화를 망치는 것이 아닌가 걱정해서 질문을 드렸습니다만 보다 중요한 문제가 있었네요. 프로그램의 성능과 디버깅의 원활함에 비할 바가 아닌것 같습니다.
그래서 원래대로 돌아오긴했는데...
내부 클래스, 메쏘드에서 동시에 사용되는 변수들이 많아 결국 대부분을 전역 변수처럼 선언해서 사용하고 있습니다. 프로그램의 성능에 영향을 미치는 것이 아닌지 걱정이 됩니다.
ps. '클래스 변수'라 함은 원래 static 변수를 말하는 것이나 제가 질문중 내부 클래스와 메쏘드에서 동시에 사용할 수 있도록 (마치 C의 전역변수같이) 메인 클래스 꼭대기에 선언된 변수들로 잘못 이해해서 질문을 했음을 밝힙니다.
大逆戰
大逆戰
제 경우엔..
전 C를 하다 JAVA 하느라 애먹었던적이 있습니다.
제 문제는 '객체지향적인 생각' 이었는데, Java Object 라는 빨간책을 보고 캡슐화, 위임등 개념을 제대로 잡았던것 같습니다.
아직도 초보이지만 객체지향적인 생각만 할 수 있다면 변수를 모으고 말고의 문제는 해결되리라 생각합니다.
언제나 시작
Java Object! 책 추천은
Java Object!
책 추천은 언제나 대환영입니다.
근데 책을 검색해보니... 없네요.
The Object Of Java : Introduction To Programming Using Software Engineering Principles (Paperback / 2nd Ed. ) : Introduction To Programming Using Software Engineering Principles
Riley, David D. 저 ㅣ Addison-Wesley
혹시 말씀하신 책이 이 책 맞습니까?
大逆戰
大逆戰
데이터와 로직 은 같은곳에
객체지향의 시작은 캡슐화에 있다고 생각 합니다.
그리고 캡슐화의 기본은 데이터와 이 데이터를 다루는 로직의 지역?(클래스)화 라고 생각 하구요.
그러므로 전역 적으로 사용되는 데이터라도 저렇게 모아 놓는 것은 기본적으로 객체지향 캡슐화 의 위반으로 보입니다.
물론 꼭 필요하다면 할수 없지만 가급적 피해야 할 사항 아닌지 모르겠습니다.
하나만 더 말씀드리면, 시스템의 구조가 늘어나 복잡도가 증각하면 리페토링을 통한 정리 작업이 한번 필요한 시기로 보입니다.
객체지향의 디자인은 지속적으로 발전하면 변화 되어 야 합니다.
어려운 문제죠^^
그럼 행운이 함께 하시기를
잘 가야지.
댓글 달기