기존 클래스를 재사용하여 새로운 클래스를 작성하는 것
상속 관계 : '~은 ~이다.(is-a)'
포함 관계 : '~은 ~을 가지고 있다.(has-a)'
자바에서는 오직 단일 상속만을 허용
다중상속은 클래스간의 관계가 매우 복잡해지고, 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 방법이 없는 단점이 있기 때문
모든 클래스 상속계층도의 최상위에 있는 조상클래스
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)
super : 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수
상속받은 멤버와 자신의 멤버와 이름이 같을 때 super를 붙여서 구별할 수 있음
super() : 조상 클래스의 생성자를 호출하는데 사용
Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 this() 또는 super()를 호출해야 함. 그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자 첫 줄에 삽입
접근 제어자 : public, protected, default, private
그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp
사용되는 곳 - 멤버변수, 메서드, 초기화 블럭
| 제어자 | 대상 | 의미 |
|---|---|---|
| static | 멤버변수 | - 모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다. - 클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다. - 클래스가 메모리에 로드될 때 생성된다. |
| 메서드 | - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다. - static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다. |
사용되는 곳 - 클래스, 메서드, 멤버변수, 지역변수
| 제어자 | 대상 | 의미 |
|---|---|---|
| final | 클래스 | 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다. (=자신을 확장하는 자손클래스 정의 X) |
| 메서드 | 변경될수 없는 메서드 final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다. | |
| 멤버변수/지역변수 | 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다. |
사용되는 곳 - 클래스, 메서드
| 제어자 | 대상 | 의미 |
|---|---|---|
| abstract | 클래스 | 클래스 내에 추상 메서드가 선언되어 있음을 의미한다. |
| 메서드 | 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다. |
멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할
사용되는 곳 - 클래스, 멤버변수, 메서드, 생성자
private : 같은 클래스 내에서만 접근이 가능
default : 같은 패키지 내에서만 접근이 가능
protected : 같은 패키지 내에서, 그리고 패키지에 관계없이 상속관계에 있는 자손클래스에서 접근이 가능
public : 접근 제한이 전혀 없음
public > protected > (default) > private
public class Singleton {
// 2. 내부에서는 private 접근 가능하므로 직접 객체 생성, 객체가 한개만 생성되게 제한되어야 함
// 4. static에서 인스턴스 바로 접근 못하니까 getInstance()에서 접근할 수 있도록 static으로
private static Singleton s = null; // 중복 객체 생성을 막기 위해 null로 초기화
// 1. 외부에서 생성자 접근하지 못하게 하기 위해 생성자의 접근 제어자를 private으로
private Singleton(){}
// 3. 외부에서 private 멤버에 접근 못하기 때문에 getter 생성
// 4. 외부에서 접근 못하니까 객체 없이 외부에서 접근할 수 있도록 static으로
public static Singleton getInstance() {
if(s == null) { // 객체가 이미 생성되었는지 판단
s = new Singleton();
}
return s;
}
}
| 대상 | 사용가능한 제어자 |
|---|---|
| 클래스 | public, (default) / final, abstract |
| 메서드 | public, protected, (default), private / final, abstract, static |
| 멤버변수 | public, protected, (default), private / final, static |
| 지역변수 | / final |
메서드에 static과 abstract를 함께 사용할 수 없다.
static메서드는 몸통이 있는 메서드에만 사용할 수 있기 때문이다.
클래스에 abstract와 final을 동시에 사용할 수 없다.
클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고 abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문이다.
abstract메서드의 접근 제어자가 private일 수 없다.
abstract메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손클래스에서 접근할 수 없기 때문이다.
메서드에 private과 final을 같이 사용할 필요는 없다.
접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중 하나만 사용해도 의미가 충분하다.