반응형
class
- 출처 https://www.youtube.com/watch?v=IDVnZPjRCYg&t=8s [Code with Joyce]
- 클래스는 class 키워드를 붙여 선언 class Invoice { /.../ }
- 클래스의 이름은 첫글자를 대문자로 함
- 클래스에 본문이 없으면 중괄호를 생략 가능
- 코틀란의 class를 객체화를 할때 new 연산자를 사용하지 않음
- 기본적으로 public
class Human {
var name = "joyce"
fun eatingCake(){
println("this is so YUMMMYY~~~")
}
}
fun main(){
var human = Human()
human.eatingCake() //결과값 this is so YUMMMYY~~~
println("this human's name is ${human.name}") // 결과값 this human's name is joyce
}
- 생성자는 주생성자 와 부생성자로 구성
- 주생성자는 클래스 헤더의 일부이며 클레스 이름 뒤에 옴
- class Person constructor(firstName: String) { /.../ }
- 기본 생성자에 주석 또는 가시성 수정자(private,protected,public)가 없으면 생성자 키워드는 생략 가능
- 생성자에는 default 값을 지정할 수 있다.
class Human constructor(name: String){
var name = name
fun eatingCake(){
println("this is so YUMMMYY~~~")
}
}
class Human(val name: String = "Anonymous"){
fun eatingCake(){
println("this is so YUMMMYY~~~")
}
}
fun main(){
var human = Human("minsu")
human.eatingCake() //결과값 this is so YUMMMYY~~~
println("this human's name is ${human.name}") // 결과값 this human's name is minsu
var human = Human()
human.eatingCake() //결과값 this is so YUMMMYY~~~
println("this human's name is ${human.name}") // 결과값 this human's name is Anonymou
}
- init{} 키워드는 초기화 블록
- 주생성자 호출 직후 실행되며 부생성자 보다 먼저 실행된다.
class Human(val name: String = "Anonymous"){
init {
println("New human has been born!!") // 첫번째로 실행
}
fun eatingCake(){
println("this is so YUMMMYY~~~") //두번째로 실행
}
}
fun main(){
var human = Human()
human.eatingCake()
println("this human's name is ${human.name}") //세번째로 실행
}
//결과값
// New human has been born!!
// this is so YUMMMYY~~~
// this human's name is Anonymous
부생성자
클래스의 본문안에서 정의된 생성자
constructor()를 이용
class Person { constructor(firstName: String){/.../} }
주생성자가 있는상태에서 부 생성자는 자신이 필요한 인수의 정보를 주 생성자에게서 가져와야 하며, 가져오는 방법은 this 키워드를 사용(왜 어려운 말로 위임한다고 할까..)
class Person(val name: String) {
var children: MutableList<Person> = mutableListOf<>()
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
class Human(val name: String = "Anonymous"){
init {
println("New human has been born!!")
}
constructor(name: String, age :Int) :this(name) {
println("my name is ${name}, ${age} years old")
}
fun eatingCake(){
println("this is so YUMMMYY~~~")
}
}
fun main(){
var human = Human("minsu", 52)
println("this human's name is ${human.name}")
}
// 결과값
// New human has been born!!
// my name is minsu, 52 years old
// this human's name is minsu
상속
클래스는 기본적으로 static 이기 때문에 상속이 불가능
그 이유로 open 키워드를 이용하여 부모 클래스를 명시적으로 선언
자바
class ParentClass{/*...*/}
class ChildClass extends ParentClass {}
- 코틀린
open class ParentClass{/*...*/}
class ChildClass : ParentClass {}
- open 키워드를 사용하지 않으면 This type is final, so it cannot be inherited from 에러 발생
open class Human2(val name: String = "Anonymous"){
init {
println("New human has been born!!")
}
constructor(name: String, age :Int) :this(name) {
println("my name is ${name}, ${age} years old")
}
fun eatingCake(){
println("this is so YUMMMYY~~~")
}
fun singASong() {
println("lalala")
}
}
class Korean : Human2(){
}
fun main(){
val korean : Korean = Korean()
korean.singASong()
}
//결과값
//New human has been born!!
//lalala
override
상속받은 클래스 의 메서드를 override 하기 위해서는 해당 메서드에도 open 키워드를 사용한다.
override 키워드 사용
open class Human2(val name: String = "Anonymous"){
init {
println("New human has been born!!")
}
constructor(name: String, age :Int) :this(name) {
println("my name is ${name}, ${age} years old")
}
fun eatingCake(){
println("this is so YUMMMYY~~~")
}
open fun singASong() {
println("lalala")
}
}
class Korean : Human2(){
// override 키워드 사용
override fun singASong(){
super.singASong()
println("라라라")
println("${name}")
}
}
fun main(){
val korean : Korean = Korean()
korean.singASong()
}
// 결과값
//New human has been born!!
//lalala
//라라라
//Anonymous
'코틀린+안드로이드' 카테고리의 다른 글
13. companion object (0) | 2020.07.18 |
---|---|
12. Lambdas 람다 (0) | 2020.07.17 |
10. for, while (0) | 2020.07.17 |
9. Nullable / NonNull (0) | 2020.07.17 |
8. List, ArrayList (0) | 2020.07.16 |