Java가 파일 이름과 이름이 다른 클래스를 컴파일 할 수있는 이유는 무엇입니까?


170

Test.java안에 파일 과 다음 코드가 있습니다.

public class Abcd
{
        //some code here

}

이제 클래스는 컴파일되지 않지만 publicmodifier를 제거하면 올바르게 컴파일됩니다.

공개되지 않은 파일 이름과 다른 클래스 이름을 컴파일 할 수있는 Java의 이유는 무엇입니까?

나는 그것이 초보자 질문이라는 것을 알고 있지만 좋은 설명을 찾을 수 없습니다.


28
자바 때문이다. (가 공개되지, 그리고 같은 명명 규약에 따를 필요가 없습니다 너머를, 당신이 그것을 발명 한 사람을 요청해야 거라고 때문입니다..)
데이브 뉴턴

2
나는 "좋은 설명"이 의심 스럽다. 공립 수업의 필수 조건이지만 비 공립 수업에는 필요하지 않은 것으로 간주되었습니다.
Kayaman

2
비슷한 질문 인 것 같습니다 : stackoverflow.com/questions/7633631/…
sanket

4
이 질문에 대해 너무 많은지지를받는 ​​이유는 무엇입니까? 먼저 중복 질문 : stackoverflow.com/questions/7633631/…
GM Ramesh

2
@ Ramesh :이 질문의 제목과 내용이 더 낫습니다 .. (다른 유사한 것보다)
Jayan

답변:


325

이론적 근거는 .java파일 당 하나 이상의 최상위 클래스를 허용하는 것 입니다.

이벤트 리스너와 같은 많은 클래스는 로컬로만 사용되며 초기 버전의 Java는 중첩 클래스를 지원하지 않았습니다. "filename = class name"규칙이 완화되지 않으면 이러한 모든 클래스는 자체 파일을 필요로했을 것입니다. 작은 .java파일 의 끝없는 확산 과 밀접하게 결합 된 코드의 산란이 불가피 합니다.

Java가 중첩 클래스를 도입하자마자이 규칙의 중요성이 크게 줄어 들었습니다. 오늘날에는 수백 개의 Java 파일을 처리 할 수 ​​있으며이를 활용하는 파일은 절대로 변경하지 않습니다.


60
+1, 이것은 실제로 이유를 제공합니다. 이것이 질문입니다.
Dave Newton

4
특히 역사적 정보에 +1-중첩 / 익명 클래스가 출현함에 따라 동일한 결정을 지금 내려야한다면 (이전 버전과의 호환성을 고려하지 않음) 당 하나의 최상위 클래스를 허용하는 것이 훨씬 더 합리적이라고 생각합니다 파일.
Michael Berry

1
@ berry120 아마도이 허용량이 컴파일 할 때 파일 검색을 복잡하게하기 때문일 것입니다.
Marko Topolnik

3
@Val 당신이 선호하는 IDE가 있기 때문에 다른 사람들이 텍스트 편집기와 CLI 도구를 사용하여 개발하는 것을 거부하는 것은 IDE없이 개발할 수 있기 때문에 IDE를 만들 때 아무런 의미가 없다고 말하는 것만 큼 바보입니다. 두 개발자 모두 양질의 코드를 만들기 위해 훌륭한 개발자가 사용합니다. 그리고 모든 개발자가 그들 중 하나를 정하고 쿰 바야를 부르는 것보다 작은 유일한 것은 우리가 단일 최고의 프로그래밍 언어가 무엇인지에 동의 할 확률입니다.
Dan Is Fiddling By Firelight

5
이맥스의 조합 (또는 빔, 당신의 독을 선택) 및 유닉스 쉘 유틸리티로 아마없는 모든 -에서 - 네 - 손가락 현대적인 IDE로, 그들은 배우고 확실히 더 열심히,하지만 그들은 두 가지가 압도적 에 비해 장점을 내가 시도한 모든 IDE : 코드베이스의 크기에 관계없이 충돌하지 않으며 입력을 따라갈 수 있습니다.
zwol

80

그 이유는 도어 플레이트와 동일합니다. 어떤 사람이 공식적으로 사무실에 공표 된 경우, 그 사람의 이름은 문 태그에 있어야합니다. "알렉스 존스"나 "탐정 콜롬보"처럼. 누군가 방을 방문하거나 공무원과 이야기하거나 바닥을 청소하는 경우, 이름을 공식적으로 입력 할 필요는 없습니다. 대신 문은 "유틸리티"또는 "회의실"을 읽을 수 있습니다.

공식 이름 또는 MyClass.java 회의실 또는 Test.java


4
확실히 흥미로운 유추; 직접 관련이있는 방법에 대한 약간의 설명만으로도 더 나을 수 있습니다. 영업 이익은 약간의 어려움이 연결을 (내가 완벽하게 이해하지만)있을 수 있습니다
앤드류 바버

4
@AndrewBarber 하나의 공개 클래스를 모델링하지 않고 여러 패키지 개인 클래스와 파일을 공유하기 때문에 유추가 실제로 적합하지 않다고 생각합니다. 문판에 "Heather Santee, Manager"라고 적혀 있지만 실제로는 Heather와 그녀의 두 비서가 들어 있습니다.
Marko Topolnik

@MarkoTopolnik 나는 이것에 관여해서는 안됩니다; 나는 A 급입니다 끔찍한 비유에서! ;)
Andrew Barber

@AndrewBarber 어쨌든 쓰고 싶었다. 당신은 방금 밀어 냈습니다 :) 비유는 또한 가장 심각한 관심사를 표현하지 못합니다.이 기능으로 인해 컴파일러는 모든 파일을 구문 분석하여 모든 클래스를 발견해야합니다. 그렇지 않으면 디렉토리 목록을 읽고 모든 이름을 알 수 있습니다 최상위 클래스.
Marko Topolnik

@AndrewBarber, 비유는 디렉토리의 아이디어에 완벽하게 부합합니다. 긴 복도에서 문 판을 살짝 보면서 사람을 빨리 찾을 수 있으므로 각 방에 들어가서 물어볼 필요가 없습니다.
exebook

29

Java 스펙에는 파일 당 최대 하나의 공용 클래스 만 가질 수 있다고 명시되어 있습니다. 이 경우 클래스 이름은 파일 이름과 일치해야합니다. 모든 비공개 클래스는 파일 이름에 관계없이 모든 이름을 가질 수 있습니다.


20
그러나 "자바의 이유는 무엇인가?"
Marko Topolnik

@MarkoTopolnik 그것은 우리를 막지 않기 때문에 : D
Maroun

8
@MarounMaroun 그러나 우리를 방해하지 않는 이유는 무엇입니까?
Marko Topolnik

@Marko Java를 사용하면 동일한 파일에 여러 클래스를 정의 할 수 있습니다 (중 하나만 공개되는 한). 동일한 패키지 내의 모든 클래스는 다른 이름을 가져야하므로 비공개 클래스가 파일 이름 이외의 이름을 갖도록 허용하는 것 외에 다른 옵션은 없습니다.
isnot2bad

2
내 2 센트 : 아마도 클래스 패스 내부의 클래스를 더 빨리 지역화하기 위해이 방법으로 설계되었습니다. 이 규칙을 사용하면 파일 이름 / 경로를 검사하면 클래스 검색에 충분합니다. 이 규칙이 없으면 클래스 경로 클래스 로더가 클래스를 찾기 위해 파일을 열고 구문 분석해야 할 수 있습니다.
Andrei Nicusan

13

그것들을 허용하는 것이 중첩 클래스의 전제 조건이라고 생각합니다. 익명 클래스는 특히 필요한 .java 파일 수를 크게 줄입니다. 이를 지원하지 않으면 사용되는 기본 클래스와 별도의 파일로 많은 단일 메소드 인터페이스 구현이 필요합니다. (특히 액션 리스너를 생각하고 있습니다)

Oracle 웹 사이트 의 Nested Classes Java 학습서 에는 모든 중첩 클래스에 대한 설명 이 있으며 여기에는 각 예제가 있습니다. 또한 유용한 이유가 있습니다.

중첩 클래스를 사용해야하는 이유

중첩 클래스를 사용하는 매력적인 이유는 다음과 같습니다.

  • 한 클래스에서만 사용되는 클래스를 논리적으로 그룹화하는 방법입니다 . 클래스가 다른 클래스에만 유용 할 경우 해당 클래스에 클래스를 포함시키고 두 클래스를 함께 유지하는 것이 논리적입니다. 이러한 "헬퍼 클래스"를 중첩하면 패키지가 더욱 간소화됩니다.

  • 캡슐화가 증가합니다 . A와 B라는 두 가지 최상위 클래스를 고려하십시오. 여기서 B는 그렇지 않으면 비공개로 선언 된 A의 멤버에 액세스해야합니다. 클래스 A 내에 클래스 B를 숨기면 A의 구성원을 비공개로 선언하고 B가 액세스 할 수 있습니다. 또한 B 자체는 외부 세계에서 숨길 수 있습니다.

  • 보다 읽기 쉽고 유지 관리가 쉬운 코드로 이어질 수 있습니다 . 최상위 클래스 내에 작은 클래스를 중첩하면 코드가 사용되는 위치에 더 가깝게 배치됩니다.

(강조 광산)

초기에는 Java 사양에 익숙하지 않지만 빠른 검색은 내부 클래스가 Java 1.1에 추가되었음을 보여줍니다.


유형이 다른 유형 내에서만 유용하지만 이전 유형의 인스턴스가 다른 유형의 인스턴스와 연관되지 않은 경우 어떻게해야합니까?
supercat

중첩 클래스는 람다 또는 '모든 것이 객체 일 때 일등 함수'를 수행하는 Java 1.2 방식입니다. 1.8 구문으로 변경되었습니다. Java 유형 시스템에서 대수 데이터 유형을 모델링하려는 경우에도 사용됩니다.
hawkeye

12

나는 다른 방향으로 봅니다. 자연스러운 상황은 프로그래머가 클래스 이름과 파일 이름을 독립적으로 선택하는 것입니다. 컴파일 과정에서 패키지 외부에서 공개 클래스를 쉽게 찾을 수 있도록하기 위해 공개 클래스가 해당 이름의 파일에 포함되는 데 특별한 제한이 있습니다.


4

Java는 대소 문자를 구분하지만 파일 시스템은 필요하지 않습니다. 파일의 기본 이름이 "abcd"이지만 클래스가 "Abcd"인 경우 대소 문자를 구분하지 않는 파일 시스템의 규칙을 준수합니까? 대소 문자를 구분할 때는 확실히 그렇지 않습니다.

또는 ABCD라는 클래스와 Abcd 클래스가 있다고 가정 해 봅시다. 이제 파일 이름을 바꿀 필요가있을뿐만 아니라 클래스, 죄송합니다!

또는 파일이 없으면 어떻게됩니까? 표준 입력에서 입력을받을 수있는 Java 컴파일러가 있다고 가정하십시오. 그렇다면 클래스의 이름을 "StandardInput"으로 지정해야합니까?

클래스 이름을 따라 파일 이름을 요구하는 의미를 합리적으로 탐색하면 여러 가지 방법으로 나쁜 생각임을 알 수 있습니다.


나는 당신이 말해야하는 것에 동의하지만 비공개 클래스 이름과 다른 이름을 부여함으로써 명명 아키텍처로 인한 문제 중 일부를 완화 할 수있는 경우를 제외하고는 특히 질문에 대답한다는 것을 모르겠습니다. 파일 이름. 나는 언어를 유도한다면 BTW, 대소 문자 구분과 관련하여, 어떤 범위에 있었다 Foo선언, 식별자는 FOO, foo, fOo등 모두가 외부 범위 내에서 존재하는 경우에도 "정의되지 않은"될 것이다. 이러한 디자인은 파일 이름에 대한 대소 문자 구분 문제를 제거합니다.
supercat

3

또한 많은 답변이 놓치기 위해 놓친 또 다른 요점은 public선언 이 없으면 JVM이 어떤 클래스의 주요 메소드를 호출해야하는지 알 수 없다는 것입니다. 하나의 .java 파일에 선언 된 모든 클래스는 모두 기본 메소드를 가질 수 있지만 기본 메소드는 public으로 표시된 클래스에서만 실행됩니다. HTH


0

Java 파일은 둘 이상의 클래스를 포함 할 수 있으므로 하나의 Java 파일에 두 개의 클래스가있을 수 있습니다. 그러나 Java 파일에는 공용 클래스가 포함 된 경우 파일 이름과 동일한 이름으로 클래스가 포함되어야합니다.


아니요,이 규칙은 공개 수업에만 적용됩니다.
deadboy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.