본문 바로가기
Mobile/Kotlin

[Kotlin] #5 : 객체지향 프로그래밍 230216

by haheehee 2023. 2. 17.
Class 분류, 범주
Property 속성(Attribute), 변수(Variable), 필드(Field), 데이터(Data)
Method 함수(Function), 동작(Operation), 행동(Behavior)
Object 인스턴스(Instance)

- 자바에서 사용하는 필드는 코틀린에서 프로퍼티로 부른다.

 

++ 클래스 선언 ++

- 클래스는 class 키워드로 선언

- 클래스의 본문에 입력하는 내용이 없다면 { }를 생략

- 클래스의 멤버는 생성자, 변수, 함수, 클래스로 구성

- 생성자는 constructor라는 키워드로 선언하는 함수

- 코틀린에서 class는 public이 디폴트

class Bird {
	// 프로퍼티...
	// 메서드...
}

 

- 객체를 생성해 사용하며 객체로 클래스의 멤버에 접근

- 객체를 생성할 때 new 키워드를 사용하지 X

- 그냥 생성자를 호출하면 객체생성이 되는것..


package com.example.pp112

class Bird {
    var name: String = "mybird"
    var wing: Int = 2
    var beak: String = "short"
    var color: String = "blue"
    
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

fun main() {
    val coco = Bird()   // 클래스의 생성자를 통한 객체 생성 (new예약어 없음)
    coco.color = "red"
    
    println("coco.color: ${coco.color}")    // 객체의 멤버 프로퍼티 읽기
    coco.fly()  // 객체의 멤버 메서드 사용
    coco.sing(3)
}

Bird 클래스 만들어 보기 예제

 


++ 객체(Object) ++

- Bird 클래스란 일종의 선언일 뿐 실제 메모리에 존재해 실행되고 있는 것이 아님

- 객체(Object)는 물리적인 메모리 영역에서 실행되고 있는 클래스의 실체

- ==> 클래스로부터 객체를 생성해 냄

- 구체화 또는 인스턴스화(instantiate)되었다!!

- 메모리에 올라간 객체를 인스턴스(instance)라고도 부름

 

++ 생성자(Constructor) ++

- 클래스를 통해 객체가 만들어질 때 기본적으로 호출되는 함수

- 객체 생성 시 필요한 값을 인자로 설정할 수 있음

- 생성자를 위해 특별한 함수인 constructor()를 정의

 

class 클래스명 constructor(필요한 매개변수들..) { // 주 생성자의 위치
	....
	constructor(필요한 매개변수들..) { // 부 생성자의 위치
		// 프로퍼티의 초기화
	}
	[constructor(필요한 매개변수들..) { ... }] // 추가 부 생성자
	...
}

** 주생성자와 부 생성자의 위치 확인 

** 오버로딩 가능 (적재)

 

// 주 생성자 선언
class User constructor() {
}

// constructor 키워드 생략 예
class User() {
}

// 매개변수가 없는 주 생성자 자동 선언 
class User {
}

 

주 생성자(Primary Constructor)

- 클래스명과 함께 기술되며 보통의 경우 constructor 키워드를 생략 가능

 

부 생성자(Secondary Constructor)

- 클래스 본문에 기술되며 하나 이상의 부 생성자를 정의 가능

- 클래스에 부 생성자를 하나 혹은 그 이상 포함할 수 있다. ==> 매개변수는 서로 달라야 함


package com.example.pp116

class Bird {
    var name: String
    var wing: Int
    var beak: String
    var color: String

    constructor(name: String, wing: Int, beak: String, color: String) {
        this.name = name
        this.wing = wing
        this.beak = beak
        this.color = color
    }
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

fun main() {
    val coco = Bird("mybird", 2, "short", "blue")
    println("coco.name => ${coco.name}")
    println("coco.color => ${coco.color}")
    coco.fly()
    coco.sing(3)
}

부 생성자를 사용하는 Bird 클래스 예제

 

package com.example.pp118

class Bird {
    var name: String
    var wing: Int
    var beak: String
    var color: String

    constructor(_name: String, _wing: Int, _beak: String, _color: String) {
        name = _name
        wing = _wing
        beak = _beak
        color = _color
    }
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

fun main() {
    val coco = Bird("mybird", 2, "short", "blue")
    println("coco.name => ${coco.name}")
    println("coco.color => ${coco.color}")
    coco.fly()
    coco.sing(3)
}

this 키워드 생략하는 경우. 

- '_'를 매개변수에 사용하고 프로퍼티에 this를 생략할 수 있음

 

package com.example.pp120

class Bird {
    var name: String
    var wing: Int
    var beak: String
    var color: String
    
    // 첫 번째 부 생성자
    constructor(name: String, wing: Int, beak: String, color: String) {
        this.name = name
        this.wing = wing
        this.beak = beak
        this.color = color
    }

    // 두 번째 부 생성자
    constructor(_name: String, _beak: String) {
        name = _name
        wing = 2
        beak = _beak
        color = "grey"
    }
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

fun main() {
    val bird1 = Bird("mybird", 2, "short", "blue")
    val bird2 = Bird("mybird2", "long")
    println("bird1.name => ${bird1.name}")
    println("bird1.color => ${bird1.color}")
    bird1.fly()
    bird1.sing(3)

    println("bird2.name => ${bird2.name}")
    println("bird2.color => ${bird2.color}")
    bird2.fly()
    bird2.sing(0)
}

여러 개의 부 생성자 지정 예제

 


주생성자

 

초기화 (우선순위)

1. 명시적, 2. 생성자, 3. 블록

 

package com.example.pp121

// 주 생성자 선언
class Bird constructor(_name: String, _wing: Int, _beak: String, _color: String) {
    // 프로퍼티
    var name: String = _name
    var wing: Int = _wing
    var beak: String = _beak
    var color: String = _color

    // 메서드
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

클래스명과 함께 생성자 정의

 

package com.example.pp122

// 주 생성자 선언
class Bird6(_name: String, _wing: Int, _beak: String, _color: String) {
    //프로퍼티
    var name: String = _name
    var wing: Int = _wing
    var beak: String = _beak
    var color: String = _color

    // 메서드
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

fun main() {
    val coco = Bird6("Yourbird", 2, "long", "red") // 기본값이 있는 것은 생략하고 없는 것만 전달 가능
    println("coco.name: ${coco.name}, coco.wing: ${coco.wing}")
    println("coco.color: ${coco.color}, coco.beak: ${coco.beak}")

}

클래스명과 함께 생성자 정의 - constructor 키워드 생략

 

package com.example.pp123

// 주 생성자 선언
class Bird7(var name: String, var wing: Int, var beak: String, var color: String) {
    // 프로퍼티 - 위에 var 혹은 val로 선언하므로서 프로퍼티가 이미 포함됨

    // 메서드
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

fun main() {
    val coco = Bird7("bird", 11, "long", "orange")
        // 기본값이 있는 것은 생략하고 없는 것만 전달 가능
    println("coco.name: ${coco.name}, coco.wing: ${coco.wing}")
    println("coco.color: ${coco.color}, coco.beak: ${coco.beak}")
}

클래스명과 함께 생성자 정의 - 프로퍼티가 포함된 주 생성자

 

package com.example.pp124

// 주 생성자 선언
class Bird6(var name: String, var wing: Int, var beak: String, var color: String) {
    // 초기화 블록
    init {
        println("-------------초기화 블록 시작--------------")
        println("이름은 $name, 부리는 $beak")
        this.sing(3)
        println("-------------초기화 블록 끝----------------")
    }

    // 메서드
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

fun main() {
    val coco = Bird6("Yourbird", 2, "long", "red")
        // 기본값이 있는 것은 생략하고 없는 것만 전달 가능
    println("coco.name: ${coco.name}, coco.wing: ${coco.wing}")
    println("coco.color: ${coco.color}, coco.beak: ${coco.beak}")
}

초기화 블록이 포함된 주 생성자

- 초기화 블록에는 간단한 코드가 허용된다.

 

package com.example.pp125

// 프로퍼티의 기본값 지정
class Bird10(var name: String = "NONAME", var wing: Int = 2, var beak: String, var color: String) {
    // 메서드
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

fun main() {
    val coco = Bird10(beak="long", color="red")
    // 기본값이 있는 것은 생략하고 없는 것만 전달 가능
    println("coco.name: ${coco.name}, coco.wing: ${coco.wing}")
    println("coco.color: ${coco.color}, coco.beak: ${coco.beak}")
    coco.fly()
}

프로퍼티의 기본값 지정

- 생성시 필요한 기본값을 지정할 수 있다.

 

 

댓글