티스토리 뷰
728x90
상속관계 vs 포함관계
- 상속관계 : is-a (A truck is a car.)
class Truck extends Car {
// ...
}
- 포함관계 : has-a (A truck has a wheel.) → 멤버로 갖는다.
class Car {
int wheel = 4;
// ...
}
오버라이딩 vs 오버로딩
- 오버라이딩 (overriding)
- 조상으로부터 상속받은 메서드의 내용을 변경하는 것이다.
- 조상보다 좁은 범위의 접근제어나 예외선언 불가능하다.
- 오버로딩 (overloading)
- 매개변수의 수나 타입을 다르게하여, 기존에 없는 새로운 메서드를 정의하는 것이다.
상속 (inheritance)
- 자바는 단일상속만 가능하다.
- 복잡한 기능의 클래스 작성은 쉽지 않다.
- 클래스 간 관계가 명확하고, 코드의 신뢰성이 높다.
- Object 클래스
- 최상위 조상클래스
- 다른 클래스를 상속받지 않는 모든 클래스에 자동 상속한다.
- 생략 가능하다.
- class와 생성자의 접근 제어자는 보통 같다.
예시)
- Truck 인스턴스를 new 연산자로 생성하면,
Truck() → Truck(int wheel, int cargo) → Car(int wheel) → Object() 순서로 호출한다. - Truck 클래스의 Truck 생성자 안에 super(wheel); 이 없을 경우,
자동으로 super();를 삽입하기 때문에 오류 발생한다. (∵ Car()가 정의되지 않음)
다형성 (polymorphism)
- 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다.
예시)
class Phone {
int serialNumber;
void phoneCall(){ }
}
class SmartPhone extends Phone {
boolean internetAccess;
void faceCall() { }
}
일 때,
SmartPhone s = new SmartPhone();
참조변수 s는 SmartPhone 인스턴스 멤버 모두 사용 가능하다.
s.serialNumber O
s.internetAccess O
s.phoneCall() O
s.faceCall() O
반면,
Phone p = new SmartPhone();
참조변수 p는 SmartPhone 중 상속받은 멤버만 사용 가능하다.
p.serialNumber O
p.internetAccess X
p.phoneCall() O
p.faceCall() X
- 자손타입 참조변수로 조상타입 인스턴스 참조 불가
- e.g. SmartPhone s = new Phone(); X
- instanceof 연산자를 이용해 참조변수가 참조하고 있는 인스턴스의 실제 타입을 확인할 수 있다.
- 연산 결과가 true이면 검사한 타입으로 형변환이 가능하다.
추상클래스 (abstract class)
// 추상클래스
abstract class Animal {
// 추상메서드
abstract void crawl();
}
// 추상클래스 상속받은 자식클래스 (구체화)
class Cat extends Animal {
// 추상메서드 구현
void crawl() {
...
}
}
- 인스턴스 생성 불가 → 상속받은 자식클래스를 통해야 한다.
- 자식 클래스에서 추상메서드를 구현하도록 강요하기 위해 abstract를 붙여 추상메서드로 선언한다.
인터페이스 (interface)
- 추상메서드와 상수만 멤버로 가질 수 있다.
- 모든 멤버변수는 public static final (생략 가능)
- static/default를 제외한 모든 메서드는 public abstract (생략 가능)
- 인트페이스로부터만 상속 가능하다.
- 다중 상속 가능하다.
- 인스턴스 생성 불가하다.
- 리턴타입이 인터페이스 = 인터페이스를 구현한 클래스의 인스턴스를 반환한다.
interface Connectible {
void connect(Phone p); // public abstract 생략되었으므로
}
class SmartPhone extends Phone implements Connectible {
public void connect(Phone p){ // 접근제어자는 반드시 public
...
}
}
728x90
'KR > Java' 카테고리의 다른 글
[JAVA] Nested Static Class (스태틱 중첩 클래스) (0) | 2022.02.09 |
---|---|
놓치기 쉬운 자바(JAVA) : (3) java.lang 패키지 (0) | 2021.06.11 |
놓치기 쉬운 자바(JAVA) : (1) 기초개념 (0) | 2021.04.22 |
[Lombok] 롬복 설치 및 STS(eclipse) 연동하기 (1) | 2020.02.28 |
[Spring] 스프링 프레임워크(Spring Framework)를 사용하는 이유 (0) | 2019.10.02 |