추상화
안녕하세요 :) 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)가 적절한 예시였을지 모르겠지만, 일단 제가 보기엔 적절했다...ㅎ;
아무튼 이 글은 꼭꼭 많은 피드백을 받고싶어요!! 많은 댓글 부탁드립니다~~~~
일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는 것에 관한 모든 것이라는 것을 깨닫고 나면 (훌륭한) 컴퓨터 프로그램을 작성하기 위한 중요한 전제 조건은
추상화를 정확하게 다루는 능력이라는 것이 명확해진다.
- 키스 데블린