👉🏻 이 글은 자바의 정석(3판) Chapter7을 공부하며 쓴 글입니다.
상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
class 자식클래스 extends 부모클래스 {
// ...
}
+ 접근제어자가 private 또는 default인 멤버들은 상속되지 않는다기보다 상속은 받지만 자손 클래스로부터의 접근이 제한되는 것이다.
자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에 따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다.
➡️ 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.
단일 상속 (다중 상속 X)
Ex. Circle 과 Point
class Circle {
int x;
int y;
int r;
}
⬇️ Point 클래스 재사용 (포함관계)
class Circle {
Point p = new Point();
int r;
}
한 클래스를 작성하는 데 다른 클래스를 멤버 변수로 선언.
( Ex. Car <- Engine, Door ..... )
⬇️ (상속관계)
class Circle extends Point{
int r;
}
Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 조상 클래스이다.
다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받게 함으로써 이것을 가능하게 한다.
(다른 클래스로부터 상속을 받지 않는 클래스들도 컴파일하면 extends Object를 자동적으로 추가하여 Object 클래스로부터 상속받게 한다.
- 오버라이딩이란?
: 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것.
= 선언부가 일치해야 한다.
오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것. ( new )
오버라이딩 : 상속받은 메서드의 내용을 변경하는 것. ( change, modify )
: 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다.
조상 클래스의 멤버와 자손 클래스의 멤버가 중복 정의되어 서로 구별해야 하는 경우에만 super를 사용하는 것이 좋다.
: 조상 클래스의 생성자를 호출하는데 사용된다.
Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자 this() 또는 super()를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 super();를 생성자의 첫 줄에 삽입한다.
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
super(x, y); // 조상 클래스의 생성자 Point(int x, int y)를 호출.
this.x = x;
this.y = y;
this.z = z;
}
}
조상 클래스의 멤버변수는 이처럼 조상의 생성자에 의해 초기화되도록 해야 한다는 것이다.
패키지란, 클래스와 인터페이스의 묶음이다.
클래스가 물리적으로 하나의 클래스파일인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다.
Ex. String클래스 -> java.lang.String클래스 (패키지명을 포함한 이름)
package 패키지명; // 패키지 선언
모든 클래스는 반드시 하나의 패키지에 속해야 한다.
: 패키지를 선언하지 않으면 자바에서 기본적으로 제공하는 '이름없는 패키지(unnamed package)'에 들어간다.
패키지는 물리적으로 클래스 파일을 포함하는 하나의 '디렉토리'이다.
import 패키지명.클래스명;
import java.util.Date;
//or
import 패키지명.*;
import java.util.*;
위 둘의 실행 시 성능상의 차이는 전혀 없다.
크게 접근 제어자와 그 외로 나뉜다.
: 마지막의, 변경될 수 없는
: 추상의, 미완성의
클래스에 final 과 같이 사용할 수 X
메서드에 static, private 와 같이 사용할 수 X
private : 같은 클래스 내에서만 접근 가능
default : 같은 패키지 내에서만 접근 가능
protected : 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근 가능
public : 접근 제한이 전혀 없음
: '여러가지 형태를 가질 수 있는 능력'
자손 타입 -> 조상 타입 : 업캐스팅 (형변환 생략 가능)
자손 타입 <- 조상 타입 : 다운캐스팅 (형변환 생략 불가능)
Car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
car = fe; // 형변환(Car) 생략. 업캐스팅
fe2 = (FireEngine) car; // 형변환 생략 불가. 다운캐스팅
인터페이스는 일종의 추상 클래스이다. 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통만 갖춘 일반 메서드나 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만 멤버로 가질 수 있다.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값; //final int PI=3; (편의상 생략 가능)
public abstract 메서드이름(매개변수목록);
}
모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
모든 메서드는 public abstract 이어야 하며, 생략가능하다.
다중 상속 가능
Ex.
interface Fightable extends Moveable, Attackable { }
class 클래스이름 implements 인터페이스이름 {
//인터페이스에 정의된 추상메서드 구현
}
class Fighter implements Fightable {
public void move(int x, int y) { /*구현부 생략*/ }
public void attack(Unit u) { /*구현부 생략*/ }
}