본문 바로가기
개인자료실

추상화클래스 Abstract

by 다겸란이 2023. 7. 27.

처음에는 반만 이해했고 드디어 완성!_이라고 생각합니다.

조금 더 이것 저것 만져봐야하지만 일단은 제 기준에 이 정도입니다.

 

1. 추상화 클래스를 만든다.

abstract class Animal {
    abstract fun eat()
    abstract fun run()
}

추상클래스는 가상공간에 존재하는 상태라고 생각하면 될 것 같습니다.

main 에서 Animal 클래스는 이용 불가능한 상태입니다. 클래스를 못 불러오면 밑에 eat() 함수도 못 불러오는 상태입니다.

2. 토끼(Rabbit) 라는 클래스를 생성해 줍니다.

class Rabbit : Animal() {
    override fun eat() {
        println("소소소소소")
     }
    override fun run() {
        println("깡총깡총")
    }
}

Rabbit 이라는 클래스에 : (상속받을 클래스명()) 을 작성해 주시면

=> Rabbit 이라는 클래스는 Animal이라는 클래스를 상속 받고 있습니다.

 

소괄호안에 override 키워드를 입력하고 함수선언 fun 을 작성하고 eat() 라는 함수를 사용할 수 있다.

=> 추상함수를 이용하기위해서 Animal 이라는 클래스를 Rabbit 에 상속받으면 Animal 에 있는 함수 eat(), run() 함수를 Rabbit 클래스에서 override(덮어씌우는 느낌입니다) 키워드로 fun eat(), fun run() 이라는 함수를 이용 할 수 있게 되고 이 때는 실제로 어떻게 실행되어지는 지를 작성해줘야 한다(추상화는 강제성이라고 한다). 저는 일단 눈에 보이기 위해서 println() 함수를 이용하여 화면에 보이게 했습니다.

 

저는 모두 다른 클래스로 파일화했습니다. 밑에 사진처럼요

main 에서 출력 할려면

fun main() {
    var a = Rabbit()
}

이렇게 선언을 하나 해주시고 a 를 이용하여 불러오는 방법

a. <<< 이러면 이렇게 뒤에 올 수 있는 것들이 보입니다.

저는 처음 추상화클래스에 함수를 eat(),run() 이 있었죠

그게 바로 보입니다.

그리고는 그것을 선택해서 눌렀습니다.

fun main() {
    var a = Rabbit()
    a.eat()
    a.run()
    
}

이것을 재생을 눌러보시면 

밑에 재생 부분 저가 Rabbit 클래스 eat(), run() 에 설정한 값들이 이렇게 불러와 집니다.

이게 추상화클래스를 이용하는 것이고

 

 

 

해석이랄까요 확실치는 않아요 왕초보개발자라서 아직 확신은 없지만 저가 이해한 것을 적어둔 것입니다.

조금 더 업그레이드랄까요 이건 필요에 의해서 하는 일_확실치않아요 저는 아직 활동해보지 못한 왕초보개발자라...

ex) 계산기

계산이라는 함수를 이용하는데 사칙연산(+,-,*,%)을 해요

그러면 추상클래스 위에 하나의 클래스를 정해서 숫자를 가져오는 기능을 넣어요

ex) 는 더하기만 하나만 예로 보여 드리겠습니다.

1.추상화 클래스를 만든다.

abstract class AbstractOperation {
    abstract fun operate (a: Double, b: Double): Double
}

2. 추상화클래스를 상속받는 Add 더하기라는일을 하는 클래스를 만든다.

class AddOperation : AbstractOperation(){
    override fun operate(a: Double, b: Double): Double {
        return a+b
    }
}

 

return 으로 받아온 a 숫자와 b 숫자를 더한다고 해놨습니다.

근데 얘는 더하기만 실행을 하고  다른것을 못 하잖아요

그래서 나누기도 만들고 곱하기도 만들고 빼기도 만들어요 (사칙연산하는 클래스들은 완성)

근데 메인에서 불러올 때 AddOperation 으로 불러오면 가능해요 가능은 한데

저가 원하던 구분하는 게 없는 것이죠.

 

//↓↓↓↓↓ 반복 설명일수도 있어요...

기호 부분을

var operator = readLine().toString()

입력하는 것에 맞춰서

when (operator) {
    "+" -> {
        val addCalc = Calculator(AddOperation()).operation(a, b)
        println("${a} + ${b} = ${addCalc}")
    }

    "-" -> {
       val divCalc = Calculator(DivideOperation()).operation(a, b)
        println("${a} + ${b} = ${divCalc}")
    }

    "*" -> {
        val mulCalc = Calculator(MultiplyOperation()).operation(a, b)
        println("${a} + ${b} = ${mulCalc}")
    }

    "/" -> {
        val subCalc = Calculator(SubstractOperation()).operation(a, b)
        println("${a} + ${b} = ${subCalc}")
    }

    else -> {
        println("입력값이 올바르지 않습니다. 다시 입력 해주세요")
        continue
    }
}

when  문을 돌려서  각각에 맞는 클래스로 가도록 하는건데 Calculator 이 있잖아요 이부분을 넣은 이유는 숫자를 갖고오기 위해서예요 

//↑↑↑↑↑반복 설명일수도 있어요...

 

사칙연산은 각각 그 Add 요런 클래스들이 하는데 숫자는 누가 갖고 오냐구요

그것을 Calculator 이라는 클래스에 갖고오는 작업을 하는 것을 만드는 거예요.

3. 숫자 가져오는 기능을 하는 것을 만든다. 

 class Calculator (val operate1: AbstractOperation)  {
     fun operation(a: Double, b : Double) : Double {
         return operate1.operate(a,b)
     }
}

보시다시피 클래스명 옆에 (이 가로 안에다가 변수선언으로 추상화를 갖고온다고 적어놨어요)

근데 main에서 추상화클래스이름명을 써보시면 못 불러옵니다. 왜냐 추상클래스는 가상이잖아요 아무것도 하는게 없어요 그 밑에 상속된 아이들이 일을 하죠 더하기,빼기,나누기,곱하기 여튼 이렇게 적고 return 에 변수선언된 operate1 을 누르고 .(점)뒤에는 operate<<< 이건 추상클래스에서 fun 함수에 있는 것 이름입니다.

operate 는 더하기클래스에도 나누기클래스에도 모두 적용되는 fun함수이죠

 

4. 메인에서 불러올 때 먼저 숫자입력하는 것.

a와 b 를 선언해주고 (저는 숫자 넣는 방식으로 했어요)

var a : Double
a = readLine()!!.toDouble()

예외처리하는 것 때문에 이렇게 위에서 변수는 어떤 타입이다 선언하고

예외처리방법(try-catch함수)이용하여 a= 입력받는값(누군가 키보드로 입력한 숫자)

선언을 해줬어요. b도 같아요

그냥 

var a = 5

이렇게 선언하셔도 되요~

 

5.

기호도 입력하고 기호에 따른 어떤것을 사용할거냐고 코딩으로 적었습니다.

var operator = readLine().toString()
when (operator) {
    "+" -> {
        val addCalc = Calculator(AddOperation()).operation(a, b)
        println("${a} + ${b} = ${addCalc}")
    }

    "-" -> {
       val divCalc = Calculator(DivideOperation()).operation(a, b)
        println("${a} + ${b} = ${divCalc}")
    }

    "*" -> {
        val mulCalc = Calculator(MultiplyOperation()).operation(a, b)
        println("${a} + ${b} = ${mulCalc}")
    }

    "/" -> {
        val subCalc = Calculator(SubstractOperation()).operation(a, b)
        println("${a} + ${b} = ${subCalc}")
    }

    else -> {
        println("입력값이 올바르지 않습니다. 다시 입력 해주세요")
        continue
    }
}

여기에 오니 빨간색이 되는데 이유는 모르겠습니다. 일단 print(이 가로안에서 함수불러오는 ${} 을 이용했습니다.)

근데 a와 b라는 숫자 불러오는 애는 Calculator 이고,

Calculator(

이 가로부분에 기호와 맞는 계산을 하는 클래스를 넣어요 그리고 클래스소환이니깐 클래스명 끝에()가 붙겠죠?

)

그러고 .(점)을 찍고 불러올수 있는 것들이 있는데. 이 때 Calculator 클래스에서 fun 함수를 줬던 operation을 붙여서

a, b를 넣어줘요._fun operation 선언할 때 파라미터로 ()안에 숫자 2개 불러오도록 설정해놨어서 그렇습니다.

 

그러면 완성.

 

각클래스는 숫자불러오기, 더하기, 빼기, 나누기, 곱하기 를 하는 클래스가 있고, 그리고 더하기,빼기,나누기,곱하기는 다 뭔가를 계산한다 라는 같은 작업을 하니깐  추상클래스로 묶어서 관리가 좋게 묶어 줬어요

근데 추상클래스 부모같은 Calculator 는 없는 경우도 많나 보더라구요. 저는 이게 무조건 인 줄 알았어요.

근데 그건 아닌 것 같아요

일단 단일책임원칙? 이거때문인 것 같은데

이부분은 더 공부해야 되요... 저가 일단 이해가능하거나 설명 가능한 부분만 적어놔서...

혹시나 잘하시는분이 댓글로 알려주시면 참 좋을 것 같아요(읽어주셔도 감사하겠지만요)

 

여튼 이렇게 추상화클래스 완성.

근데 저는 계산기 업그레이드가 하고 싶어요(아마 학원 진행중_포스팅에도 이 내용이있을 것 같지만... )

 

숫자가 지금은 2개인데... 여러개 넣고 할 때

가로()가 있으면 어떻게 먼저 계산해야되는 부분들 어떻게,

가로도 (), {}, [] 있잖아요 이건 또 어떻게 먼저 계산 바로 위질문이랑 동일 한거일수도 있겠네요.

엔터를 사용해서 벌써 숫자부분이 넘어갔는데 숫자입력을 잘못해서 지우고 싶을 때

내가 계산한 이력들 보고 싶을 때

 

그냥 계산기 생각하니깐 너무 많은 기능들이 있네요...

이런 기능들이 다 하나의 클래스일까요? 아니면 계산기 안에 fun 함수로 다 나눠야되는걸까요?

아직 이런 전체에서 구분이랄까요 패턴이랄까요 이런 시야가 많이 부족해서... 모르겠네요.

 

그리고 추상화클래스 위에 넣는 클래스(ex Calculator)에

추상화 클래스2개도 넣어봤는데 넣어지더라구요.(파라미터로 넣었습니다)

그리고 함수fun을 다르게 해서 하는 것도 가능했어요 (새로운 함수선언 오버라이딩은 아닙니다.)

신기신기 근데 실질적으로 이렇게 잘 사용하지 않을것같아요 

하나의 클래스가 많은 추상화를 받는게 이상하다네요_필요에 의하면 사용은 가능한것만 확인.

'개인자료실' 카테고리의 다른 글

print(), readLine()  (0) 2023.07.16
Flutter TextField 일단 알아야할 것  (0) 2023.07.14