일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 프림
- BFS
- 다익스트라
- Database
- 그래프 탐색
- 배포
- SQL
- union find
- JOIN
- 백준
- SQL코딩테스트
- Baekjoon
- 크루스칼
- 최단경로
- django
- GROUPBY
- Java
- EC2
- 피로그래밍
- 구현
- AWS
- Pirogramming
- OrderBy
- 알고리즘
- 자바
- 코딩테스트
- 누적합
- 프로그래머스
- db
- MST
Archives
- Today
- Total
NullNull
Abstract class vs Interface 본문
추상 클래스 (is a)
추상 클래스(abstract class)
- 미완성된 클래스
- 다른 클래스를 만들기 위한 보조 클래스
- 자손 클래스에서 반드시 재정의해서 사용되기 때문에 조상의 구현이 무의미한 메서드
- 메서드의 선언부만 남기고 구현부는 없음
- abstract 키워드를 메서드 선언부에 추가
- 객체를 생성할 수 없는 클래스가 됐기 때문에 클래스 선언부에 abstract 추가
abstract class Person {
public void hello() {
return "hi";
}
public abstract void walk();
}
추상 클래스의 특징
- 기본 클래스의 특징을 모두 갖고 있음
- 상태를 가질 수 있음. (멤버 변수)
- 추상 메소드를 포함할 수 있음. 없어도 상관은 없다.
- 직접 객체 생성을 할 수 없다. 상속을 위한 클래스
- 간접적으로 생성 가능
- 자식 클래스에 의해서
- 간접적으로 생성 가능
- 상속이 가능하므로 자식을 참조할 수 있다. 다형성 적용이 가능하다.
- 단일 상속만 가능하다.
- 조상 클래스에서 상속받은 abstract 메서드를 재정의 하지 않으면
- 해당 클래스 내에는 여전히 abstract 메서드가 있는 상황이기 때문에 자식 클래스 역시 abstract 클래스가 된다.
- 접근제어자 설정 가능
proteced abstract <- 요런거 가능
추상 클래스 사용의 이유
- 구현의 강제를 통해 프로그램의 안정성을 향상한다.
인터페이스 (has a)
인터페이스
- 구현자 관점 - 구현 명세
- 사용자 관점 - 사용 방법
인터페이스의 특징
- 클래스가 아니다.
- 객체로 생성될 수 없기 때문에 상태를 가질 수 없음
- 인터페이스에서 멤버 변수 생성 시 public static final이 생략된다. (상수)
- 메소드엔 public abstract 생략 되어 있음. (모든 메소드 오버라이딩 함)
- 구현 클래스에선 반드시 인터페이스의 모든 메소드를 구현해야 함
- 인터페이스는 다중 상속이 가능하다.
- 상속이 가능하므로 다형성 역시 적용된다.
인터페이스의 사용 이유
- 해당 기능들의 구현을 강제할 수 있음.
- 구현 입장 → 메서드의 이름을 만들 필요 없음
- 사용 입장 → 구현 볼 필요 없이 인터페이스만 참고하면 됨
- 해당 인터페이스를 구현한 클래스들은 같은 기능을 구현하고 있다는 것을 파악할 수 있음
- 구현과 사용의 분리를 통해 결합도를 낮출 수 있음. 손쉬운 모듈 교체 지원
- 결합도가 낮다?
- 특정 코드에 변화가 생겼을 때 다른 부분이 바뀌는 정도가 낮다.
- 결합도가 낮다?
- 공통된 기능을 통한 관계성 부여
- 원래는 상속을 통해서만 부모 자식의 관계 부여 가능
- 이제는 인터페이스 사용도 가능
- 인터페이스 타입으로 해당 객체를 받을 수 있다. (다형성 적용)
- 해당 인터페이스 타입의 참조 변수로 인터페이스를 구현한 객체를 참조 가능
- 모듈 간 독립적 프로그래밍 가능
추상클래스와 인터페이스
공통점 | 차이점 |
---|---|
직접 객체 생성이 불가능하다. | 추상클래스는 is a 관계의 경우 주로 사용 |
참조 변수의 타입으로 사용 가능하다. | 인터페이스는 has a 관계의 경우 주로 사용. 해당 클래스가 특정 기능들을 구현해야하는 경우 |
추상 클래스는 클래스라 단일 상속, 인터페이스는 클래스는 아니라서 다중 상속 |
공통점 | 차이점 |
직접 객체 생성이 불가능하다. | 추상클래스는 is a 관계의 경우 주로 사용 |
참조 변수의 타입으로 사용 가능하다. | 인터페이스는 has a 관계의 경우 주로 사용. 해당 클래스가 특정 기능들을 구현해야하는 경우 |
추상 클래스는 클래스라 단일 상속, 인터페이스는 클래스는 아니라서 다중 상속 |
인터페이스 ≥ JDK v8
- 이전 버전에는 인터페이스는 구현부분이 없어야 했다.
- 이제는 default, static메서드 구현 가능
default 메소드
- 아래처럼 이미 사용되던 인터페이스에 새로운 기능을 추가할 경우, 그 인터페이스를 사용하고 있던 모든 클래스에서는 그 기능을 오버라이딩 해야 함 → 기능 하나만 넣으려고 하다가 엄청 많은 오류와 유지보수가 필요함
interface {
void off();
//새롭게 추가한 메서드 ------- (x)
void powerOff();
}
- 이를 방지하기 위해서 default 으로 선언하여 구현을 일부 작성하고 → 재정의도 가능함
- 여러개 만들 수도 있음
interface {
void off();
//새롭게 추가한 메서드 ------- (o)
default void powerOff() {
System.out.println("강제종료");
}
}
static 메소드
- 객체를 생성하지 않고도 사용 가능한 메소드
- 인터페이스명.메소드명 으로만 사용 가능하다.
- 재정의 불가능 → 객체를 위해 만들어 둔 것이 아니다. <default 메소드와 의 차이점>
- 해당 인터페이스의 고유기능 같은 것들 정의
- 또는 유틸리티 메소드 형태로 사용
- 유틸리티 클래스란?
- 프로그램 개발에 유용한 클래스
- java.util 패키지의 클래스
- 프로그램 개발에 유용한 클래스
- 유틸리티 클래스란?
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
간단한 Unit Test 작성하기 (0) | 2024.04.04 |
---|---|
객체지향 언어의 특징과 설계 원칙 (0) | 2022.09.29 |
예외 처리 (0) | 2022.08.14 |
JAVA 노드 스트림 & 보조 스트림 (0) | 2022.07.31 |
Java Data Type (0) | 2022.07.24 |