1. 개념
상속이란, 부모 클래스의 필드와 메서드를 자식 클래스가 물려받는 것이다.
부모 클래스 == 슈퍼 클래스
자식 클래스 == 서브 클래스
❗상속의 장점
코드 중복을 제거하여 클래스가 간결해진다.
클래스를 계층적으로 분류하여 관리하기가 용이하다.
클래스를 재사용하고 확장이 용이하므로 소프트웨어의 생산성이 향상된다.
class Rabbit extends Animal{ ... }
자바에서의 클래스는 다중 상속을 지원하지 않는다.
모든 클래스는 Object 클래스를 상속받게 된다.
2. 접근 지정자
private | default | protected | public | |
같은 패키지에 있는 클래스 | X | O | O | O |
다른 패키지에 있는 클래스 | X | X | X | O |
같은 패키지에 있는 서브 클래스 | X | O | O | O |
다른 패키지에 있는 서브 클래스 | X | X | O | O |
3. 캐스팅(Casting)
캐스팅(Casting)이란 타입 변환을 의미한다.
❗업캐스팅(Upcasting)
Person p;
Student s = new Student();
p = s;
슈퍼 클래스의 레퍼런스 변수가 서브 클래스 객체를 가리키는 것을 업캐스팅이라고 한다.
p로는 Person클래스의 멤버만 접근할 수 있다.
즉, 업캐스팅한 레퍼런스는 슈퍼 클래스의 멤버에만 접근할 수 있다.
(알아서 자동형변환되기 때문에 p = (Person)s; 라고 해주지 않아도 괜찮다.)
❗다운캐스팅(Downcasting)
Person p = new Student();
Student s = (Student) p;
업캐스팅된 것을 다시 되돌리는 것을 다운캐스팅이라고 한다.
반드시 (Student)를 붙여서 형변환하는 것을 나타내주어야 오류가 발생하지 않는다.
❗instanceof 연산자
메서드에서 전달받은 레퍼런스 변수가 어떤 객체를 가리키고 있는지 알 수 없다.
이럴 때 instanceof 연산자를 이용하여 확인해볼 수 있다.
Person p = new Student();
if (p instanceof Person) {...} // true
if (p instanceof Student) {...} // true
클래스에만 적용할 수 있다.
4. 메서드 오버라이딩
5. 추상 클래스
❗추상 메소드
public abstract void setId(Long id);
**abstract 키워드를 사용하여 선언만 하고 코드는 작성하지 않는다.**
❗추상 클래스
abstract class Person{
public void run() { ... }
abstract public void eat();
}
추상 메서드를 지니고 있다면, 반드시 추상 클래스로 선언되어야 한다.
추상 클래스로는 객체를 생성할 수 없다.
❓ 추상 메서드가 미완성 상태이기 때문이다.
abstract class Student extends Person{
public void study() { ... }
}
마찬가지로 상속을 받은 서브 클래스도 추상 클래스여야 한다. 추상 메서드를 그대로 상속받기 때문이다. 추상 메서들를 @Override해주어 구현해준다면 abstract을 붙이지 않아도 괜찮다.
❕슈퍼 클래스의 메서드 오버라이딩
만약 Student에서 오버라이딩을 해주지 않는다면 문제가 발생할까? 전혀 문제가 없다.!
❕추상 클래스의 추상 메서드 오버라이딩
그렇다면 추상 클래스를 상속받은 경우에는 어떨까?? Student 클래스에서 오버라이딩을 하지 않는 경우엔, 반드시 오버라이딩을 해주어야 하기 때문에 오류가 발생한다.
책의 목차를 정해주면 해당 목차의 내용이 반드시 존재해야 하는 것처럼, 기본적인 방향을 잡아주는 역할이라고 할 수 있다.
설계 ⇒ 구현
6. 인터페이스
인터페이스는 사물과 사물 사이, 사물과 인간 사이에서 상호 간의 소통을 위한 장치나 프로토콜을 의미한다. 서로 다른 장치간의 데이터를 주고 받기 위한 규격이다.
interface Person{
public static final int I = 10; // public static final 생략 가능
public abstract void eat(); // public abstract 생략 가능(고정되어 있기 때문)
public default void print() {System.out.println("print");} // public 생략 가능(고정되어 있기 때문)
}
- 상수, 추상 메서드
- default 메서드
- private 메서드
- static 메서드
인터페이스도 추상 클래스처럼 객체를 생성할 수 없다.
인터페이스끼리는 상속이 가능하다.
인터페이스를 상속받았다면, 모든 추상 메서드를 구현해야 한다.
❗인터페이스 구현
class Student implements Person{
public void eat() { System.out.println("Student eat"); }
public void print2() { System.out.println("Student"); }
}
Person 인터페이스의 추상 메서드인 eat을 구현해주어야 하며, default 메서드였던 print는 그대로 물려받는다.
❗인터페이스 상속
interface Professor extends Person{
void study();
}
Person 인터페이스에 있던 I, eat( ), print( )와 study( )까지 총 4개의 멤버를 지니게 된다.
interface A extends Professor, Student{
...
}
인터페이스는 다중 상속이 가능하다.
❕목적
동일한 인터페이스를 가지고 그 속의 동일한 메서드를 이용하여 구현되는 내용들을 서로 다르다.
바로 다형성이 실현되는 것이다.
⚠️ 추상 클래스 vs. 인터페이스
추상 클래스 | 서브 클래스에서 대부분의 기능이 구현되며, 추상 메서드를 서브 클래스에서 구현할 수 있도록 한다. | 추상 메서드 일반 메서드 상수와 변수가 포함된다. |
인터페이스 | 목적에 따라 인터페이스의 추상 메서드를 구현하도록 한다. | 변수 필드는 포함하지 않는다. 상수, 추상 메서드, 일반 메서드, default 메서드, static 메서드가 포함된다. protected 접근 지정자 X 다중 상속을 지원한다. |