1. 추상 메소드
: 메소드 정의에 abstract 키워드를 사용함
: 몸체의 구현이 없이 형식만 존재하는 메소드
-> 반환형, 메소드 이름과 인자에 관한 선언만 존재함
-> 자식 클래스에 상속될 때, 몸체의 구현이 필요함
-> 상반된 의미의 final과 함께 사용할 수 없음
-> 추상 메소드는 추상 클래스 또는 인터페이스에서 선언되어야 함
abstract class Shpe {
abstract public double getArea();
}
2. 추상 클래스
: 클래스 정의에 abstract 키워드를 사용함
-> 추상 메소드를 포함할 수 있음
-> 물론 데이터 필드나 일반 메소드를 포함할 수 있음
-> 객체 생성을 할 수 없음
*구체적이지 못한 불완전한 클래스라는 의미
*오류 예(Shape이 추상클래스라 가정)
Shape s = new Shape("red"); // 컴파일 오류
3. 추상 클래스의 사용
: 의미적으로 유사한 자식 클래스를 묶고자 할 때 사용
-> 공통으로 사용할 데이터 필드와 메소드를 추상 클래스에서 정의
: 추상 클래스는 불완전한 클래스
-> 기능적으로 구현하기 어려운 메소드가 존재
: 추상 클래스는 자식 클래스로 상속되어 사용됨
-> 자식 클래스에서 추상 메소드를 구현해야 함
-> 그러면 자식 클래스는 객체 생성이 가능
-> 자식 클래스가 추상 메소드를 구현하지 않으면 계속해서 자식 클래스도 추상 클래스이어야 함
: 추상 클래스는 일반 클래스와 인터페이스의 중간적 성격을 지님
4. 인터페이스
: 100% 추상적 클래스
-> 인터페이스의 모든 메소드가 추상 메소드(public abstract)
: 몸체 없이, 구현되어야 할 메소드의 형식만 정의해 둠
-> 단, default 인스턴스 메소드와 static 메소드는 몸체를 구현함
*모든 메소드의 기본 접근 제어자는 public
-> 데이터 필드는 클래스 상수만 가능(public static final)
: 참조형이며 직접적 객체 생성은 불가
: 인터페이스의 이름은 보통 형용사임
ex) Runnable, Serializable, Comparable
5. 인터페이스의 정의
: 문법은 클래스 정의와 유사함
: 정의할 때 키워드 class 대신에 interface를 사용
-> abstract는 생략하는 것이 일반적.
: 메소드는 접근 제어자는 기본적으로(생략하더라도) public abstract임
-> 몸체가 없으며, 반환형, 이름, 매개변수 목록만 표시
: default 인스턴스 메소드와 static 메소드도 가능
-> 이 경우 몸체를 구현해야 함
-> 기본적으로(생략하더라도) 접근 제어자는 public임
: 데이터 필드는 항상(생략 가능) public static final임
-> 클래스 상수만 가능함
6. 인터페이스의 사용
: 추상 클래스와 마찬가지로 자식 클래스에 상속(구현)되어 사용됨
: 의미적으로는 관련이 없으나 기능적으로 유사한 클래스들을 묶을 때 인터페이스를 사용할 수 있음
ex) 대소 비교가 가능한 클래스(사각형, 사람 등)
: 인터페이스를 상속받아 자식 인터페이스를 정의할 수 있음
-> 인터페이스의 상속(또는 확장)
7. 인터페이스의 상속
: 자식 인터페이스가 부모 인터페이스를 상속받는 경우
-> 기존 인터페이스를 상속받아 새로운 인터페이스를 정의할 때, 키워드 extends를 사용
* interface 자식인터페이스 extends 부모인터페이스 { ... }
-> 여러 부모 인터페이스를 상속받는 다중 상속도 가능
8. 인터페이스의 구현
: 자식 클래스가 부모 인터페이스를 상속받는(구현하는) 경우
-> 자식은 부모가 나열한 기능(추상 메소드)을 구현해야 함
: 구현을 통해 클래스를 정의할 때 implements를 사용
* class 자식클래스 extends 부모클래스 implements 부모인터페이스1, 부모인터페이스2 {...}
9. 인터페이스 구현 예
10. 디폴트 메소드
: 인터페이스에서 선언하는 메소드에 기본 구현(몸체)을 넣을 수 있음
-> 자식 클래스에서 상속받을 때, 디폴트 메소드를 그대로 사용할 수 있음
-> 메소드 선언시 default를 사용하고 몸체를 구현해 줌
: 인터페이스에 새 메소드를 추가할 때, 기존 코드(클래스 정의)의 수정을 피하기 위함
-> 단순히 추상 메소드가 추가된다면, 이전 인터페이스를 구현한 클래스를 수정해야 함
11. 추상 클래스, 인터페이스, 클래스의 형변환
: 인터페이스와 클래스는 모두 사용자 정의형
: extends와 implements에 따라 상위/하위 자료형 관계가 설정됨
: 상위 유형의 변수는 하위 객체의 참조값을 가질 수 있음
: 상위 유형의 변수가 가리키는 객체의 실제 유형에 따라 수행되는 메소드가 결정됨(동적 바인딩)
-> 실행 중 메소드 호출 시, 변수의 선언 유형으로 정하지 않음
ex) SuperClass sup = new SubClass(); // 자동형변환
sup.method(); // method()를 SubClass에서 찾음
-> 컴파일할 때는 method()가 sup의 선언 유형에 정의되어 있는지 확인함
'방통대 > Java' 카테고리의 다른 글
5-3 열거 자료형 (0) | 2024.03.22 |
---|---|
5-2 다형성 (0) | 2024.03.22 |
4강. Java - 클래스와 상속(2) (0) | 2024.03.15 |
4-2 상속 (0) | 2024.03.15 |
4-1 클래스 정의와 사용 (0) | 2024.03.15 |