기본적으로 kotlin은 java의 static과 멤버필드 사용 위치랑 똑같음
class hi {
val good = ""
fun test() {
//a = "aaaa" final이라 변경 불가
//b = "bbbb" final이라 변경 불가
c = "cccc" //인스턴스 메소드에서는 static필드 사용 가능
run() //인스턴스 메소드에서는 static메소드 호출 가능
}
companion object {
val a: String = "" //static final, 런타임 시 값 결정됨 즉,독립적인 프로그램 수행 중에 프로그램 수행에 따라 값이 바뀔 수 있음
const val b: String = "" //static final, 컴파일 시 값 결정됨
var c = "" //static
fun run() {
// test() -> static메소드 영역에서 인스턴스 메소드 호출 불가능
// good="" ->static메소드 영역에서 인스턴스 필드 사용 불가능
}
}
}
class Family {
companion object {
var number = 4
var name = "백김치"
}
var happy = "yes"
}
fun main(args: Array<String>) {
Family.number
Family.name
// Family.happy
}
기억하고 있어야 할 기본 규칙 4개
class Child33(val value:String):Base2{
super(value)
} //에러
//세컨더리 생성자가 호출될 때 프라이머리 생성자를 반드시 호출하도록 해야됨
class Car(engine:String,body:String) {
var door:String=""
constructor(engine: String, body: String, door: String): this(engine,body){
this.door=door
} //세컨더리 생성자 호출하면서 프라이머리 생성자 호출하기
}
open class Charator(var hp: Int, val power: Int) {
open fun defense(damage: Int) {
hp -= damage
if (hp > 0) println(" ${javaClass.simpleName} 의 남은 체력은 $hp 입니다")
else println("사망했습니다")
}
}
//자식생성자에서 var val을 붙이면 안됨
class SuperNight(hp: Int, power: Int, val heal:Int) : Charator(hp, power) {
override fun defense(damage: Int) {
super.defense(damage - 2)
}
}
open class Base {}
class Child2:Base{
//constructor():Base()
//불가능!!!super() 로 호출해야됨 자바를 기억해
1. 부모 프라이머리 생성자+파라미터X
open class Base {}
1. 프라이머리 생성자에서 같이 호출
class Child(name: String) : Base() {}
2. 세컨더리 생성자에서 같이 호출
class Child2:Base{
constructor():super()}
//자식 생성자 호출될 때 부모 클래스의 프라이머리 디폴트 생성자 호출
//constructor():Base() 불가능!!!super() 로 호출해야됨 자바를 기억해
2. 부모 프라이머리 생성자+파라미터O
open class Base(value: String) {}
1. 프라이머리 생성자에서 같이 호출
class Child(value: String, val name: String) : Base(value) {}
class Child2(value: String) : Base2(value) {}
2. 세컨더리 생성자에서 같이 호출
class Child22 : Base2 {
constructor(name: String) : super(name)
}
3. 부모 세컨더리 생성자+파라미터X
open class Base3 { //부모 클래스는 open되어 있어야함
constructor()
}
1. 프라이머리 생성자에서 같이 호출
class Child1:Base3() {}
class Childddd(name:String):Base333(){}
2. 세컨더리 생성자에서 같이 호출
class Child2:Base3{
constructor(name:String):super()
}
4. 부모 세컨더리 생성자+파라미터O
open class Base3 { //부모 클래스는 open되어 있어야함
constructor(name:String)
}
1. 프라이머리 생성자에서 같이 호출
class Child1(name:String):Base3(name) {}
class Childddd(age:Int,name:String):Base333(name){}
2. 세컨더리 생성자에서 같이 호출
class Child2:Base3{
constructor(name:String):super(name)
}
private class mother{
// class는 접근 제한자 안붙어있으면 원래 private이 기본.
//private는 생략이 가능해서 그냥 class mother{}이면 자식 클래스 생성 불가
// 기본=private class=자식 클래스 생성 불가=생성자 private아니니까 객체 생성은 가능
constructor()
fun dabin(){}
}
open class mother1{
private constructor()
constructor(hi:String)
}
//class child:mother(){}
//private class는 자식 클래스 생성 불가
//class child1:mother1(){}
//mother() 호출은 해당 부모 생성자가 private이라 호출 불가
class child2(hi:String):mother1(hi){}
//보무 생성자 중 private아닌 생성자 호출해서 클래스 생성 가능
fun main(args: Array<String>) {
mother().dabin()
//private class 역시도 생성자 호출해서 객체 생성이 가능! 메서드 필드 호출도 됨
//mother1() 외부에서 객체 생성을 불가능하게 하려면 생성자가 private이여야함
//mother().num
open class BaseClass {
open fun opend() {}
open var open = 6
fun notOpend() {}
}
class ChildClass : BaseClass() {
override fun opend() {} //오버라이딩 할때 앞에 override작성!
override var open = 7
//override fun notOpend() open되어 있지 않아서 오버라이딩 불가능
}
open class Car22 {
open fun drive(): String {
return "달린다"
}
}
class superCar : Car22() {
override fun drive(): String {
return "빨리 ${super.drive()}"
}
}
fun 확장하고싶은 클래스.내가 만드는 메서드(){//정의}
fun String.plus(word: String): String {
return this + word
}
fun main(args: Array<String>) {
var nice = "안녕"
println(nice.plus("반가워")) //안녕 반가워
}