기존의 클래스를 기능 추가/재정의 하여 새로운 클래스를 정의하는 것
자식 클래스에서
→ 상위클래스의 일반메소드를 그대로 쓰지 않고 재정의해서 사용한다.
여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임
유연하게 변경이 가능
코드의 변경 최소화
유지보수 유리
코드의 재사용 → 반복적인 코드 최소화. 코드 간결하게 표현
인간 친화적이고 직관적인 코드
추상화
사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 추출
→ 추상클래스와 인터페이스를 통해 구현 가능
상속
기존의 클래스를 재활용하여 새로운 클래스를 작성
상위 클래스로부터 확장된 여러개의 하위클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용
재사용 → 반복적인 코드 최소화, 공유하는 속성과 기능에 간편하게 접근
다형성
하나의 메소드나 클래스를 가지고 여러가지 동작을 할 수 있게 한다.
메서드 오버라이딩
기능 재정의
메소드 오버로딩
매개변수의 개수나 타입을 다르게 정의
리턴 값만 다른것은 해당 x
캡슐화
서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화 -
추상클래스 | 인터페이스 | |
---|---|---|
다중상속 | 불가능 | 가능 |
추상 메서드 | 0개 이상 | 전부 |
일반 메서드 | 가능 | 불가능. 다만 java8부터는 디폴트, 정적 메서드 구현 가능 |
필드 | 일반 변수, 상수 모두 가능 | 상수만 가능 |
상속 키워드 | extends | implements |
접근 제어자 | 제한 없음 | public |
💡 이 인터페이스를 구현하여 실제로 통신하는 클래스는 Retrofit이 자동으로 만들어주는데, 이때 @GET, @Query, @Url과 같은 애너테이션을 참조한다. 즉, 함수에 선언한 애너테이션을 보고 그 정보대로 네트워크 통신을 할 수 있는 코드를 자동으로 만들어 준다.
import com.example.booksearchapp.data.model.SearchResponse
import com.example.booksearchapp.util.Constants.API_KEY
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.Query
interface BookSearchApi {
@Headers("Authorization: KakaoAK ${API_KEY}")
@GET("v3/search/book")
suspend fun searchBooks(
@Query("query") query: String,
@Query("sort") sort :String,
@Query("page") page:Int,
@Query("size") size: Int
): Response<SearchResponse>
}
interface BookSearchRepository {
suspend fun searchBooks(
query: String,
sort: String,
page: Int,
size: Int
): Response<SearchResponse>
}
class BookSearchRepositoryImpl : BookSearchRepository {
override suspend fun searchBooks(
query: String,
sort: String,
page: Int,
size: Int
): Response<SearchResponse> {
return api.searchBooks(query, sort, page, size)
}
}
그외
Java 8, 11, 17 버전별 추가된 기능 (+ 무슨 버전을 써야할까?)
추가
SAM(Single Abstract Method)은 말 그대로 단 1개의 Abstract Method를 가졌다는 뜻이다.