1 분 소요

💡 객체 지향 프로그래밍 입문 시리즈

인프런의 객채 지향 프로그래밍 입문을 기반으로 작성한 게시물 입니다.
(본 시리즈의 모든 예시는 JavaScript(TypeScript)로 변환하여 작성하였습니다.)
객체 지향 프로그래밍 입문_1
객체 지향 프로그래밍 입문_2
객체 지향 프로그래밍 입문_3
객체 지향 프로그래밍 입문_4
객체 지향 프로그래밍 입문_5
객체 지향 프로그래밍 입문_6
객체 지향 프로그래밍 입문_7


“객체란 무엇인가? “


1. 객체 지향 vs 절차 지향


절차 지향 프로그래밍_객체 지향 프로그래밍 입문(최범균)

절차 지향 프로그래밍_객체 지향 프로그래밍 입문(최범균)

위 그림과 같이 절차 지향 프로그래밍은 데이터와 프로시저가 따로 구성되어 맞물려 있다.

이 때문에 코드가 수정되거나 새로운 요구사항이 추가 될 때 복잡성을 보인다.

예제로 보면 이러하다

기존의 코드가 다음과 같다고 가정하자

// 인증 API

const account: Account = await this.accountRepository.findOne(id);
if(account.getState() === 'DELETED') {
...
}

// 암호 변경 API
const account: Account = await this.accountRepository.findOne(id);
if(account.getState() === 'DELETED') {
...
}

차후 인증을 하거나 암호를 변경할 시 추가로 Block 카운트가 0보다 큰지 검증을 하는 요구사항이 발생했다.

// 인증 API

const account: Account = await this.accountRepository.findOne(id);
if(account.getState() === 'DELETED' || account.getBlockCount() > 0) {
...
}

// 암호 변경 API
const account: Account = await this.accountRepository.findOne(id);
if(account.getState() === 'DELETED' || account.getBlockCount() > 0) {
...
}

이후 요구사항이 계속 추가 될 경우 코드는 더욱 복잡하고 길어지게 될 것이다.

반면 객체 지향에서는 데이터와 프로시저가 객체라는 단위로 묶여 있다.

객체 지향 프로그래밍 _ 객체 지향 프로그래밍 입문(최범균)

특정 객체가 가지고 있는 데이터는 그 객체의 프로시저만 접근할 수 있다. 즉, 객체와 객체는 서로 프로시저를 호출하는 방식으로 연결이 된다.

2. 객체란?


“그래서 객체가 뭔데”


객체는 데이터와 그 데이터를 조작하는 프로시저(오퍼레이션, 메서드, 함수)로 구성된다.

이는 객체의 물리적인 특징이고, 실제로 객체를 정의할 때 사용되는 것은 객체가 제공해야 할 기능이며, 객체가 내부적으로 어떤 데이터를 갖고 있는 지로 정의되지 않는다. 기능을 제공한다는 것이 중요할 뿐이다. 즉, 다시 말하면 객체마다 자신만의 책임(responsibility)가 있다는 것을 의미한다.

객체는 메서드를 이용하여 기능을 명세한다. 앞서 말했듯 객체와 객체는 프로시저를 호출하는 방식으로 연결을 한다고 했는데 이때 사용되는 것이 기능, 즉 메서드 호출을 통해서 이루어 진다.

그렇다면 다음 코드는 객체라고 부를까?

public class User {
private _name: string;
private _id: number;

get name() {
	return this.name
}

get id() {
	return this.id
}

set name(name: string) {
	this.name = name
}

set id(id: number) {
	this.id = id
}


언뜻 보면 아이디와 이름을 가져오고 세팅하는 기능을 가진 객체라고 볼 수도 있다.

하지만 위 클래스는 객체라기보단 데이터 클래스에 가깝다. 여기서 더욱 다양한(일반적인 get, set 기능 이외의) 기능이 추가되면 그땐 객체라 부를수 있겟다.


3. 메시지란?

객체와 객체의 상호 작용 과정에서 주고 받는 모든 것(리턴, 예외, 메소드 호출 등).

댓글남기기