객체지향 프로그래밍이란?
🍳 OOP 탄생 배경
: 객체지향 프로그래밍이 등장하기 전에는 절차지향적, 구조적 개발 방법론을 이용해 소프트웨어를 개발했다.
- 명시된 입력을 받아 명시된 순서로 처리한 다음 결과를 내는 방식이다
하지만 대규모 프로젝트같은 복잡한 로직이 요구되면 순서도로 나타내는 게 불가능해지고 스파게티 코드를 양상하게 되었다.이때 구조적 프로그래밍이 탄생했다.
구조적 프로그래밍이란 큰 문제를 해결하기 위해 작은 함수로 쪼개기 때문에 Top-Down (하향식)방식으로 불린다.
하지만 구조적 프로그래밍 도 데이터 자체를 구조화하지는 못했다.
전역 네임 스페이스는 포화상태가 되고 GUI 프로그래밍에선 실행 컨텍스트를 저장할 방법이 없었다.
이에 해결책으로 나온게 객체 지향 프로그래밍 이다.
객체지향은 먼저 작은 문제들을 해결할 수 있는 객체를 만들고 이 객체들을 조합해 큰 문제를 해결하는 Bottom-up(상향식) 방식을 도입했다. 객체의 독립성, 신뢰성이 보장되게 만들면 재사용섣오 높아져 개발기간과 비용도 줄일 수 있게 되었다.
이후 객체 지향 프로그래밍도 복잡해지면서 여러 디자인 패턴이 대두되었다.
oop란?
객체지향 프로그램밍(Object-Oriented Programming) 은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, '객체'들의 상호작용 ( 메세지 주고받기, 데이터 처리, 등)으로 프로그램 로직을 구성하는 프로그램 패러다임이다.
🔥프로그램밍 패러다임
프로그래밍 패러다임이란 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성해햐 할 지 결정하는 역할을 한다. 새로운 패러다임이 제시된다면 새로운 방식, 생각이 필요하고 이를 바탕으로 코드를 작성한다.
oop의 특징
💊 1. 캡슐화 (Encapsulation)
: 한 객체가 특정한 하나의 목적을 위해 필요한 데이터나 메소드를 하나로 묶는 것을 의미한다.
데이터는 외부에서 직접 접근이 불가능하고, getter, setter와 같은 함수를 통해서만 접근이 가능하다.
📌2. 은닉화 (Information hiding)
: 캡슐화의 목표이다. 내부 구조는 접근 제어자 private를 사용하여 외부에서 보이지 않게 하고 공개해도 되는 내용은 public으로 공개한다.
- 바깥 간섭으로 인해 발생하는 오류 방지
-> 내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 낮춰 코드 전제척으로 유연함과 유지 보수성을 높인다.- 다른 사람의 클래스 객체를 뜯어볼 필요가 줄어든다. 제공해주는 기능 그래도 사용하면 된다.
👩👧👦 3. 상속 (Inheritance)
: 부모 클래스의 메소드, 변수는 자식이 물려받아 사용할 수 있다. 하지만 자식 클래스에 맞게 기능을 커스텀하여 재정의 할 수 있다.
- 상속은 클래스 상속관계에서 혼란을 야기할 수 있어 다중 상속이 불가능하다. 반면 인터페이스는 이에 대해 자유롭다.
- 날기 인터페이스를 Implements 한 경우 반드시 해당 인터페이스에 있는 메소드를 정의해야 한다.
- 인터페이스의 경우 implements된 모든 클래스 객체를 하나로 묶어 한 번에 명령하는 것이 가능하다.
ex)
상속 : 박쥐와 날다람쥐 객체는 포유류라는 부모 클래스의 상속을 받는다. 여기서 새키 수, 수유 방법 등과 같은 메소드는 상속받되, 안에 세부 내용은 객체에 맞게 커스텀하여 재정의할 수 있다.
인터페이스 : 인터페이스를 implements 했다면 박쥐와 날다람쥐, 날치는 반드시 날기 메소드를 만들어야 하고 각자의 방법에 맞게 재정의하면 된다. 인터페이스의 경우 먹기, 자기와 같은 기능들을 여러개 implements 할 수 있다.
🎨 4. 추상화 (Abstraction)
: 공통의 속성이나 기능을 묶어 이름을 붙이는 것
- 클래스를 정의하는 걸 추상화라고 볼 수 있다.
🍞 5. 다형성 (Polymorphism)
: 하나의 변수명이 상황에 다라 다른 의미로 해석될 수 있다는 것 뜻한다.
- 오버라이딩, 오버로딩이 있다.
🍎 6. 동적 바인딩
: 런타임 값에 따라 변수 데이터 타입, 호출될 함수가 결정된다.
- 대부분의 객체 지향 언어가 동적 바인딩을 지원하지만 에이다와 같은 예외도 있다.
참고
https://computasha.github.io/CS-OOP/
https://velog.io/@sxxk2/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-OOP