728x90
추상 클래스 (abstract class)

추상 클래스 (abstract class)

  • 구현할 클래스의 명세를 정의 : 하위 클래스에서 구체 사항을 구현
    • 실제로 구현되지는 않음
    • ex. abstract class Vehicle : 하위 클래스로 차량의 클래스인 차량, 오토바이 등을 구현
    • open 키워드 없이 상속 가능
abstract class Vehicle(val name : String, val color : String, val weight : Double) //primary constructor 속 프로퍼티는 abstract가 아님 { abstract val maxSpd : Double //추상 프로퍼티 : 하위 클래스에서 override해야 함 abstract fun start() abstract fun stop() // 추상 메소드 : 하위 클래스에서 구현해야 함 fun display() { println("$name / $color / $weight") }//비 추상 메소드 : 하위 클래스 모두가 해당 구현물을 갖게 됨 } class Car(name : String, color : String, weight : Double, override val maxSpd : Double) : Vehicle(name, color, weight) //상속 선언(maxsPd override 포함) { override fun start() { println("car start") } override fun stop() { println("car stop") } }
  • object를 이용한 추상 메소드 구현
abstract class Printer { abstract fun print() } val myPrinter = object : Printer() { override fun print() println("출력!")//하위 클래스 선언 없이 임시로 추상 메소드 구현 가능 }

인터페이스

  • 해야 하는 작업에 대한 추상적 명세
    • 클래스가 아니므로 다중 상속 가능
    • 강한 연관을 갖지 않음
interface Pet //인터페이스 상속 시 ': 인터페이스명' 추가 { //abstract 없이도 프로퍼티/메소드 선언됨 var category : String fun feeding() //다만 메소드는 내용 작성 시 일반 메소드로 동작 fun patting() { println("Keep patting!") } } class Cat(override var category : String) : Pet { override fun feeding() { println("Feed cat tuna!") } //patting은 인터페이스에서 선언되었으므로 오버라이드가 없어도 됨 }

데이터 클래스

  • 데이터 전달을 위한 객체 DTO(Data Transfer Object)
    • 자바에서는 POJO(Plain Old Java Object)
    • 구현 없이 데이터를 표현
    • 데이터를 접근하는 게터/세터 포함
  • 코틀린의 데이터 클래스 : 프로퍼티 = 필드 + 게터, 세터
  • 자동 생성 메소드
    • 게터, 세터
    • 비교를 위한 equals(), 키를 위한 hashCode()
    • 프로퍼티를 문자열로 보여주는 toString()
    • 객체 복사를 위한 copy()
    • 프로퍼티에 상응하는 component1(), component2(), ...
  • 선언 방식 : data class 이름(프로퍼티)
    • 주 생성자는 최소 하나의 매개변수를 가져야 함
    • 주 생성자의 모든 매개변수는 val, var 프로퍼티여야 한다
    • 데이터 클래스는 abstract, open, sealed, inner 키워드를 쓸 수 없음
data class Customer(var name : String, var email : String) { var job : String = "unknown" constructor(name : String, email : String, __job : String) : this(name, email) { job = __job } // 부 생성자 : 프로퍼티 선언 init { // init : 간단한 로직 선언 가능 } } val cus1 = Customer("kim", "kim@mail.com") val cus2 = Customer("kim", "kim@mail.com") println(cus1 == cus2) //동등성 비교, true 반환 println(cus1.equals(cus2)) //위와 동일 println("${cus1.hashCode(), ${cus2.hashCode()}}") // 고유값 동일 - 두 객체의 값이 동일하므로 참조하는 위치도 동일함 val cus3 = cus1.copy(name = "alice") // cus1 내용을 복사하면서 name만 새 값을 대입
  • 디스트럭처링(destructuring) : 객체의 프로퍼티를 개별 변수로 분해
val (name, email) = cus1 val (_, email) = cus1 // 특정 프로퍼티가 필요 없는 경우 val name = cus1.component1() //cus1의 1번째 component(name) 반환 val customers = listOf(cus1, cus2) //DTO가 많은 경우 리스트화 후 반복문 사용 for((name, email) in customers)

내부 클래스와 중첩 클래스

  • 코틀린의 내부 클래스
    • 중첩(Nested) 클래스 : 객체 생성 없이 이용 가능
      • 외부 클래스 생성 없이 내부의 nested 객체를 생성할 수 있음
      • 외부 클래스에 companion object를 갖고 있을 경우 해당 객체에 접근 가능
    • 이너(inner) 클래스 : 필드, 메소드와 연동하는 클래스(inner 키워드 필요) - 외부 클래스 프로퍼티에 접근 가능
      • 클래스 내에 키워드 없이 선언 시 nested class로 선언됨, 내부 클래스는 외부에 접근이 불가능하게 됨
      • 바깥 클래스의 private 멤버도 접근 가능
    • *익명 객체 : 일회용 객체 선언을 위해 object 키워드 사용

지역 클래스와 익명 클래스

  • 지역 클래스(Local Class)
    • 특정 메서드 블록이나 init블록과 같이 그 안에서만 유효한 클래스
      • 블록 범위 내에서는 사용되지 않음
class Smartphone(val model:String) { fun powerOn() : String class Led(val color : String) { fun blink() : String = "Blink $color on $model" }//지역 클래스 - 외부 프로퍼티에 접근 가능 val powerStatus = Led("Red") return powerStatus.blink() }
  • 익명 클래스(Anonymous Class)
    • 일회적으로 객체를 생성해 사용
    • 메모리 효율 혹은 개발 속도(오버라이딩 구현) 면에서 사용

실드 클래스와 열거형 클래스

  • 실드(Sealed) 클래스
    • sealed 키워드를 사용
    • 그 자체로는 추상 키워드와 같이 객체 생성은 불가
    • 기본 생성자는 private, 그 외에는 불허
    • 같은 파일 내에서만 상속 가능
    • 블록 내의 클래스는 필요한 경우 open 키워드로 선언하여 상속 가능
    • 주로 상태의 정의와 관리에 사용
sealed class Result { open class Success(val message : String) : Result() //해당 클래스는 상속 가능 class Error(val code : Int, val message : String) : Result() } class Status : Result() // 같은 파일에서만 상속 가능 class Inside : Result.Success("Success") // 내부 클래스 상속
  • 열거형 클래스(enum class)
    • 여러 상수를 선언하고 조건에 따라 값을 선택 가능
    • 동일한 자료형의 상수 나열 가능
enum class 이름(생성자) { 상수1(값), 상수2(값), 상수3(값), ... //값은 선택 가능 }
  • 어노테이션 클래스
    • 코드에 부가정보 추가
    • @기호를 이용하여 사용
    • 컴파일러나 프로그램 실행 시 사전 처리
      • @Test : 유닛 테스트
      • @JvmStatic : 자바 코드에서 컴패니언 객체 접근
728x90

+ Recent posts