Object Oriented Programming
- 목차
- OOP(Object Oriented Programming)는 현실 세계의 사물 및 개념들을 객체의 관점으로 보고 그 객체들을 조립하여 프로그래밍 하는 기법
- 절차 지향적 프로그래밍(C언어)의 코드의 재 사용성과 중복 제거를 목적으로 만들어진 기법
절차 지향 프로그래밍
- 실행하고자 하는 절차를 정하고, 그 절차대로 프로그래밍
- 목적을 달성하기 위한 일의 흐름에 중점을 둔다.
객체 지향 프로그래밍
- 현실 세계의 사물 및 개념들을 객체의 관점으로 보고 표현하여 프로그래밍
- 객체 지향을 사용하여 변경에 유연하고 재사용성과 확장성이 높은 개발을 할 수 있다.
- 객체들의 관계를 결정하고 이들의 상호 작용에 필요한 함수(메서드)와 변수(필드)를 설계 및 구현
- 하나의 클래스를 바탕으로 서로 다른 상태를 가진 인스턴스를 만들면 서로 다른 행동을 하게 됨
- 즉, 하나의 클래스가 여러 개의 인스턴스가 될 수 있다 - 재활용 성
객체지향(OOP)의 특징
1. 추상화
- 필요한 객체 관련 속성들 만 정의하고 불필요한 세부 정보는 숨기는 설계 기법
- 추상 클래스(Abstract Class)와 인터페이스(Interface)를 사용하여 구현된다.
2. 캡슐화
- 외부에 노출할 필요가 없는 정보들은 은닉하고 필요한 정보만 보여주게 설계 (정보 은닉)
- 정보 은닉(information hiding): 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것
- 정보 은닉을 통해서 높은 응집도와 낮은 결합도를 유지(변경에 대한 유연함과 유지보수성 증가)
3. 상속성
- 부모 클래스가 자식 클래스에게 속성을 상속
- 코드의 재사용
4. 다형성
- 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것
- 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
- 반복된 코드를 줄이며 꼭 필요한 코드만 수정한다는 장점을 가짐
- 다형성의 구현 방법
- 오버로딩(Overloading)** : 한 클래스 내에서 매개변수 개수와 타입이 다르면, 같은 이름의 메서드를 **중복 정의 (같은 이름의 메서드지만 서로 다른 동작을 한다 - 다형성)
-
오버라이딩(Overriding)** : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 **재정의
class A{ public String x(){return "A.x";} } class B extends A{ @Override public String x(){return "B.x";} public String y(){return "y";} } class B2 extends A{ @Override public String x(){return "B2.x";} } public class Test { public static void main(String[] args) { A obj = new B(); A obj2 = new B2(); System.out.println(obj.x()); System.out.println(obj2.x()); } } // 출력 결과 // B.x // B2.x
- 서로 다른 클래스 B와 B2가 동일한 데이터 타입 A로 인스턴스화 되었다.
- 하지만 두 인스턴스의 메소드 x를 호출한 결과는 서로 다르다.
- 이것이 상속과 오버라이딩 그리고 형변환(업캐스팅)을 이용한 다형성이다.
- 함수형 인터페이스와 enum을 함께 사용
- 함수형 인터페이스란? 람다식을 사용하기 위한 API로 자바에서 제공하는 인터페이스에 구현할 메소드가 하나 뿐인 인터페이스
객체 지향(OOP)의 장점
- 객체 중심으로 프로그래밍하기 때문에
- 사람의 관점에서 프로그램을 이해하고 파악하기 쉽다.
- 강한 응집력과 약한 결합력을 가진다. (변경에 유연하다)
- 응집력 : 해당 기능을 수행하기 위해 얼마 만큼의 기능과 아이디어가 뭉쳐있는지
- 결합력 : 한 코드의 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 의존적인지
- 재사용성, 확장성, 융통성이 높다.
객체 지향(OOP)의 단점
- 객체가 많으면 프로그램 용량이 커질 수 있다. 느려진다.
- 설계에 많은 시간이 투자된다.
- 설계 실패 시, 다시 처음부터 시작해야 한다.
좋은 객체 지향 설계의 5가지 원칙
Aa 원칙 | 설명 | |
---|---|---|
S | SPR 단일 책임 원칙 | 객체는 단 하나의 책임(역할) 만 가져야한다 |
O | OCP 개방 폐쇄 원칙 | 기존의 코드를 변경하지 않으면서 기능을 추가 할 수 있도록 설계가 되어야 한다 |
L | LSP 리스코프 치환 원칙 | 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야한다 |
I | ISP 인터페이스 분리 원칙 | 인터페이스를 클라이언트에 특화되도록 분리 시키라는 설계 원칙(특징에 맞춰 여러 개의 인터페이스로 분리) |
D | DIP 의존 역전 원칙 | 추상화에 의존해야지, 구체화에 의존하면 안된다. 의존 관계를 맺을 떄 변화하기 쉬운 것 또는 자주 변화하는 것 보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다. |