클래스, 객체

OneTwoThree·2022년 7월 29일
0

부스트코스 코틀린

목록 보기
21/26

[부스트코스]클래스와 객체의 정의

코틀린에서는 절차지향, 객체지향 모두 지원

객체지향

클래스

특정 대상의 특징(멤버변수)과 동작 활동(메소드) 기록

목표로 하는 대상에서 필요한 속성, 동작을 정의하는 것을 추상화 라고 한다.


자바의 필드는 코틀린에서 프로퍼티로 부른다.

클래스 다이어그램

클래스를 시각적으로 나타내서 분석, 개념 구현에 용이하다.

//Car 클래스 선언, 정의
class Car{
    val wheel : Int=4

    fun start(){
        println("Engine Start")
    }
}

//Bird 클래스 선언
class Bird

fun main() {
    //생성자를 이용해 객체 생성
    val sonata : Car = Car()
    println(sonata.wheel)
    sonata.start()
}

생성자

[부스트코스]생성자

  • 주 생성자
    클래스명과 함께 기술되며 보통의 경우 constructor 키워드를 생략할 수 있다.
  • 부 생성자
    클래스 본문에 기술되며 하나 이상의 부 생성자를 정의할 수 있다.
    매개변수에 따라 다른 생성자가 필요할 경우 부 생성자 이용

주 생성자

package chap01.section2

class Bird constructor(_name : String, _wing : Int){

    var name : String = _name
    var wing : Int = _wing

    fun birdInfo(){
        println("Bird Info")
        println("name : $name")
        println("wing : $wing")
    }

}

fun main() {
    var bird1 = Bird("비둘기",2)
    bird1.birdInfo()
}

Bird Info
name : 비둘기
wing : 2

주 생성자는 클래스 명 옆에 constructor 를 이용해 정의한다.
블록 내부에서 프로퍼티를 선언, 초기화해준다.

주 생성자에서 프로퍼티 초기화 외에 다른 코드를 작성하고 싶다면 init블록을 이용한다.

package chap01.section2

class Bird constructor(_name : String, _wing : Int){

    var name : String = _name
    var wing : Int = _wing

    init{
        println("bird constructed")
    }

    fun birdInfo(){
        println("Bird Info")
        println("name : $name")
        println("wing : $wing")
    }

}

fun main() {
    var bird1 = Bird("비둘기",2)
    bird1.birdInfo()
}

bird constructed
Bird Info
name : 비둘기
wing : 2

init {} 을 이용해서 생성자에 필요한 코드를 추가로 작성할 수 있다.

package chap01.section2

class Bird(var name : String, var wing : Int){
    
    init{
        println("bird constructed")
    }

    fun birdInfo(){
        println("Bird Info")
        println("name : $name")
        println("wing : $wing")
    }

}

fun main() {
    var bird1 = Bird("비둘기",2)
    bird1.birdInfo()
}

주 생성자의 매개변수 부분에 클래스 프로퍼티를 넣어버릴 수 있다.
그리고 constructor 도 특별히 @ 어노테이션 등이 필요한 것이 아니라면 생략 가능하다.

부 생성자

package chap01.section2

class Bird{

    var name : String
    var wing : Int
    
    constructor(_name:String,_wing:Int){
        println("부생성자 호출")
        name = _name
        wing = _wing
    }

    fun birdInfo(){
        println("Bird Info")
        println("name : $name")
        println("wing : $wing")
    }

}

fun main() {
    var bird1 = Bird("비둘기",2)
    bird1.birdInfo()
}

부생성자 호출
Bird Info
name : 비둘기
wing : 2

부 생성자는 클래스 내에 constructor를 이용해서 작성한다.
부 생성자 여러개를 이용할 때는 매개변수 형태가 같으면 충돌 발생

package chap01.section2

class Bird{

    var name : String
    var wing : Int
    
    constructor(_name:String,_wing:Int){
        println("부생성자 호출")
        name = _name
        wing = _wing
    }

    constructor(_name:String){
        println("부생성자 호출")
        name = _name
        wing = 2
    }

    fun birdInfo(){
        println("Bird Info")
        println("name : $name")
        println("wing : $wing")
    }

}

fun main() {
    var bird1 = Bird("비둘기",2)
    bird1.birdInfo()
}

두번째 부 생성자에서는 wing을 매개변수로 갖지 않고 부생성자 블록 내에서 2로 초기화 해 주었다. 이처럼 매개변수에 따라 다른 부생성자를 정의해야 한다.

package chap01.section2

class Bird{

    var name : String
    var wing : Int
    
    constructor(_name:String,_wing:Int){
        println("부생성자 호출")
        name = _name
        wing = _wing
    }

    constructor(_name:String){
        println("부생성자 호출")
        name = _name
        wing = 2
    }

    fun birdInfo(){
        println("Bird Info")
        println("name : $name")
        println("wing : $wing")
    }

}

fun main() {
    var bird1 = Bird("4윙치킨",4)
    bird1.birdInfo()
    var bird2 = Bird("비둘기")
    bird2.birdInfo()
    
}

부생성자 호출
Bird Info
name : 4윙치킨
wing : 4
부생성자 호출
Bird Info
name : 비둘기
wing : 2

부생성자를 이용하면 이처럼 Bird를 생성할 때 인자 2개를 전달할 수도 있고 한개만 전달할 수도 있다.

0개의 댓글