1. 클래스
- 클래스를 정의할 때는 아래와 같이 한다.
[접근제어자] [final | abstract] class 식별자 [extends 슈퍼클래스 | implements 인터페이스] {
...
}
- 중괄호 내에는 필드와 메소드를 선언한다.
- 부모 클래스를 확장하는 자식 클래스를 정의할 때 extends 키워드를 사용한다.
- 인터페이스를 구현하는 클래스인 경우 인터페이스에 정의된 메소드를 반드시 구현해야 한다.
- 어떤 클래스가 다른 클래스 내에서 정의된 경우 이를 내부 클래스라 한다.
- 그렇지 않은 클래스를 외부 클래스 또는 톱레벨 클래스라 한다.
- 클래스의 접근제어자를 생략하는 경우 동일 패키지 내에 있는 다른 클래스에서 참조가 가능하다.
- 접근제어자의 생략은 package-private라고 부른다.
- 접근제어자의 범위는 public > protected > 생략 > private 순으로 넓다.
- 외부 클래스는 public 또는 생략된 접근제어자만 가질 수 있다.
- 내부 클래스는 모든 종류의 접근제어자를 가질 수 있다.
2. 필드와 메소드
- static 필드는 객체화되지 않은 클래스를 통해서 참조가 가능한 공유 필드이다.
- static이 아닌 필드는 인스턴스 필드라고 부르며, 각 객체가 배타적으로 소유한다.
- final 필드는 선언과 동시에 초기화하여야 한다.
- public 메소드는 모든 곳에서 참조 가능하다.
- protected 메소드는 클래스 내부, 동일 패키지 내부, 다른 패키지에 존재하는 서브클래스에서도 참조 가능하다.
- 접근제어자가 생략된 경우 클래스 내부, 동일 패키지 내부에서 참조 가능하다.
- private 메소드는 클래스 내부에서만 참조 가능하다.
- 복습: 접근제어자의 범위는 public > protected > 생략 > private 순이다.
- final 메소드는 오버라이딩이 불가하다.
- final 클래스는 서브클래스를 가질 수 없다.
- 메소드를 오버라이드 할 때는 부모클래스의 메소드와 식별자, 반환형이 일치해야 한다.
- 오버라이드 된 메소드의 접근제어자를 더 넓은 접근제어자로 변경할 수 있다.
- this를 사용하여 객체의 필드를 참조할 수 있다.
- 인스턴스 필드 또는 인스턴스 메소드를 참조할 때는 this를 생략할 수 있다.
- super를 사용하여 부모클래스의 필드를 참조할 수 있다.
- this()와 super()는 생성자의 맨 앞 부분에 사용한다.
- this()는 동일한 클래스의 또다른 생성자를 호출하는 데 사용된다.
- super()는 부모클래스의 생성자를 호출하는 데 사용된다.
2. 연습문제 요약
- Java에는 전역 변수가 없다.
- 접근제어자
public | protected | 생략 | private |
모든 곳 | 동일 패키지 내부 + 타 패키지의 서브클래스 |
동일 패키지 내부 | 클래스 내부 |