The Java Language Specification, Third Edition (한국어판)
- 원서명The Java™ Language Specification, Third Edition (ISBN 9780321246783)
- 지은이James Gosling, Bill Joy, Guy Steele, Gilad Bracha
- 옮긴이허진영, 최선재, 이상민, 이정룡
- 감수자김형준
- ISBN : 9788960770072
- 36,000원
- 2008년 01월 02일 펴냄 (절판)
- 페이퍼백 | 704쪽 | 188*255mm
판매처
- 현재 이 도서는 구매할 수 없습니다.
책 소개
『The Java™ Language Specification, Third Edition』은 자바 언어를 만든 사람들이 직접 작성했으며, 자바 프로그래밍 언어의 기술 참고서적의 결정판이다.
언어 구조에 대한 정확한 의미를 알고자 하는 독자라면 이 책은 분명 훌륭한 지침서가 될 것이다.
이 책은 자바 프로그래밍 언어에 대한 완벽하고 정확하며 상세한 설명을 제공한다. 또한 2판 이후 새롭게 추가된 기능인 제네릭, 어노테이션, 단언문, 박싱/언박싱, 열거형, for-each 구문, 가변 길이 매개변수를 포함하는 메소드, 정적 임포트 등에 대한 완벽한 설명을 제공한다.
[ 책 소개 ]
자바 프로그래밍 언어는 범용적이고 병렬 수행이 가능한 클래스 기반의 객체지향 언어로, 많은 프로그래머들이 언어를 능숙하게 다룰 수 있도록 매우 단순하게 설계되었다. 자바 프로그래밍 언어는 C나 C++와 관련이 있지만 다소 다르게 체계화되었다. C와 C++의 일부 요소는 제외되었고, 다른 언어의 사상도 일부 포함되었다. 자바는 연구용 언어가 아니고 상용 언어이다. 호어(C. A. R. Hoare)가 발표한 언어 설계에 대한 논문을 토대로 최신 기술이나 검증되지 않은 부분은 배제했다.
자바 프로그래밍 언어는 타입에 대한 규칙이 엄격하다. 따라서 컴파일 시 에러(컴파일할 때 확인할 수 있으며 반드시 검증해야 하는 에러)와 실행 시 발생하는 에러를 확실히 구분한다. 컴파일은 프로그램을 CPU와 같은 하드웨어 아키텍처에 독립적인 바이트 코드 형태로 번역하는 작업을 의미한다. 실행은 프로그램을 수행하기 위해서 필요한 클래스를 로딩하고 링크하며, 선택적으로 기계어를 생성하고 동적으로 프로그램을 최적화하고, 프로그램을 수행하는 작업을 의미한다.
자바 프로그래밍 언어는 기계 표현의 세부 내용이 드러나지 않는 고급 언어이다. 명시적인 메모리 해제(C의 free나 C++의 delete와 같은) 작업 시 일어날 수 있는 문제를 피하기 위해서 가비지 콜렉터(GC, Garbage Collector)라는 자동 메모리 관리 기능을 사용한다. 실행 시 멈추는 현상을 최소화 하도록 고성능 가비지 콜렉터를 구현하여 시스템 프로그래밍과 실시간 응용 프로그램을 지원할 수 있다. 자바는 프로그램이 지정되지 않은 방식으로 수행되는 것을 방지하는 구조이다. 예를 들면 인덱스 점검을 하지 않고 배열에 접근하는 작업은 불가능하다.
자바 프로그래밍 언어는 일반적으로 바이트 코드 명령어 집합과 바이너리 형식으로 컴파일 된다. 이에 대한 내용은 『The Java™ Virtual Machine Specification, Second Edition』 (Addison-Wesley, 1999)에 잘 정리되어 있다.
[ 이 책의 구성 ]
2장에서는 자바의 어휘 및 구문 문법을 표현하기 위한 표기법(notation)에 대해서 설명한다.
3장에서는 C와 C++에 기반을 둔 자바 언어의 어휘 구조에 대해서 설명한다.
4장에서는 타입, 값, 변수에 대해서 설명한다.
5장에서는 형변환 및 수치 확장에 대해서 설명한다.
6장에서는 선언과 명명규칙, 의미 있는 이름을 정하는 방법에 대해서 설명한다.
7장에서는 패키지로 구성되는 프로그램의 구조에 대해 설명한다.
8장에서는 클래스에 대해서 알아본다.
9장에서는 인터페이스 타입에 대해서 알아본다.
10장에서는 배열에 대해 설명한다.
11장에서는 예외에 대해서 다룬다.
12장에서는 프로그램 수행 시 일어나는 동작에 대해서 알아본다.
13장에서는 바이너리 호환성에 대해서 알아본다.
14장에는 C와 C++에 기반을 둔 블록과 문장에 대해서 알아본다.
15장에서는 표현식에 대해 알아본다.
16장에서는 자바 언어에서 지역변수가 사용되기 전에 초기화 되어야 하는 것을 보장하는 방법에 대해서 자세히 다룬다.
17장에서는 Mesa라는 모니터 기반 병행처리 프로그래밍 언어에 기초한 스레드(thread)와 잠금(lock)에 대해서 알아본다.
18장에서는 구문 문법을 정리한다.
언어 구조에 대한 정확한 의미를 알고자 하는 독자라면 이 책은 분명 훌륭한 지침서가 될 것이다.
이 책은 자바 프로그래밍 언어에 대한 완벽하고 정확하며 상세한 설명을 제공한다. 또한 2판 이후 새롭게 추가된 기능인 제네릭, 어노테이션, 단언문, 박싱/언박싱, 열거형, for-each 구문, 가변 길이 매개변수를 포함하는 메소드, 정적 임포트 등에 대한 완벽한 설명을 제공한다.
[ 책 소개 ]
자바 프로그래밍 언어는 범용적이고 병렬 수행이 가능한 클래스 기반의 객체지향 언어로, 많은 프로그래머들이 언어를 능숙하게 다룰 수 있도록 매우 단순하게 설계되었다. 자바 프로그래밍 언어는 C나 C++와 관련이 있지만 다소 다르게 체계화되었다. C와 C++의 일부 요소는 제외되었고, 다른 언어의 사상도 일부 포함되었다. 자바는 연구용 언어가 아니고 상용 언어이다. 호어(C. A. R. Hoare)가 발표한 언어 설계에 대한 논문을 토대로 최신 기술이나 검증되지 않은 부분은 배제했다.
자바 프로그래밍 언어는 타입에 대한 규칙이 엄격하다. 따라서 컴파일 시 에러(컴파일할 때 확인할 수 있으며 반드시 검증해야 하는 에러)와 실행 시 발생하는 에러를 확실히 구분한다. 컴파일은 프로그램을 CPU와 같은 하드웨어 아키텍처에 독립적인 바이트 코드 형태로 번역하는 작업을 의미한다. 실행은 프로그램을 수행하기 위해서 필요한 클래스를 로딩하고 링크하며, 선택적으로 기계어를 생성하고 동적으로 프로그램을 최적화하고, 프로그램을 수행하는 작업을 의미한다.
자바 프로그래밍 언어는 기계 표현의 세부 내용이 드러나지 않는 고급 언어이다. 명시적인 메모리 해제(C의 free나 C++의 delete와 같은) 작업 시 일어날 수 있는 문제를 피하기 위해서 가비지 콜렉터(GC, Garbage Collector)라는 자동 메모리 관리 기능을 사용한다. 실행 시 멈추는 현상을 최소화 하도록 고성능 가비지 콜렉터를 구현하여 시스템 프로그래밍과 실시간 응용 프로그램을 지원할 수 있다. 자바는 프로그램이 지정되지 않은 방식으로 수행되는 것을 방지하는 구조이다. 예를 들면 인덱스 점검을 하지 않고 배열에 접근하는 작업은 불가능하다.
자바 프로그래밍 언어는 일반적으로 바이트 코드 명령어 집합과 바이너리 형식으로 컴파일 된다. 이에 대한 내용은 『The Java™ Virtual Machine Specification, Second Edition』 (Addison-Wesley, 1999)에 잘 정리되어 있다.
[ 이 책의 구성 ]
2장에서는 자바의 어휘 및 구문 문법을 표현하기 위한 표기법(notation)에 대해서 설명한다.
3장에서는 C와 C++에 기반을 둔 자바 언어의 어휘 구조에 대해서 설명한다.
4장에서는 타입, 값, 변수에 대해서 설명한다.
5장에서는 형변환 및 수치 확장에 대해서 설명한다.
6장에서는 선언과 명명규칙, 의미 있는 이름을 정하는 방법에 대해서 설명한다.
7장에서는 패키지로 구성되는 프로그램의 구조에 대해 설명한다.
8장에서는 클래스에 대해서 알아본다.
9장에서는 인터페이스 타입에 대해서 알아본다.
10장에서는 배열에 대해 설명한다.
11장에서는 예외에 대해서 다룬다.
12장에서는 프로그램 수행 시 일어나는 동작에 대해서 알아본다.
13장에서는 바이너리 호환성에 대해서 알아본다.
14장에는 C와 C++에 기반을 둔 블록과 문장에 대해서 알아본다.
15장에서는 표현식에 대해 알아본다.
16장에서는 자바 언어에서 지역변수가 사용되기 전에 초기화 되어야 하는 것을 보장하는 방법에 대해서 자세히 다룬다.
17장에서는 Mesa라는 모니터 기반 병행처리 프로그래밍 언어에 기초한 스레드(thread)와 잠금(lock)에 대해서 알아본다.
18장에서는 구문 문법을 정리한다.
목차
목차
- 1장 소개 1
- 1.1 예제 프로그램 5
- 1.2 표기법 5
- 1.3 이미 정의되어 있는 클래스, 인터페이스와의 관계 6
- 1.4 참고 문헌 6
- 2장 문법 8
- 2.1 문맥 자유 문법 8
- 2.2 어휘 문법 8
- 2.3 구문 문법 9
- 2.4 문법 표기법 9
- 3장 어휘 구조 13
- 3.1 유니코드 13
- 3.2 어휘 번역 14
- 3.3 유니코드 확장문자 15
- 3.4 라인 종결자 16
- 3.5 입력 요소 및 토큰 17
- 3.6 공백 18
- 3.7 주석 18
- 3.8 식별자 19
- 3.9 예약어 21
- 3.10 리터럴 21
- 3.10.1 정수 리터럴 22
- 3.10.2 부동 소수점 리터럴 24
- 3.10.3 Boolean 리터럴 27
- 3.10.4 문자 리터럴 27
- 3.10.5 문자열 리터럴 28
- 3.10.6 문자 리터럴과 문자열 리터럴의 확장 문자열 30
- 3.10.7 Null 리터럴 31
- 3.11 구분자 32
- 3.12 연산자 32
- 4장 타입, 값, 변수 33
- 4.1 타입의 종류와 값 34
- 4.2 기본자료형과 값 35
- 4.2.1 정수형과 값 36
- 4.2.2 정수 연산 36
- 4.2.3 부동소수점형, 형식, 값 38
- 4.2.4 부동소수점 연산자 40
- 4.2.5 boolean형과 boolean 값 43
- 4.3 참조자료형과 값 44
- 4.3.1 객체 45
- 4.3.2 Object 클래스 48
- 4.3.3 String 클래스 49
- 4.3.4 참조자료형이 동일할 경우 49
- 4.4 타입 변수 50
- 4.5 매개변수화 타입 52
- 4.5.1 타입 인자와 와일드카드 53
- 4.5.1.1 타입 인자 포함과 동등 55
- 4.5.2 매개변수화 타입의 구성 요소와 생성자 56
- 4.5.1 타입 인자와 와일드카드 53
- 4.6 타입 삭제 56
- 4.7 구체화 가능한 타입 57
- 4.8 원형 타입 58
- 4.9 교차 타입 62
- 4.10 하위타입화 63
- 4.10.1 기본자료형 사이의 하위타입화 63
- 4.10.2 클래스와 인터페이스 타입 사이의 하위타입화 64
- 4.10.3 배열 타입의 하위타입화 65
- 4.11 타입의 사용 65
- 4.12 변수 67
- 4.12.1 기본자료형 변수 67
- 4.12.2 참조자료형 변수 67
- 4.12.2.1 힙 오염 68
- 4.12.3 변수의 종류 69
- 4.12.4 final 변수 71
- 4.12.5 변수의 디폴트값 72
- 4.12.6 타입, 클래스, 인터페이스 73
- 5장 형변환과 확장 77
- 5.1 형변환의 종류 80
- 5.1.1 식별 형변환 80
- 5.1.2 기본자료형 확장 형변환 80
- 5.1.3 기본자료형 축소 형변환 82
- 5.1.4 기본자료형 확장 및 축소 형변환 84
- 5.1.5 참조자료형 확장 형변환 85
- 5.1.6 참조자료형 축소 형변환 85
- 5.1.7 박싱 형변환 86
- 5.1.8 언박싱 형변환 88
- 5.1.9 비확인 형변환 89
- 5.1.10 캡쳐 형변환 89
- 5.1.11 문자열 형변환 92
- 5.1.12 형변환 금지 92
- 5.1.13 값 집합 형변환 92
- 5.2 할당 형변환 93
- 5.3 메소드 호출 형변환 99
- 5.4 문자열 형변환 101
- 5.5 캐스팅 형변환 101
- 5.6 수치 확장 108
- 5.6.1 단항 수치 확장 108
- 5.6.2 이항 수치 확장 109
- 5.1 형변환의 종류 80
- 6장 이름 113
- 6.1 선언 114
- 6.2 이름과 식별자 115
- 6.3 선언의 유효범위 117
- 6.3.1 선언 감춤 119
- 6.3.2 모호한 선언 121
- 6.4 멤버와 상속 122
- 6.4.1 타입 변수의 멤버, 매개변수화 타입, 원형 타입, 교차 타입 122
- 6.4.2 패키지의 멤버 122
- 6.4.3 클래스 타입의 멤버 123
- 6.4.4 인터페이스 타입의 멤버 124
- 6.4.5 배열 타입의 멤버 125
- 6.5 이름의 의미 결정 126
- 6.5.1 문맥에 따른 이름의 구문 분류 127
- 6.5.2 문맥상 모호한 이름의 재분류 129
- 6.5.3 패키지명의 의미 131
- 6.5.3.1 단순 패키지명 131
- 6.5.3.2 한정 패키지명 131
- 6.5.4 패키지또는타입명의 의미 131
- 6.5.4.1 단순 패키지또는타입명 131
- 6.5.4.2 한정 패키지또는타입명 131
- 6.5.5 타입명의 의미 132
- 6.5.5.1 단순 타입명 132
- 6.5.5.2 한정 타입명 132
- 6.5.6 표현식명의 의미 134
- 6.5.6.1 단순 표현식명 134
- 6.5.6.2 한정 표현식명 135
- 6.5.7 메소드명의 의미 137
- 6.5.7.1 단순 메소드명 137
- 6.5.7.2 한정 메소드명 137
- 6.6 접근 제어 138
- 6.6.1 접근 가능성 결정 138
- 6.6.2 protected 접근 139
- 6.6.2.1 protected 멤버 접근 139
- 6.6.2.2 protected 생성자 한정 접근 139
- 6.6.3 접근 제어 예제 140
- 6.6.4 public과 비 public 클래스 접근 예제 141
- 6.6.5 필드, 메소드, 생성자의 디폴트 접근 예제 142
- 6.6.6 public 필드, 메소드, 생성자 접근 예제 143
- 6.6.7 protected 필드, 메소드, 생성자 접근 예제 143
- 6.6.8 private 필드, 메소드, 생성자 접근 예제 144
- 6.7 완전한정명과 정규명 145
- 6.8 명명 규칙 146
- 6.8.1 패키지명 147
- 6.8.2 클래스명과 인터페이스명 147
- 6.8.3 타입 변수명 148
- 6.8.4 메소드명 149
- 6.8.5 필드명 150
- 6.8.6 상수명 150
- 6.8.7 지역변수명과 매개변수명 151
- 7장 패키지 153
- 7.1 패키지 멤버 153
- 7.2 패키지를 위한 호스트 지원 154
- 7.2.1 파일 시스템에 패키지 저장하기 155
- 7.2.2 데이터베이스에 패키지 저장하기 156
- 7.3 컴파일 단위 157
- 7.4 패키지 선언 158
- 7.4.1 기명 패키지 158
- 7.4.1.1 패키지 어노테이션 158
- 7.4.2 무기명 패키지 159
- 7.4.3 패키지의 유효성 159
- 7.4.4 패키지 선언의 유효범위 160
- 7.4.1 기명 패키지 158
- 7.5 임포트 선언 160
- 7.5.1 단일 타입 임포트 선언 161
- 7.5.2 요청 타입 임포트 선언 163
- 7.5.3 단일 정적 임포트 선언 163
- 7.5.4 요청 정적 임포트 선언 165
- 7.5.5 자동 임포트 165
- 7.5.6 비정상적인 예 165
- 7.6 최상위 타입 선언 166
- 7.7 유일한 패키지명 170
- 8장 클래스 173
- 8.1 클래스 선언 174
- 8.1.1 클래스 제한자 175
- 8.1.1.1 추상 클래스 176
- 8.1.1.2 final 클래스 178
- 8.1.1.3 strictfp 클래스 178
- 8.1.2 제네릭 클래스와 타입 매개변수 178
- 8.1.3 내부 클래스와 인클로징 인스턴스 181
- 8.1.4 상위클래스와 하위클래스 183
- 8.1.5 상위인터페이스 185
- 8.1.6 클래스 바디와 멤버 선언 189
- 8.1.1 클래스 제한자 175
- 8.2 클래스 멤버 190
- 8.2.1 상속의 예 191
- 8.2.1.1 디폴트 접근을 갖는 상속 예제 191
- 8.2.1.2 public과 protected의 상속 192
- 8.2.1.3 private의 상속 193
- 8.2.1.4 접근 불가능한 클래스의 멤버에 대한 접근 193
- 8.2.1 상속의 예 191
- 8.3 필드 선언 195
- 8.3.1 필드 제한자 197
- 8.3.1.1 정적 필드 197
- 8.3.1.2 final 필드 198
- 8.3.1.3 transient 필드 199
- 8.3.1.4 volatile 필드 199
- 8.3.2 필드 초기화 200
- 8.3.2.1 클래스 변수 초기자 201
- 8.3.2.2 인스턴스 변수 초기자 202
- 8.3.2.3 초기화 중 필드 사용의 제한 202
- 8.3.3 필드 선언의 예 205
- 8.3.3.1 클래스 변수 숨김 예제 205
- 8.3.3.2 인스턴스 변수 숨김 예제 206
- 8.3.3.3 다중상속필드 예제 207
- 8.3.3.3 필드의 재상속 예제 209
- 8.3.1 필드 제한자 197
- 8.4 메소드 선언 210
- 8.4.1 형식 매개변수 211
- 8.4.2 메소드 서명 213
- 8.4.3 메소드 제한자 214
- 8.4.3.1 추상 메소드 215
- 8.4.3.2 정적 메소드 217
- 8.4.3.3 final 메소드 217
- 8.4.3.4 native 메소드 218
- 8.4.3.5 strictfp 메소드 219
- 8.4.3.6 synchronized 메소드 219
- 8.4.4 제네릭 메소드 220
- 8.4.5 메소드 리턴 타입 221
- 8.4.6 메소드 throws 절 222
- 8.4.7 메소드 바디 224
- 8.4.8 상속, 오버라이딩, 숨기기 224
- 8.4.8.1 인스턴스 메소드 오버라이딩 225
- 8.4.8.2 클래스 메소드 숨기기 226
- 8.4.8.3 오버라이딩과 숨기기의 조건 226
- 8.4.8.4 오버라이드 동등한 서명을 갖는
- 8.1 클래스 선언 174
- 메소드 상속하기 229
- 8.4.9 오버로딩 230
- 8.4.10 메소드 선언의 예 230
- 8.4.10.1 오버라이딩 예제 231
- 8.4.10.2 오버로딩, 오버라이딩, 숨기기 예제 231
- 8.4.10.3 부정확한 오버라이딩 예 232
- 8.4.10.4 오버로딩과 숨기기 비교 예제 232
- 8.4.10.5 숨겨진 클래스 메소드의 호출 예제 234
- 8.4.10.6 오버라이딩에 대한 예제 235
- 8.4.10.7 throws로 인한 부정확한 오버라이딩 예제 237
- 8.5 멤버 타입 선언 238
- 8.5.1 제한자 238
- 8.5.2 정적 멤버 타입 선언 238
- 8.6 인스턴스 초기자 239
- 8.7 정적 초기자 240
- 8.8 생성자 선언 240
- 8.8.1 형식 매개변수와 형식 타입 매개변수 241
- 8.8.2 생성자 서명 241
- 8.8.3 생성자 제한자 241
- 8.8.4 제네릭 생성자 242
- 8.8.5 생성자 throws 절 243
- 8.8.6 생성자의 타입 243
- 8.8.7 생성자 바디 243
- 8.8.7.1 명시적 생성자 호출 244
- 8.8.8 생성자 오버로딩 247
- 8.8.9 디폴트 생성자 247
- 8.8.10 클래스의 인스턴스화 막기 248
- 8.9 열거형 249
- 9.1 인터페이스 선언 260
- 9.1.1 인터페이스 제한자 260
- 9.1.1.1 추상 인터페이스 261
- 9.1.1.2 strictfp 인터페이스 261
- 9.1.2 제네릭 인터페이스와 타입 매개변수 261
- 9.1.3 상위인터페이스와 하위인터페이스 262
- 9.1.4 인터페이스 바디와 멤버 선언 263
- 9.1.5 인터페이스 멤버명에 대한 접근 263
- 9.1.1 인터페이스 제한자 260
- 9.2 인터페이스 멤버 264
- 9.3 필드(상수) 선언 264
- 9.3.1 인터페이스 내 필드의 초기화 265
- 9.3.2 필드 선언의 예 266
- 9.3.2.1 모호하게 상속된 필드 266
- 9.3.2.2 여러 번 상속된 필드 266
- 9.4 추상 메소드 선언 267
- 9.4.1 상속과 오버라이딩 268
- 9.4.2 오버로딩 269
- 9.4.3 추상 메소드 선언의 예 269
- 9.3.3.1 오버라이딩 예제 269
- 9.3.3.2 오버로딩 예제 270
- 9.5 멤버 타입 선언 270
- 9.6 어노테이션 타입 271
- 9.6.1 미리 정의된 어노테이션 타입 278
- 9.6.1.1 Target 278
- 9.6.1.2 Retention 278
- 9.6.1.3 Inherited 279
- 9.6.1.4 Override 279
- 9.6.1.5 SuppressWarnings 280
- 9.6.1.6 Deprecated 281
- 9.6.1 미리 정의된 어노테이션 타입 278
- 9.7 어노테이션 281
- 10.1 배열 타입 288
- 10.2 배열 변수 288
- 10.3 배열 생성 289
- 10.4 배열 접근 289
- 10.5 배열의 간단한 예 290
- 10.6 배열 초기자 290
- 10.7 배열 멤버 292
- 10.8 배열의 Class 객체 293
- 10.9 문자의 배열은 String이 아니다 294
- 10.10 배열 저장 예외 294
- 11.1 예외의 원인 298
- 11.2 컴파일 시 예외 검사 298
- 11.2.1 표현식의 예외 분석 299
- 11.2.2 문장의 예외 분석 299
- 11.2.3 예외 검사 300
- 11.2.4 에러를 검사하지 않는 이유 301
- 11.2.5 런타임 예외를 검사하지 않는 이유 301
- 11.3 예외 처리 301
- 11.3.1 예외의 정확성 302
- 11.3.2 비동기 예외 처리 303
- 11.4 예제 304
- 11.5 예외 계층 306
- 11.5.1 로드와 링크 에러 306
- 11.5.2 가상머신 에러 307
- 12.1 가상머신 기동 309
- 12.1.1 Test 클래스 로드 310
- 12.1.2 Test 클래스 링크: 검증, 준비, 분석 310
- 12.1.3 Test 클래스 초기화: 초기자 실행 311
- 12.1.4 Test.main 호출 312
- 12.2 클래스와 인터페이스 로딩 312
- 12.2.1 로딩 절차 313
- 12.3 클래스와 인터페이스 링크 314
- 12.3.1 바이너리 표현 검증 314
- 12.3.2 클래스나 인터페이스 타입 준비 315
- 12.3.3 기호 참조 분석 315
- 12.4 클래스와 인터페이스 초기화 316
- 12.4.1 초기화 실행 시 316
- 12.4.2 구체적인 초기화 절차 319
- 12.4.3 초기화: 코드 생성의 결과 321
- 12.5 클래스의 인스턴스 신규 생성 321
- 12.6 클래스 인스턴스 종료 325
- 12.6.1 종료 구현 326
- 12.6.1.1 메모리 모델과의 상호작용 328
- 12.6.2 비순차적 소멸자 호출 329
- 12.6.1 종료 구현 326
- 12.7 클래스와 인터페이스 언로딩 330
- 12.8 프로그램 종료 331
- 13.1 바이너리 형태 334
- 13.2 바이너리 호환성과 비호환성 337
- 13.3 패키지 변경 338
- 13.4 클래스 변경 339
- 13.4.1 추상 클래스 339
- 13.4.2 final 클래스 339
- 13.4.3 public 클래스 339
- 13.4.4 상위클래스와 상위인터페이스 339
- 13.4.5 클래스 형식 타입 매개변수 341
- 13.4.6 클래스 바디와 멤버 선언 341
- 13.4.7 멤버와 생성자로의 접근 343
- 13.4.8 필드 선언 344
- 13.4.9 final 필드와 생성자 346
- 13.4.10 정적 필드 349
- 13.4.11 transient 필드 349
- 13.4.12 메소드와 생성자 선언 349
- 13.4.13 메소드와 생성자의 형식 타입 매개변수 350
- 13.4.14 메소드와 생성자의 매개변수 351
- 13.4.15 메소드 리턴 타입 351
- 13.4.16 추상 메소드 351
- 13.4.17 final 메소드 352
- 13.4.18 native 메소드 353
- 13.4.19 정적 메소드 353
- 13.4.20 synchronized 메소드 353
- 13.4.21 메소드와 생성자의 throws 절 353
- 13.4.22 메소드와 생성자 바디 353
- 13.4.23 메소드와 생성자 오버로딩 354
- 13.4.24 메소드 오버로딩 355
- 13.4.25 정적 초기자 355
- 13.4.26 열거형의 변경 355
- 13.5 인터페이스의 변경 356
- 13.5.1 public 인터페이스 356
- 13.5.2 상위인터페이스 356
- 13.5.3 인터페이스 멤버 356
- 13.5.4 인터페이스 형식 타입 매개변수 357
- 13.5.5 필드 선언 357
- 13.5.6 추상 메소드 선언 357
- 13.5.7 어노테이션 타입의 변경 358
- 14.1 문장의 정상 및 비정상 종료 360
- 14.2 블록 361
- 14.3 지역 클래스 선언 361
- 14.4 지역변수 선언문 363
- 14.4.1 지역변수 선언자와 타입 364
- 14.4.2 지역변수 선언 유효범위 365
- 14.4.3 지역변수에 의한 이름 감춤 367
- 14.4.4 지역변수 선언의 실행 368
- 14.5 문장 368
- 14.6 빈 문장 370
- 14.7 라벨 있는 문장 371
- 14.8 표현문 372
- 14.9 if 문 373
- 14.9.1 if-then 문 373
- 14.9.2 if-then-else 문 374
- 14.10 assert 문 374
- 14.11 switch 문 378
- 14.12 while 문 382
- 14.12.1 비정상 종료 383
- 14.13 do 문 383
- 14.13.1 비정상 종료 384
- 14.13.2 예제 384
- 14.14 for 문 385
- 14.14.1 기본 for 문 385
- 14.14.1.1 for 문의 초기화 386
- 14.14.1.2 for 문의 반복 386
- 14.14.1.3 for 문의 비정상 종료 387
- 14.14.2 향상된 for 문 388
- 14.14.1 기본 for 문 385
- 14.15 break 문 390
- 14.16 continue 문 392
- 14.17 return 문 393
- 14.18 throw 문 394
- 14.19 synchronized 문 396
- 14.20 try 문 397
- 14.20.1 try-catch 실행 400
- 14.20.2 try-catch-finally 실행 401
- 14.21 도달 불가능한 문장 403
- 15.1 평가, 지시, 결과 409
- 15.2 값으로서의 변수 410
- 15.3 표현식의 타입 410
- 15.4 FP-strict 표현식 410
- 15.5 표현식과 실행 시 검증 411
- 15.6 평가의 정상 종료 및 비정상 종료 412
- 15.7 평가 순서 414
- 15.7.1 왼쪽 피연산자 우선 평가 414
- 15.7.2 연산 전 피연산자 평가 416
- 15.7.3 괄호와 우선순위를 고려한 평가 417
- 15.7.4 인자 목록의 좌측 우선 평가 418
- 15.7.5 그 밖의 표현식에 대한 평가 순서 419
- 15.8 기본 표현식 419
- 15.8.1 어휘 리터럴 420
- 15.8.2 클래스 리터럴 420
- 15.8.3 this 421
- 15.8.4 한정 this 422
- 15.8.5 괄호 표현식 422
- 15.9 클래스 인스턴스 생성식 423
- 15.9.1 인스턴스화할 클래스의 결정 424
- 15.9.2 인클로징 인스턴스 결정 425
- 15.9.3 생성자와 인자 선택 427
- 15.9.4 클래스 인스턴스 생성식의 실행 시 평가 427
- 15.9.5 익명클래스 선언 428
- 15.9.5 익명 생성자 428
- 15.9.6 예제 : 평가 순서와 Out-of-Memory 검출 429
- 15.10 배열 생성식 430
- 15.10.1 배열 생성식의 실행 시 평가 432
- 15.10.2 예제 : 배열 생성 평가 순서 433
- 15.10.3 예제 : 배열 생성과 Out-of-Memory 찾기 434
- 15.1 필드 접근식 435
- 15.11.1 기본 표현식을 이용한 필드 접근 435
- 15.11.2 super를 이용한 상위클래스 멤버 접근 438
- 15.12 메소드 호출식 440
- 15.12.1 컴파일 시 단계 : 찾을 클래스나 인터페이스 결정 440
- 15.12.2 컴파일 시 단계 2: 메소드 서명 결정 442
- 15.12.2.1 잠재적 적용가능 메소드 식별 443
- 15.12.2.2 페이즈 1: 하위타입화을 통해 적용가능한
- 15.12.2.3 페이즈 2: 메소드 호출 형변환을 통해
- 15.12.2.4 페이즈 3: 적용가능한
- 15.12.2.5 최적 메소드 선택 447
- 15.12.2.6 메소드 리턴 타입과 throws 타입 450
- 15.12.2.7 실인자에 기초한 타입 인자 추론 451
- 15.12.2.8 분석되지 않은 타입 인자 추론 466
- 15.12.2.9 예제 466
- 15.12.2.10 모호한 오버로딩 예제 468
- 15.12.2.1 리턴 타입 무시 예제 468
- 15.12.2.12 컴파일 시 분석 예제 469
- 15.12.4.1 (필요 시) 목표 참조 계산 473
- 15.12.4.2 인자 평가 474
- 15.12.4.3 타입과 메소드의 접근가능성 확인 475
- 15.12.4.4 호출 대상 메소드 위치 확정 476
- 15.12.4.5 프레임 생성, 동기화, 제어 이동 477
- 15.12.4.6 목표 참조와 정적 메소드 예제 479
- 15.12.4.7 평가 순서 예제 479
- 15.12.4.8 오버라이딩 예제 480
- 15.12.4.9 super를 이용한 메소드 호출 예제 482
- 15.13.1 실행 시 배열 접근 평가 483
- 15.13.2 배열 접근 평가 순서 예제 484
- 15.14.1 표현식명 486
- 15.14.2 후행 증가 연산자 ++ 486
- 15.14.3 후행 감소 연산자 -- 487
- 15.15.1 선행 증가 연산자 ++ 488
- 15.15.2 선행 감소 연산자 -- 489
- 15.15.3 단항 덧셈 연산자 + 489
- 15.15.4 단항 뺄셈 연산자 - 490
- 15.15.5 비트 보수 연산자 ~ 490
- 15.15.6 논리 보수 연산자 ! 491
- 15.17.1 곱셈 연산자 * 492
- 15.17.2 나눗셈 연산자 / 493
- 15.17.3 나머지 연산자 % 495
- 15.18.1 문자열 연결 연산자 + 497
- 15.18.1.1 문자열 형변환 497
- 15.18.1.2 문자열 연결 최적화 498
- 15.18.1.3 문자열 연결 예제 498
- 15.18.2 숫자형의 부가 연산자(+와 -) 500
- 15.20.1 숫자 비교 연산자 <, <=, >, >= 503
- 15.20.2 타입 비교 연산자 instanceof 504
- 15.21.1 숫자 동등비교 연산자 ==과 != 506
- 15.21.2 Boolean 동등비교 연산자 ==와 != 506
- 15.21.3 참조 동등비교 연산자 ==과 != 507
- 15.22.1 정수형 비트 연산자 &, ^, | 508
- 15.22.2 Boolean 논리 연산자 &, ^, | 508
- 15.26.1 단순 할당 연산자 = 513
- 15.26.2 복합 할당 연산자 519
- 16.1 명시적인 할당과 표현식 533
- 16.1.1 Boolean 상수식 533
- 16.1.2 Boolean 연산자 && 533
- 16.1.3 Boolean 연산자 || 534
- 16.1.4 Boolean 연산자 ! 534
- 16.1.5 Boolean 연산자 ?: 534
- 16.1.6 조건 연산자 ?: 535
- 16.1.7 boolean 형의 다른 표현식 535
- 16.1.8 할당 표현식 535
- 16.1.9 ++ 와 -- 연산자 536
- 16.1.10 나머지 표현식 536
- 16.2 명시적 할당과 문장 538
- 16.2.1 빈 문장 538
- 16.2.2 블록 538
- 16.2.3 지역 클래스 선언문 539
- 16.2.4 지역변수 선언문 540
- 16.2.5 라벨 있는 문장 540
- 16.2.6 표현문 540
- 16.2.7 if 문 541
- 16.2.8 assert 문 541
- 16.2.9 switch 문 542
- 16.2.10 while 문 542
- 16.2.11 do 문 543
- 16.2.12 for 문 543
- 16.2.12.1 초기화 부분 544
- 16.2.12.2 증가 부분 544
- 16.2.13 break, continue, return, throw 문 545
- 16.2.14 synchronized 문 545
- 16.2.15 try 문 545
- 16.3 명시적 할당과 매개변수 547
- 16.4 명시적 할당과 배열 초기자 547
- 16.5 명시적 할당과 열거형 상수 548
- 16.6 명시적 할당과 익명 클래스 548
- 16.7 명시적 할당과 멤버 타입 549
- 16.8 명시적 할당과 정적 초기자 549
- 16.9 명시적 할당과 생성자, 인스턴스 초기자 550
- 17.1 잠금(Locks) 554
- 17.2 예제 표기법 554
- 17.3 부적절하게 동기화된 프로그램의 동작 555
- 17.4 메모리 모델 557
- 17.4.1 공유 변수 558
- 17.4.2 액션 558
- 17.4.3 프로그램과 프로그램 순서 560
- 17.4.4 동기화 순서 561
- 17.4.5 선행(Happens-before) 순서 562
- 17.4.6 실행 567
- 17.4.7 올바르게 구성된(Well-formed) 실행 568
- 17.4.8 실행 및 인과관계 요구사항 568
- 17.4.9 식별 가능한 동작과 끝나지 않는 실행 571
- 17.5 Final 필드 의미론 573
- 17.5.1 Final 필드의 의미론 575
- 17.5.2 생성 중 Final 필드 읽기 576
- 17.5.3 Final 필드의 추후 수정 576
- 17.5.4 쓰기 방지(write-protected) 필드 578
- 17.6 워드 찢기(Word Tearing) 578
- 17.7 double과 long의 비 원자적(Non-atomic) 처리 580
- 17.8 대기 집합과 통보(Notification) 580
- 17.8.1 대기 580
- 17.8.2 통보(Notification) 582
- 17.8.3 인터럽션(Interruption) 582
- 17.8.4 대기, 통보, 인터럽션의 상호작용 583
- 17.9 일시 정지(sleep)와 양보(yidld) 583
관련 블로그 글
아듀 2007
오늘 에이콘의 107번째 책『Java Language Specification, Third Edition (한국어판)』이 출간되었습니다. 2007년의 마지막 날을 뜻깊게 마무리해준 이 책으로 올해 에이콘은 스물세권의 책을 펴냈습니다. 작년 결산에 이어 올해도 결산을 해봤는데요. 몇 권 더 나온 건데도 이젠 좀 멀리 떨어져 찍어야 한 화면에 모두 잡히는군요. :)
연말이고 한데 달리 드릴 건 없고, 몇 분의 근황이나 알려드릴게요.
[##_Gallery|6903313957.jpg||8404797921.jpg||9570777323.jpg||9257600021.jpg||2209539728.jpg||width="400" height="300"_##]오늘은 멀리 미국에서 유학 중인 해킹 보안 시리즈 에디터 강유님, 『와이어샤크를 활용한 실전 패킷 분석』의 두 분 역자 김경곤님, 장은경님과 점심 식사를 함께 했습니다. 이 자리에서 강유님은 역자 두 분이 싸인을 한 책을 받아들고 흐뭇해하셨죠. 자리를 함께 하지는 못했지만 윤근용님, 김홍석님이 좋은 책 만들어주시니 에이콘의 해킹 보안 시리즈는 앞으로도 독자분들께 좋은 책 많이 보여드릴 수 있을 것 같습니다.
매번 관리대상 역자 방문차원으로 NHN에 갈 때마다 다른 역자분들의 시기질투를 야기하신 양주일 UIT 센터장님, 장정환 Ajax UI 랩장님이 사무실에 오셔서 『초난감 기업의 조건』 홍보대사를 맡아주셨습니다. 두 분 승진도 축하드리고, 내년 3월에 나올 양주일 센터장님의 신간 기대하겠습니다. 그리고 사진에 담지는 못했지만, 오늘 에이콘을 방문해주신 역자 남기혁님과 오늘 처음 인연을 맺은 역자 김홍중님 등도 2007 에이콘의 마지막 날을 함께 해주신 분이군요.
이 모든 필자분들과 안팎에서 에이콘을 도와주시는 분들이 계시기에 하루하루 에이콘은 쑥쑥 자라나고 있습니다. 올 한해 동안 좋은 책 찾아주시고 번역 저술해주신 여러 역자, 저자님들과, 뜨거운 응원 보내주신 많은 분께 감사합니다. 그리고 무엇보다도 저희 책 사랑해주신 독자님들께 감사합니다. 많은 분의 따뜻한 사랑에 보답하기 위해 내년에도 에이콘은 최선을 다하겠습니다.
지난 1년을 돌아보니 글 목록만큼 참 많은 일이 있었네요. 이제 2007년도 두어 시간 남짓 남았습니다. 내년에는 이 글 읽으시는 분들 모두 건강하시고, 원하는 소망 모두 이루시길 빌어드릴게요.
오늘은 글이 왜 이렇게 우왕좌왕할까요. ^^; 2007년을 마감하면서 마지막으로 독자분들께 상큼한 하트를 날려드릴게요. 저희도 어느 좋은 분께 받은 선물인데 받은 만큼 돌려드려야죠! 열심히 블로그글을 쓰고 있는데도 책 이야기만 쓰지 말고 더 재미있는(!) 글 좀 써달라고 한 블로그 애독자 분을 위해서 짤방도 하나 올립니다. :)
예쁜 신입 직원이 날리는 하트 받으시고 내년엔 더욱 행복하세요! ^^ 새해 복 많이 받으세요!
연말이고 한데 달리 드릴 건 없고, 몇 분의 근황이나 알려드릴게요.
[##_Gallery|6903313957.jpg||8404797921.jpg||9570777323.jpg||9257600021.jpg||2209539728.jpg||width="400" height="300"_##]오늘은 멀리 미국에서 유학 중인 해킹 보안 시리즈 에디터 강유님, 『와이어샤크를 활용한 실전 패킷 분석』의 두 분 역자 김경곤님, 장은경님과 점심 식사를 함께 했습니다. 이 자리에서 강유님은 역자 두 분이 싸인을 한 책을 받아들고 흐뭇해하셨죠. 자리를 함께 하지는 못했지만 윤근용님, 김홍석님이 좋은 책 만들어주시니 에이콘의 해킹 보안 시리즈는 앞으로도 독자분들께 좋은 책 많이 보여드릴 수 있을 것 같습니다.
매번 관리대상 역자 방문차원으로 NHN에 갈 때마다 다른 역자분들의 시기질투를 야기하신 양주일 UIT 센터장님, 장정환 Ajax UI 랩장님이 사무실에 오셔서 『초난감 기업의 조건』 홍보대사를 맡아주셨습니다. 두 분 승진도 축하드리고, 내년 3월에 나올 양주일 센터장님의 신간 기대하겠습니다. 그리고 사진에 담지는 못했지만, 오늘 에이콘을 방문해주신 역자 남기혁님과 오늘 처음 인연을 맺은 역자 김홍중님 등도 2007 에이콘의 마지막 날을 함께 해주신 분이군요.
이 모든 필자분들과 안팎에서 에이콘을 도와주시는 분들이 계시기에 하루하루 에이콘은 쑥쑥 자라나고 있습니다. 올 한해 동안 좋은 책 찾아주시고 번역 저술해주신 여러 역자, 저자님들과, 뜨거운 응원 보내주신 많은 분께 감사합니다. 그리고 무엇보다도 저희 책 사랑해주신 독자님들께 감사합니다. 많은 분의 따뜻한 사랑에 보답하기 위해 내년에도 에이콘은 최선을 다하겠습니다.
지난 1년을 돌아보니 글 목록만큼 참 많은 일이 있었네요. 이제 2007년도 두어 시간 남짓 남았습니다. 내년에는 이 글 읽으시는 분들 모두 건강하시고, 원하는 소망 모두 이루시길 빌어드릴게요.
오늘은 글이 왜 이렇게 우왕좌왕할까요. ^^; 2007년을 마감하면서 마지막으로 독자분들께 상큼한 하트를 날려드릴게요. 저희도 어느 좋은 분께 받은 선물인데 받은 만큼 돌려드려야죠! 열심히 블로그글을 쓰고 있는데도 책 이야기만 쓰지 말고 더 재미있는(!) 글 좀 써달라고 한 블로그 애독자 분을 위해서 짤방도 하나 올립니다. :)
예쁜 신입 직원이 날리는 하트 받으시고 내년엔 더욱 행복하세요! ^^ 새해 복 많이 받으세요!
크리에이티브 커먼즈 라이센스 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
『The Java Language Specification』한국어판 출간
『The Java Language Specification, Third Edition (한국어판)』
James Gosling, Bill Joy, Guy Steele, Gilad Bracha 지음
허진영, 최선재, 이상민, 이정룡 옮김 | 김형준 감수
9788960770072 | 704페이지 | 36,000원 | 2007년 12월 31일 출간
James Gosling, Bill Joy, Guy Steele, Gilad Bracha 지음
허진영, 최선재, 이상민, 이정룡 옮김 | 김형준 감수
9788960770072 | 704페이지 | 36,000원 | 2007년 12월 31일 출간
... 어느 스승과 제자의 대화
“스승님. 어느 정도 기본은 됐으니, 이제 자바의 고수로 가는 길을 알려주십시오.”
“자, 이 책을 마늘과 양파를 먹으며 정독하도록 하여라.”
“아니, 이 책은 Java Language Specification이 아닙니까? 저는 JVM 같은 시스템 소프트웨어엔 별 취미가 없습니다. 응용프로그램을 잘 만들고 싶으니 다른 책을 권해주십시오.”
“아니, 스노보드를 타면서 왜 무릎을 세우고 바닥이 아닌 진행 방향을 바라봐야 하는지, 어떤 원리에 의해 조정이 가능한지도 모르면서 하프파이프부터 먼저 타려 하는 것이 말이 된다고 생각하느냐?”
- 옮긴이의 말 중에서
드디어 『The Java Language Specification, Third Edition』의 한국어판이 출간됩니다. 12월 31일에 출간되는 2007년 에이콘의 마지막 작품이 되겠네요. (물론 들뜬 연말 분위기에도 불구하고 에이콘의 비장한 마감 모드는 다음 주에도 쭈욱 이어진다고 하지요.) 1996년 초판이 발행된 이후, 2000년 2판, 그리고 이번에 저희가 번역 출간하는 이 책 3판까지 자바라는 언어를 샅샅이 파헤치고 분석한, 그야말로 자바 언어에 대한 바이블이라고 할 수 있습니다.
역자분이 옮긴이 서문에서 말씀하셨듯이 자바의 인기도에 비해 자바에 대한 책들은 그저 문법 소개나 활용에 대한 책들만 즐비했을 뿐 언어의 근원을 파헤치는 서적은 전무했습니다. 금번에 출간되는 『The Java Language Specification, Third Edition (한국어판)』으로 자바 프로그래밍 언어의 실체를 만나보시기 바랍니다.
지금 교보문고, YES24, 강컴, 인터파크, 알라딘 등에서 예약 주문을 받고 있습니다.
이 책의 역자분들을 만난 건 지난(!) 봄이었습니다. 당시 출간을 앞두고 있던『SOA: 서비스 지향 아키텍처』홍보차 삼성 SDS 자바 커뮤니티 세미나를 들렀다가, 지금은 NHN으로 자리를 옮기신, 당시 회장을 맡아 커뮤니티를 이끌던 김형준님을 처음 만나 인사를 나누면서 이길고도 질긴 인연의 끈이 시작되었던 거죠. 늘 사명을 품고 더 나은 개발자 세상을 만들기 위해 열심히 살아가시는 김형준님을 통해네 분의 역자를 소개받았습니다. 사당역 어디께선가 처음 뵈었던 서먹하던 자리에서부터, 그야말로 "명세서"를 번역해야하는 막중한부담감에 어려워하시던 역자분들과의 몇 차례에 거친 번역 미팅 등 그리고 그 수많은 독촉과 압박의 나날들. ^^ 막판 퇴고과정에서 온 원고지를 새빨갛게 물들일 정도의 열의로 끝까지 최선을 다해주신 네 분 역자들과 처음부터 끝까지 번역팀을 꾸려 끌고나가주신 김형준님께 진심으로 감사하단 말씀 전합니다. 모두 고생 많으셨습니다.
[##_Gallery|5894889475.jpg||6554417573.jpg||3775289010.jpg||5992399151.jpg||width="450" height="320"_##]올 여름 예쁜 아들을 낳은 최선재님(사진 왼쪽)과 그 아이의 아빠가 된 허진영님입니다.
출간에 임박한 마감의 날들은 사실 온 몸과 신경이 곤두섭니다. 필자분들은 한 글자라도 더 책에 정성을 넣으려고 열정을 쏟아내시고, 출간 일정과 책의 품질을 동시에 고려해야 하는 저희들간의 보이지 않는 암투가 벌어지기도 하죠.어제 오신 허진영님, 최선재님 두분은 보기만해도 즐거워지는 부부 역자셨습니다. 소울메이트가 바로 저런 두 분을 일컬어 나온 말인가보다라는 생각이 절로 들 정도로 소근소근 의견을 나누며 일하시는 모습은 옆에서 봐도 부러웠으니까요. 게다가 모든 필자분들이 그러하셨지만, 늦어지는 마감 원고 리뷰에도 활짝 핀 웃음 잃지 않으시고 즐겁게 작업하시는 모습이 참 좋았습니다. 재깍재깍 평시의 3배 속도로 정신없이 달려가는 시계 초침도 그럴 때는 즐거운 리듬악기처럼 들리기도 한답니다. 힘들었을 텐데도 밝게 웃음 머금은 얼굴 늘 잃지 않고 열심히 일하는 직원들에게도 참 고맙다는 말 슬쩍 전해봅니다.
참, 마감을 하던 어제 밤에는 『Ajax 패턴과 베스트 프랙티스』의 역자 최재훈님께서 이쁜 친구들을 잔뜩 데리고 회사에 들러주셨습니다. 안 그래도 아기자기한 저희 에이콘이 더욱 알콩달콩해질 것 같습니다. :) 저희는 최재훈님께 오신 기념으로 멋진 원서를 한 권 안겨드렸습니다. 번역하실 책으로요~ ^^; 기쁘셨죠? 이래저래 정말 감사합니다!
올해는 이것저것 바쁘다는 핑계로 가까이 계신 고마운 분들께 인사도 제대로 드리지 못했는데, 맛있는 먹거리를 보내주기도 하시며 불쑥 전해오시는 여러분들의 따뜻한 마음에 가슴이 훈훈해집니다. 물론 표현하지 않으시는 수많은 독자분과 필자분들이 저희들 아껴주시는 감사한 마음은 너무 잘알고 있습니다요. :-)
모두 건강하시고 남은 2007년의 마지막 주도 잘 마무리하시기 바랍니다! 감사하는 마음으로 바라보면 모든 세상이 참 따뜻해지더군요. 행복한 주말 보내세요.
크리에이티브 커먼즈 라이센스 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
도서 오류 신고
정오표
[ p53 박스 내 ]
WildcardBounds:
extends ReferenceType
52super ReferenceType
↓
WildcardBounds:
extends ReferenceType
super ReferenceType
WildcardBounds:
extends ReferenceType
52super ReferenceType
↓
WildcardBounds:
extends ReferenceType
super ReferenceType