Search

1주차 : 객체지향?

키워드
객체지향
객체
협력
진행 날짜
2023/05/22
파트
1

키워드

협력, 속성, 행동, 추상화, 캡슐화, 상속, 다형성

객체지향이란 무엇인가?

객체지향은 자율적인 객체간의 협력을 통해 프로그램을 표현하는 패러다임이다. 객체는 속성과 행동을 가지며 협력 속에서 특정 역할을 수행한다.
이때, 가장 중요한 것은 협력이다. 협력이 잘 수행되는 것은 프로그램이 사용자가 원하는대로 동작한다는 것을 의미한다. 협력을 설계하다 보면, 어떤 역할이 필요하게 된다. 역할은 곧 역할을 수행할 책임을 의미한다. 두번째로 중요한 것이 이 책임을 어떤 객체에 부여할 것인지 정하는 것이다.
어떤 객체에 어떤 책임을 부여할지 결정하기 위해서는 두가지 작업이 선행된다.
1.
어떤 객체가 있는지 식별하는 작업
2.
협력 속에 어떤 역할이 필요한지 식별하는 작업
이번 시간에는 전자를 중점으로 알아보고, 후자는 보다 더 설계와 아키텍처 관점에 가까우므로 나중에 다룬다.

어떤 객체가 있는지 식별하는 작업

객체를 식별하기 위해선 객체가 무엇인지 알아야한다. 객체의 정의는 책마다 조금씩 다르게 서술한다.
객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것 - 이것이 자바다, 신용권 저
객체란 식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다. 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다. - 객체지향의 사실과 오해, 조영호 저
공통된 것만 뽑아보면
객체는 다른 것과 구별 가능한 식별자, 자신의 속성(상태), 행동을 가진 것이다. 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.

행동

객체에게 부여된 책임을 수행하기 위한 동작이다.
객체는 자신에게 부여된 책임을 수행하기 위해 행동을 한다. 이 때, 다른 객체의 행동을 유도하기도 한다. 프로그래밍 언어에서 행동은 메서드로 구현된다.

속성

객체가 과거에 어떤 행동을 했는지 기억하기 위해 객체 내부에 저장하는 데이터다.
어떤 객체의 행동은 과거에 그 객체가 어떤 행동을 했는지에 영향을 받아야 한다. 따라서 과거에 어떤 행동을 했는지 알 필요가 있는데 이를 객체 내부에 속성으로 저장한다. 프로그래밍 언어에서 속성은 필드로 구현된다.

추상화(Abstraction)

객체가 어떤 행동을 하고, 어떤 속성을 가질지 결정하는 과정에서 추상화라는 개념이 등장한다.
객체가 어떤 행동을 하고, 어떤 속성을 가질지 결정하는 것은 객체를 이해하는 것과 같다. 어떤 것을 이해한다는 것은 그것의 복잡도를 극복하는 것과 같다. 예를 들어 눈앞에서 부들부들 떠는 여자친구의 화를 풀어주는 것의 복잡도는 너무 크기에 극복하는 것이 거의 불가능하다. 반면, 중학교 수준의 간단한 대수법칙의 복잡도는 낮기 때문에 극복하는 것이 쉽다.
화난 여자친구예시에서 어떻게든 대화를 하다보면 복잡도가 점점 낮아진다. 대화를 하면서 여러 조건들이 생략되기 때문이다. 이것이 바로 추상화다.
추상화란 어떤 양상, 세부 사항, 구조를 좀 더 명확히 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춰 복잡도를 극복하는 과정이다.
즉, 추상화란 구체적인 것을 분해해서 우리가 관심있는 것들만 추려 재조합 하는 모델링이다.

캡슐화(encapsulation)

속성은 객체 내부에 저장하는 데이터라고 했다. 내부 라는 말에는 외부가 있다는 것이 내포되어있다. 내부와 외부라는 말은 어떤 뚜렷한 경계가 있다는 것이 된다. 캡슐화란 내부와 외부를 철저히 분리하는 것을 말한다.
객체는 협력 속에서 어떤 책임을 잘 수행하기에 가치가 있는 것이다. 객체는 행동을 통해 책임을 수행한다. 또한, 객체는 자신의 책임을 수행하기 위해 다른 객체의 행동을 유도하기도 한다. 따라서, 행동은 외부에 공개되어야 한다. 객체는 다른 객체가 과거에 어떤 행동을 했는지 알 필요가 없다. 즉, 다른 객체의 속성은 알 필요가 없다. 따라서 속성은 내부에 철저히 감춰져야 한다.
캡슐화는 객체의 속성은 철저히 숨겨 다른 객체가 알 수 없도록 하고, 일부 공개된 행동을 통해서만 상호작용 할 수 있도록 하는 것이다. 객체가 어떻게 행동을 수행하는지, 그 과정에서 입력으로 주어진 데이터가 아닌 데이터를 사용하는지 등은 다른 객체의 관심사가 아니다.
캡슐화는 객체지향 프로그래밍에 한정된 개념이 아니다. C 언어에서도 완벽한 캡슐화가 가능하다.

상속과 다형성

객체지향을 설명할 때 상속과 다형성은 빠지지 않고 등장한다. 상속과 다형성은 객체의 행동으로 설명할 수 있다.

상속(Inheritance)

확장의 의미를 가진다. A 라는 객체가 B 라는 객체를 상속한다면, A 는 B 와 같은 책임을 수행할 수 있어야 한다. 즉, A 는 B 의 행동을 그대로 수행할 수 있어야 한다. 추가적으로 A 만의 책임이 있어야 한다.
A 가 B 를 상속해도 되는 경우는 A is kind of B 를 만족하는 경우다. A is B

다형성(Polymorphism)

A와 B가 같은 책임을 서로 다른 방법으로 수행할 수 있는 것을 말한다. 앞서 말한 것처럼, 객체는 어떤 책임을 수행해야 하는지는 명시되어있지만, 어떻게 수행할 것인지는 책임을 수행하는 객체만 안다. 다형성은 어떤 객체든 협력에서 요구하는 책임을 수행할 수 있다면, 지금 협력에 참여하고 있는 객체를 대신할 수 있다는 것을 의미한다. 이는 프로그램의 유연성과 재사용성에 직결된다.
GPT가 말하는 다형성(Polymorphism)과 상속(Inheritance)
자바 스터디 1주차.pptx
264.6KB