객체지향 사고 프로세스 #1

세나정·2024년 2월 18일
0
post-thumbnail

다시 초심으로 돌아가 객체지향에 대해 본격적으로 공부함과 다른 스터디 중인 '내코그이'책과 시너지를 올리기 위해 객체 프로세스 사고에 공부하려 책을 샀다!

옮긴이의 머리말에는 이런 말이 있다. (거의 내가 대학 처음 들어갔을 때 객체논란)

객체지향을 처음 접할 때 많은 사람들은 '오브젝트', '물체', 어떤 이는 또 '개체'라고 부르기도 했고 그러다가 '객체'라고도 부르기도 했는데 사람들은 참 많이도 해당 단어를 비난하고 비웃었지만 이젠 '객체'라는 말이 더 정확한 번역이 되었다.

또한, 객체 말고도 implementation의 번역어인 '구현'이라는 말도 그렇다.
영어는 한 가지 단어를 여러 의미로 쓰는 경우가 많은 언어이기 때문에

모든 걸 다 '구현'이라도 뭉뚱그려서 말하곤하는데 이걸 우리 말로는 구현, 구현부, 구현체처럼 잘 드러내는 말로 바꿀 수 있다.

'구현체'라는 말을 구'현'에서 떼어네어 사용해야만 '컴퓨터 메모리상에 구현된 클래스'라는 개념을 이해할 수 있기 때문

그래야만 객체와 클래스 인스턴스가 어떻게 다른지를 명확히 이해할 수 있음

동일한 영어단어일지라도 내포하는 개념이 서로 다르면 각기 다른 번역어로 표현해야 하고 철학 용어나 철학적 용어 표기 방식 ('-소', '-체'로 끝나는 방식)을 도입 해야한다고함

나는 위에 문구가 가장 인상적이었다. 어릴 때부터 성경이나 책을 보면 '말투를 왜 굳이 저렇게 하쥥' 했는데 그런 것에서 철학적면모를 이렇게 찾을 수 있다니..

하여튼 이번 책에서는 '객체 지향 기술을 다룬다'기보다 객체지향식으로 사고하는 방법을 다룬 철학적인 책이라니까 열심히 배워보겠다!

(물론 늘 그랬지만, 이 책에서 다루는 내용은 내가 인상깊거나, 꼭 다시 한번 상기해야할 내용들만 들어있으며 모든 내용은 책의 온전한 내용이 아닌 나의 이해를 바탕으로 함.)


Ch1. 객체지향 개념 소개

객체와 레거시 시스템

객체지향이 주류가 되며 새로운 객체 기술을 레거시 시스템(Legacy system, 구형 or 기존 시스템)과 통합하는 것이 개발자가 직면한 문제 중 하나


객체지향 프로그래밍과 절차적 프로그래밍

어떤 사람을 하나의 객체로 간주해보자 객체는 속성행위라는 두 가지 성분으로 정의됨

사람에게는 눈의 색, 나이, 키 등 같은 속성(attributes)가 존재하고
걷기, 말하기, 싸우기 같은 행위를 함

절차적 프로그래밍에서는 코드는 완전히 다른 함수나 절차와 구별된다
누구나 다 알듯이 이러한 절차는 '블랙박스'형태로 진행이 된다

객체지향 설계에서 속성과 행위는 한 가지 객체 안에 모두(both) 포함되는 반면에, 절차적 설계나 구조적 설계에서는 속성과 행위가 일반적으론 분리됨

제대로 설계된 객체지향 모델이라면 전역 데이터가 전혀 없을 것이라고 말할 수 있음 이로인해 객체 지향 시스템에서는 데이터 무결성이 달성된다

객체 지향 용어에서는 데이터 = 속성이라고 하며 행위 = 메서드라고 함
속성이나 메서드에 접근하지 못하게 제한하는 일은 데이터 은닉이라고 함

캡슐화라고 부르는 행위 즉, 동일한 엔티티에서 특성들과 메서드들을 한 곳으로 합침으로
특정 객체에 대한 데이터 접근을 제어할 수 있음 ---> 이로써 특정 객체는 특정 객체만이 조작할 수 있게됨

계산기로 예를 들어, 다시 한번 객체지향에 대해 살펴보자

calculate라는 객체가 myInt1, myInt2를 합산한 결과에 접근하려면
Math 객체라는 객체가 하기 나름임


calculate라는 객체는 Math 객체에 메세지(Sum하라는)를 보내면 sum 메서드는 myObject에 값을 반환함


합계를 계산하는 일은 calculate의 책임이 아닌 math객체의 책임
항상 객체에서 이야기 하지만, 우리는 합계만을 원하지 계산 방법까지 알아야하는 것은 아님

절차적 프로그래밍

일반적으로 시스템의 데이터를 다루는 연산과 데이터를 분리

예를 들어, 네트워크를 통해 정보를 보내려면 네트워크 파이프의 다른 쪽 끝에 있는 프로그램이 이 정보를 사용해 처리할 것으로 예상하는 관련 데이머나이 전송
(즉, 데이터를 전송하려면 클라이언트와 서버 간에 일종의 주고받기 계약이 있어야함)

클라이언트 -> 데이터 (패킷들) -> 서버

객체지향 프로그래밍

기본 장점으로는 데이터와 이 데이터를 다루는 연산이 객체에 캡슐화 되어있다는 점

예를 들어, 어떤 한 객체가 네트워크를 통해 전송되면 이 객에 포함된 데이터와 행위까지 모두 전송됨

클라이언트 -> Employee 객체 -> 서버


객체란 정확히 무엇일까?

객체의 데이터

객체 내에 저장된 데이터는 객체의 상태를 나타내고 이것을 속성이라고 부름

우리는 한 회사의 직원의 객체를 나타낼 때

주민번호, 생년월일, 성별등의 속성이 있을 수 있음

객체의 행위

객체의 행위는 객체가 할 수 있는 일은 나타냄

절차적언어세너는 프로시저, 함수 및 서브루틴 등으로 정의하고 객체지향 프로그래밍에서는 '메서드'라고 부름

우리는 메세지를 보내어 메서드를 호출함 각 속성에 대응하는 setGender() 및 getGender() 등이 있어야 함
이런 메서드들이 있다면 정보가 필요한 그 밖의 객체는 직원 객체로 메세지를 보내어 직원의 성별이 무엇인지 물어볼 수 있음

객체를 사용하여 얻을 수 있는 강력한 장점 중 하나는 '데이터가 패키지의 일부이며, 코드와 분리되어 있지 않다.'라는 점

다음과 같은 게터, 세터가 있다고 하자

public void setName(string name) {
	this.name = name;
}

public String getName() {
	return this.name();
}

게터와 세터라는 개념이 있기 때문에 데이터 은닉이라는 개념이 성립할 수 있음
객체들이 그 밖의 객체 내 데이터를 직접 조작해서는 안 되므로, 게터와 세터에 대한 접근 권한을 제어해야함

다른 말로 게터를 접근자 메서드, 세터를 변경자 메서드라고 부르기도 함

우리는 우리 메서드의 인터페이스(접속부)만을 보여주고 있을 뿐, 메서드 내의 구현(구현부)를 보여주고 있지 않다는 점에 유념하자

아래 정보들은 사용자가 메서드를 효과적으로 사용하기 위해 알아야할 것들임

  • 메서드의 이름
  • 메서드에 전달된 매개변수
  • 메서드의 반환 형식

만약 위에 언급한 '직원'이라는 객체에 급여란 객체를 만들어 급여를 알고 싶다면

급여(payroll)란 객체가 Employee(직원) 객체의 getSocialSecurityNumber()메서드에 메세지를 보내면 되는 것

일단은 '클래스란 객체를 만드는 템플릿'이라고 생각하면 됨
객체가 생성되면 우리는 객체가 인스턴스화가 되었다고 말하고 세 명의 직원을 만들었따는 것은 Employee클래스르 가지고 완전히 다른 세 개의 인스턴스를 만들었다는 뜻

이렇게 되면 속성 및 메서드의 복사본이 각 객체의 고유한 속성과 메서드가 됨
--> 직원이라는 클래스로 세 명의 직원을 찍어내면 하나하나 직원들의 자체에도 클래스에서 복사된 자체 속성과 메서드가 존재

UML 클래스 다이어그램

  • UML : Unified Modeling Language, 통합 모델링 언어

각 클래스 다이어그램은 클래스 이름, 데이터(즉, 속성), 행위(즉, 메서드)라는 세 부분으로 정의됨

우리는 이러한 UML 모델링 도구를 사용하여 실제 코드에 해당하는 클래스 다이어그램을 작성 및 유지 가능

구현체와 관련된 문제

각 객체에 대해 물리적 사본이 반드시 필요한 것은 아니고, 오히려 각 객체는 동일한 구현체를 가리킴

이런 식으로 객체의 물리적 사본을 구현하는 일은 컴파일러나 운영 플랫폼이 담당해야할 문제

개념적 수준에서는 객체란 완전히 독립적이고, 고유한 속성과 메서드를 갖고 있는 것으로 여겨도됨


클래스란 정확히 무엇을 일컫는 말인가?

클래스는 곧 객체의 설계도,
객체를 인스턴스화할 때는 클래스를 사용해 객체를 어떤 식으로 구축할지를 따져보게 됨

클래스와 객체를 설명하려는 것은 닭이 먼저냐, 계란이 먼저냐 하는 논제와 같음 왜냐하면 객체를 사용하지 않고 클래스를 설명하기는 어렵고 클래스를 사용하지 않고 객체를 설명하기엔 어렵기 때문

하지만 클래스가 먼저다, 클래스가 없으면 객체의 인스턴스화가 불가

객체 생성

클래스는 객체의 템플릿
쿠키를 구울 때, 틀(클래스)가 존재하고 나온 과자(객체)가 존재하는 것

  • MyClass myObject

클래스는 코드의 한 가지 단편 그러므로 객체를 만들기 전에 클래스부터 설계해야함

속성

접근 지정 (*필수 기본 상식!)

데이터 형식이나 메서드가 public이면 다른 객체에서 이것들에 접근할 수 있음 / private은 이것들을 소유한 객체만 접근할 수 있음
물론 protected도 존재

메서드

메서드는 클래스의 행위를 나타내는 것
당연하게도 클래스에에서 인스턴스화된 모든 객체에는 해당 클래스에서 정의한 메서드가 포함되어 있음

당연히 메서드를 호출하는 것은 객체지향 시스템에서 흔히 볼 수 있는 기술
모든 경우에, 객체 내의 속성에 대한 접근은 객체자체에 의해 제어 되어야만 함

어떤 객체도 다른 객체의 속성을 직접 변경해선 안 됨

캡슐화 및 데이터 은닉

모든 속성과 행위를 객체에 나타낼 필요가 없다는 점이 객체의 장점 중 하나

객체지향 설계에서 객체는 여타 객체의 상호 작용하는 데 필요한 인터페이스만을 나타내야함

객체 사용과 관련이 없는 세부 사항을 그 밖의 객체들이 알 수 없도록 감춰야함 ('알아야 할 것만 알게 해야함')

캡슐화 - 객체 속에 속성 뿐만 아니라 행위도 함께 들어있다는 사실에 기반하여 정의할 수 있는 개념
데이터 은닉은 캡슐화의 주요 부분이라고 생각면 됨

인터페이스

인터페이스가 객체들 사이의 기본적인 의사 소통 수단을 정의한다는 점을 알고 있고
각 클래스 설계는 적절한 인스턴스화 및 연산을 위한 인터페이스를 지정

객체가 제공하는 인터페이스 중 한 개를 지정해 전송하면 해당 객체가 제공하는 행위라면 어떤 것이든 간에 호출할 수 있어야 함

인터페페이스는 클래스 사용자가 클래스와 상호작용 하는 방식을 완전히 설명해야함

대부분의 객체지향 언어에서 인하터페이스의 일부인 메서드들은 publix으로 지정

데이터 은닉에서 public를 사용하는 순간 데이터 은닉의 개념이 깨짐

슈퍼클래스 및 서브 클래스

슈퍼 클래스는 부모 클래스 혹은 기저 클래스 (base class)
상속으을 받는 클래스들에 공통으로 들어가는 속성과 행위가 모두 이러한 클래스에 들어있음

예를 들어, Mammal 클래스의 경우에 모든 포유류는 눈색, 털색 등등 행위를 갖고
상속 트리에 굳이 복제할 필요가 없음

서브 클래스는 자식 클래스 혹은 파생 클래스 (derived class)라고도 함

이것은 슈퍼클래스의 확장체, 따라서 Dog클래스와 Cat클래스는 Mammal 클래스의 모든 공통 속성과 행위를 상속

  • 생성자
public class Circle extends Shape {
	public Circle(double r)	{
    	~
    }
}

메서드 이름이 클래스와 동일하고 반환 형식이 지정되지 않은 메서드는 생성자라고 부르는 특별한 메서드


결론

  • 캡슐화 : 객체지향 및 개발에서 데이터와 행위를 단일 객체로 캡슐화 (포장, 봉지로 싸기) 하는 것이 가장 중요, 단일 객체에는 데이터와 행위 모두 포함되고, 우리는 이러한 데이터(속성)와 행위(메서드) 들 중에 원하는 것들을 골라 그 밖의 객체로부터 은닉해둘 수 있음

  • 상속 : 클래스는 다른 클래스에서 상속하고 슈퍼클래스에 의해 정의된 속성과 메서드를 활용할 수 있음

  • 다형성 : 비슷한 객체가 다른 방식으로 동일한 메세지에 응답할 수 있음을 의미 ex) 모양이 많은 시스템 - 원형, 사각형 등등은 각자 다른 모양으로 그려짐
    다형성을 활용하면 이러한 각 도형에 같은 메세지를 보내더라도 각 도형은 자신을 다른 모양으로 그려내게 할 수 있음

  • 합성 : 합성은 어떤 객체가 이 객체와 다른 그 밖의 여러 객체를 사용해서 만든 것을 의미

profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글