Languages

kotlin의 가시성 (open, final, abstract), 생성자

!쪼렙조햄 2020. 4. 19. 21:42
반응형

4장. 클래스, 객체, 인터페이스

😤 클래스 계층 정의

  • kotlin의 가시성/접근 변경자는 자바와 비슷하지만 아무것도 지정하지 않은 경우 기본 가시성은 다르다
  • sealed
    • 코틀린에 새로 도입됨
    • 클래스 상속을 제한

🤪 kotlin 인터페이스

  • 코틀린 인터페이스 안에는 추상 메소드 뿐 아니라 구현이 있는 메소드도 정의할 수 있다
  • interface에는 아무런 field도 들어갈 수 없다
interface Clickable {
    fun click()
    fun showOff() = println(“I’m clickable!")
}

interface Focusable {
    fun showOff() = println(“I’m focusable!”)
}
  • 이 인터페이스를 구현하는 모든 비추상 클래스는 click에 대한 구현을 제공해야 한다
  • class Button : Clickable
    • 이렇게 하면 클래스 확장과 인터페이스 구현 완료
    • 자바의 경우 extends, implements 키워드 사용
  • 클래스는 인터페이스를 원하는 만큼 개수 제한없이 마음대로 구현 가능하다
  • 클래스는 오직 하나만 확장할 수 있다
  • @override
    • 자바의 경우 어노테이션
    • 코틀린에서는 override 변경자 사용
  • 인터페이스 메소드
    • 디폴트 구현을 제공할 수 있다
  • class Button : Clickable, Focusable
    • 쉼표로 여러개의 interface 상속 가능
    • 두 상위 인터페이스가 같은 이름의 showOff 메소드를 가지고 있는 경우 오버라이딩 메소드를 제공하지 않으면 컴파일러 에러
    • override fun showOff(){. }
      • super을 지정하면 어떤 interface의 메소드를 호출할지 지정할 수 있다

🧐 kotlin의 가시성 - open, final, abstract

  • 자바 : final로 명시적으로 상속을 금지하지 않는 모든 클래스를 다른 클래스가 상속할 수 있다
  • 취약한 기반 클래스
    • 기반 클래스가 변경되어 하위 클래스가 가진 가정이 깨진경우 생기는 문제
    • 상속을 위한 설계와 문서를 갖추거나 그럴 수 없다면 상속을 금지하라
  • 코틀린 : open을 명시해주지 않으면 모두 기본적으로 final
    • 상속을 허용하고 싶은 class 앞에 open
    • 오버라이드를 허용하고 싶은 메소드앞에 open
  • override 메소드 / 프로퍼티
    • 기본적으로 열려있다
    • 상속을 금지시키려면 final 해야 한다
  • abstract는 기본적으로 열려있다

😣 kotlin의 가시성 변경자

  • 아무 변경자도 없는 경우 선언은 모두 public
  • protected
    • java
      • 같은 패키지 안에서 protected 에 접근 가능
    • kotlin
      • 클래스, 그 클래스를 상속한 클래스 안에서만 보인다
      • 클래스를 확장한 함수는 접근 불가
  • internal
    • 모듈 내부에서만 볼 수 있음
    • 모듈
      • 한번에 컴파일 되는 코틀린 파일들 (프로젝트)
    • 모듈의 최상위 선언을 private로 해두면 모든 class를 internal 설정한것 과 같음
  • private
    • kotlin은 최상위 선언에 private 허용

😡 봉인된 클래스

  • sealed
  • sealed class Expr
    • Expr을 상속한 하위 클래스 정의를 제한할 수 있다
  • sealed 표시된 클래스는 자동으로 open
  • sealed 쓴 class는 다른 class에 상속시킬 수 없다?
    • sealed 클래스에서 하위 클래스 정의는 어디에 할 수 있는가
    • kotlin 1.0
      • 모든 하위 클래스는 중첩 클래스여야 한다
    • kotlin 1.1
      • sealed class와 같은 파일의 아무데서나 sealed class 상속한 하위 클래스를 만들 수 있다
      • data class로 하위 클래스를 정의할 수도 있다

😘 kotlin의 주 생성자, 부 생성자

class User(val nickname: String)
  • 생성자
    • java : 여러개의 생성자 생성 가능
    • kotlin : 여러개의 생성자를 주 생성자와 부 생성자로 구분
      • 초기화 블록을 통해 초기화 로직 추가 가능
  • 클래스 이름 뒤에 오는 괄호로 둘러싸인 코드 : 주 생성자
  • constructor
    • 생성자 정의를 시작할 때 사용
  • init
    • 초기화 블록을 시작
    • 실무에서 init을 사용한 클래스 초기화가 많이 쓰인다
  • 클래스의 인스턴스를 만드려면 new 키워드 없이 생성자를 직접 호출하면 된다
  • private class
    • 어떤 클래스를 클래스 외부에서 인스턴스화 하지 못하게 하고 싶다면 모든 생성자를 private 시키면 된다
  • 대부분의 클래스는 생성자가 간단하여 주 생성자로 편하게 생성 가능

😏 부 생성자 사용시 유의할 점

  • 인자에 대한 디폴트 값을 제공하기 위해 부 생성자 여러개 만들지 말것
    • 파라미터의 디폴트 값을 생성자 시그니처에 직접 명시하기
  • 부 생성자는 super 키워드를 통해 자신에 대응하는 상위 클래스 생성자를 호출한다
  • 클래스에 주 생성자가 없다면 부 생성자는 상위 클래스를 초기화 or 다른 생성자에게 생성 위임 해야 한다

😇 kotlin 생성자에서 field 란

field = value
  • setter의 역할을 하는 구문
  • field 가 property의 값을 가지고 있고 값을 받기도 함
반응형