[코틀린기초] 21. 클래스
## 객체 지향 프로그래밍
프로그램의 구조를 객체 간 상호작용으로서 표현하는 프로그래밍 방식
확장과 재사용이 용이하다.
## 코틀린에서의 용어
자바의 필드는 코틀린에서 프로퍼티 라고 부른다.
인스턴스는 코틀린에서 객체라고 한다.
나머지는 자바와 동일
## 예제 코드
class Car {
val wheel: Int = 4
fun start(){
println("Engine Start!")
}
}
class Bird // 중괄호도 생략이 가능하다!
fun main(){
val sonata : Car = Car() // 생성자를 사용한 객체의 생성
//val sonata = Car() 도 가능하다.
println(sonata.wheel)
sonata.start()
}
## 생성자
클래스를 통해 객체가 만들어질 때 기본적으로 호출되는 함수
생성자를 위해 특별한 함수인 constructor() 를 정의
자바처럼 클래스 이름으로 생성자를 선언하지 않는다.
class 클래스명 constructor(매개변수들..){ // 주 생성자
...
constructor(매개변수들..){ // 부 생성자
//프로퍼티 초기화
}
[contructor(매개변수들..){..}] // 추가 부 생성자
}
#### 주 생성자
클래스명과 함께 기술되며 보통의 경우 constructor 키워드를 생략할 수 있다.
class Bird constructor(_name:String, _wing:Int, _beak:String){ //주 생성자를 이용하는 법
...
}
//constructor 생략할 수 있다
class Bird(_name:String, _wing:Int, _beak:String){
...
}
//프로퍼티를 생성자 안에 선언할 수도 있다!
class Bird(var name: String, val wing:Int, var beak:String){...}
#### 부 생성자
클래스 본문에 기술되며 하나 이상의 부 생성자를 정의할 수 있다.
class Bird{
var name: String
var wing: Int
vat beak: String
//여러개의 부 생성자 사용하기 (생성자 오버로딩같은 느낌이다)
constructor(_name: String, _wing: Int, _beak: String){
name = _name
wing = _wing
beak = _beak
}
constructor(_name: String, _beak: Int){
name = _name
wing = 2
beak = _beak
}
}
## init 블럭
객체가 만들어지는 시점에서 수행되는 블럭.
출력문이나 프로퍼티, 메서드 등과같은 간단한 코드를 사용할 수 있습니다.
class Bird(var name:String, val wing: Int, var beak: String){
init{
println("--------- init start ------------")
name = name.capitalize()
println("name: $name, wing: $wing, beak: $beak")
println("--------- init end --------------")
}
}
#### 객체 생성시 실행순서는 1. (프로퍼티, init블럭 순서 없이 선언된 차례대로) 2. constructor 내용
#### 상속 관계에 있다면, 부모 클래스의 모든 property, init, constructor가 생성된 후에 자식 클래스가 생성된다!