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

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

public class Abcd
{
        //some code here

}

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

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

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



답변

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

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

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


답변

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

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


답변

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


답변

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

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

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

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

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

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

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

(강조 광산)

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


답변

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


답변

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

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

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

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


답변

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