Unit.9 객체지향 프로그래밍 주요 개념.

2023. 1. 13. 20:51코드스테이츠/코드스테이츠S2: Chapter & Unit

절차지향과 객체지향의 차이

Encapsulation (캡슐화)

  • 캡슐화는 외부에서 앞서 말했던 데이터(속성)와 기능(메서드)을 따로 정의하는 것이 아닌, 하나의 객체 안에 넣어서 묶는 것입니다. 데이터(속성)와 기능(메서드)들이 느슨하게 결합되는 것이죠. 느슨한 결합은 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미합니다.
  • 마우스 구동을 위한 코드 작성을 예로 들겠습니다. 스위치가 눌리고, 전기 신호가 생겨서, 전선을 타고 흐르고.. 와 같은 전 과정을 이곳저곳에 나누어 작성하는 것이 아니라, 마우스의 상태를 속성(property)으로 정하고 클릭, 이동을 메서드(method)로 정해서 코드만 보고도 인스턴스 객체의 기능을 상상할 수 있게 작성하는 것이 느슨한 결합을 추구하는 코드 작성법입니다.
  • 캡슐화라는 개념은 "은닉화"의 특징도 포함하고 있는데, 은닉화는 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것입니다. 따라서, 디테일한 구현이나 데이터는 숨기고, 객체 외부에서 필요한 동작(메서드)만 노출시켜야 합니다. 은닉화의 특징을 살려서 코드를 작성하면 객체 내 메서드의 구현만 수정하고, 노출된 메서드를 사용하는 코드 흐름은 바뀌지 않도록 만들 수 있습니다. 반면 절차적 코드의 경우 데이터의 형태가 바뀔 때에 코드의 흐름에 큰 영향을 미치게 되어 유지 보수가 어렵습니다. 그래서 더 엄격한 클래스는 속성의 직접적인 접근을 막고, 설정하는 함수(setter), 불러오는 함수(getter)를 철저하게 나누기도 합니다.
  • 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미합니다.
  • 마우스의 상태를 속성(property)으로 정하고 클릭, 이동을 메서드(method)로 정해서 코드만 보고도 인스턴스 객체의 기능을 상상할 수 있게 작성하는 것이 느슨한 결합을 추구하는 코드 작성법입니다.
  •  "은닉화"의 특징도 포함하고 있는데, 은닉화는 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것입니다. 

Abstraction (추상화)

  • 추상화는 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념입니다.예를들어 전화라는 객체가 있다면, 그 안에는 스피커와 마이크가 존재하고, 서킷보드등이 존재하는 등 내부구현이 되어 있을 것 입니다.그러나 실제로 우리가 사용할 때에는, 이러한 존재를 대해 생각하지 않고 단순히 수화기를 들고 버튼을 눌러서 해결하는 것으로 인터페이스를 단순화 할 수 있습니다.
  •  추상화는 캡슐화와 비교해서 종종 헷갈리는 개념입니다.
  • 캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면, 추상화는 클래스를 사용하지 않는 사람이 필요하지 않은 메서드등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 포커스가 맞춰져 있습니다.
  • 클래스 정의 시, 메서드와 속성만 정의한 것을 인터페이스라고 부릅니다. 이것이 추상화의 본질입니다.

Inheritance (상속)

  • 상속은 부모 클래스의 특징을 자식 클래스가 물려받는 것 입니다. 부모/자식으로 설명하기도 하지만, 보다 그특징을 자세하게 설명하는 용어는 "기본 클래스(base class)"의 특징을 파생 클래스(derived class)가 상속받는다"로 표현하는 것이 적합합니다.

  • 예를 들어, 사람이라는 클래스가 있다고 가정해봅시다. 사람은 기본적으로 이름과 성별 나이와 같은 속성, 먹고 자고 마시고 싸고 등 어떠한 기능 메서드가 있습니다.
  • 추가적으로 학생이라는 클래스를 생성한다고 생각해 봅시다. 그런데 이때 앞서 구현했던 사람 클래스의 속성과 메서드를 다시 구현한다면 비효율적일 것입니다. 학생의 본질은 결국 모든 사람이므로, 상속을 이용하여 학생 클래스는 사람 클래스를 상속받을 수 있습니다 .학생은 추가적으로 학습내용, 공부하다 와 같은 속성/메서드를 추가합니다.

Polymorphism (다형성)

  • 다형성은 "다양한 형태"를 가질 수 있다라는 말이라고 이해하면 된다.
  • "말하다" 라는 동작의 본질은 "입으로 소리를 내다"를 의미한다. 각기 다른 동물들이 "말할 때" 제 각각의 소리를 내는 것처럼, 객체 역시 똑같은 메서드라 하더라도 다른 방식으로 구현 될 수 있다.
  • 만일 언어 자체에서 다형성을 제공하지 않는다면, 기본(부모) 클래스에 종류별로 분기를 시켜서 하나하나 다르게 만들어야 할 것입니다. 또는 각각의 자식 클래스에 별도의 각기 다른 render 함수를 만들 수도 있겠지만, 엘리먼트라는 클래스의 본질상 "화면에 뿌린다"(render)는 개념은 부모가 갖고 있는 것이 합리적입니다.

 


OOP의 주요 개념에 대한 장점.

 
 

슐화는 코드가 복잡하지 않게 만들고, 재사용성을 높입니다.

 

추상화는 마찬가지로 코드가 복잡하지 않게 만들고, 단순화된 사용으로 변화에 대한 영향을 최소화합니다.

 

상속 역시 불필요한 코드를 줄여 재사용성을 높입니다. 다형성으로 인해 동일한 메서드에 대해 if/else if와 같은 조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능해집니다.

다형성으로 인해 동일한 메서드에 대해 if/else if와 같은 조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능해집니다.