상속, 추상클래스, 인터페이스

유진·2024년 1월 12일
0
post-custom-banner

상속

기존의 클래스를 기능 추가/재정의 하여 새로운 클래스를 정의하는 것

자식 클래스에서

  1. 일반 메소드라면, 부모 클래스가 추상클래스이던 일반 클래스이던 해당 메소드를 재정의 할 수도 있고, 아닐 수도 있고
  2. 추상 메소드라면, 상속받은 자식 클래스에서 반드시 구현
    1. 추상 메소드를 하나라도 포함한다면 추상 클래스

오버라이딩

→ 상위클래스의 일반메소드를 그대로 쓰지 않고 재정의해서 사용한다.

객체지향

여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임

객체지향의 장점

유연하게 변경이 가능

코드의 변경 최소화

유지보수 유리

코드의 재사용 → 반복적인 코드 최소화. 코드 간결하게 표현

인간 친화적이고 직관적인 코드

객체지향의 특징

  1. 추상화

    사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 추출

    추상클래스인터페이스를 통해 구현 가능

  2. 상속

    기존의 클래스를 재활용하여 새로운 클래스를 작성

    상위 클래스로부터 확장된 여러개의 하위클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용

    재사용 → 반복적인 코드 최소화, 공유하는 속성과 기능에 간편하게 접근

  3. 다형성

    하나의 메소드나 클래스를 가지고 여러가지 동작을 할 수 있게 한다.

    1. 메서드 오버라이딩

      기능 재정의

    2. 메소드 오버로딩

      매개변수의 개수나 타입을 다르게 정의

      리턴 값만 다른것은 해당 x

  4. 캡슐화

    서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것

    1. 데이터 보호
    2. 데이터 은닉

객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화 -

추상클래스

💡 추상 메서드를 포함하지 않는 클래스에서도 abstract를 붙여서 추상 클래스로 지정할 수 있다. → 인스턴스 생성을 막기위해서 제한하는 용? 반대로 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.
  • 추상클래스가 인터페이스보다 먼저 나온 개념이다 (GPT왈)

인터페이스

차이점

추상클래스인터페이스
다중상속불가능가능
추상 메서드0개 이상전부
일반 메서드가능불가능. 다만 java8부터는 디폴트, 정적 메서드 구현 가능
필드일반 변수, 상수 모두 가능상수만 가능
상속 키워드extendsimplements
접근 제어자제한 없음public

공통점

  1. 인스턴스를 생성할 수 없다.
  2. 상속받은 클래스는 반드시 추상 메서드를 구현해야 한다.

안드로이드 사용 예시

  • 추상클래스
    • BaseActivity
      • 인터페이스는 미리 메서드 구현을 할 수 없어서!
      • databinding 등
  • 인터페이스
    • service
      • 얘는 구현부가 따로 없는데…? → 구현을 안하는 이유는 레트로핏에서 해줌! 어노테이션을 단다.

💡 이 인터페이스를 구현하여 실제로 통신하는 클래스는 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>
            }
  • repository & repositoryImpl
    - repository에서 함수 원형
            interface BookSearchRepository {
                suspend fun searchBooks(
                    query: String,
                    sort: String,
                    page: Int,
                    size: Int
                ): Response<SearchResponse>
            }
  • repositoryImpl이 구현부
            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 버전별 추가된 기능 (+ 무슨 버전을 써야할까?)


추가

Functional(SAM) Interface

SAM(Single Abstract Method)은 말 그대로 단 1개의 Abstract Method를 가졌다는 뜻이다.

  • fun interface

상속의 단점

  • depth가 깊어지면 문제점을 찾기 어렵다
profile
안드로이드 학생 개발자 에디 / 유진입니다
post-custom-banner

0개의 댓글