[코틀린] 클래스

나고수·2021년 9월 24일
0

kotlin

목록 보기
3/10

클래스

package Kotlin

//OOP->Object Oriented Programing
//객체란? - 이름이 있는 모든 것
//절차지향 프로그래밍의 문제해결방법 -> 코드를 위에서 부터 아래로 실행하면 문제가 해결된다.
//객체지향 프로그래밍의 문제해결방법 -> 객체를 만들어서 객체에게 일을 시켜서 문제를 해결한다.
//ex)축구게임 선수, 심판, 경기장, 관중 을 만들고 각 객체에게 일을 시켜서 문제를 해결한다.
//프레임워크에서 지원해주지 않는 객체를 우리가 만들어야한다.

//객체를 만드는 방법
//설명서가 있어야 한다.

fun main(array: Array<String>){
    //클래스(설명서)를 통해서 실체를 만드는 방법
    //->인스턴스화를 통해서 인스턴스를 얻는다. (인스턴스랑 객체는 유사한 개념)
    Car("v8 engine","big")

    val number : Int =10
    val bigCar = Car("v8 engine","big")
    //우리가 만든 클래스(설명서)는 자료형이 된다.
    val bigCar2 : Car = Car("v8 engine","big")
    val SuperCar : SuperCar = SuperCar("good engine", "big", "white")
    //인스턴스가 가지고 있는 기능을 사용하는 방법
    val runableCar : RunableCar = RunableCar("Simple engine", "short body")
    runableCar.ride()
    runableCar.navi("부산")
    runableCar.drive()
    //인스턴스의 멤버변수에 접근하는 방법
    val runableCar2 : RunableCar2 = RunableCar2("nice engine","long body")
    println(runableCar2.body)
    println(runableCar2.engine)

    //오버로딩
    val testClass : TestClass = TestClass()
    testClass.test(3)
    testClass.test(3,5)

}

//클래스 만드는 방법 (클래스 == 설명서)1
class Car(var engine : String, var body: String){
}
//클래스 만드는 방법 (클래스 == 설명서)2
class SuperCar{
    var engine : String
    var body : String
    var door : String

    constructor(engine: String, body: String, door: String){
        this.engine = engine
        this.body= body
        this.door = door
    }
}
//클래스 만드는 방법 (클래스 == 설명서)3 ->1번방법의 확장
//엔진, 바디는 필수 도어는 있어도되고 없어도 됨
class Car1(engine: String, body: String){
    var door : String =""

    //생성자
    constructor(engine: String, body: String, door: String):this(engine, body){
        this.door=door

    }
}
//클래스 만드는 방법 (클래스 == 설명서)4 ->2번방법의 확장
class Car2{
    var engine: String = ""
    var body : String = ""
    var door : String = ""

    constructor(engine: String, body: String){
        this.engine=engine
        this.body=body
    }
    constructor(engine: String, body: String, door: String){
        this.engine=engine
        this.body=body
        this.door=door
    }
}
//기능이 있는 설명서 만들기
class RunableCar(engine: String, body: String){
    fun ride(){
        println("탑승하였습니다.")
    }
    fun drive(){
        println("달립니다")
    }
    fun navi(destination: String){
        println("$destination 으로 목적지가 설정되었습니다")
    }
}

class RunableCar2{
    var engine : String
    var body  : String

    constructor(engine: String, body: String){
        this.engine=engine
        this.body=body
    }
    //클래스가 인스턴스화 될 때 가장 먼저 호출되는 함수
    //초기셋팅을 할 때 유용하다
    init {
        println("RunableCar2가 만들어졌습니다.")
    }
    fun ride(){
        println("탑승하였습니다.")
    }
    fun drive(){
        println("달립니다")
    }
    fun navi(destination: String){
        println("$destination 으로 목적지가 설정되었습니다")
    }
}
//오버로딩
//->이름이 같지만 받는 파라미터가 다른 함수
class TestClass(){
    fun test(a: Int){
        println("UP")
    }
    fun test(a: Int, b: Int){
        println("down")
    }
}
class TV2(val channels: List<String>) {
    var onOrOff: Boolean = false
    var currentChannelNumber = 0
        //값이 할당될때를 포착해서 어떤 행동을 하는 함수
        //원하는 변수 바로 밑에 들여쓰기 해서 써줘야함
        set(value) {
            //currentChannelNumber = value 로 하면 안됨! 그러면 무한루프에 빠진다.
            field = value
            if (field > 2) {
                field = 0
            }
            if (field < 0) {
                field = 2
            }
        }
        //값이 호출될때를 포착해서 어떤 행동을 하는 함수
        get() {
            println("출력되었습니다.")
            return field
        }

    fun switch() {
        onOrOff = !onOrOff
    }

    fun checkCurrentChannel(): String {
        return channels[currentChannelNumber]
    }

    fun channelUp() {
        currentChannelNumber += 1
    }

    fun channelDown() {
        currentChannelNumber -= 1
    }
}

//https://www.notion.so/set-get-outOfBoundaryError-a517a8cfb33746e9b968d0b6b07b73e5
//숫자 여러개 계산
class Calculator2() {
    fun plus(vararg numbers: Int): Int {
        var result: Int = 0
        numbers.forEach {
            result += it
        }
        return result
    }

    fun minus(vararg numbers: Int): Int {
        var result: Int = numbers[0]
        for (i in 0 until numbers.size) {
            if (i != 0) {
                result = result - numbers[i]
            }
        }
        return result
    }

    fun multiple(vararg numbers: Int): Int {
        var result: Int = 1
        numbers.forEach {
            result = result * it
        }
        return result
    }

    fun divide(vararg numbers: Int): Int {
        var result: Int = numbers[0]
        numbers.forEachIndexed { index, i ->
            if (index != 0 && i != 0) {
                result = result / i
            }
        }

        return result
    }
}

//return을 Class로 하기
class Calculator3(val initialValue: Int) {
    fun plus(number: Int): Calculator3 {
        val result = this.initialValue + number
        return Calculator3(result)
    }

    fun minus(number: Int): Calculator3 {
        val result = this.initialValue - number
        return Calculator3(result)
    }

    fun multiple(number: Int): Calculator3 {
        val result = this.initialValue * number
        return Calculator3(result)
    }

    fun divide(number: Int): Calculator3 {
        val result = this.initialValue / number
        return Calculator3(result)
    }

}
// 계좌개설시 마이너스 통장을 만드는 경우 방지 1

class Bank {
    val name: String
    val birth: String
    var balance: Int

    constructor(name: String, birth: String, balance: Int) {
        this.name = name
        this.birth = birth
        //생성자 매개변수를 this에 넣을 때 검열가능
        if (balance >= 0) {
            this.balance = balance
        } else {
            this.balance = 0
        }
    }

    fun checkBalance(): Int {
        return balance
    }

    fun withdraw(amount: Int): Boolean {
        if (balance >= amount) {
            balance -= amount
            return true
        } else {
            return false
        }
    }

    fun save(amount: Int) {
        balance += amount
    }
}

//디폴트값을 가지는 함수
class Bank2(val name: String, val birth: String, var balance: Int = 1000) {

    fun checkBalance(): Int {
        return balance
    }

    fun withdraw(amount: Int): Boolean {
        if (balance >= amount) {
            balance -= amount
            return true
        } else {
            return false
        }
    }

    fun save(amount: Int) {
        balance += amount
    }
}

// 계좌개설시 마이너스 통장을 만드는 경우 방지 2 
//initialBalance 를 활용한 변수를 클래스 내에서 새로 만든다.
class Bank3(initialBalance: Int) {
    var balance: Int = if (initialBalance >= 0) initialBalance else 0

    fun checkBalance(): Int {
        return balance
    }

    fun withdraw(amount: Int): Boolean {
        if (balance >= amount) {
            balance -= amount
            return true
        } else {
            return false
        }
    }

    fun save(amount: Int) {
        balance += amount
    }
}
profile
되고싶다

0개의 댓글