Search
Duplicate
😀

08. 추상 클래스, 인터페이스, Generic

태그
추상 클래스의 정의
추상 메서드 ㄴ 자손 클래스에서 반드시 재정의해서 사용되기 때문에 조상의 구현이 무의미한 메서드 ㄴ 메서드의 선언부만 남기고, 구현부는 세미콜론으로 대체 ㄴ 구현부가 없다는 의미로 abstract 키워드를 메서드 선언부에 추가 ㄴ 객체를 생성할 수 없는 클래스라는 의미로 크래스 선언부에 abstract 축 추상 클래스의 특징 ㄴ 클래스에 구현부가 없는 메서드가 있으므로 객체를 생성할 수 없음 ㄴ 하지만 상위 클래스 타입으로써 자식 참조는 가능! ex) Vehicle v = new Vehicle(); → X Vehicle v = new DiselSUV(); → O 추상 클래스를 사용하는 이유 ㄴ abstract class는 구현의 강제를 통해 프로그램의 안정성을 향상시킴 ㄴ 인터페이스에 있는 메서드 중 구현할 수 있는 메서드를 구현해 편의를 지원
인터페이스
인터페이스 ㄴ 사용자 관점 : how는 궁금하지 한고, 호출, 리턴결과, 동작만 요구 ⇒ 선언부만 필요 ㄴ 개발자 관점 : 실제 동작하는 how에 초점 ⇒ 구현부 구현 ==⇒ 인터페이스를 두고 한쪽은 사용에 초점, 다른 쪽은 구현에 초점 인터페이스의 작성 ㄴ 최고 수준의 추상화 단계 ⇒ 모든 메서드가 abstract 형태 ㄴ JDK 8에서부터 default method와 static method 추가 ⇒ body 가질 수 있음! ㄴ 멤버 구성 ㄴ 모든 멤버변수는 Public static final이 기본 베이스 (생략 가능) ㄴ 모든 메서드는 Public abstract이 기본 베이스 (생략 가능) ⇒ Method Override 시 같거나 큰 범위로밖에 지정을 못하므로 무조건 Public!! 인터페이스끼리의 상속 ㄴ 인터페이스도 extends를 통해 상속이 가능 ㄴ 클래스와 다른 점은 인터페이스는 다중 상속이 가능! 인터페이스 구현과 객체 참조 ㄴ implements한 클래스는 모든 abstract 메서드를 override 하거나, 구현하지 않을 경우 abstract 클래스로 표시해야한다.
인터페이스 vs 추상 클래스
추상 클래스 ⇒ 하위 클래스를 통해 공간 생성이 가능 ⇒ 변수가 존재하는 경우, 공간이 필요한 경우 (상태를 가질 때) ⇒ 객체마다 고유한 상태를 가져야 하는 경우엔 추상 클래스를 사용한다!! 인터페이스 ⇒ 객체마다 고유한 상태를 가질 필요가 아닌 경우
인터페이스의 필요성
인터페이스의 필요성 ㄴ 구현의 강제로 표준화 처리 (벤더가 바뀌어도 호출 함수는 변경되지 않음) ㄴ 인터페이스를 통한 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원 ㄴ 서로 상속 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장 ⇒ 상속 관계가 없는 경우 최상위 객체인 Object로밖에 묶을수가 없지만 인터페이스 배열을 통해 하나의 배열로 묶어서 관리가 가능! + 참조변수를 Interface로 사용하였기 때문에 Interface의 메서드 호출도 가능!!독립적인 프로그래밍으로 개발 기간 단축 ⇒ 인터페이스만 신경쓰고 서로 다른 팀에서 동시 개발 가능!!
인터페이스의 활용 - 공개범위 제한
인터페이스를 통해 특정 기능을 제한할 수 있다. 자식에게는 강의() 메서드를 공개할 필요가 없고, 제자에게는 청소(), 요리() 메서를 공개할 필요가 없다. ⇒ 인터페이스를 통해 특정 기능을 제한!! ⇒ 엄마 a = new Person(); a.요리() → O a.청소() → O a.강의() → X ⇒ 하나의 클래스를 관점, 목적에 따라 공개범위를 지정할 수 있다!!!. 참조변수 타입이 객체의 사용을 결정!!
default method
default method ㄴ 인터페이스에 선언된 구현부가 있는 일반 메서드 ㄴ 메서드 선언부에 default modifier 추가 후 메서드 구현부 작성 ㄴ 접근 제한자는 public으로 한정됨 (생략 가능)
default method의 필요성
default method의 필요성 ㄴ 기존에 interface 기반으로 동작하는 라이브러리의 interface에 추가해야하는 기능 발생 ㄴ 기존 방식으로라면 모든 구현체들이 추가되는 메서드를 override 해야함 ㄴ default 메서드는 abstract가 아니므로 반드시 구현할 필요가 없어짐!!
default method의 충돌
default method의 충돌 ㄴ 동일한 이름을 갖는 구현부가 있는 메서드가 충돌할 수 있다. ㄴ method의 우선순위 ㄴ super class의 method가 우선super class가 구체적인 메서드를 갖는 경우 default method는 무시됨 ㄴ interface간의 충돌 ⇒ 하나의 interface에서 default method를 제공하고, 다른 interface에서도 같은 이름의 메서드(default 무관) 가 있을 때 sub class는 반드시 override해야함!
Generic 표현
Generic ㄴ 컴파일 타임에 타입 파라미터들이 할당된 타입으로 대체된다!! ㄴ 클래스, 또는 인터페이스 선언 시 <>에 타입 파라미터 표시 ㄴ Class_Name : Raw Type Class_Name<T> : Generic Type ㄴ 객체 생성 ㄴ 변수 쪽과 생성 쪽의 타입은 반드시 같아야 함 (생략 가능) ex) Class_Name<String> generic = new Class_Name<String>(); Class_Name<String> generic2 = new Class_Name<>(); ㄴ 타입 파라미터의 제한 가능type parameter 선언 뒤 extends와 함께 상위 타입 명시 Generic Method ㄴ 파라미터와 리턴 타입으로 type parameter를 갖는 메서드 ㄴ 메서드 리턴 타입 앞에 타입 파라미터 변수 선언
Generic 표현
Generic Method ㄴ 파라미터와 리턴 타입으로 type parameter를 갖는 메서드 ㄴ 메서드 리턴 타입 앞에 타입 파라미터 변수 선언 ㄴ Class Parameter ⇒ 객체 생성 시점에 T 타입 결정 ㄴ Method Parameter ⇒ 메서드 호출 시점에 T 타입 결정