추상 클래스
상대방이 말을 애매하게 할 때 우리는 "너의 말은 추상스러워." 혹은 "왜 추상스럽게 말해?"라고 할 때가 있다.
객체 지향 프로그래밍에서 코드를 작성할 때 클래스나 함수를 명확하게 작성하기 어려울 때가 있다.
이때 추상 클래스 또는 추상 메서드를 사용할 수 있다.
abstract class Game{
abstract fun gameStart(title: String)
abstract val name : String
}
추상 클래스를 선언할 때 일반 클래스와 달리 앞에 abstract를 반드시 작성해야 한다.
추상 클래스를 자세히 보면 메서드 앞에서도 abstract라고 적은 것을 볼 수 있는데 이를 추상 메서드, 추상 함수라고 부른다.
일반 클래스에서는 선언할 수 없으나 매개 변수를 받을 수는 있다. 다만 선언만 해주고 마무리해줘야 한다.
일반 변수도 추상화가 가능한 걸 볼 수 있다. 이때 평상시와는 달리 선언할 수 없어 코틀린이 데이터 타입을 추론할 수 없다. 따라서 데이터 타입의 종류도 명시해야 한다.
사용 이유
추상 클래스를 사용하는 이유는 크게 상속과 관련이 있다. 공통부분을 여러 번 사용하여 코드 가독성과 유지 보수를 용이하게 하는 것이 바로 추상 클래스이다.
상속과 관련이 있으므로 추상 클래스를 상속 받은 클래스는 반드시 추상 클래스에서 선언만 한 객체를 구체화하는 작업이 필요하다. 아래의 코드는 상속받은 클래스의 예시 코드이다.
class Gta : Game(){
override fun gameStart(title: String) {
println(" released?")
}
override val name: String
get() = "Grand Theft Auto VI"
}
상속받은 클래스에서 모든 추상화 메서드, 객체를 정의하였다. 만약 정의하지 않는다면 에러가 발생한다.
fun main() {
val gta = Gta();
val title = gta.name
gta.gameStart(title)
}
이렇게 상속 받은 클래스를 메인 함수에서 출력이 가능하다.
출력문: Grand Theft Auto VI released?
데이터 클래스
데이터 클래스는 데이터를 클래스의 형식으로 관리한다. 코틀린만이 가지고 있는 특징이다. 데이터 클래스는 추상 클래스처럼 맨 앞에 data를 붙여준다.
data class Memo(val title: String, val content: String, val isDone : Boolean)
위 클래스는 메모의 제목과 내용, 완료 여부를 나타낸다. 메인 함수에서 데이터 클래스가 어떻게 사용이 되는지 아래 코드에서 확인할 수 있다.
fun main() {
val memo1 = Memo("Study Kotlin", "Study Data Table", true)
println(memo1.toString())
println(memo1.title)
}
메모리 변수의 매개 변수를 전부 작성해 주어야 메모 클래스를 사용할 수 있다.
선언된 변수명에 toString()을 붙이면 키-값 구조로 데이터를 볼 수 있다.
결과: Memo(title=Study Kotlin, content=Study Data Table, isDone=true)
만약 해당 메모의 특정 키의 값만 보고 싶다면 변수명.키 이런 구조로 작성하면 된다.
println(memo1.title) // Study Kotlin
copy()도 있는데 말 그대로 복사한다는 의미이다.
val memo2 = memo1.copy()
println(memo2.content) // Study Data Table
memo2는 memo1의 데이터를 전부 복사했기 때문에 memo2.content의 값은 memo1의 content 값으로 출력된다.
'코틀린' 카테고리의 다른 글
16. 인터페이스 (0) | 2025.02.06 |
---|---|
15. 클래스 - Object (0) | 2025.02.06 |
13. 클래스 - 상속 (0) | 2025.01.29 |
12. 클래스 - 기본 (1) | 2025.01.29 |
11. 객체 지향 프로그래밍 (0) | 2025.01.29 |