객체

meredith·2021년 11월 29일
0

객체 지향 프로그래밍

객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나로,
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

객체 지향 vs 절차 지향

객체 지향을 얘기하며 빠짐없이 항상 비교되는 대상이 절차 지향이다.
그래서 절차 지향을 먼저 살펴보고, 절차 지향과 비교하며 객체 지향을 살펴볼 예정이다.

절차 지향

절차 지향은 데이터를 여러 프로시저를 공유하는 방식이다.

(지저분한 그림은 참고만 ㅎ)
위 그림처럼 데이터1을 프로시저A와 프로시저C가 공유하고 있고,
데이터4를 프로시저B와 프로시저D가 함께 사용하고 있다.

입문 단계에서 많이 볼 수 있는 프로그래밍 형식이다.
하지만, 이러한 데이터를 공유하는 방식은 로직이 추가될수록 구조가 복잡해지며, 수정이 어려워진다.

절차 지향 예시

// 인증 API
Account account = findOne(id);
if (account.getSatate() == DELETED) {
  ...
}
  
// 암호 변경 API
Account account = findOne(id);
if (account.getSate() == DELETED) {
  ...
}

위 코드에서 인증 API와 암호 변경 API에서 account의 state를 직접 사용하고 있다.

만약 다음 업데이트에서 인증 API와 암호 변경 API에서 blockCount도 체크해야한다면, 코드는 다음과 같이 수정된다.

// 인증 API
Account account = findOne(id);
if (account.getSatate() == DELETED
  || account.getBlockCount() > 0) {
  ...
}
  
// 암호 변경 API
Account account = findOne(id);
if (account.getSate() == DELETED
  || account.getBlockCount() > 0) {
  ...
}

또 다음 출시에서는 인증 API에서 emailVerifyStatus도 체크하고,
암호 변경 API에서는 acticeStatus가 ENABLE인지 검사하도록 변경되었다면,
코드는 다음과 같이 수정된다.

// 인증 API
Account account = findOne(id);
if (account.getSatate() == DELETED
  || account.getBlockCount() > 0
  || account.getEmailVerifyStatus() == 0) {
  ...
}
  
// 암호 변경 API
Account account = findOne(id);
if (account.getSate() == DELETED
  || account.getBlockCount() > 0
  || account.getActiveStatus() == ENABLE) {
  ...
}

위 코드만 보고 수정이 그렇게 어렵지 않다고 생각이 들었다면, 상상력을 발휘해보자.
만약 수정해야하는 if 문이 1억개라면?
동일한 조건을 복붙한다 하더라도, 굉장한 시간이 걸릴 것이고,
시간이 오래 걸릴 것이다.

객체 지향

객체 지향은 데이터와 프로시저를 객체 단위로 묶는다.
특정 객체가 가지고 있는 데이터는 해당 객체의 프로시저만 접근할 수 있도록 한다.

입문자는 (당연하게도) 객체 지향 프로그래밍이 어렵다고 느낀다.
이유는 데이터와 프로시저를 기능별로 묶어야하기 때문이다.
즉, 객체는 기능별로 정의한다고 볼 수 있다.

그럼 데이터를 어떻게 사용하냐면,
객체가 데이터에 바로 접근하는 것이 아니라, 프로시저를 이용해 외부에 기능을 제공한다.
즉, 다른 객체의 프로시저를 부르는 형태로 객체와 객체가 연결되는 형태다.

객체란

객체는 데이터와 프로시저의 묶음이다.
객체 대 객체 관점에서 객체는 기능 제공자이다.

예) 회원 객체

  • 암호 변경 기능
  • 차단 여부 확인 기능

예) 소리 제어기 객체

  • 소리 크기 증가 기능
  • 소리 크기 감소 기능

기능 명세

기능 명세란 어떻게 사용하면 되는지 알려주는 것이다.

method(operation)를 이용해서 기능 명세한다.

// Member.class

public class Member {

  public void changePassword(String curPw, String newPw) {
    ...
  }
}
// VolumnController.class

public class VolumnController {
  
  public void increase(int inc) {
    ...
  }
  
  public void decrease(int dec) {
    ...
  }
  
  public int volumn() {
    ...
  }
}

객체의 협력

객체와 객체는 기능을 사용해서 협력한다.
이때 기능을 사용한다는 말을 메서드를 호출한다는 의미이다.

VolumnController volCont = new VolumnController();
volCont.increase(4);
volCont.decrease(3);

int currentVol = volCont.volume();

메시지란?

객체와 객체가 상호작용하는 것을 메시지를 주고 받는다고 표현한다.
메서드를 호출하는 메시지, 리턴하는 메시지, 익셉션 메시지

ex) 2:measure()는 호출하는 메시지, 8:return은 리턴하는 메시지

이건 객체라고 할 수 있을까?

public class Member {
  private String name;
  private String id;
  
  public void setName(String name) { 
    this.name = name; 
  }
  
  public String getName() { 
    return name; 
  }
  public void setId(String id) { 
    this.id = id; 
  }
  public String getId() { 
    return id; 
  }
}

위 코드에서는 데이터를 받아 저장하고 데이터를 리턴하는, 데이터만 단순 조작하는 객체는 객체라는 표현보다 데이터 클래스라는 식으로 표현한다.

profile
해보자고 가보자고

0개의 댓글