[Java] 추상클래스와 인터페이스
글 작성자: _rian
1. 추상 클래스 (Abstract Class)
추상이란?
- 실체들 간에 공통되는 특성을 추출한 것
- (예시) 새, 곤충, 물고기 -> 동물(추상)
추상 클래스 (abstract class) 개념
-
실체 클래스들의 공통되는 필드와 메소드를 정의한 클래스
-
추상 클래스는 실체 클래스의 부모 클래스 역할
-
new 연산자로 인스턴스 생성을 못한다!!
추상클래스 s = new 추상클래스(); //이렇게 못한다!!!!!!!!!!!!!!
-
추상 클래스 용도
- 상속 계층에서 자식 멤버의 이름을 통일하기 위하여 사용
- 실체 클래스 설계자가 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있음.
- 실체 클래스를 작성할 때 시간 절약
- 실체 클래스는 추가적인 필드와 메소드만 선언
- 실체 클래스 설계 규격을 만들고자 할 때
- 실체 클래스가 가져야 할 필드와 메소드를 추상 클래스에 미리 정의
- 실체 클래스는 추상 클래스를 무조건 상속받아 작성
추상 클래스 선언
- 클래스 선언에 abstract 키워드 사용
- 필드와 메소드 포함 가능
- 자식 객체가 부모 생성자 super()를 호출할 수 있으므로 생성자도 포함 가능
- abstract 키워드로 선언하고 실체 클래스처럼 public으로 지정할 수 있음.
추상 메소드 선언
- 추상 메소드도 abstract 키워드 사용
- 실체가 없으므로 본체 없이 세미콜론(;)으로 끝남
- public이나 protected로 지정할 수 있음
- 추상클래스를 상속받은 자식 클래스는 부모의 추상 메소드를 반드시 구현해야 함.
추상 메소드와 오버라이딩
- 메소드 이름은 동일하지만, 실행 내용이 실체 클래스마다 다른 메소드
- 예: 동물은 소리를 낸다. 하지만 실제 동물들의 소리는 제각기 다르다
- 구현 방법
- 추상 클래스에는 메소드의 선언부만 작성 (추상 메소드)
- 실체 클래스에서 메소드의 실행 내용 작성 (오버라이딩)
2. 인터페이스 개념
인터페이스 장점
- 인터페이스만 준수하면 통합에 신경쓰지 않고 다양한 형태로 새로운 클래스 개발 가능
- Java는 클래스의 다중 상속을 지원하지 않지만, 인터페이스로 다중 상속 효과를 간접적으로 얻을 수 있음.
인터페이스 vs. 추상 클래스
- 추상화라는 동일한 목적을 가짐
- 추상 클래스는 일부 메소드를 추상화, 인터페이스는 모든 멤버를 추상화함.
분류 | 인터페이스 | 추상클래스 |
구현 메서드 | 포함 불가 (단, 디폴트 메서드와 정적 메서드는 제외) | 포함 가능 |
인스턴스 변수 | 포함 불가능 | 포함 가능 |
다중 상속 | 가능 | 불가능 |
디폴트 메서드 | 선언 가능 | 선언 불가능 |
생성자와 main() | 선언 불가능 | 선언 가능 |
상속에서의 부모 | 인터페이스 | 인터페이스, 추상클래스 |
접근 범위 | 모든 멤버를 공개 | 추상 메서드를 최소한 자식에게 공개 |
3. 인터페이스 구조
인터페이스 선언
- interface 키워드를 붙이고 이름을 추가
- 모든 멤버 변수는 public static final이며 생략 가능
- 모든 메소드는 public abstract 이며 생략 가능
- JDK8 이후 디폴트 메소드, 정적 메소드 선언 가능
- 디폴트 메소드는 오버라이딩 가능, 정적 메소드는 오버라이딩 불가능
- 디폴트 메소드는 인스턴스 메소드 -> 객체 생성한 후 호출
- 정적 메소드 -> 인터페이스로 직접 호출
인터페이스 구조
interface 인터페이스 이름{
// 상수 필드 -> 상수만 가능하기 때문에 public static final 키워드 생략 가능
//abstract 메서드 -> 인터페이스의 모든 메서드는 public abstract 키워드 생략 가능
//default 메서드 -> JDK 8 이후 가능
//static 메서드 -> JDK 8 이후 가능
}
- 데이터 저장을 위한 인스턴스 필드 선언 불가 => 상수 필드 선언 가능 (초기값 대입 필수)
- 인터페이스 객체 생성 불가 => 생성자를 가질 수 없음.
인터페이스 파일의 컴파일
- 상수 필드의 public static final, 추상 메소드의 public abstract를 생략하더라도 자동적으로 컴파일 과정에서 붙게 됨
- 인터페이스 파일 확장자는 java로 컴파일하면 확장자가 class인 파일 생성!
4. 인터페이스 상속
클래스와 인터페이스의 관계
- 클래스가 클래스 상속 -> extends
- 인터페이스가 인터페이스 상속 -> extends
- 클래스가 인터페이스 상속 -> implements
- 인터페이스가 클래스 상속 -> 못함!!!!!!!!!
인터페이스 다중상속? 클래스 다중 상속??
// 상속할 인터페이스가 여러개라면 쉽표(,)로 연결한다.
interface 자식 인터페이스 extends 부모인터페이스1, 부모인터페이스2{
...
}
class 자식클래스 implements 부모인터페이스1, 부모인터페이스2{
...
}
- 인터페이스는 다중상속이 가능하지만 클래스는 다중상속을 할 수 없다!!
5. 인터페이스 응용
인터페이스와 상수
- 인터페이스에서 상수 : 기본 public static final int!
Comparable 인터페이스
객체를 비교하기 위한 규격으로 사용되는 인터페이스!
다른 객체보다 크면 양수, 동일하면 0, 작으면 음수를 반환한다.
public interface Comparable{
int compareTo(Object other); //다른 객체보다 크면 양수, 동일하면 0, 작으면 음수를 반환함.
}
6. 인터페이스와 다형성
인터페이스의 상속과 구현 클래스
- 인터페이스도 클래스처럼 하나의 타입이므로 변수를 인터페이스 타입으로 선언 가능
- 인터페이스의 구현 클래스는 그 인터페이스의 자식 타입
인터페이스타입 변수 = 구현 객체 // 구현 객체는 인터페이스 타입이므로 자동 변환
- 인터페이스 타입 변수가 구현 객체를 참조한다면 강제 타입 변환 가능
구현 클래스 타입 변수 = (구현클래스타입) 인터페이스타입 변수
타입 변환과 다형성
아래는 구현 객체를 인터페이스 타입이 인수로 대입하는 예제다
'Computer Engineering > Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map (0) | 2019.12.16 |
---|---|
[Java] 제네릭 프로그래밍 (0) | 2019.12.16 |
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류 (0) | 2019.12.15 |
[Java] 중첩 클래스와 람다식 (0) | 2019.12.11 |
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends (0) | 2019.12.11 |
댓글
이 글 공유하기
다른 글
-
[Java] 제네릭 프로그래밍
[Java] 제네릭 프로그래밍
2019.12.16 -
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류
2019.12.15 -
[Java] 중첩 클래스와 람다식
[Java] 중첩 클래스와 람다식
2019.12.11 -
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends
2019.12.11