객체지향 프로그래밍(OOP)
💡 “객체 지향 프로그래밍(OOP : Object-Oriented Programming)” 여러개의 독립된 단위 **“객체”**를 기본단위로 나누어 이들의 유기적인 결함과 상호작용을 통한 프로그래밍 패러다임
객체란❓
*“주변에 실재하는 모든 대상” ***
➕ 논리, 철학, 공식 등 무형의 대상도 포함 될 수 잇다.
“ 객체 지향 프로그램의 가장 기본이 되는 단위 ”
“우리가 보고 느끼고 인지할 수 있는 그 모든 것”
객체 지향 프로그래밍❓
“주변의 많은 것들을 객체화 해서 프로그래밍 하는 것” 이라고 할 수 있다.
OOP의 장점
✓ “모듈화”된 프로그래밍
- 유연하게 사용가능
- 추가 , 수정, 삭제가 용이하다. → 유지보수 Good!
- 코드의 재 사용성 증가
- 중복된 코드 가독성 증가
4가지 특징
1️⃣ 추상화(Abstraction)
*“ 현실 세계에 있는 객체가 가지고 있는 **“속성”*과 “기능” 중 필요한 부분만을 추출하여 표현하는 것 ”
객체로 표현 될 수 있는 현실 세계의 사물이나 표상들은 각각 어떠한 성질이나, 특징들을 가지고 있다.
추상화라는 단어는 사물이나 표상의 이러한 것들을 추출하여 파악한다는 의미를 가지고 있다.
객체 지향 프로그래밍(OOP) 에서 추상화는 어떠한 기준을 가지고 클래스를 만들어내는 것이라고 할 수 있다.
추상화하는 과정 속에서 핵심이 되는 개념은 불필요한 부분을 제거하고 사물의 **“공통적”**이고, 가장 **“본질”**적인 부분을 추출하여 표현하는 것이다.
추상화를 통해 **클래스(Class)**를 만들고, 만들어진 클래스를 통해 “구체화” 시킨 객체를 프로그래밍을 하는데 사용하게 된다.
현실 세계의 객체 & 클래스 & 프로그래밍의 객체의 관계
- “현실 세계의 객체”가 추상화(Abstraction) 되어 클래스(Class)에 정의된다.
- 추상화된 클래스(Class) 가 구체화 되어 **객체(instance, Object)**가 만들어진다.
- Class는 객체 지향 프로그래밍에서 하나의 “타입(type)”으로 사용된다.
Tip! 현실 세계의 “상태 속성” → 클래스(Class)의 멤버 변수 현실 세계의 “기능, 행위” → 클래스(Class)의 메서드
❗️
JAVA에서 추상화를 구현 할 수 있는 문법 요소❗️
- “추상 클래스(abstract class)”
- “인터페이스(interface)”가 있다.
2️⃣ 상속 (Polymorphism) :: AKA. 확장
“기존(상위) 클래스의 자산(멤버)을 자식(하위) 클래스에서 재사용하기 위한 것!”
추상화를 통해 만들어진 클래스(Class)를 보았을 때, 클래스간 서로 공유할 수 있는 속성과 기능들이 있을 수 있다.
서로 공유할 수 있는 부분을 “상위 클래스”로 추상화 시켜 여러 “하위 클래스”들이 “상위 클래스”로부터 상속받은 속성과 기능을 편하게 사용할 수 있도록 한 개념이다.
상위 클래스의 것을 하위 클래스가 물려받아 재사용 할 수 있고, 더 나아가 추가하여 사용할 수 있다. 그래서 상속의 개념을 “확장” 이라고도 말하기도 한다.
➕➕➕ 메서드 오버라이딩(method overriding)
장점
- 클래스간 공유되는 속성과 기능들을 반복적으로 정의할 필요가 없다!
- 한번만 정의하여 사용하기에 “재 사용성 증가”
- 상위 클래스로 부터 물려 받기 때문에, “코드의 유지보수성 향상”
3️⃣ 다형성 (Inheritance)
“객체 지향 프로그래밍의 꽃”
“하나의 객체가 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질”*
간단한 예를 들어, 어떤 한 개발자가 있다고 했을 때, 이 개발자는 아내에게는 “남편”, 자식에게는 “아버지”, 부모님에게는 “자식”, 회사에서는 “직원” 등 여러 상황과 환경에 따라서 맡겨지는 역할이 달리질 수 있다.
OOP에서 다형성 은 위의 예시와 같이 “어떠한 객체를 속성이나 기능이 맥락에 따라서 다른 역할을 수행할 수 있는 특성” 을 의미한다.
하나의 객체를 다른 이름(객체)로 부를 수 있는 개념! ⇒ “다형성!!”
**다형성**의 기본 조건은 “상속” 이다
다형성의 종류
함수의 다형성 → 오버로딩, 오버 라이딩
객체의 다형성 → 동적 바인딩
객체 지향 프로그래밍에서 **다형성**의 중요한 부분
“한 객체(타입)의 참조 변수”를 통해 하위의 여러 타입의 객체를 참조할 수 있도록 만드는 것!!
황금 붕어빵
is a붕어빵
즉, “상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있도록 하는 것”
❗️**
JAVA*에서 *다형성**을 구현 할 수 있는 문법 요소❗️
- 오버로딩
- 오버라이딩
- 동적 바인딩
4️⃣ 캡슐화 (Encapsulation) :: 데이터 은닉과 보호
“서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것”
외부에서 객체에 접근해 정보를 마음대로 변경하게 되면 독립된 객체라는 고유한 특성을 잃어버리게 된다.
예를 들어, 개인정보를 가지고 있는 Person 클래스가 있다고 해보자.
Person 클래스로 생성된 하나의 객체가 가지고 있는 있는 중요한 정보인 주민번호, 연락처, 생년월일 , 계좌 잔액 등을 변경한다고 생각해보면 아주 큰 위험이라는 것을 누구나 느낄 수 있을 것이다.
객체 지향 프로그래밍에서 캡슐화 라는 개념이 존재하는 이유는 객체의 고유한 데이터를 외부로부터 “은닉” 하고 ***“보호”***를 위해서이다.
외부에서 객체에 접근하지 못하도록 하여 정의된 속성과 기능을 보호하고, 내부의 동작을 감추고, 외부에는 필요한 부분만을 노출하게 한다.
**캡슐화**를 통해 각 객체의 고유의 독립성과 책임 영역을 안전하게 지키고자 하는 목적이 있다.
❗️
JAVA에서 캡슐화를 구현 할 수 있는 문법 요소❗️
- “접근 제어자(access modifiers)”
- “getter/setter”
