목차
1. 추상 클래스
2. 인터페이스
3. 자료형 변환: 레퍼런스 형변환
1. 추상 클래스(Abstract Class)
1) 추상 클래스의 정의와 특징 →★AbstractTest01 참고
• 추상 클래스: 실체 클래스들의 공통되는 필드와 메소드를 정의한 클래스
- 추상 클래스는 *실체 클래스의 부모 클래스 역할 (자체적으로 객체 생성X)
- 추상 클래스를 구성하는 요소는 추상 메소드와 일반 메소드, 멤버변수가 있다.
- 실체 클래스의 공통된 필드와 메소드의 이름을 통일할 목적으로 사용된다.
- 추상 클래스는 객체 생성을 통해 불러올 수 없기 때문에, 일반 클래스인 자식 구현 클래스로 객체를 생성해서 접근한다.
abstract class AbsClass{
int a=10; // 멤버변수
abstract void Method01(); // 추상메소드 - 괄호 안에 내용이 없고 중괄호도 없음
void Method02(){ // 일반메소드
}
}
*실체 클래스: 객체를 만들어 사용할 수 있는 클래스
2) 추상 클래스의 상속 →★AbstractTest03 참고
- 추상 클래스를 상속받을 때는 extends를 이용해서 상속을 받는다.
- 추상 클래스도 일반 클래스와 마찬가지로 단일 상속만 가능하다. (클래스의 다중상속을 허용하지 않는다.)
- 추상 클래스를 상속받은 일반 클래스는 추상 클래스 안에 들어있는 추상 메소드를 반드시 ‘메소드 오버라이딩’ 해야 한다.
- 추상 클래스를 상속받게 되면 추상 클래스 안에 들어있는 추상 메소드를 반드시 메소드 오버라이딩 해야 한다. (일반 클래스를 상속받을 때는 메소드 오버라이딩이 선택 사항)
- 추상 클래스A, 추상 클래스B, 일반 클래스 C가 있고 B가 A를, C가 B를 상속받는 경우(C → B → A), B나 C 둘 중 하나에서 메소드 오버라이딩이 이루어져야 한다. (2단계 상속 ≠ 다중 상속)
→ ★ AbstractTestB 참고
• 이클립스에서 메소드 오버라이딩을 하는 방법
방법 1) 상속을 받는 클래스의 좌측에 뜨는 오류 표시(x)를 더블 클릭 → ‘Add unimplemented methods’ 선택
방법 2) 오른쪽 마우스 → ‘Source’ → ‘Override/Implement Methods’ 선택
3) 메소드의 다형성 → ★AbstractTest02 참고
- 하나의 메소드가 다양한 방법으로 동작하는 것을 의미한다.
- 클래스 간에 통일성을 부여한다.
2. 인터페이스(Interface)
1) 인터페이스의 구성 → ★InterfaceTest01 참고
인터페이스는 상수와 추상 메소드로 구성되어 있다.
(cf.추상클래스: 멤버변수, 일반 메소드, 추상 메소드 )
public interface Inter01 {
int a = 10; // 상수 (public static final 생략 가능)
void check(); // 추상 메소드 (public abstract 생략 가능)
}
2) 인터페이스 상속 → ★InterfaceTest01, 02 / AbstractTest04, 06, 07 참고
- 인터페이스를 상속받을 때는 implements로 상속을 받는다.
- 인터페이스를 상속받은 일반클래스는 인터페이스 안에 들어있는 추상 메소드를 반드시 Method Overriding 해야 한다.
interface A {
public abstract void check();
}
class S implements A {
public void check() { // public을 생략할 수 없다.
}
}
- 인터페이스는 다중상속을 허용한다.
interface A {}
interface B {}
class S implements A, B {} // B, A가 되도 된다.(순서 상관 X)
- 추상 클래스와 인터페이스를 모두 상속을 받는 경우에는 ①추상 클래스를 먼저 상속받고, ②인터페이스는 그 다음으로 상속받아야 한다. (상속받는 순서가 바뀌면 안 됨) – 일반 클래스도 마찬가지. → ★AbstractTest04 참고
interface A {}
abstract class B {}
class S extends B implements A {}
- 인터페이스 간의 상속: implements가 아닌 ‘extends’로 상속받는다.
interface A {}
interface B {}
interface C extends A, B {}
class S implements C {}
3. 자료형 변환: 레퍼런스 형변환
• 레퍼런스 형변환: 두 개의 클래스 사이에 상속관계가 있어야함
1) 업캐스팅(자동 형변환) → ★RefTest01 참고
- 서브클래스에서 슈퍼클래스로 형변환 하는 것
- 참조 가능한 영역이 축소가 된다.
- 컴파일러에 의해서 암시적 형변환(자동 형변환)된다.
Parent p1 = (Parent) new Child(); // 업캐스팅, 우측의 ‘Parent’는 생략 가능
p.parentPrn(); // O
p.childPrn(); // X (참조 가능한 영역의 축소)
2) 다운캐스팅(강제 형변환) → ★RefTest02 / RefTest03 참고
- 슈퍼클래스에서 서브클래스로 형변환 하는 것
- 참조 가능한 영역이 확대가 된다.
- 컴파일러에 의해서 암시적 형변환(자동 형변환)이 되지 않기 때문에 자료형을 생략할 수 없다.(강제 형변환)
Child c = (Child) new Parent(); // 오류 발생
Child c;
Parent p = new Child(); // 업캐스팅
c = (Child) p; // 다운 캐스팅(명시적 형변환)
'Java' 카테고리의 다른 글
15일차: Java 자료구조/제네릭/예외처리 - 2021.07.05 (0) | 2021.07.05 |
---|---|
14일차: Java 레퍼런스 형변환/자료구조 - 2021.07.02 (0) | 2021.07.02 |
12일차: Java 상속(필드/메소드 오버라이딩/생성자) - 2021.06.30 (0) | 2021.06.30 |
11일차: Java split()메소드/Wrapper클래스/상속 - 2021.06.29 (0) | 2021.06.29 |
10일차: Java 문자열 관련 클래스 - 2021.06.28 (0) | 2021.06.28 |