## OOP란? 객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, '객체'들의 상호작용(메시지 주고받기, 데이터 처리 등)으로 프로그램 로직을 구성하는 프로그래밍 패러다임이다. <br> > **프로그래밍 패러다임** > [[프로그래밍 패러다임, 함수형 프로그래밍|프로그래밍 패러다임]]은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할지 결정하는 역할을 한다. 새로운 프로그래밍 패러다임을 통해서는 새로운 방식으로 생각하는 법을 배우게 되고, 이를 바탕으로 코드를 작성하게 된다. <br> ## OOP의 특징 #### 1. 캡슐화, Encapsulation 💊 한 객체가 **특정한 하나의 목적**을 위해 필요한 데이터나 메소드를 하나로 묶는 것을 의미한다 - 데이터는 외부에서 직접 접근을 하면 안되고 함수를 통해서만 접근해야 한다 <br> #### 2. 은닉화, Information hiding 🥷 캡슐화의 목표. 내부 구조는 private하게 감춰두고 외부에서 조작할 수 있는 정보만 public으로 공개한다 → 바깥 간섭으로 인해 발생하는 오류 방지 ([내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨어뜨려 유연함과 유지 보수성을 높인다](http://wiki.hash.kr/index.php?title=객체지향_프로그래밍&mobileaction=toggle_view_desktop#.EC.83.81.EC.86.8D)) → 다른 사람의 클래스 객체를 다 뜯어볼 필요가 없어진다. 제공되는 기능 그대로 사용하면 된다 <br> #### 3. 상속, Inheritance 👪 기존 메소드와 변수를 물려받되, 필요한 기능을 더 추가하거나 나(자식클래스)에게 맞게 재정의하는 방법 상속과 인터페이스를 이해하는데 가장 큰 도움이 된 [영상](https://youtu.be/vrhIxBWSJ04)에 나왔던 예시 ![[Inheritance_and_Interface.png]] 상속이 👪 이런 느낌이라면, 인터페이스는 👬 이런 느낌. - 보통 상속에서는 다중 상속은 안되거나 제한이 있는데(클래스 상속 관계에 혼란을 줄 수 있어서), 인터페이스는 이에 대해 자유롭다 - 날기 인터페이스를 implements 하는 경우, 반드시 날기 인터페이스에 있는 메소드를 정의해야 한다 - 인터페이스의 경우 implements된 모든 클래스 객체를 하나로 묶어서 한번에 명령 할 수 있다 → 짱 편함 e.g. 박쥐와 날다람쥐는 포유류 클래스로부터 새끼 수 데이터, 수유하는 방법 메소드와 같은 내용을 상속받되, 원하는 내용을 추가하거나 재정의할 수 있다. 그리고 공통적으로 날기 인터페이스를 implements 했기 때문에 이 인터페이스에 있는 날기 메소드를 각자 나는 방법에 맞게 정의해야 한다. <br> #### 4. 추상화, Abstraction ⛰️ 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다 → 보통 객체 지향 프로그래밍에서 클래스를 정의하는 걸 추상화라고 생각하면 된다 <br> #### 5. 다형성, Polymorphism 🎭 하나의 변수명이 상황에 따라 다른 의미로 해석될 수 있다는 것을 뜻한다 - 일반적으로 오버라이딩 혹은 오버로딩을 의미한다 <br> #### 6. 동적 바인딩 ⛓️ runtime에 값에 따라 변수 데이터 타입, 호출될 함수가 결정된다 - 대부분의 객체 지향 언어가 동적 바인딩을 지원하지만 에이다 같은 예외도 있다