모르는 것만 짧고 빠르게 정리한 노트입니다.
2.2 오버라이딩의 조건
조상 클래스이 메서드를 자손 클래스에서 오버라이딩 할 때,
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스이 메서드보다 많이 선언할 수 없다.
- 인스턴스메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.
책에서는 예외 부분을 굉장히 간단하게 설명하는 것 같아, 따로 더 정리했다.
[Java의 정석] 7.2 메소드 오버라이딩 시 예외 선언
책에서는 예외 부분을 굉장히 간단하게 설명이 되어있는 것 같아, 더 구체적인 자료를 찾아봄 "예외는 조상 클래스이 메서드보다 많이 선언할 수 없다." 라고 적혀있지만, 엄밀히 말하면 checked
letsmakemyselfprogrammer.tistory.com
3.2 패키지의 선언
- 패키지 선언문은 반드시 소스파일에서 주석과 공백을 제외한 첫 번째 문장이어야 한다.
- 패키지 명은 대소문자를 모두 허용하지만, 클래스명과 쉽게 구분하기 위해서 소문자로 하는 것을 원칙으로 한다.
- 모든 클래스는 반드시하나의 패키지에 포함되어야한다.
- 패키지 명을 선언하지 않으면 'unnamed package' 에 포함된다. 따라서 패키지를 지정하지 않은 모든 클래스들은 모두 같은 패키지에 속하는 셈이 된다.
- 컴파일 옵션 -
# 바이트코드(PackageClass.class)로 컴파일하고 해당 디렉토리에 저장
javac -d ~/com/inhabas/javastudy/ PackageClass.java
# 실행
java com.inhabas.javastudy.PackageClass # (클래스패스가 설정된 경우)
java -cp ~/com/inhabas/javastudy/ com.inhabas.javastudy.PackageClass # (클래스패스 지정)
4.1 제어자
- 접근제어자 : public, protected, default, private
- 그 외 : static, final, ababstract, native, transient, synchronized, volatile, strictfp
- 접근 제어자는 중첩해서 사용할 수 없다.
- 하나의 대상에 여러 제어자를 조합하여 사용하는 것이 가능하다.
4.2 static 초기화 블럭
class StaticTest {
static int a = 1;
static int b = 2;
static {
// static 변수의 복잡한 초기화 수행
}
(...생략...)
}
4.3 final
- final 클래스 : 확장될 수 없는 클래스가 된다. 다른 클래스이 조상이 될 수 없다.
- final 메서드 : 오버라이딩을 통해 재정의될 수 없다.
- final 멤버변수, 지역변수 : 값이 변경될 수 없다.
4.4 abstact
- abstract 클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
- abstract 메서드 : 아직 구현되지 않은 추상 메서드임을 알린다.
4.5 접근 제어자
(참고) 접근 제어자와 상속

5.2 참조변수의 형변환
- 형변환은 참조변수의 타입을 변환하는 것. 실제 인스턴스는 아무런 영향이 없다. 형변환을 통해서 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위를 조절하는 것 뿐이다.
- 실제 인스턴스가 조상타입인데, 자손 타입으로 참조되는 것은 런타임에러를 발생시킨다.
- 따라서 instanceof 연산자를 이용해, 실제 인스턴스가 해당 타입으로 형변환이 가능한지 검사해야 안전하다.
5.4 참조변수와 인스턴스의 연결
: (실제 인스턴스는 자식, 참조변수의 타입이 조상인 경우) 멤버변수는 참조변수 타입인 조상, 멤버 메소드는 실제 인스턴스의 메소드가 호출된다.
5.5 여러 종류의 객체를 배열로 만들기
: 조상 타입의 참조변수를 이용해 배열을 만들면 된다. java.util.Vector 클래스는 Object 객체를 이용해서 모든 객체를 담을 수 있다.
7.1 인터페이스
: 추상 클래스보다 추상화 정도가 높아서, 일반메서드와 일반 멤버변수를 가질 수 없다. 추상 메서드와 상수만을 멤버로 가질 수 있다.
7.2 인터페이스의 작성
- 모든 멤버변수는 public static final 이어야 하며, 생략가능
- 모든 메서드는 public abstract 이어야 하며, 생략 가능 (단 jdk1.8 부터 static메서드와 디폴트 메서드가 추가됨.)
7.3 인터페이스 상속
: 인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와 달리 다중상속 가능하다.
7.4 인터페이스 구현
: 인터페이스의 모든 메서드를 구현해야하며, 일부만 구현하고자 한다면 추상클래스로 만들어서 구현하지 않는 메소드를 abstract 로 선언해야한다.
7.9 디폴트 메서드와 static 메서드
- static 메서드 : jdk 1.8 이전에는 자바 규칙을 단순화하기 위해 인터페이스의 모든 메서드는 추상 메서드여야 한다는 규칙에 예외를 두지 않았다. 그래서 해당 인터페이스와 관련된 static 메서드는 별도의 클래스에 따로 두어야 했다. (ex. Object-Objects, Collection-Collections,,)
- default 메서드 : 인터페이스가 변경될 경우에, 이 인터페이스를 상속받은 모든 클래스를 변경해야한다. 이런 문제로 디폴트 메서드가 생겨났다. 디폴트 메서드는 추상메서드가 아닌 구현되어 있는 메서드이다. default 키워드를 붙이며 일반 메서드처럼 몸통{} 이 있어야한다. 접근 제어자는 public 이며 생략가능하다.
- (여러 인터페이스의 디폴트 메서드 간의 충돌) : 구현 클래스에서 오버라이딩 해야한다.
- (인터페이스와 조상 클래스 간의 충돌) : 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
8.1 내부 클래스
- 인스턴스 클래스 : 외부 클래스의 멤버변수 선언위치에 선언, 인스턴스 멤버처럼 다루어진다.
- 스태틱 클래스 : 외부 클래스의 멤버변수 선언위치에 선언, static 멤버처럼 다루어진다.
- 지역 클래스 : 외부 클래스의 메서드나 초기화 블럭 안에 선언, 선언된 영역 내부에서만 사용. 시역변수는 상수만 접근 가능하다. 지역변수에 final 을 붙이지 않고 접근하면 jdk 1.8 부터는 오류를 내지 않고 컴파일러가 암묵적으로 final로 처리한다.
- 익명 클래스 : 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 일회용 클래스
8.4 내부클래스의 제어자와 접근
- 컴파일 했을 때 생성되는 파일명은 '외부 클래스명$내부클래스명.class' 형식으로 된다.
- 지역내부 클래스는 다른 메서드에 같은 이름의 내부 클래스가 존재할 수 있기 때문에 내부 클래스명 앞에 숫자가 붙는다. ('외부 클래스명$1내부클래스명.class' 또는 '외부 클래스명2$내부클래스명.class')
- 내부 클래스와 외부 클래스에 선언된 변수의 이름이 같을 때, 'this', '외부클래스명.this' 를 붙여서 서로 구별한다.
8.5 익명 클래스
- 조상클래스나 인터페이스의 이름을 사용해서 정의. -> 여러 개 상속 못함.
- 컴파일 하면 '외부클래스명$숫자.class' 의 형식으로 생성된다.
'Java > Java의 정석' 카테고리의 다른 글
[Java의 정석] 08. 예외 처리 (0) | 2022.03.17 |
---|---|
[Java의 정석] 7.2 메소드 오버라이딩 시 예외 선언 (0) | 2022.03.14 |
[Java의 정석] 06. 객체지향 프로그래밍 (0) | 2022.03.08 |
[Java의 정석] 05. 배열 (0) | 2022.03.05 |
[Java의 정석] 04. 조건문 (0) | 2022.03.05 |