개발자 끄적끄적

코틀린OPP 본문

안드로이드 프로그래밍

코틀린OPP

햏치 2023. 3. 18. 23:01

<Class>
- 단순한 클래스 정의
  - class 클래스_이름(생성자 인자 리스트)
  - 생성자 인자들 중 val/var이 붙은 것은 클래스의 속성이 된다

 - 자바와 다르게
  - 코틀린은 기본적으로 public class
  - 객체를 생성할 때 new 키워드를 쓰지 않는다
  - 속성 접근 메소드를 자동으로 만들어주며, 커스텀 접근 메소드를 만들 수도 있다



<Interface>
- 자바의 인터페이스와 비슷하다
- 구현이 있는 메소드 정의 가능
  - 자바처럼 default를 붙이진 않는다
- 인터페이스 구현 클래스의 메소드 구현에서 override를 반드시 써야한다
  - 클래스르 상속받을 때에도 메소드 오버라이드할 때 override를 쓴다


<기본적으로 상속, 오버라이드 금지>
- interface, abstract class는 기본적으로 상속(구현), 메소드 오버라이드 가능
- class는 기본적으로 상속, 메소드 오버라이드 금지
  - 상속이나 오버라이드가 가능하게 하려면 open 키워드 사용
  - open class Test()
- 메소드 오버라이드 접근 변경
  - final : 오버라이드 금지, 기본적으로 final이다
  - open : 오버라이드 가능, 명시적으로 open을 붙여야 오버라이드 가능
  - abstract : 반드시 오버라이드 해야한다, abstract class 내에서만 사용 가능
  - override : 오버라이드 가능


<기본적으로 공개(public)>
- 코틀린은 클래스와 메소드 모두 기본적으로 public
- 접근(access) 변경자
  - public : 기본 접근
  - internal : 같은 모듈(gradle의 모듈과 같이 같이 컴파일되는 단위)
  - protected : 상속 받은 클래스에서만 접근 가능
  - private : 같은 클래스에서만 접근 가능


<중첩(Nested) 클래스>
- 코틀린에서 중첩 클래스는 자바에서 정적(static) 중첩 클래스와 같다
- 자바처럼 내부 클래스를 만들려면 중첩 클래스 앞에 inner 키워드를 사용



<봉인(Sealed) 클래스>
- 특정 클래스를 상속하는 클래스를 제한할 수 있다


<Constructor>
- Primary constructor : 클래스 이름 옆에 정의하는 생성자
  - class Person(val name: String)
- Secondary constructor : 클래스 내부에 정의하는 생성자


<Property와 getter/setter>
- Property의 커스텀 setter와 getter를 정의할 수 있다
  - public인 속성에 대해 setter를 private으로 하면 클래스 밖에서는 getter만 가능하다
- Interface에 property를 정의할 수 있으나, 이 property는 구현 클래스에서 반드시 오버라이드 해야한다


<Data Class>
- class 정의 앞에 data 키워드 추가
- data class auto-generates equals/hashCode/toString/copy


<object 키워드>
- 클래스 정의 없이 바로 객체를 생성하는 방법
  - 싱글톤을 만들거나
  - companion object를 만들거나
  - anonymous object를 만들 때 사용
- Companion object는 이 객체를 포함하는 클래스의 private 멤버에 접근 가능


<Extension Method/Property>
- 이미 만들어진 클래스의 메소드와 속성을 클래스를 상속하거나 수정하지않고도 추가할 수 있다
- 이렇게 추가된 메소드는 오버라이드가 안된다
- 자바의 기존 Collection들에 다양한 유틸 함수들을 이 방법으로 추가한다
  - String의 새로운 유틸 함수 : substringBefore, substringAfter 등


<Extension Method/Property - 계속>
- 속성도 마찬가지로 확장 가능하다
  ex)
  val String.lastChar : Char
    get() = get(length - 1)

fun main(){
  println("Hello".lastChar)
}



<연산자 오버로딩>
- 이항 산술 연산자 +,-,*,/,% 오버로딩 가능
  - 오버로딩할 때 연산자 이름 plus, minus, times, div, rem

 - 단항 연산자
  - unaryPlus, unaryMinus, not, inc, dec

- 비교 연산자
  - equals, compareTo



<위임(Delegation)>
- 상속과 유사하지만 다른
  - 상속은 강한 결합, 위임은 약한 결합
  - 상속 불가여도 위임은 가능
  - 위임(상속)할 클래스와 동일한 인터페이스를 구현해야한다

- 위임 패턴은 위임(상속)할 객체를 멤버로 만들고 특정 메소드 호출 시 위임 객체의 메소드로 포워드(호출)하는 방식으로 만든다
 - 위임 객체의 메소드 각각에 대해 메소드를 새로 만들어서 포워드 해야한다

- 코틀린은 by 키워드로 위임을 쉽게 지원한다



<위임 속성(Delegated Property)>
- by 키워드를 써서 속성의 get/set을 위임 객체의 getValue/setValue로 위임한다
- 이를 이요하여 특별한 성질을 갖는 속성을 만든다
  - Lazy 특성 : 값을 처음 접근할 때 생성/계산한다
  - Obervable 특성 : 값이 변경될 때 알려주는 리스너를 지정한다
  - Map을 이용하여 객체 속성 값을 저장한다


<Generic>
- 자바 제너릭과 비슷하다

'안드로이드 프로그래밍' 카테고리의 다른 글

안드로이드 레이아웃(LayOut)  (0) 2023.03.30
코틀린FP  (0) 2023.03.23
코틀린(Kotlin) 기초  (0) 2023.03.11