객체 지향 프로그래밍

hyo·2022년 7월 24일
0

[Javascript] 기초 학습

목록 보기
59/62

객체지향 프로그래밍 (OOP)

객체 지향 프로그래밍이라는 패러다임이 등장하기 전엔
절차 지향 프로그래밍이 있었다.
우리는 앞서 모든 것을 절차적으로 생각하고 기껏해야 함수로 이동하는 것이 전부였다.

-> 초기의 C , 포트란 같은 언어들이 절차적 언어

그러나 객체 지향 프로그래밍이 등장하면서, 단순히 변수와 함수로 순차적 작동을 넘어 데이터의 접근, 데이터의 처리 과정에 대한 모형을 만들어 내는 방식을 고안했다.

-> 따라서 데이터와 기능이 별개로 취급되지 않고, 한 번에 묶여서 처리할 수 있게 되었다.
-> 자바스크립트는 엄밀히 말해 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성가능!


클래스와 인스턴스

클래스는 세부 사항이 들어가지 않은 청사진이다.
세부사항(속성, 메서드)만 넣는다면 객체가 되는 것이다.
클래스를 통해 만들어진 객체를 인스턴스라고 부른다.
그렇다면, 세부 사항(속성)은 언제 어떻게 넣어둬야 할까?
이 역할을 하는 것이 바로 생성자(constructor) 이다.
생성자를 통해 세부사항(속성)을 함수에 인자를 넣듯 속성을 넣어준다.

-> 클래스는 일종의 원형(original form)으로, 객체를 생성하기 위한 아이디어나 청사진이다.
-> 인스턴스클래스의 사례(instance object)이다.
-> 클래스는 객체를 만들기 위한 생성자(constructor) 함수를 포함한다.


객체 지향 프로그래밍 4가지 특징 (OOP Basic Concepts)

객체 지향 프로그래밍(oop)캡슐화(Encapsulation), 상속(Inheritance), 추상화(Abstraction), 다형성(Polymorphism) 이라는 4가지 특징을 가지고 있다.

캡슐화 Encapsulation

캡슐화는 데이터(속성)와 기능(메서드)을 따로 정의하는 것이 아닌, 하나의 객체에 넣어서 묶어 객체로 정의하고 객체 안에서 정의된 속성은 해당 객체에서만 접근이 가능하다.

캡슐화의 개념에는 은닉화 의 특징도 포함하고 있으며 이는 프로그램의 세부적인 구현을 외부로 드러나지 않도록 감추는 것이다. 외부로의 노출을 최소화하여 모듈간의 결합도를 떨어뜨려 데이터(속성)와 기능(메서드)들이 느슨하게 결합된다(Loose Cooupling).
-> 이러면 유지보수에 용이해 진다. 언제든 구현을 수정할 수 있음.


추상화 Abstraction

추상화는 복잡한것들을 어떤 객체의 이름으로 추상화 시켜 내부 메서드의 구현이 어떤지 몰라도 사용자가 사용하기 쉽게 만드는 것이다.
-> 인터페이스를 단순화할 수 있다.

예를 들어 전화기안에 여러 전선들 등이 있는데 우리는 그것들을 이해하지않아도 숫자버튼을 누르고 통화버튼을 누르기만 해서 사용하면 되는것이다.


캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면, 추상화는 클래스를 사용하는 사람이 필요하지 않은 메서드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 포커스가 맞춰져 있다.

클래스 정의 시, 메서드와 속성만 정의한 것을 인터페이스라고 부른다.
이것이 추상화의 본질이다.


상속 Inheritance

상속은 부모객체의 특징을 물려받는 것이다.
다시말해 부모가 가진 속성이나 메서드를 자식이 부모의 속성이나 메서드를 상속받아 가질 수 있다.
상속을 사용하여 프로그램의 복잡도를 줄여주고 불필요한 코드를 제거할 수 있다.
또한 상속받은 자식의 기능의 일부분을 변경해야 할 경우 해당하는 기능을 다시 정의하게 되는데 이런 작업을 오버라이딩(Overriding)이라고 한다.


다형성 Polymorphism

객체의 변수나 메서드가 상황에 따라 다른 의미로 해석될 수 있는 것을 말한다.
상속에서 언급했던 오버라이딩(Overriding)을 사용하여 자식 클래스의 메서드가 부모 클래스의 메서드와 다르게 동작하거나 변수가 다른 값으로 지정될 수 있다.

포유류 범주(부모클래스)에 있는 강아지(자식 클래스)와 고양이(자식 클래스)가 소리를 낼때(같은 메서드) 둘은 다른소리를 내는것과 같다.

만일 다형성을 제공하지 않는다면 위의 예시에서 포유류범주(부모클래스)에 종류별로 분기를 시켜서 하나하나 다르게 만들어야 할 것이다.

->

if(강아지){
  return '멍멍';
}
else if(고양이){
  return '야옹';
}

또는 각각의 자식 클래스에 별도의 각기 다른 메서드를 만들 수도 있겠지만,
클래스의 본질상 부모가 갖고 있는 것이 합리적이다.


정리

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

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

  • 상속 역시 불필요한 코드를 줄여 재사용성을 높인다.

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

profile
개발 재밌다

0개의 댓글