프로그래밍 농장

[OOP] 객체지향적 개발을 위한 필수개념 정리 본문

IT 관련 정보

[OOP] 객체지향적 개발을 위한 필수개념 정리

Tennessee201 2019. 10. 5.
728x90

객체지향의 등장

객체지향의 개념은 1970년대에 들어서 용어가 나왔으며, 이는 벌써 50년이 넘어가는 역사를 가지고 있다.

이전까지는 C 언어 처럼 실행하고자 하는 순서대로 명령어를 입력해서 실행되는 "절차 지향" 이 주를 이루었고 이러한 방법으로 코딩하는 언어들을 "절차지향 언어" 라고 한다. 예전에는 프로그램의 단위가 크지 않았으며, 대체적으로 간단한 Login을 순차적으로 처리하여 결과를 얻는데 그쳤지만, 점점 컴퓨터의 발전과 프로그램의 복잡도가 증가하면서 이에 들어가는 유지보수, 개발기간 등 다양한 부분에서 자원 소모가 커졌고 점점 비효율적인 방식이 되었다.

이런 어려움을 해결하기 위해 선택한 방법이 "효과적인 개발방식"을 채택하게 되었고 이는 곧 객체지향의 특성인 "추상화", "상속", "은닉", "재사용", "인터페이스 등"을 활용하는 것이 되었다.

물론 함수의 활용으로도 충분히 좋은 프로그램이 개발될 수 있으나, 절차 지향의 시각을 벗어나 새로운 시각으로 바라보는 움직임이 커졌고 객체지향 프로그래밍이 하나의 커다란 패러다임으로 현재는 자리 잡게 되었습니다.

객체지향에서는 현실에 존재하는 사물을 있는 그대로 모델링하여, 이들의 행위와 속성을 정의 하고, 절차적이 아닌 객체가 중심이 되어 "실제 사물이 동작하는 방식으로 설계" 하였다. 이는 사물에 대해서는 "객체" 라고 불렀으며, 해당 사물이 하는 행위 (기능) 을 Method로 정의하고 해당 사물이 가지는 속성을 변수 (Variable) 라고 정의한다.

따라서 "객체지향" 에서는 시스템을 설계할 때 실제 사물을 중심으로 설계하기 때문에. 기존의 절차 지향보다는 조금 더 편리하게 설계가 가능 해졌다.

 


객체 설계하기

객체의 3가지 요소

- 상태 유지 (객체의 상태)

객체는 상태 정보를 저장하고, 유지되어야 하며 이러한 속성 (variable)은 변수로 정의되어야 합니다. 이러한 속성 값이 바뀜으로 인하여, 객체의 상태가 변경 수 있어야 한다.

- 기능 제공 (객체의 책임)

객체는 기능을 제공해야 하는데, 이 부분은 Method 의 제공으로 이루어진다. 이 부분은 캡슐화와 연관이 있으며, 외부로 부터 직접 속성을 접근하여 변경하는 것이 아닌 객체가 제공하는 Method 로 기능이 제공되어야 한다.

- 고유 식별자 제공 (객체의 유일성)

각각의 객체는 고유한 식별자를 가져야 한다. 예를 들면 카드번호, 계좌번호, 자동차 번호 와 같은 속성을 통해서 각각 고유한 값을 줄 수 있으며, 이는 이후 DB에서 Unique Key, 또는 Primary Key 로도 작성이 가능하다.

 


물리 객체와 개념 객체

물리 객체

  • 물리적 객체는 실제로 사물이 존재하며, 이를 클래스로 정의한 객체를 의미.

Ex)

  • 자동차 렌탈 시스템: 자동차, 고객, 직원, 사업장, 정비소 등등
  • 급여 관리 시스템: 직원, 월급통장 등등

 

개념 객체

서버 개발을 할 때 사용되는 Service Layer가 대표적인 예이며, 이는 Busniess Logic을 처리하는 부분을 의미. Business Logic에서는 여러 객체를 서로 상호작용 하도록 하며, 객체가 제공하는 오퍼레이션 method를 통하여 객체의 속성을 변경시킨다.

Ex) 사용자 관리 시스템: 사용자 객체의 마지막 접속일자를 이용하여, 계정 만료, 비밀번호 초기화, 재등록 처리 등등

 


 

객체지향의 4대 특성

캡슐화

캡슐화는 객체의 속성 (Variable)을 보호하기 위해서 사용한다. 객체의 캡슐화는 현실 세계에서도 볼 수 있다. 컴퓨터 나 TV의 경우에 본체 안에는 수많은 부품이 있지만, 전원을 켜기 위해서 메인보드에 직접 전기신호를 주는 것이 아니라, 외부에서 전원 버튼을 통해서 On/Off를 컨트롤한다.

이렇게 사용자에게 내부의 로직 (부품)을 공개하지 않고 "전원 버튼" 등의 특정 기능을 통해 객체의 상태를 변화시키는 것을 "캡슐화"라고 다.

 

Method 설계

  • 객체에 속성이 선언되어 있으나, 각각의 속성들의 상태를 변경하는 method 가 없다면 잘못 선언된 속성이다. 따라서 자신이 가지고 있는 속성에 대해서는 해당 상태를 변경하는 기능을 제공해야 한다.
  • 실물 객체가 가진 기능을 모두 제공해야 합니다. 예를 들어 계산기 객체라고 한다면 사칙연산 및 각종 수학 기능을 제공해야 한다.
  • 각각의 Method는 서로 관련이 있어야 한다. 차량 렌탈이 있다면 반납이 있고, 차량 등록이 있다면 해지 기능이 있어야 합니다. 즉 각 속성에 상대 되는 기능을 제공해야 한다.
  • 객체 안의 Method 는 객체 안의 속성을 처리해야 하며, 다른 객체를 전달받아 해당 다른 객체에 정의된 속성을 처리해서는 안됌.
    • 단, Method 실행에 필요한 값들은 객체의 형태가 아닌 매개변수의 형태로 전달되어야 한다.

 

캡슐화의 장점

  • 객체지향의 패러다임 중 하나인 추상화를 제공.
    • 실제로 Method가 어떻게 동작하는지 외부에서는 이해할 필요가 없으며, 이를 단순히 메서드 Call 하여 해당 기능을 실행하여 프로램을 객체 단위로 설계 가능.
  • 재 사용성 향상
    • 한 객체에 관련된 속성 및 Method는 모두 캡슐화 형태로 제공됨으로, 객체의 모듈성과 응집도가 높아진다. 이를 통하여 재 사용성이 높아진다.
    • 만일 절차적 프로그래밍에서, method를 재사용한다면, 함수가 참조하고 있는 전역 변수 및 내부에서 호출하는 Method가 미치는 영향을 모두 체크해야 하는데, 객체의 경우는 단일 객체에만 영향을 주기 때문에 재사용성이 높다.
  • 이러한 이유들로 인하여 유지보수의 효율성이 향상

 

캡슐화로 인한 객체의 무결성

보통 캡슐화 코딩이라고 하면 클래스 멤버들을 private 로 선언하고 Method 들을 public으로 선언하는 형태를 가지는데 이는 객체의 무결성을 유지하기 위함이다. Getter/Setter를 제외하고는 public method는 입력된 매개변수에 대해 validation을 한 후 실행하는 것을 기본으로 한다.   validation을 통하여 객체의 값을 바꾸거나, 값의 대한 유효성을 가질 수 있다.

 

 

상속

  • 객체지향에서의 상속은 속성의 상속이 아닌, 하위로 내려갈수록 구체화되는 것을 의미.

이미지 출처:   https://github.com/steve-developer/fastcampus-springboot-introduction/blob/master/01 

 

상속의 효과

프로그램 구조에 대한 이해도가 향상됩니다.

  • 최상위 클래스의 구조를 보고, 하위 클래스의 동작을 이해할 수 있다.

재사용성 향상

  • 상속을 이용하여, 해당 클래스에 필요한 속성 및 메서드를 모두 정의하지 않고, 상속을 받아서 사용할 수 있다.

확장성 향상

  • 일관된 형태의 클래스 객체를 추가할 수 있어, 간단하게 프로그램 확장이 가능.

유지보수성 향상

  • 각 객체마다, 자신의 메서드를 정의하고 있다면, 코드 수정에서 많은 작업이 필요 하지만 상속을 사용한 경우 일관된 형태로 작성이 가능.

 

다형성

  • 다형성은 하나의 개체가 여러 개의 형태로 변화하는 것을 말하며, 이를 객체지향에서도 유사하게 사용하고 있다.
  • 이러한 다형성은 오버라이드 등을 통해서 구현한다.

 

다형성 예시

 

 

위의 그림들을 보면 알 수 있듯이 모든 유닛들 (저글링, 시즈탱크, 레이스...) 은 모듀 Unit이라는 공통 인터페이스를 구현하기 때문에 하나의 타입으로 다양한 유닛들이 생성됌. 그리고 각 Unit 별 move 메서드에 매개 값들을 다르게 하여 각각의 기능들 또한 다양하게 구현할 수 있다.

 

추상화

  • 객체지향에서의 추상화는 "모델링"을 의미.
  • 구체적으로 공통적인 부분, 또는 특정 특성을 분리해서 재조합하는 부분이 추상화이다.
  • 즉, 앞에서 배운 다형성과, 상속은 모두 추상화에 속한다.

 

참고

728x90