클래스 (Class)
class Person {
var name: String = ""
var age: Int = 0
}
val Per = Person();
// 인스터스 생성은 일반 함수처럼 호출합니다.
생성자를 사용하여 프로퍼티를 초기화하는 생성자를 구현할 수 있습니다.
class Person constructor(firstName: String) { /*...*/ }
class Person(firstName: String) { /*...*/ }
// 기본 생성자에 주석이나 가시성 수정자가 없으면 constructor키워드를 생략할 수 있습니다.
class Person(val firstName: String, val lastName: String, var age: Int)
// Kotlin에는 속성을 선언하고 기본 생성자에서 초기화하는 간결한 구문이 있습니다.
상속 (Inheritance), 재정의 (override)
상속은 상위 클래스의 메서드, 또는 프로퍼티를 사용할 수 있게 해 줍니다.
상위 클래스의 기능을 모두 가지고 새로운 하위 클래스의 기능과 함께 새로운 클래스를 정의할 수 있습니다.
class Example // public class Example
open class Base // class Base
class Derived : Base()
기본적으로 Kotiln 클래스는 최종 클래스이므로 상속할 수 없습니다. 하지만 open 키워드를 사용하여 상속이 가능하게 만들어줄 수 있습니다.
open class Apple {
fun message() {
println("This is a Apple.")
}
}
// open으로 생성한 클래스를 다음과 같이 사용
class Banana : Apple()
fun main() {
var a = Banana()
a.message()
}
Banana 클래스는 아무런 메서드가 없지만 Apple 클래스를 상속받았기 때문에 message라는 method를 사용할 수 있습니다.
open class Apple {
fun message() {
println("This is a Apple.")
}
}
// open으로 생성한 상속 클래스를 다음과 같이 구분
class Banana : Apple() {
fun message() {
println("This is a Banana.")
}
}
fun main() {
var a = Banana()
a.message()
}
위처럼 코드와 같이 Apple 클래스를 Banana 클래스가 같은 메서드를 가지고 있습니다.
하지만 위 코드는 에러가 발생합니다.
open class Apple {
open fun message() {
println("This is a Apple.")
}
}
class Banana : Apple() {
override fun message() {
println("This is a Banana.")
}
}
위 코드는 override라는 키워드를 표시해 줘야 합니다.
상속할 때 이름이 겹치는 method가 있을 경우 override 가 적힌 상속받는 Banana 클래스의 message method가 상속해주는 Apple 클래스의 message method를 덮어 씌웁니다.
결과는 This is a Banana가 출력됩니다.
이는 Activity Lifecycle 에서 사용하는 onCreate 같은 자주 겹치는 메서드에서 자주 사용됩니다.
super 랑 this는 무슨 차이?
super는 상위 클래스의 메서드, 프로퍼티, 생성자를 사용하는 키워드를 뜻하며 this는 현재 클래스의 메서드, 프로퍼티, 생성자를 사용하는 키워드를 뜻합니다.
- super. 메서드 이름 , this. 메서드 이름
- super. 프로퍼티 , this. 프로퍼티
- super() , this()
open class Apple {
open fun message() {
println("This is a Apple.")
}
}
// open으로 생성한 상속 클래스를 다음과 같이 구분
class Banana : Apple() {
override fun message() {
super.message()
println("This is a Banana.")
}
}
fun main() {
var a = Banana()
a.message()
}
class MainActivity: Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_hello)
}
// 1. 확장 불가능한 HelloActivity 클래스를 만들었습니다.
// 2. Activity 클래스를 부모로 합니다.
// 3. 부모 클래스에 정의되어 있는 onCreate를 오버라이드 합니다.
// 4. 부모 클래스의 setContentView를 호출합니다.
하위 클래스의 코드는 super키워드를 사용하여 상위 클래스 함수 및 속성 접근자 구현을 호출할 수 있습니다.
아래 코드는 Activity를 만들면 흔히 볼 수 있는 코드입니다.
데이터 클래스
데이터를 보관하는 목적으로 사용하는 클래스입니다. 클래스가 Data를 보유하면서 특별한 기능을 하지 않습니다.
데이터 클래스는 다음과 같은 특징을 가집니다.
- 상속받을 수 없습니다.
- val 또는 var으로 선언해야 합니다
- abstract, open, sealed, inner를 붙일 수 없습니다
- 1개 이상의 프로퍼티를 가지고 있어야 합니다
- equals(), toString(), hashCode()에 Override 구현 시 구현 함수를 사용합니다.
data class User(
val name: String,
val profileImg: String,
val age: Int
)
val UserData = User(name = '홍길동', profileImg = '123.jpg', age = 123)
val UserName = UserData.name // 홍길동
val UserAge = UserData.age // 123
val _UserData = UserData.copy(name = '김씨')
val _UserName = _UserData.name // '김씨'
fun main() {
val user = User("김", "123.jpg", 24)
// toString() - 결과 : Person(name=김, profileImg="123.jpg", age=24)
println(user.toString())
// hashCode() - 결과 : 1595160
println(user.hashCode())
// equals() - 결과 : true
val user1 = User("김", "123.jpg", 24)
println(user.equals(user1))
// equals() - 결과 : false
val uesr2 = User("김", "123.jpg", 25)
println(user.equals(user2))
}
data class User(
val name: String,
val profileImg: String,
val age: Int
)