Number란?
코틀린에서 Number는 숫자 타입의 공통 기능을 제공하는 추상 클래스입니다. 코틀린에서 제공하는 숫자 타입은 다음과 같습니다.
- Byte: 8비트 부호 있는 정수 타입
- Short: 16비트 부호 있는 정수 타입
- Int: 32비트 부호 있는 정수 타입
- Long: 64비트 부호 있는 정수 타입
- Float: 32비트 IEEE 754 부동 소수점 타입
- Double: 64비트 IEEE 754 부동 소수점 타입
이러한 숫자 타입은 Number 클래스를 상속하고 있으므로, 공통적으로 toByte(), toShort(), toInt(), toLong(), toFloat(), toDouble() 등의 메서드를 가지고 있습니다. 이 메서드들은 해당 숫자 타입으로 변환하는 기능을 제공합니다.
또한, 코틀린에서는 숫자 타입 간의 자동 타입 변환이 일어납니다. 예를 들어, Byte 타입의 변수를 Int 타입의 변수에 대입하면 자동으로 Int 타입으로 변환됩니다. 이러한 자동 타입 변환은 작은 범위에서 큰 범위로의 타입 변환이 일어날 때 자동으로 발생합니다.
val b: Byte = 1
val i: Int = b // 자동 타입 변환 발생
하지만, 큰 범위에서 작은 범위로의 타입 변환은 명시적으로 해주어야 합니다.
val i: Int = 1
val b: Byte = i.toByte() // 명시적 타입 변환
추상클래스란?
코틀린에서 추상 클래스는 하나 이상의 추상 멤버를 가지는 클래스입니다. 추상 멤버는 구현 코드가 없는 멤버로, 하위 클래스에서 반드시 구현해야 합니다. 추상 클래스는 abstract 키워드를 사용하여 정의합니다.
예를 들어, 다음과 같이 추상 클래스를 정의할 수 있습니다.
abstract class Shape {
abstract fun area(): Double
}
위 코드에서 Shape 클래스는 area() 메서드를 추상 멤버로 가지고 있습니다. 이 클래스를 상속받는 하위 클래스에서는 area() 메서드를 반드시 구현해야 합니다. 추상 클래스는 인스턴스를 생성할 수 없으므로, 하위 클래스에서 추상 멤버를 모두 구현한 후에 인스턴스를 생성할 수 있습니다.
class Rectangle(val width: Double, val height: Double) : Shape() {
override fun area(): Double {
return width * height
}
}
위 코드에서 Rectangle 클래스는 Shape 클래스를 상속하고 있으며, area() 메서드를 구현하고 있습니다. Shape 클래스의 추상 멤버인 area() 메서드를 반드시 구현해야 하므로, Rectangle 클래스에서는 area() 메서드를 구현해주어야 합니다.
추상 클래스는 다른 클래스와 마찬가지로 일반 멤버 변수와 멤버 메서드를 가질 수 있습니다. 추상 클래스의 일반 멤버 변수와 메서드는 하위 클래스에서 그대로 사용할 수 있습니다. 추상 클래스는 상속을 통해 하위 클래스에서 공통된 멤버를 구현할 때 유용하게 사용됩니다.
추상클래스와 인터페이스의 차이
코틀린에서 추상 클래스와 인터페이스는 모두 추상화를 위한 도구입니다. 하지만 추상 클래스와 인터페이스는 목적과 특징이 다르므로, 사용할 때 목적에 맞게 선택해야 합니다.
추상 클래스는 일반 클래스와 마찬가지로 일반 멤버 변수와 멤버 메서드를 가질 수 있습니다. 또한, 추상 멤버를 가질 수 있으며, 추상 멤버는 하위 클래스에서 반드시 구현해야 합니다. 추상 클래스는 구현을 강제할 수 있는 추상 멤버와 공통적인 코드를 제공하는 멤버를 함께 가질 수 있습니다. 추상 클래스는 클래스 계층 구조에서 상위 클래스로 사용됩니다.
인터페이스는 모든 멤버가 추상 멤버입니다. 즉, 멤버 변수와 멤버 메서드는 모두 추상화되어 있으며, 하위 클래스에서 반드시 구현해야 합니다. 인터페이스는 여러 클래스가 공통적으로 가지는 멤버를 추상화할 때 사용합니다. 인터페이스는 클래스 계층 구조에서 상위 클래스가 아닌 독립적인 개념으로 사용됩니다. 하나의 클래스는 여러 인터페이스를 구현할 수 있습니다.
따라서, 추상 클래스는 일반적으로 클래스 계층 구조에서 상위 클래스로 사용되며, 공통된 코드와 구현을 강제하는 추상 멤버를 함께 가집니다. 반면, 인터페이스는 여러 클래스가 공통으로 가지는 멤버를 추상화할 때 사용하며, 클래스와는 별도의 개념으로 독립적으로 사용됩니다.
'질문 정리' 카테고리의 다른 글
코틀린과 지연 초기화, UninitializedPropertyAccessException 방지법 (0) | 2023.03.15 |
---|---|
editText에 setText로 값을 넣어야하는 이유가 뭘까? (1) | 2023.03.15 |
Toast.makeText()를 사용할 때, context를 달라고 하면 this를 입력하는 이유는 뭘까? (0) | 2023.03.14 |
Object와 Any, void와 Unit (0) | 2023.03.14 |
왜 List<String> list = new ArrayList<>()라고 쓸까?? (2) | 2023.02.16 |