[코틀린기초] 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가 생성된 후에 자식 클래스가 생성된다!