[Book Review] JAVA의 신 (7)

Tony Kim·2021년 10월 13일
0
post-thumbnail

[Book Review] JAVA의 신 (6)

CH11. API

API (application programming interface)
애플리케이션에 선언되어있는 클래스와 메소드(JDK에 포함된)에 대한 상세한 설명이 포함된 문서

  • 자바의 API는 HTML로 구성
  • 우리는 API 문서를 직접 작성할 필요는 없고 소스 내에 클래스 및 메소드를 선언하기 전이나 후에 API에 명시되도록 하기 위한 주석만 상세히 달아주면 됨
  • 그 다음 javac와 java명령어가 있는 jdk/bin 디렉터리에 있는 javadoc명령을 통하여 API문서가 자동으로 작성되도록 소스내에 주석을 달아주는 방법이 있다. (javadoc사용법은 부록 참고)

API열어보기
부록 1 보고 JDK설치
docs – api – index.html

API 문서

  • 왼쪽 위 : 모든 패키지의 링크 목록
  • 왼쪽 아래 : 윗 창에서 선택한 패키지의 클래스 링크 목록
  • 우측 : 선택한 패키지 or 선택한 클래스에 대한 설명

API 문서 구성
패키지 목록에서 all classes – packages – java.lang
좌측 하단 클래스 목록에는 (인터페이스 목록 / 클래스 목록 / Enum 클래스 목록 / 예외 클래스 목록 / 에러 클래스 목록 / 어노테이션 타입 목록)

클래스 및 인터페이스의 상세 정보 화면
java.lang패키지의 클래스 목록에서 String 클래스
화면 상단 – Header / 화면 하단 – Footer

1) 패키지와 클래스 / 인터페이스 이름
ex. java.lang – class String

2) 클래스 상속관계 다이어그램 (Class Inheritance Diagram)
이 클래스가 어떤 클래스들의 상속을 받았는지에 대한 관계를 간단한 계단식으로 보여줌
(중요)

  • 해당클래스의 객체에서 사용할 수 있지만, 지금 보고있는 페이지에 메소드에 대한 상세 설명은 존재하지 않을 수도 있기 때문
  • 오라클 자바 API 문서는 부모 클래스에 선언되었지만, 자식 클래스에서 별도로 Overriding을 하지 않은 메소드는 자세한 설명이 제공되지 않는다. 따라서 사용가능한 메소드가 있는데 그 클래스의 API에 없다면 부모 클래스의 메소드들을 살펴봐야한다.

3) 직속 자식 클래스 (Direct Known Subclasses)
String클래스는 final클래스이기 때문에 더 이상 자식을 갖지 못한다.
java.lang.Throwable클래스의 직속 자식 클래스

Direct Known Suclasses 
  Error, Exception

-> 이처럼 해당 클래스를 확장한 클래스들의 목록이 제공
-> 자바 API에는 JDK API의 관계만 제공

4) 알려진 모든 하위 인터페이스 목록 (All Known Subinterfaces) : 인터페이스에만 존재

  • 인터페이스를 상속받은 인터페이스 목록을 나타냄
  • String클래스는 인터페이스가 아니므로, java.lang.Runnable이라는 인터페이스 살펴보기로
All Known Subinterface:
Runnable Future<V>, RunnableScheduledFuture<V>
(Runnable 인터페이스의 알려진 모든 하위 인터페이스 목록)

-> 이처럼 인터페이스 간의 확장 관계를 쉽게 확인할 수 있다.

5) 알려진 모든 구현한 클래스 목록 (All Known Implementing Classes) : 인터페이스에만 존재

해당 인터페이스를 구현한 클래스들의 목록 / 방금 살펴본 java.lang.Runnable의 예시

All Known Implemeting Classes:
AsyncBoxView, ChildState, ForkJoinWorkerThread, FUtureTask,
RenderableimageProducer,SwingWorker, Thread, TimerTask

-> Runnable 인터페이스의 알려진 모든 구현한 클래스 목록

어떤 인터페이스로 선언된 매개변수를 메소드에 넘겨줘야할 때, 여기에 구현된 클래스의 객체를 넘겨주면 됨 / 즉 runnable 인터페이스를 매개 변수로 사용하는 메소드가 있으면, Thread 객체를 생성해서 넘겨주면 된다는 것이다.

6) 구현한 모든 인터페이스 목록 (All Implemented Interfaces) : 클래스에만 존재함
클래스에서 구현한 모든 인터페이스의 목록 나열

All Implemented Interfaces:
Serializable, CharSequence, Comparable<String>

-> String클래스에서 구현한 모든 인터페이스 목록

여기에 명시되어있는 모든 인터페이스의 메소드들은 해당 클래스에 반드시 구현되어있을 것임

7) 클래스 / 인터페이스의 선언 상태 (Class/Interface Declaration)
클래스의 선언 상태를 볼 수 있다.

public final class String
extends Object
implements Serializable, Comparable<String>,CharSequence

-> 스트링 클래스의 선언상태

즉 클래스가 어떤 접근 제어자를 사용했는지, final 클래스인지 등을 확인할 수 있다

8) 클래스 / 인터페이스의 설명 (Class/Interface Description)
클래스에 대한 상세한 설명을 볼 수 있다. 이 영역에서 제공되는 내용은 클래스의 용도, 클래스 사용법, 사용 예 등이 자유롭게 기술되어 있다.

(중요) 설명 가장 아래에 있는 Since와 See also 부분

Since:
  JDK1.0
See Also:
  Object.toString(), StringBuffer, StringBuilder, Charset, Serialized Form

-> String클래스의 Since와 See Also

Since : 해당 클래스가 JDK에 추가된 버전 명시 / String 클래스는 자바가 처음 만들어지면서부터 생긴 클래스기 때문에 JDK1.0으로 되어있지만 JAVA버전이 올라가면서 많은 클래스들이 추가되었기 때문에 개발할 때에는 이 부분을 꼭 확인해야함
ex) JAVA5기반의 시스템을 만드는데 JAVA 6,7의 API문서를 보면서 개발하면, 컴파일이 제대로 되지 않는 경우가 발생할 수 있다. 클래스만이 아니라 클래스에 선언된 상수 필드나 메소드에도 Since가 표시되어있는 경우가 있다.
현재 클래스가 만들어질 때 같이 만든 상수 필드나 메소드에는 Since가 없지만 이후 JDK포함된 상수 필드나 메소드에는 Since명시 /
-> 만약 개발하면서 못보던 메소드 발견 -> API 문서 확인하여 그 메소드가 언제부터 추가되었는지 확인하는 습관 기르기
See also : 클래스와 관련되어 있는 모든 클래스나 인터페이스, 메소드 등의 링크가 제공됨. 이 링크 클릭하면 정보

9) 내부 클래스 종합 (Nested Class Summary)
자바는 클래스 안에 내부 클래스를 선언하여 사용 가능하다. 이 내부 클래스를 public하게 선언할 경우 그에 대한 내용이 이 목록에 제공된다. 내부 클래스는 해당 클래스에서 직접 호출하여 사용할 수 있기 때문에 쉽게 사용할 수 있다. 이 내부 클래스 목록에 있는 클래스의 링크를 클릭하면 해당 클래스의 상세 설명 API화면으로 이동한다.

10) 상수 필드 종합 (Field Summary)
클래스에는 public static으로 선언한 상수 필드가 존재할 수 있다. 이 값은 바뀌지 않기 떄문에 여러모로 많이 사용됨 (java.util.Calendar 클래스 보면 이해가능)

11) 생성자 종합 (Constructor Summary)
클래스에 어떤 생성자들이 선언되어있는지 목록으로 제공 / 어떤 생성자가 있는지 한눈에 볼 수 있음 / 생성자에 걸려있는 링크 클릭하면 생성자 상세 설명으로 이동
String클래스의 생성자는 여러 개
String(byte[] ascii, int hibyte)
클래스타입의 매개변수 -> 링크로 확인가능

12) 메소드 종합 (Method Summary)
클래스에 선언된 모든 public 및 protected 메소드에 대한 종합 정보 제공 / 가장 많이 보는 부분 -> 왜? : 어떤 메소드가 있는지 쉽게 확인가능하며 각 메소드의 리턴 타입/매개변수 확인가능

modifier가 public뿐이라면 리턴 타입만 표시 / 해당 메소드가 static메소드라면 static 추가로 명시 / (static메소드는 별도로 객체 생성 필요X)
protected도 API에 표시 (상속받은 클래스에서만 사용가능 = 해당 클래스 상속받아 자식 클래스 개발할 때 어떤 메소드가 있는지 알아야하기 때문 = Overriding하기위해)
API문서 생성할 떄 private메소드도 보이도록 가능

13) 부모 클래스로부터 상속받은 메소드를(Methods inherited from parent)
부모클래스가 여러 개라면 각 클래스 별로 목록 별도로 제공

Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait

14) 상수 필드 상세 설명 (Field Detail)
클래스에 선언된 상수 필드가 어떤 내용을 제공하는지에 대한 설명

15) 생성자 상세 설명 (Constructor Detail)
생성자를 어떻게 사용하고, 매개변수에 어떤 값들이 제공되어야하는지, 어떤 리턴값을 제공하는지, 이 생성자에서 던지는(throw) 예외는 언제 발생하는지 확인 가능 / 생성자도 since & see also제공하는 경우 O

16) 메소드 상세 설명 (Method Detail)
length메소드 설명

지금까지 API내용 살펴봄 / 클래스 API상세 ㄴ용과 앞으로 배울 어노테이션 및 Enum클래스의 API내용도 상이 /

Deprecated (디프리케이티드)?
= 이제 이건 안쓴다는 의미
= 강력히 반대하다

Deprecated는 생성자, 상수필드, 메소드에 선언되어있음
JDK를 처음 만들었을때에 만들었지만 오류 발생 가능성으로 더 이상 가치가 없을 때 Deprecated로 처리됨

놔두는이유?
호환성 (Compatibility) : Java버전 올라갈 때 어떤 클래스의 print()라는 메소드를 없ㅇㄴ다고 할 때 A라는 시스템의 Java버전을 올라갈 버전으로 변경하려고할 때 가장 쉬운 방법은 JDK변경하고 컴파일
그런데 A시스템의 모든 클래스에서 print()메소드를 호출한다면 엄청난 컴파일 오류
이외에도 여러 발생 가능한 문제
-> 기존 만들었던 메소드를 쉽게 지울수 없어서

package c.api;
ㅤ
public class APICheck {
  public static void main(String[] args) {
    APICheck check = new APICheck();
    check.useDeprecated();
  }
ㅤㅤ
  public void useDeprecated() {
    String str = “abcde”;
    byte[] strBytes = str.getBytes();
    String convertedStr = new String(strBytes, 0);
  }
}

여기서 byte의 배열인 strBytes와 숫자 0을 매개변수로 갖는 String 클래스의 생성자는 Deprecated되었음

컴파일

C:godofjava>javac c/api/APICheck.java
Note: c\api\APICheck.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

첫번째 노트: APICheck라는 클래스는 deprecated된 API를 사용하거나 override한다고 말함
두 번째 노트: -Xlint:deprecation이라는 옵션을 주고 다시 컴파일하라고 말함

-> warning (경고), 에러가 아님
이클립스의 경우 생성자 이름에 줄을 쳐서 개발자들이 알 수 있게끔 알려줌
일반 에디터에서는 컴파일 할 때 알려주는 것이 당연
deprecated된 메소드의 API를 보면 대체 메소드나 생성자를 가이드해줌
(deprecated된 것들은 다 이유가 있음!!!)



Header와 Footer에 있는 링크들은 무엇인가?

첫줄
1) Overview : 전체 패키지에 대한 설명 화면으로 이동 / 자바에 어떤 패키지들이 존재하는지 /
(java.applet , java.awt, javax.swing, org.omg.CORBA로 시작하는 패키지는 거의 볼 일 없음)

2) Package : 패키지 메뉴를 클릭하면 현재 보고있는 클래스가 속해있는 패키지의 모든 인터페이스, 클래스, 예외 등의 모곡 및 간단한 설명을 확인가능

3) Class : 클래스에 대한 상세 설명

4) Use : JDK에 포함되어있는 패키지 및 클래스 중에서 현재 보고있는 패키지, 클래스, 인터페이스 등을 사용하는 모든 목록을 나열 /
ex. String클래스 보고있는 상태에서 Use메뉴를 누르면, PC성능에 따라 달라지겠지만 목록을 화면에 보여주는 시간 오래 소요, 왜냐하면 해당 클래스를 매개변수로 사용하는 모든 메소드의 목록까지도 보여줌
(처음보는 클래스가 어디에 사용되는지 확인하려고 할 때 참고하면 좋음)

5) Tree : 지금 보고있는 클래스가 속한 패키지에 있는 모든 클래스들이 어떤 상속관계를 갖고있는지 Tree형태로 제공

6) Deprecated : JDK에 포함되어있는 클래스나 메소드 중 앞에서 알아본 deprecated 클래스나 메소드의 목록을 제공

7) Index : A부터 Z까지의 알파벳을 클릭하면 각 알파벳에 해당하는 클래스, 인터페이스, 메소드, static변수 등의 색인을 오름차순으로 정렬하여 제공

8) Help : API문서에 대한 설명을 아주 간단하게 정리해놓은 화면

두번째줄
1) PREV CLASS : API목록 상에서 위에 선언된 클래스의 상세정보로

2) NEXT CLASS : API목록에 상에서 아래에 선언된 클래스의 상세정보로 이동

3) FRAMES : 지금까지 본 화면은 세개의 화면으로 분리된 FRAMES를 클릭했을때화면

4) NO FRAMES : 분리되어있는 화면 싫으면 HTML프레임 없는 한 화면

profile
Back-end-dev

0개의 댓글