0️⃣ 객체지향프로그래밍? 클래스?
코틀린은 자바와 같이 객체지향 프로그래밍을 언어인데, 이는 객체를 만들고 사용하며 적극 활용하는 언어임을 알 수 있다. 객체지향 프로그래밍은 OOP(Object Oriented Programming)이라고도 하며 모든 데이터를 Object, 즉 객체를 취급하여 처리하는 것이다.
그리고 이 객체는 속성과 메서드를 포함해야 하는데 이를 도와주는 것 설계도가 바로 클래스다. 클래스는 객체를 정의하는 틀 또는 설계를 의미하는데 좀 더 쉽게 설명하자면 붕어빵을 만들어내는 틀, 붕어빵 기계와 같다고 보면 된다. 고로 객체는 클래스를 인스턴스화한 데이터 덩어리를 의미하게 되고 객체와 클래스 인스턴스는 서로 바꾸어 사용할 수 있다.
객체지향 프로그래밍을 하려면 클래스를 잘 사용해야하며, 반대로 클래스를 이해하려면 객체지향 프로그래밍을 잘 알아야한다. 객체지향 프로그래밍에는 크게 4가지 특징이 있는데 아래와 같다.
- 캡슐화 : 관련 속성에 관해 작업을 실행하는 메서드를 클래스에 래핑
- 추상화 : 캡슐화의 확장으로 내부 구현 로직을 최대한 숨기는 개념
- 상속 : 상위-하위 관계를 설정하여 다른 특정 클래스의 특성과 동작을 토대로 새로운 클래스를 빌드
- 다형성 : 여러 객체를 한 가지 공통 방식으로 사용하는 능력
이 4가지 특징 중에서 오늘은 추상화와 상속에 대해 알아보겠다.
위에서 설명한 것은 비단 코틀린에만 해당하는 것이 아닌 정의이기 때문에 잘 알아두면 좋다!
1️⃣ 상속
먼저 상속에 대해 알아보겠다.
부모 클래스/자식 클래스가 상속을 받는 개념인데 부모 클래스를 기준으로 자식 클래스가 부모 클래스의 특징을 이어 받는 것이다. 공통적인 요소들이 있다면 부모/자식 클래스를 구분해서 상속관계를 만들 수 있다. Java나 Dart와 달리 extends라는 키워드는 사용하지 않으며 콜론(:)을 사용해서 상속을 받는다. 또한 Kotlin의 클래스는 final 속성이기 때문에 부모 클래스를 선언할 때 앞에 open을 사용하여 상속할 수 있도록 별도로 선언해주어야 한다.
// 부모 클래스 정의
open class Animal(val name: String) {
open fun makeSound() {
println("$name 가 소리를 냅니다.")
}
}
// 자식 클래스 정의1
class Dog(name: String) : Animal(name) {
override fun makeSound() {
println("$name 가 멍멍 짖습니다.")
}
}
// 자식 클래스 정의2
class Cat(name: String) : Animal(name) {
override fun makeSound() {
println("$name 가 야옹 웁니다.")
}
}
이런 식으로 부모 클래스를 하나 선언 해두면 자식 클래스는 부모클래스를 상속 받을 수 있다. override를 통해 부모 클래스에서 선언된 메소드를 자식 클래스에서 재설계할 수 있다. 그리고 이 키워드를 생략하여 메소드를 재설계할 수 없다.
또한 상속은 하나의 부모만 가질 수 있으므로 다중 상속은 불가능하다.
2️⃣ 추상화
추상클래스는 하나 이상의 추상 메소드를 갖고 있는 클래스다. 추상 메소드는 바로 이름만 선언된 미완성 메소드다. 아래와 같이 중괄호도 없어 구체적인 로직도 반환값도 없는 것이 추상 메소드다.
abstract class Animal {
fun makeSound()
}
interface Animal {
fun makeSound()
}
추상 클래스는 하나 이상의 추상 메소드를 가진 클래스로 이루어지며 추상 클래스를 상속 받은 자식 클래스에서 메소드가 구체적으로 정의된다. 좀 더 쉽게 설명하자면 추상 클래스는 미완성 설계도라고 보면 된다. 따라서 추상 클래스를 상속 받은 자식 클래스는 모든 추상 메소드를 오버라이딩 해야하기 때문에 강제성이 부여된다.
하지만 위 코드를 자세히 보면 추상 클래스를 만들 수 있는 키워드가 abstract와 interface 2개가 있는 것을 알 수 있는데, 두 키워드 모두 추상화를 할 수 있다. 차이점으로는, abstract 키워드는 단일 상속, interface는 다중 상속이 가능하다는 점에 있다. interface는 꼭 추상 메소드가 아니더라도 일반 메소드처럼 구현할 수 있다는 것도 특징이다.
❗ 출처
참고 사이트1 : https://developer.android.com/codelabs/basic-android-kotlin-compose-classes-and-objects?hl=ko#0
참고 사이트2 : https://uknowblog.tistory.com/232
'Kotlin' 카테고리의 다른 글
Kotlin 문법 : StringBuilder() (0) | 2024.07.10 |
---|---|
switch문과 if else문, 둘 중 어떤 것이 더 좋은가? (2) | 2024.06.14 |
문제해결 : unresolved reference: add (0) | 2024.06.07 |
Kotlin 문법 : sort와 sorted (with. 프로그래머스) (0) | 2024.06.05 |
Kotlin 문법 : filter (with. 프로그래머스) (0) | 2024.05.14 |