본문 바로가기

Sparta/TIL

24.02.21 TIL - 객체지향 프로그래밍(OOP) (1)

1. 객체지향(Object-Oriented)

1)객체란

객체는 현실세계의 물체나 개념을 소프트웨어 세계로 옮긴 것이다. 예를 들어 자동차나 사람처럼 생각하면 된다. 여기서, 객체는 여러 속성과 행동[메서드]로 구성된다. 객체는 정보[데이터]와 그 정보를 처리하는 행동[함수 또는 메서드]를 가지고 있는데, 객체들은 서로 메서드 호출을 통해 메시지를 주고 받아 협력한다.

 

2)객체 지향이란

객체지향은 소프트웨어 개발에서 주요 구성요소를 기능(Function)이 아닌 객체(Object)로 삼으며 어떤 객체가 어떤일을 할 것인가에 초첨을 맞춘다. 즉, 객체를 도출하고 각각의 역할을 명확하게 정의하는 것에 초첨을 맞추는 방법론이다. 책임과 권한을 가진 객체들이 서로 메시지를 주고받아 협력하여 필요한 기능을 수행한다. 

 

3)절차지향 vs 객체지향

객체지향은 캡슐화, 다양성, 상속을 지원하고 데이터 접근 제한이 가능한 반면, 절차지향은 이 조건들을 만족하지 않는다.

 

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

1)프로그래밍 패러다임

a)구조적 프로그래밍 : 기능 중심적인 개발, 가장 처음으로 적용된 패러다임

b)객체지향 프로그래밍 : 처리단위가 객체인 프로그래밍, 현실세계를 프로그램으로 모델링

c)함수형 프로그래밍 : 세가지 중 가장 초기에 만들어졌지만 최근 주목받기 시작함.

 

2)객체지향

상태(데이터)와 그 데이터를 조작하는 프로세스(메서드)가 같은 모듈 내부에 배치되는 프로그래밍 방식. 코드를 추상화하여 개발자가 더 직관적으로 사고할 수 있게 하는 대표적인 방법론이며, 현실 세계의 객체를 유연하게 표현할 수 있다.
객체는 고유한 특성을 가지며, 특정 기능을 수행할 수 있다.

 

OOP는 가독성이 좋고 재사용성이 높고, 유지보수가 쉬운 코드를 지향해야 한다. 프로그래밍을 하는 시간을 효율적으로 관리하려면 코드 변경점이 발생하더라도 최대한 적게 수정하고 문제를 빠르게 인지하고 빠르게 오류를 수정할 수 있어야 한다.

 

3. OOP의 핵심원칙

1) 갭슐화(Encapsulation)

캡슐화란 객체 내부의 세부적인 사항을 감추는 것, 즉 중요정보를 외부로 노출시키지 않도록 만드는 것을 말한다. 

 

JavaScript는 완벽한 캡슐화를 지원하지 않는데, 변수 앞에 언더바(_)를 사용하여 내부의 변수를 숨긴 것처럼 나타내는 규칙을 따르곤 한다. private라는 접근 제한자도 있는데, 인스턴스 내부에서만 해당 변수에 접근이 가능하도록 제한하는 문법이다. typescript에서 제공하는 문법이다.

 

2) 상속(Inheritance)

상속은 하나의 클래스가 가진 특징(함수, 변수 및 데이터)을 다른 클래스가 그대로 물려받는 것을 말한다. 이미 정의된 상위 클래스의 특징을 하위 클레스에서 물려받아 코드의 중복을 제거하고 크드 재사용성을 증대시킨다.

 

3) 추상화(Abstraction)

객체에서 공통된 부분을 모아 상위 개념으로 새롭게 정의하는 것. 즉, 불필요한 세부사항을 생략하고 중요한 특징만을 강조함으로써 코드를 더욱 간결하고 관리하기 쉽게 만드는 것. 코드가 간결하고 관리하기 쉬우며 공통적인 특성을 더욱 명확하게 파악할 수 있다.

 

클래스를 설계할 때 추상화-> 추상클래스->인터페이스 순으로 정리한다면, 여러 클래스 간의 일관성을 유지하면서 다양한 형태로 확장될 수 있는 코드, 즉 다형성(Polymorphism)이 가능해진다.

 

4) 다형성(Polymorphism)

다형성은 하나의 객체(클래스)가 다양한 형태로 동작하는 것을 의미한다. 이는 객체가 가진 특성에 따라 같은 기능이 다르게 재구성되는 것을 의미한다. 즉, 동일한 메서드나 함수명을 사용하더라도 클래스마다 그 메서드가 다르게 동작하는 것이 다형성의 핵심이다.

 

다형성은 역할(인터페이스)와 구현을 분리하게 해주고 오버라이딩을 통해 특정한 서비스의 기능을 유현하게 변경하거나 확장할 수 있게 한다.