java file 하나 당 public class 를 하나만 두는 이유가 무엇일까요?

winner의 이미지

저는 학생입니다.
Java 를 제대로 공부한 적은 아직없었는데 수업에서 Java 를 배우게 되어
이번에 기초를 제대로 쌓아볼려고 합니다.

그런데 java file 하나 당 public class 를 하나만 두게 되어 있더군요.
상당히 불편하다는 생각이 듭니다.
같은 package 에서 외부 가시성을 두는 두 개 이상의 class 가 연관성이 강할 수 있고,
이런 경우 하나의 source file 에서 작업하는게 편할 거라 생각됩니다.

책에는 이에 대해 딱히 설명이 없어 이리저리 찾아보니 구현을 쉽게 하기 위해서라는
말도 있고, Sun 의 'The Java Tutorial' 에서는 compiler 가 public class 를 찾고,
작업하기 쉽다라고 나옵니다.

하지만 compiler 만들기 어렵다고 이렇게 할 거 같지는 않습니다.
5.0 까지 version up 이 된 Java 는 C 는 물론이고 C++ 와 비교를 해도 만만치 않게
다양하고 복잡한 기술을 적용하고 있는 것으로 보입니다.
compile 도 당연히 어려울 거라고 생각하고요.

public class 는 C/C++ 에서 생각해보면 extern 이라고 생각됩니다.
C++ 는 물론 C 에서도 두 개 이상의 함수와 변수를 extern 으로 외부연결할 수 있습니다.
더구나 extern 은 기본지정이고 오히려 file 통용범위로 한정하는 static 이
선택적 지정입니다. Java 는 왜 public 으로 해야만 외부연결이 가능하고 더우기
단 하나의 class 로 한정하는 걸까요?

생각을 해보면 Java programmer 들이 이부분에 대해 그다지 필요를 느끼지
않은 것이 아닌가 싶습니다. 필요성이 강하다면 당연히 수정될 부분일 거 같구요.
단지 compiler 만들기 편하라고 이렇게 하지는 않을 거 같기에 이곳에 질문을 올립니다.

kslee80의 이미지

C++ 로 작성된, 30여개 이상의 클래스 선언을 가지는 프로젝트를 본다면 자바의 그러한 제약을 수동으로라도 두고 싶어지는 충동을 느끼실 것입니다. -.-
도데체 어느 클래스의 선언이 어떤 파일에 들어있는지를 알 수가 없거든요.
Visual Studio 같은 클래스 다이어그램을 보여주는 통합환경이 없다면 이런 경우 프로젝트의 관리 자체가 복잡해집니다.
맨 바닥에서 처음부터 끝까지 자기가 짜더라도 나중에 가면 어떤 클래스의 선언을 어디에 했는지를 까먹어서 찾고 있다보면 한숨나온답니다;

게다가, 연관성이 강한 두 개의 클래스를 하나의 파일에 선언했을때 편리한 점은 무엇인지요?
에디터 프로그램을 하나만 띄울 수 있는것도 아닌데 말이죠...
노파심에서 하는 이야기이지만, 전역 static 변수등을 사용해서 두 클래스간에 데이터 공유라던지 하는 것을 생각하신다면 그것은 OO 의 설계철학에 위배되는 것이라는것을 말씀드립니다.

그리고, C++ 로 코드 작성하다 보면 static 으로 접근제한을 하는 경우가 훨씬 많습니다. 자기 혼자만 코드 작성하고 쓴다면 굳이 static 으로 접근제한 안 하고 그냥 안 쓰면 될지도 모르겠지만, 여러 사람이 같은 코드를 관리하게 되면 외부에서 건드려서는 안 되는 녀석들에 다 접근제한을 걸어야 나중에 소스코드가 엉망이 되는 사태를 피할 확률이 생깁니다;
차라리 기본적으로 외부 접근이 불가능하고 외부 접근이 필요한 경우에만 따로 키워드를 써서 허용하는 것이 더 편한 셈이죠.

P.S.)
파일 하나당 하나의 public class 라는 제약은 실제로 쓰다보면 별로 귀찮다는 생각이 안 들게 되더군요.

ㅡ,.ㅡ;;의 이미지

저도 그것이 안좋다고 생각했는데..

찾는것이 문제라면 다른방법을 강구해야지... 궂이 그런제약으로 한다는건...
(클레스선언찾기 힘드시면.. 프로그램내부에 메시지하나 짱박혀있는거 어떻게 찾으세요?)

그리고 사용자도 기계나동물이 아닌 생각이 있는사람인데 선택의 자유를 주는게..ㅋㅋ

그리고 편리성이 무엇이냐는 내가하고싶은데로 할수있는자체가 편리한것이죠
그리고 에디터 프로그램을 하나만띄워야할상황이나 두개띄우거나 마음데로 할수 있는것또한 편리한것이지 꼭두개로해야만가능하게 한다는자체가 불편한것이죠..

OOP 설계철학에 위배된다면 문법적으로 막을일이지.. 구지 이상하게 만들필요는 없죠.
막을생각이 없었다면 사용해야할이유도 있다고 봐야죠..
(그리고OOP라면서 왜그렇게 다른Obj에 얽매여야하고 다른Obj 를 파악해야하는지..왜 오히려 더신경써야되게 만들어놓았다는것도 ...)

처음부터 제약에 익숙해지면 불편함을 못느끼게 마련입니다.. 그러나 자유를가졌던사람이 자유가 제약당하면 매우 불편하게 생각합니다.


----------------------------------------------------------------------------

kslee80의 이미지

ㅡ,.ㅡ;; wrote:
OOP 설계철학에 위배된다면 문법적으로 막을일이지.. 구지 이상하게 만들필요는 없죠.
막을생각이 없었다면 사용해야할이유도 있다고 봐야죠..

이 부분에서 약간 오해가 있으신듯...

클래스간의 데이터 공유를 전역변수로 하는 것이 OO 의 철학에 위배된다는 이야기이며,
Java 에서 그것을 못 하게 하기 위해서 public class 당 파일 하나라는 제약을 두었다라고 이야기 한 것은 아닙니다..;
Java 는 아예 전역변수라는 녀석이 없죠...꽁수로 비스므리한 녀석을 만들어 낼 수는 있지만 말이죠..

그리고 다른 분께서도 말씀하셨지만,
Java 언어는 여러 제약을 둠으로서 프로그래머가 실수할 수 있는 부분들을
줄이는 것이 언어의 설계철학이죠..
프로그래머라고 해서 모두 다 자료구조 및 메모리 관리에 능통하고,
클래스를 잘 설계해서 사용하는 것은 아닙니다. (물론, 긍국적으로는 그래야 하겠지만 말이죠)
즉, 현실적으로 모든 C++ 프로그래머들이 그렇지 않기 때문에
여러 프로그래머들이 같은 프로젝트를 할 때 문제가 발생하고,
그렇기 때문에 아예 언어상으로 제약을 가해서
효율을 높이고자 하여 만들어진 언어가 Java 입니다.

그럼..

P.S.) 코드 내부에 메세지 하나 짱박아놓고 프로젝트 같이 하는 사람들에게 이야기 안 해주면 (혹은 도큐먼트 안 해 놓으면)
그건 죄악입니다 -_-;;

pool007의 이미지

Java 는 왜 public 으로 해야만 외부연결이 가능하고 더우기
단 하나의 class 로 한정하는 걸까요?
->

일단 하나의 클래스만 한 파일에 넣는건 아니고 public 인 클래스가 한 파일에 하나만 존재할 수 있습니다. 만약 public 이 아닌 클래스라면 같은 파일에 둘 수 있고, 그런 클래스들은 동일한 패키지 내 다른클래스에서 접근가능합니다. public 클래스당 하나의 파일을 두는 것은 어디까지나 소스를 찾기 쉽게 하기 위해서라고 생각되구요.

왜 public 으로해야만 접근이 가능한가라는 건, 기본이 숨겨놓자!이기 때문이죠. 같은 논리로만 접근하면 왜 C++의 필드는 기본이 private일까요... 다 나름의 이유가 있어서 입니다.

클레스선언찾기 힘드시면.. 프로그램내부에 메시지하나 짱박혀있는거 어떻게 찾으세요?
-> 원래는 메시지를 프로그램 내부에 짱박으면 안됩니다. resource boundle 클래스 등으로 외부에 빼는 것이 제대로 된 해결방법입니다.

사용자도 기계나동물이 아닌 생각이 있는사람인데 선택의 자유를 주는게..ㅋㅋ
-> 이것이 C++과 자바의 기본 철학상 다른점입니다. C나 C++은 프로그래머에게 최대의 자유를 부여하고, 그의 능력을 믿지만 자바는 언어적으로 제한합니다. 포인터, alias 등이 없는 것도 같은 맥락입니다.

일단 새로 언어를 배우시니까, 자바의 guru 들이 하는 기법을 그대로 따라가보세요. 그러면서 또 다른 세상이 보이곤 하는거니까요.

--
Passion is like genius; a miracle.

--
Passion is like genius; a miracle.

iolo의 이미지

썬의 자바 컴파일러(javac)가 그렇게 만들어졌고.. 또 그것과 호환성을 염두에 두고 만들어진 다른 자바 컴파일러들이 그렇게 동작하는 것 뿐이죠.

예를 들어 .javax라는 파일형식이 있고, 그 안에 여러개의 class를 정의할 수 있다면 각각의 클래스를 .class로 만들어내는 컴파일러를 만들면 그만인거죠.
(각각의 클래스를 .java로 만들어내는 프리프로세서정도는 쉽게 만들수도 있겠네요.)

결론은 .java파일 하나에 퍼블릭 클래스 하나라는 제약은 "자바 언어"와는 별 관계가 없다~는 거죠. 처음 만들어진 컴파일러가 그럴 뿐~이고 그게 IMHO 단점보다는 장점이 더 많다고 생각합니다만...

the smile has left your eyes...

----
the smile has left your eyes...

winner의 이미지

우선 댓글 올려주신 모든 분께 감사드린다는 말 하고 싶네요.

C++ 로 코드 작성하다 보면 static 으로 접근제한을 하는 경우가 훨씬 많습니다. 자기 혼자만 코드 작성하고 쓴다면 굳이 static 으로 접근제한 안 하고 그냥 안 쓰면 될지도 모르겠지만, 여러 사람이 같은 코드를 관리하게 되면 외부에서 건드려서는 안 되는 녀석들에 다 접근제한을 걸어야 나중에 소스코드가 엉망이 되는 사태를 피할 확률이 생깁니다;
차라리 기본적으로 외부 접근이 불가능하고 외부 접근이 필요한 경우에만 따로 키워드를 써서 허용하는 것이 더 편한 셈이죠.

kslee80

--> 이건 정말 공감입니다. 예전에 무조건 static 으로 지정부터 하고 본 적도 있었는데 이젠 귀찮더군요... -_-; 물론 같이 하는 작업을 하게 되면 의논해서 전역이름을 정하고 나머지는 static 으로 해야겠지만요.

파일 하나당 하나의 public class 라는 제약은 실제로 쓰다보면 별로 귀찮다는 생각이 안 들게 되더군요.

kslee 80

--> 아직 Java programming 은 많이 해보지 않았지만 그럴 거라고 생각됩니다. 정말 귀찮았다면 OOP paradigm 을 떠나 바뀌었을테고, programmer 에게도 나름대로 유용한 class 관리 방안이라고는 생각합니다. 다만 왠지 귀찮은 경우도 분명 존재는 한다는게 제 생각입니다. --_--;
저는 C/C++ 에 익숙하다보니...

썬의 자바 컴파일러(javac)가 그렇게 만들어졌고.. 또 그것과 호환성을 염두에 두고 만들어진 다른 자바 컴파일러들이 그렇게 동작하는 것 뿐이죠.

iolo

--> 예전에는 약간의 모순도 못 견뎠지만 요새는 현실적으로 훌륭하다는 것이 뭔지 깨닫습니다.. ^_^

그나저나 KLDP homepage 바뀌고 나서 처음 글쓰는 건데 익숙하지 않아서인지 불편하군요. 예전에는 BBCode 를 마우스로 클릭해서 많이 썼는데 그렇게 할 수 없다보니... 인용 tag 가 어떤거였는지도 까먹었고... --_--;

그럼 댓글 달아주신 분들께 다시 감사드리며 공부 열심히 하겠습니다.

익명 사용자의 이미지

10년 뒤에 공부하고 있는 학생에게도 많은 도움이 되네요.

익명 사용자의 이미지

근데 자바로 프로그래밍 개념잡는건 안좋은가요

4241의 이미지

다중 클래스였나... 그런걸 들은 것 같은데...
문제는 다중 클래스를 둬봤자 관리하기만 더 힘들어집니다. 오히려 간단한것도 다 쪼개놓는것이 좋습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.