GYUD-TECH

[스터디: 객체지향의 사실과 오해] 추상화와 클래스 본문

스터디

[스터디: 객체지향의 사실과 오해] 추상화와 클래스

GYUD 2024. 1. 24. 23:12

3. 타입과 추상화

객체의 분류

2장에서 객체는 행동, 상태, 식별자를 가진다고 이야기 했다.

 

식별자에 의해 모든 객체를 구분할 수 있지만, 이러한 구분작업은 목적에 따라서 필요한 작업일 수도 있지만, 오히려 불필요하고 번거로운 작업일 수도 있다.

 

  • 현실에서도 나와 내 친구를 따로 구별해서 부르는 경우도 있지만, 공통적으로 사람이라는 분류로 나누기도 한다.
  • 더 좁은 범위로는 학생이라고 분류할 수도 있을 것이다.
  • 더 좁게는 대학생이라고도 분류 할 수 있을 것이다.

위 예시가 3장에서 이야기하는 타입과 추상화의 개념을 현실세계에 빗대어 쉽게 설명한 내용이다.

위의 예시를 계속해서 떠올린다면, 3장에서 전하고자 하는 메시지를 더 쉽게 이해할 수 있을 것이다.

 


추상화

추상화란?

현실에서 출발하여 목적에 맞게 필요한 부분을 도려내면서 사물의 본질을 드러내게 하는 과정

 

현실은 매우 복잡하기 때문에, 추상화를 통해서 필요한 부분만 취하면서 복잡성을 극복할 수 있다.

만일 학교에서 공부하는 학생을 묶어서 표현하고 싶을때, 일일이 사람의 이름을 나열하는 것 보다 학생이라는 단어를 사용하는 것이 훨씬 간결하고 의미 전달이 정확하다.

 

추상화의 장점

현실에서는 당연한 이야기이지만 이를 자바의 클래스와 연관지어 생각했을때 다르게 다가왔다.

 

학교에서 공부를 하는 사람이라는 특징을 가진 사람을 모두 학생으로 분류하고 싶다면, Student라는 클래스를 생성하고, 클래스로 객체를 생성했을 것이다.

 

Student 클래스로 생성했다고 해도 모든 객체는 다른 식별자를 가진 다른 존재이지만, 학교에서 공부하는 사람을 분류한다라는 목적에 맞게 하나의 부류로 분류함으로써 복잡성을 줄일 수 있었다.

 

만일 모든 학생들에게 운동을 한다라는 행동을 추가하고자 할 때, 일일이 학생에 해당하는 객체들을 찾아서 추가해줄 필요없이 학생 클래스에 운동을 한다라는 행동을 추가해주면 된다.

💡 이렇게 객체를 특정한 부류로 묶어서 분류하면, 유지 보수에 용이하고, 변화에 쉽게 대처할 수 있다.

 


타입

프로그래밍에서 자주 사용하는 int 타입은 사칙연산을 할 수 있는 정수를 의미한다.

즉, 앞에서 이야기한 부류가 타입이라는 단어로 표현된다.

 

앞의 예를 생각해보면, 나를 학생으로 분류한 이유는 학교에서 공부를 한다는 특징이 있기 떄문이다.

반대로 학교에서 공부를 하는 객체는 모두 학생으로 분류할 수 있기 때문에, 내 친구도 학생으로 분류될 수 있다.

💡 공부를 한다는 행동을 기준으로 타입을 분류하였다.

 

 

나와 내 친구는 모두 대학에서 공부를 한다는 행동을 할 수 있지만, 같은 내용을 공부할 필요는 없다.

나는 자바를 공부하고, 친구는 파이썬을 공부하더라도 둘 다 학생으로 분류할 수 있다.

💡 타입은 행동을 수행하는 내부적인 방식은 고려하지 않는다.

 

 

학생의 정보에 어디에 사는지 거주지 정보가 필요해서 거주지라는 상태가 있다고 가정하자.

나는 현재 대구에서 공부를 하고 있지만, 내 친구는 서울에서 공부를 하고 있다.

상태가 대구와 서울로 다르더라도, 둘 다 학생인것은 변하지 않는다.

대구에서 일하는 직장인은 거주지라는 상태가 나와 같지만, 학생 타입에는 포함될 수 없다.

💡 같은 타입이라도 상태가 다를 수 있고, 다른 타입이어도 상태가 같을 수 있다.

 

하지만 대구에서 일하는 직장인과 나는 대구 시민이라는 타입으로 공통적으로 분류될 수 있다.

인간이라는 타입으로 분류한다면 나와 내 친구, 직장인 모두가 같은 부류에 속할 수 있을 것이다.

목적에 따라 학생이 아니라 더 넓은 범위인 인간으로 분류하였을 때 문제가 더 간단해질 수 있다.

💡 구체적인 것을 더 넓은 범위로 넓히는것을 일반화 라고 하며 일반화는 추상화의 도구이다.

 

이렇게 객체의 타입은 상태가 아닌 행동에 의해서 결정된다.

따라서 객체를 설계할 때 행동을 중심으로 설계하여야 한다.

 

1장과 2장의 내용도 포함하여 객체와 행동의 관계를 정의해보자.

  • 객체의 타입은 행동에 의해서 결정된다.
  • 객체의 상태는 행동에 의해서 결정된다.
  • 객체는 행동을 통해서 다른 객체와 협력한다.

이렇게 객체가 해야하는 책임(행동)에 따라서 설계하는 것을 책임-주도-설계 라고 한다.

 


이 챕터를 읽으면서

책을 읽으면서 계속 자바의 클래스의 상속, 캡슐화와 같은 개념이 떠올랐다.

그래서 자연스럽게 타입 = 클래스라는 생각이 자리잡았던 것 같다.

 

하지만 마지막 장을 읽으면서 내 생각이 잘못됐다는 것을 알 수 있었다.

행동에 의해서 타입이 분류되는 것이라면, 꼭 클래스가 아니더라도 타입을 분류할 수 있는 방법은 많다.

(실제로 자바스크립트와 같은 언어에스는 클래스가 존재하지 않지만 타입을 구분하는 매커니즘을 사용할 수 있다.)

 

이제까지 객체를 찍어내는 틀의 개념으로 클래스를 이해했다.

틀린 이야기는 아니지만 클래스를 사용하는 이유를 나타내기에는 많이 부족한 표현인 것 같다.

 

  • 객체마다 다른 식별자와 상태를 가지고 있지만, 이를 모두 구별하는 것은 복잡하고 비효율적이다.
  • 그래서 타입으로 분류하여 목적 달성에 필요한 행동들만 취하는 방식을 사용하여 쉽게 객체를 관리할 수 있다.
  • 클래스는 타입을 구현하기위한 수단이다.

 

반복적인 동작을 빠르게 수행하기 위해 사용하는 틀이라는 표현 보다는, 추상화를 구현하는 도구라는 표현이 그 역할과 효과를 잘 표현한다고 생각한다.

 

클래스는 객체의 추상화를 위한 도구이다.