data class 클래스이름 (val name : String, val age : Int,)
실드 클래스 (sealed class)
클래스 상속과 관련된 개념
자식클래스를 미리 정의할 수 있고, 무분별한 상속을 방지할 수 있음
컴파일 시점에 생성할 수 있는 자식을 알 수 있기 때문에 효율적으로 다형성 구현
sealed class 부모클래스 { class 자식클래스1 : 부모클래스생성자}
오브젝트 클래스 (object class)
프로그램을 실행하는 동시에 인스턴스화 함
생성자
클래스를 통해 객체 생성 시 최초로 실행할 로직
메서드와 비슷해 보이지만 반환타입이 없어 메서드로 부르진 않음
//방법 1
class Person () {
}
//방법 2 : 생성자의 인자가 없을 경우 괄호 생략 가능
class Person{
}
-----------------------------------------
//생성자에 변수에 자료형을 선언해주면 클래스 내부 멤버변수로 저장됨
fun main (){
val a = Person("홍길동")
println(a.name)
}
class Person(val name : String){
}
// 출력값 - 홍길동
-----------------------------------------
// 아래 name은 매개변수로 받지만 Person클래스의 멤버변수로는 존재안함
fun main (){
val a = Person("홍길동")
println(a.name)
}
class Person( name : String){
}
// error - name은 멤버변수가 아니여서 호출되지 않음
-----------------------------------------
init 코드블럭
클래스가 인스턴스화 될 때 가장 먼저 실행
무조건 동작해야 하는 코드
fun main(){
val a = Test1()
}
class Test1(){
init{
//클래스 인스턴스화 될 때 가장 먼저 실행
}
}
기본생성자
클래스 이름 오른쪽에 정의되는 생성자
매개변수는 멤버변수로 등록
class Test1 construct(val a :Int){
//원래는 위와 같이 construct를 붙여야하지만 생략 가능하다
}
보조생성자
매개변수나 자료형을 달리하여 여러개 만들어서 사용 가능
fun main (){
val a = Person("홍길동", 12)
}
class Person{
constructor(){
println("매개변수 없는 생성자") //메인함수 생성자에 매개변수가 없는 값이 없어서 호출 안됨
}
constructor(name : String, age : Int){
println("$name, $age")
}
}
//출력값 - 홍길동, 12
응용 문제
fun main() {
val test1 = Test1("홍길동")
val test2 = Test1("홍길순",30,"010-1234-5678")
}
class Test1 (name : String) {
var name1 : String
var age1 : Int
var phone1 : String
init {
println("initblock")
this.name1 = name
this.age1 = 100
this.phone1 = "비밀"
println(name1)
println(age1)
println(phone1)
}
constructor(name: String, age:Int, phone:String) : this(name) {
println("constructor")
this.name1 = name
this.age1 = age
this.phone1 = phone
println(name)
println(age)
println(phone)
}
}
//출력값 - initblock // val test1 실행
홍길동
100
비밀
initblock // val test2 실행
홍길순
100
비밀
constructor
홍길순
30
010-1234-5678