2010-08-03 2 views
10

1) Java 패키지에있는 파일에서 "패키지"를 쓰는 이유는 무엇입니까? 간접적으로 디렉토리에 있으면 패키지에 있다고 가정하지 않습니까?왜 "패키지"키워드와 .h입니까?

2) 저는 C++ 세계에서 왔습니다. 필자는 필자가 필요로하는 클래스의 .h를 그 클래스를 사용하는 다른 파일들로부터 가져왔다. (즉, 구현이 아니라 헤더 만 보여주고 싶다.) 그러나 이제는 자바에서의 수입에 대해 다소 혼란 스럽습니다. 이것이 Java로 어떻게 이루어 집니까?

감사

답변

7
  1. 아니, 가정되지 않도록. 결국,? com.mypackage.stuff라는 내 패키지 무엇입니까?의 rc.com.mypackage.stuff? myproject.com.mypackage.stuff? C.Users.makakko.workspace.myproject.src.com.mypackage.stuff?

    패키지의 기본 패키지가 폴더 밖에있는 경우 드라이브 루트에 상대적입니까? 프로젝트가 다른 컴퓨터의 다른 드라이브 문자로 개발되면 어떻게됩니까? javac.exe의 위치와 관련이 있습니까? 다시, 다른 설치 디렉토리는 어떨까요? javac를 실행할 때 작업 디렉토리는 어떻습니까? 하지만 javac에서 소스 파일을 찾을 수있는 위치를 지정할 수 있습니다. 간단한 테스트 프로그램을 작성하거나 이전에 프로그래밍 한 적이없는 Java를 가르치려면 어떻게해야합니까? 패키지 구조의 전체 개념을 사용/설명해야합니까?

    package 지정자를 생략하면 패키지에 포함됩니다. 그것은 단지 이름이없는 "기본 패키지"입니다.

  2. 헤더 파일은 정보 숨기기를 달성하는 방법보다 C를 컴파일해야하는 방식의 아티팩트입니다. C에서 메소드는 참조되기 전에 정의되어야합니다. 서로 참조하는 몇 가지 메소드를 원할 경우, 그 중 하나를 사용하기 전에 모든 메소드를 정의해야합니다. 따라서 헤더를 사용하십시오. C++의 헤더는이 부분을 대신 처리하지만 C++의 변경으로 헤더의 필요성이 바뀝니다.

    Java에서 컴파일러는 메서드/클래스가 필요한 작업을 수행하기 전에 모든 메서드와 클래스 서명을 조사합니다. 헤더가 제공하는 함수는 컴파일러 자체에 저장됩니다.별도의 라이브러리 등을 숨기고 실제 정보를 사용하지 않는

    1. 코드 헤더 파일

    2. 내에 배치 될 수 있기 때문에 당신은 정보 은닉의 헤더에 의존하지 수, 프로그래머가 갈 수 문제없이 헤더와 일치하는 c/cpp 파일을 찾으십시오.

    마찬가지로 Java에서는 원본을 제거하여 실제 정보를 숨길 수 있습니다. 소스를 액세스 할 수 없게 만들면 공개/보호 된 클래스, enum 및 인터페이스로 API를 노출합니다. 보너스 포인트를 얻으려면 모든 것에 대한 설명 JavaDoc 주석을 작성하고 소스를 통해 javadoc.exe를 실행하여 패키지를 사용할 모든 사용자를위한 별도의 설명서를 작성하십시오.

+0

AFAIK 패키지 이름은 항상 중복됩니다. 그냥'com.mypackage.stuff'를 * anything * else로 변경하고'CLASSPATH'를 변경하지 않고 컴파일하십시오. – maaartinus

5

1) package 선언은 프로젝트의 디렉토리 계층 구조를 일치해야합니다.

Car.java에 사용하면 다음과 같은 계층 구조가 예상됩니다.

com/ 
|-- stackoverflow/ 
| `-- bakkal/ 
|  |-- Car.java 

2) 당신이 class 대신 자바 interface를 사용할 수있는 구현을 숨기려면. 그런 다음 실제 구현을 .class 파일이나 JAR에 배포하십시오.

음하지만 인터페이스가 가 인스턴스화 할 수없는

...

인터페이스는 어느 정도 C에서 프로토 타입 ++처럼 작동합니다. 당신은 계약을 맺었고 실제 구현은 다른 곳에 있습니다. 당신이 실제 구현을하지 않고 뭔가를 인스턴스화 할 수있는 방법을 구현을주지 않고

나는 클래스를 인스턴스화 할

하지만 , 만 프로토 타입도 C++ 불가능

? C++에서는 여전히 오브젝트 파일에 링크해야합니다. Java에서는 .class 개의 파일을 사용합니다.

+1

1) 제 질문은 그 가정이 아닙니다. : S 2) 음,하지만 인터페이스를 인스턴스화 할 수 없습니다 ... 클래스를 인스턴스화하려고하지만 구현을 제공하지 않고 프로토 타입 만 제공합니다. – makakko

+0

@makakko : .java 파일을 사용할 수있는 한 구현을 항상 사용할 수 있습니다. 기간. 구현을 숨기려면 user/programmer/ET 전용 .class 파일 (또는 .class를 포함하는 .jar)을 제공하십시오. 그러나 문서를 포함시켜야합니다. –

+0

브라이언 감사합니다. :). BTW, .class는 "좋은"방식으로 바꿀 수 있습니까? 원래의 "이름"변수/함수를 복원하겠습니까? 왜냐하면 Java VM이 클래스 멤버 또는 함수에 "오프셋"을 처리하지 않기 때문입니다. – makakko

3

Java의 철학은 암시 적/가정보다 명시 적으로하는 것이 낫기 때문에 패키지는 사용되지 않습니다.

현재 패키지에있는 항목에 액세스 할 수 있지만 외부에있는 항목은 명시 적으로 가져와야합니다. (Java.lang은 예외입니다. String을 사용하지 않는 단일 패키지가 아닌 String과 같은 기본 기능이 많이 포함되어 있기 때문입니다.)

import java.util.ArrayList; 
import java.util.LinkedList; 

대신 :

import java.util.*; 

이는 어느 날 당신이 누군가를 elses 코드를 알아 내려고 할 때까지 짜증나 보일 수 있으며 명중 당신이보고하는 경향이 왜

은 또한 일이 숨겨 지거나 함축되어 있다면 얼마나 더 힘들겠습니까.

Eclipse, Netbeans 또는 IntelliJ를 사용하는 경우 두 가지 기능으로 인해 알지 못할 것입니다.

우선 클래스 이름을 입력하는 중 ctrl-space를 누르면 해당 클래스 이름이 완성 될뿐 아니라 자동으로 가져 오기 목록에 추가됩니다.

두 번째로 가져 오기가 "잘못"되거나 Ctrl-Space 확장을 사용하지 않는 경우 ctrl-shift-o (일식)를 입력하여 "수정 가져 오기"를 수행 할 수 있습니다. 이렇게하면 더 이상 필요없는 가져 오기를 제거하고 가져 오는 항목을 자동으로 가져옵니다. 설정에 따라 *가 확장되거나 축소됩니다.

일단 시스템이 다운되면 수입을 고려하지 않습니다.

1

패키지는 클래스에 대한 경로를 지정합니다. 디스크 또는 jar (zip) 디렉토리와 일치해야합니다. 위치는 클래스 경로의 위치와 관련이 있습니다. 보호 된 액세스는 동일한 패키지의 클래스로 제한됩니다.

.h 파일에서 수행 할 수있는 작업 중 일부는 클래스 정의에서 수행됩니다. 상수는 클래스에 속하며 공개적으로 표시 될 수 있습니다. .h에서 상수는 공개적으로 보일 수 있어야합니다.

가져 오기는 .h를 포함하는 것과 동일하지만 같은 이름의 충돌하는 정의 문제를 해결하는 데 도움이됩니다. 클래스의 항목 하나 또는 표시 가능한 모든 항목 만 포함 할 수 있습니다. 가져 오기를 건너 뛰고 패키지 이름을 사용하여 액세스하려는 클래스 앞에 접두사를 붙일 수도 있습니다.

임포트를 통해 구현이 실제로 보이지 않습니다 (적어도 컴파일 된 클래스에서 제공하는 것 이상은 아닙니다.) 보이는 인터페이스 공용 메서드 및 데이터입니다. 액세스가없는 동일한 패키지 메소드 및 데이터에서 가져 오기 .h 파일은 소스 또는 오브젝트 파일을 제공하지 않고 사용할 수 있습니다. 가져 오기에는 지정된 클래스가 제공되어야합니다 (클래스는 다음을 수행 할 수 있습니다. 그 일을 가난한 디자인이 될 것이지만, 상수 만 구성되어 있습니다.)

+0

'protected' 액세스는 동일한 패키지가 아니라 하위 클래스를 의미합니다. 패키지 액세스 ("기본 액세스")는 액세스 키워드 (public/protected/private)를 생략하여 지정됩니다. –

+0

답변이 수정되었습니다. – BillThor