공부

추상화

Zedd0202 2022. 1. 10. 22:34
반응형

안녕하세요 :) Zedd입니다.

오늘은 추상화에 대해서 공부해보려고 합니다! 

 

# 추상화의 목적

추상화는 단지 하나의 개념일 뿐이고, 프로그램 세계에서 추상화는 다양한 방식으로 나타내질 수 있습니다.

그래서 추상화에 대한 정의보다는 목적을 보면 좋을 것 같아요. 

✔️ 추상화의 목적 == 복잡성을 이해/극복하기 쉬운 수준으로 단순화하는 것. 

 

 

# 예시

계좌(Account)로 예를 들어볼게요. 

[1. 계좌] 

계좌의 특성은 엄~~청나게 많고 복잡할텐데요. 이 계좌를 프로그램 세계에서 표현하고 싶습니다. 

그러기위해 우리가 가장 먼저 해야하는 일은 

class Account {}
struct Account {}
protocol Account {}

이렇게 '타입'을 정의하는 것이죠.

그리고 현실세계 계좌의 모든 특징을 가져오지 않고, 불필요한 세부사항은 제거할거에요. 

계좌의 진짜진짜 중요한 부분만 강조하는것이죠!

계좌의 대표적인 행동/속성은 잔액, 잔액조회, 입금, 출금같은 게 있겠네요. 

✔️ 추상화의 목적 == 복잡성을 이해/극복하기 쉬운 수준으로 단순화하는 것. 

이렇게 타입을 정의함으로써 현실세계의 복잡한 개념을 프로그램 세계에서는 간단하게 표현할 수 있게 됩니다. 

범위가 상당히 크긴 하지만, 이것이 바로 추상화입니다! 

 

[2. 계좌의 종류]

현실 세계의 계좌에는 종류가 엄청나게 많은데요. 

예를 들어 종합매매계좌,CMA,중개형 ISA과 같은 복잡한 개념을 프로그램 세계에서 표현하고 싶습니다.

종합매매계좌,CMA,중개형 ISA 각각 타입을 만드는 것 역시 추상화라고 할 수 있는데요. 

잘 보면, 전부 다 '계좌'라는 공통점이 있습니다. 

즉, 종합매매계좌,CMA,중개형 ISA는 현실세계의 '계좌'라는 개념으로 추상화가 가능합니다.

딱 종합매매계좌,CMA,중개형 ISA를 봤을 때는 괜히 복잡해보이고 이해도 안됐었는데,

추상화를 함으로써 본질이 드러나 훨씬 단순해진 '계좌'를 보고나면,

 종합매매계좌,CMA,중개형 ISA를 오히려 더 잘 이해할 수 있게 됩니다. (오히려 좋아)

 아 CMA, 중개형 ISA가 일단 '계좌'구나?.. < 이런식..

이것이 추상화의 장점이죠! 

 

프로그램 세계에서 가장 먼저 하게 되는 일은 역시

class Account {}
struct Account {}
protocol Account {}

'Account'라는 타입을 만드는 것일거고, 더 나아가서 

class Account {

    var balance: Int

    func deposit() {} // 입금
    func withdraw() {} // 출금
}

 

이런 계좌의 공통적인 속성/특징을 정의 할 수 있습니다. (위 예제는 그냥 class에 정의해본거) 

이 Account를 상속 또는 conform하는 종합매매계좌, CMA, 중개형 ISA 타입을 만들게 될것입니다. 

 

 

# 타입 정의 == 추상화

위에서 언급했듯이,

현실 세계의 개념을 프로그램 세계에서 표현하기 위해 타입을 정의하는것 자체가 추상화인데요.

Swift를 예로 들자면, 타입을 정의하는 여러가지 메커니즘이 존재하는데요.

class, struct, enum, protocol이 있습니다. 

이 중 어떤 방식으로 타입으로 정의하느냐?도 추상화에 포함되는 내용일것입니다. 

 

단순히 계좌 타입 하나만 만들고 싶다면 class, struct 모두 계좌 타입을 만들기에 적절할 것 같은데요. 

(둘 중 뭘 선택하는지는 때에 따라 다르겠지만..그리고  제가 생각하는 잔액조회 등등이 되는 계좌타입은 enum으로 표현하기 힘들 것 같아서 일단 제외하겠습니다. )

이 계좌 타입으로 하위개념을 표현하는데 사용하고 싶다면 (종합매매계좌, CMA, 중개형 ISA같이..)

- 상속 / conform이 불가능한 struct 제외

- 하위개념을 표현하는데 사용가능한 class, protocol 가능

class와 protocol만 남게되는데, 이 역시 둘 중 어떤 방법으로 타입을 정의할지는 상황에 따라 다르겠지만,

1. 하나의 super class만 상속 가능

2. struct(또는 enum)이 class를 상속할 수 없음

과 같은 class의 한계 + 상속의 한계때문에 Swift에서는 주로 protocol로 타입을 만드는 것 같습니다. 

(class, struct 모두 protocol을 conform만 하면 되니)

 


 

<객체지향의 사실과 오해>를 읽으면서 책에 있는 내용들과 제 생각을 글로 써봤는데요! 

이런걸 포함해서 글 쓰면서 생각을 정말 많이 한 것 같아요. 

퇴고를 몇번이나 했는데도 제 생각이 잘 담긴지 잘 모르겠습니다. 

 

요 글도 지인에게 피드백을 받았었는데, 다음과 같은 질문이 있었어요. 

타입을 정의하는게.. 그러니까 class, struct같은 concrete타입을 정의하는게 왜 추상화인지 잘 이해가 안가.
내가 생각하는 추상화는 어떠한 개념을 추상적으로(세부사항이 없이) 만들기 위한 것인데...
그리고 그런 추상화를 구체화한게 class, struct같은 concrete타입인데! 타입을 만드는게 왜 추상화인거야? 

위 말에도 정말 1000% 공감을 합니다.

다만 저는 프로그래밍 세계 안에서 추상화를 활용한 기법에 집중했다기 보다..

현실세계의 개념을 프로그래밍 세계에서 표현하기 위한 추상화에 집중했다고 봐주시면 좋을 것 같아요! 

"타입을 이용하여, 객체의 특성을 추상화한다."

 

그리고 

삼각형, 사각형은 도형으로 추상화 가능하다 / 토끼, 사자는 동물로 추상화가 가능하다..

이런 예제보다는 뭔가 진짜 현실세계의 복잡한 개념을 예시로 들고싶었는데,

계좌(Account)가 적절한 예시였을지 모르겠지만, 일단 제가 보기엔 적절했다...ㅎ;

아무튼 이 글은 꼭꼭 많은 피드백을 받고싶어요!! 많은 댓글 부탁드립니다~~~~

 

일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는 것에 관한 모든 것이라는 것을 깨닫고 나면 (훌륭한) 컴퓨터 프로그램을 작성하기 위한 중요한 전제 조건은
추상화를 정확하게 다루는 능력이라는 것이 명확해진다.
- 키스 데블린

 

 

반응형