추상 클래스 정의
자식 클래스에서 반드시 재정의해서 사용되기 때문에 조상의 구현이 무의미한 메서드
메서드의 선언부만 남기고 구현부는 세미클론으로 대체
구현부가 없다는 의미로 abstract 키워드를 메서드 선언부에 추가
객체를 생성할 수 없는 클래스라는 의미로 클래스 선언부에 abstract를 추가
추상 클래스의 특징
abstract 클래스는 상속 전용의 클래스
- 클래스에 구현부가 없는 메서드가 있으므로 객체를 생성할 수 없음
- 하지만 상위 클래스 타입으로써 자식을 참조할 수는 있다.
조상클래스에서 상속받은 abstract 메서드를 재정의 하지 않은 경우
- 클래스 내부에 abstract 메서드가 있는 상황이므로 자식 클래스는 abstract 클래스로 선언되어야 함
추상 클래스를 사용하는 이유
abstract 클래스는 구현의 강제를 통해 프로그램의 안정성 향상
인터페이스란?
서로 다른 두 시스템, 장치, 소프트웨어 따위를 서로 이어 주는 부분 또는 그런 접속 장치
최고 수준의 추상화 단계 : 일반 메서드는 모두 abstract 형태
- JDK8에서 default method와 static method 추가
형태
- 클래스와 유사하게 interface 선언
- 멤버 구성
- 모든 멤버변수는 public static final 이며 생략 가능
- 모든 메서드는 public abstract 이며 생략 가능
public interface MyInterface {
public static final int MEMBER1 = 10;
int MEMBER2 = 10;
public abstract void method1(int param);
void method2(int param);
}
클래스와 마찬가지로 인터페이스도 extends를 이용해 상속이 가능
클래스와 다른 점은 인터페이스는 다중 상속이 가능
인터페이스 구현과 객체 참조
클래스에서 implements 키워드를 사용해서 interface 구현
implements 한 클래스는 모든 abstract 메서드를 override 해서 구현하거나 구현하지 않을 경우 abstract 클래스로 표시해야 함
여러개의 interface implements 가능
인터페이스의 필요성
구현의 강제로 표준화 처리
- abstract 메서드 사용
인터페이스를 통한 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원
서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
모듈 간 독립적 프로그래밍 가능 -> 개발 기간 단축
서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
default method
인터페이스에 선언 된 구현부가 있는 일반 메서드
- 메서드 선언부에 default modifier 추가 후 메서드 구현부 작성
- 접근 제한자는 public으로 한정됨(생략가능)
- 필요성
- 기존 interface 기반으로 동작하는 라이브러리의 interface에 추가해야하는 기능이 발생
- 기존 방식으로라면 모든 구현체들이 추가되는 메서드를 override 해야 함
- default 메서드는 abstract가 아니므로 반드시 구현 해야 할 필요가 없어짐
defatul method의 충돌
- JDK 1.7이하의 java에서는 interface method에 구현부가 없으므로 충돌이 없었음
- 1.8부터 default method가 생기면서 동일한 이름을 갖는 구현부가 있는 메서드가 충돌
- method 우선 순위
- super class의 method 우선 : super class가 구체적인 메서드를 갖는 경우 default method는 무시됨
- inteface간의 충돌 : 하나의 interface에서 default method를 제공하고 다른 interface에서도 같은 이름의 메서드(default 유무와 무관)가 있을 때 sub class는 반드시 override 해서 충돌 해결
static method
interface에 선언된 static method
- 일반 static 메서드와 마찬가지로 별도의 객체가 필요 없음
- 구현체 클래스 없이 바로 인터페이스 이름으로 메서드에 접근해서 사용 가능
*abstract 구현된것도 안된것도 있음 interface abstract 자체 default method 각각 써야하는 함수 static method 다 같이 써야하는 함수
Generics
다양한 타입의 객체를 다루는 메서드, 컬렉션 클래스에서 컴파일 시에 타입 체크
- 미리 사용할 타입을 명시해서 형 변환을 하지 않아도 되게 함
- 객체의 타입에 대한 안전성 향상 및 형 변환의 번거로움 감소
class GenericBox<T> { private T some; }
public T getSome() { return some; }
public void setSome(T some) { this.some = some; }
제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미
특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입
Generictype<?> 타입에 제한이 없음 Generic type<? extends T> T 또는 T를 상속받는 타입들만 사용가능
Generic tpye<? super T> T 또는 T의 조상 타입만 사용 가능
'Java' 카테고리의 다른 글
[Java] List, Set, Map, Sort (0) | 2023.02.01 |
---|---|
[Java] try~catch, throws , 사용자 정의 예외 (0) | 2023.01.31 |
[Java] 다형성, 정적 바인딩, 동적 바인딩 (0) | 2023.01.31 |
[Java] Singleton 디자인 패턴 (0) | 2023.01.31 |
[Java] 상속, 메서드 재정의, package, 제한자 (0) | 2023.01.31 |