클래스는 '값'과 그 값을 사용하는 '기능'들을 묶어 놓은 것
고유의 특징 값 <속성> + 기능 구현 <함수>
클래스를 이용해서 만들어 내는 서로 다른 속성의 객체를 지칭.
fun main() {
var a =Person("박보영", 1990) //인스턴스 a
var b = Person("전정국", 1997) //인스턴스 b
var c = Person("장원영",2004) //인스턴스 c
a.introduce()
b.introduce()
c.introduce()
}
class Person(var name:String, val birthYear: Int) {
fun introduce(){ //함수 추가
println("안녕하세요, ${birthYear}년생 ${name}입니다")
}
}
객체지향의 기본 구조 + 함수형 언어의 장점 = 코틀린
: 새로운 인스턴스를 만들기 위해 호출하는 특수한 함수.
<기능>
(init 함수는 파라미터나 반환형이 없는 특수한 함수, 생성자를 통해 인스턴스가 만들어 질 때 호출되는 함수)
:클래스를 만들 때 기본으로 선언
:필요에 따라 추가적으로 선언,
기본 생성자와 다른 형태의 생성자를 제공하여 인스턴스 생성시 편의를 제공하거나, 추가적인 구문을 수행하는 기능을 제공하는 역할,필요에 따라 추가적으로 선언, 기본 생성자와 다른 형태 의 생성자를 제공하여 인스턴스 생성시 편의를 제공하거나, 추가적인 구문을 수행하는 기능을 제공하는 역할
보조생성자 만들 때는 반드시 기본 생성자를 통해 속성을 초기화 해줘야함.
constructor(name:String):this(name,1997)
fun main() {
var a =Person("박보영", 1990)
var b = Person("전정국", 1997)
var c = Person("장원영",2004)
var d = Person("박지민")
var e = Person("김석진")
var f= Person("김남준")
}
class Person(var name:String, val birthYear: Int) {
init {
println("${this.birthYear}년생 ${this.name}님이 생성되었습니다")
}
constructor(name:String):this(name, 1997){
println("보조생성문이 사용되었습니다")
}
}
inheritance
상속의 필요성
이미 존재하는 클래스를 확장하여 새로운 속성이나 함수를 추가한 클래스를 만들어야 할 때.
여러개의 클래스를 만들었는데 공통점을 뽑아 코드 관리를 편하게 할 때 사용.
수퍼 클래스 : 속성과 함수를 물려주는 클래스
서브 클래스 : 물려받는 클래스
상속 구현 : Animal ⇒ Dog, Cat 확정
open은 클래스가 상속될 수 있도록 클래스 선언시 붙여주는 키워드
fun main() {
var a =Animal("별이", 5, "개")
var b = Dog("별이", 5)
a.introduce()
b.introduce()
b.bark()
var c = Cat("루이", 1)
c.introduce()
c.meow()
}
open class Animal(var name:String, var age:Int, var type:String){
fun introduce(){
println("저는 ${type} ${name}이고, ${age}살입니다.")
}
}
class Dog(name: String, age:Int) : Animal(name, age, "개"){
fun bark() {
println("멍멍")
}
}
class Cat(name:String, age:Int): Animal(name,age,"고양이"){
fun meow(){
println("야옹야옹")
}
}
결과값 :
저는 개 별이이고, 5살입니다.
저는 개 별이이고, 5살입니다.
멍멍
저는 고양이 루이이고, 1살입니다.
야옹야옹
상속 규칙