[질문]자바로 프로그램을 만들고 있습니다 + 변수만 모아놓은 클래스는 어떤가요?

GunSmoke의 이미지

그동안 공부한 기본적인 지식을 동원해서 자바로 프로그램을 만들고 있습니다.
정말 재미있게 시작했습니다만... 프로그램의 덩치가 커지기 시작하면서 고민이 생겼습니다. 어떤 기능을 하나 추가하게되면 메쏘드 붙이고 인스턴스 변수 하나 선언하고... 자꾸 이러다보니 전혀 객체지향적이지 않은 자바 프로그램이 되어가고 있네요. 완전히 함수 하나 추가하고 변수하나 추가하는 식입니다. 물론 추가되는 작업마다 전체 코드는 한번씩 다시 손을 봐줘야하구요.

ㅠ,.ㅠ 입문서 대신 다른 책을 찾아봐야겠어요. 추천해주시면 고맙겠습니다.

객체지향 프로그래밍의 적, 클래스 변수는 가능한 줄이기 위해서 아예 변수들만(거의 모든 변수들을) 따로 모아놓은 클래스를 하나 만들어서 사용하고 있습니다. 이렇게 하는 것이 올바른 방법일까요?

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의 전역변수같이) 메인 클래스 꼭대기에 선언된 변수들로 잘못 이해해서 질문을 했음을 밝힙니다.

bookgekgom의 이미지

그냥 변수가 아니라 스태틱 변수들있죠?

그런걸 모아놓아서 사용하면 편해요.

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

chadr의 이미지

아니요. 결론부터 말씀드리자면 별로입니다.

지금 당장은 어느 변수가 어디에 쓰이는지 잘 알기에 괜찮을지 모르겠지만 그 코드를 후임자가 보거나
아니면 자신이 짠 코드라도 한두달 묵혀두고 다시 볼일이 생겼을때 해당 변수가 어디서들 사용하고 있는지
가물가물 해집니다. 그리고 디버깅 할일이 생겨서 그 변수들을 추적해야할 일이 생긴다면....

또한 변수 네이밍을 할때도 곤란해집니다. 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.

klutzy의 이미지

변수들 간에 겹치는 부분이 있다면(예를 들어 int x,y; int x2,y2; 식으로) 그 부분은 따로 빼내는 게 좋지만, 그런 게 아니라면 별로라고 생각합니다. 오히려 그럴 때는 하나의 클래스가 너무 많은 걸 처리하는 건 아닌지를 의심할 필요가 있어요.

다만, 프로그램의 전체 설정을 담는 Configuration 클래스를 만들어서 쓰는 경우는 몇 번 본 것 같아요.

lateau의 이미지

저도 변수를 모아둔 클래스를 선언하는 것 그다지 추천드리고 싶지 않습니다.
언뜻 보기엔 굉장히 정돈되어있고 편리할 것 같지만 그 클래스를 모든 클래스에서 상속 혹은 인스턴스 선언으로 사용하게 되므로 결국엔 변수 몇 개 불러쓰기 위해서 너무 큰 희생(?)을 치르게 되겠죠.

저도 참 안되고 어렵고 기능도 기능이지만, 일단 '성격'에 따라 클래스를 한 번 분류한 후에, '관계를 설정'하고 각 클래스에 씌여질 '변수의 범위와 접근'에 대해 고민하신 후 '클래스 변수(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.

GunSmoke의 이미지

effective JAVA, 추천 감사합니다.
effective c++는 본 적 있는데 같은 깨달음을 얻을 수 있는 책이었으면 좋겠군요.

UML에 대해 아는 바가 전혀 없습니다.
UML을 객체들의 관계도를 그림으로 그려주는 멋진 툴 정도로 이해하고 있습니다만...
UML을 이해하는데 도움이 될만한 자료나 서적을 추천해주신다면 어떤게 좋을까요?

大逆戰

大逆戰

bellows의 이미지

c의 include를 통해 ini 파일을 읽어들이는 것처럼 java에서 쓰고 싶을 때가 있습니다.

그럴 때 class 를 만들고 모든 변수를 static 및 pulic 으로 선언해서 쓸 때가 있습니다.

변수를 쓸 때 class 이름이 붙기 때문에.. 전역변수처럼 사용할 수 있고 다른 것과 확연하게 구별도 되고...

그렇게 씁니다.

아직은 갈 길이 멀다

GunSmoke의 이미지

프로그램의 설계에 있어 캡슐화를 망치는 것이 아닌가 걱정해서 질문을 드렸습니다만 보다 중요한 문제가 있었네요. 프로그램의 성능과 디버깅의 원활함에 비할 바가 아닌것 같습니다.

그래서 원래대로 돌아오긴했는데...

내부 클래스, 메쏘드에서 동시에 사용되는 변수들이 많아 결국 대부분을 전역 변수처럼 선언해서 사용하고 있습니다. 프로그램의 성능에 영향을 미치는 것이 아닌지 걱정이 됩니다.

ps. '클래스 변수'라 함은 원래 static 변수를 말하는 것이나 제가 질문중 내부 클래스와 메쏘드에서 동시에 사용할 수 있도록 (마치 C의 전역변수같이) 메인 클래스 꼭대기에 선언된 변수들로 잘못 이해해서 질문을 했음을 밝힙니다.

大逆戰

大逆戰

alwaysN00b의 이미지

전 C를 하다 JAVA 하느라 애먹었던적이 있습니다.

제 문제는 '객체지향적인 생각' 이었는데, Java Object 라는 빨간책을 보고 캡슐화, 위임등 개념을 제대로 잡았던것 같습니다.
아직도 초보이지만 객체지향적인 생각만 할 수 있다면 변수를 모으고 말고의 문제는 해결되리라 생각합니다.

언제나 시작

GunSmoke의 이미지

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

혹시 말씀하신 책이 이 책 맞습니까?

大逆戰

大逆戰

soungno의 이미지

객체지향의 시작은 캡슐화에 있다고 생각 합니다.
그리고 캡슐화의 기본은 데이터와 이 데이터를 다루는 로직의 지역?(클래스)화 라고 생각 하구요.
그러므로 전역 적으로 사용되는 데이터라도 저렇게 모아 놓는 것은 기본적으로 객체지향 캡슐화 의 위반으로 보입니다.
물론 꼭 필요하다면 할수 없지만 가급적 피해야 할 사항 아닌지 모르겠습니다.
하나만 더 말씀드리면, 시스템의 구조가 늘어나 복잡도가 증각하면 리페토링을 통한 정리 작업이 한번 필요한 시기로 보입니다.
객체지향의 디자인은 지속적으로 발전하면 변화 되어 야 합니다.
어려운 문제죠^^
그럼 행운이 함께 하시기를

잘 가야지.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.