- OOP stands for “Object Oriented Programming”. 일명 객체지향프로그래밍 (오오피)
- 프로그램을 여러개의 “객체”로 나누고 그 객체들의 상호작용으로 서술하는 방식.
- Objects 의 개념을 바탕으로한 프로그래밍 패러다임 이다.
- Objects 는 fields 와 methods 를 포함한다.
- 상호작용하는 객체들의 집합
프로그래밍 패러다임이란 프로그래머에게 프로그래밍의 관점을 갖게 해주고, 결정하는 역할을 한다. 예를 들어 객체지향 프로그래밍은 프로그래머들이 프로그램을 상호작용하는 객체들의 집합으로 볼 수 있게 하는 반면에, 함수형 프로그래밍은 상태값을 지니지 않는 함수값들의 연속으로 생각할 수 있게 해준다. — 위키백과
- 상태값을 지니지 않는 함수값들의 연속
- 객체지향은 사람의 추상능력, 인식방법에 가까운 개발 방법론.
- attributes와 behavior로 이루어진 객체를 만드는 것.
- 프로그램을 독립된 단위인 객체들의 모임으로 보고 각각 객체는 메시지를 주고 받고 데이터를 처리함.
- Strong Cohesion and Weak Coupling (강한 응집력, 약한 커플링)
- 클래스에 하나에 문제 해결을 위한 데이터를 모아 놓은 데이터형을 사용함으로써 응집력을 강화한다.
- 클래스간에 독립적으로 디자인함으로써 결합력을 약하게 한다.
- Reusable: 잘 만들어진 객체는 재사용이 가능하다.
- 유지보수 용이성: Weak coupling 은 프로그램을 독립적으로 볼 수 있기 때문.
- 절차지향 패러다임 대비 대형 프로젝트에 적합.
- 설계하기가 쉽지 않다. 언제나 그렇지만 잘 짜는게 어렵다.
- 처리 속도가 느리다
- attribute = data = member variable = state = field
- behavior = operation = member function = method
- class = concept = type
- object = instance = variable
- 추상화 (Abstraction) — class, object, instance
- 상속 (Inheritance)
- 캡슐화 (Encapsulation)
- 다형성 (Polymorphism)
- Define and execute abstract actions
- 표현 대상의 특징에 대한 서술
- procedural abstraction : 함수 (function)
- data abstraction : 구조체, 배열, 포인터
- Object, Instance, 실체 : instance of class,
- Object 는 클래스의 Instance 이다. 클래스가 실제로 만들어 진 것.
- Inherit members from parent class
- 하나의 클래스가 가지고 있던 특징들을 그대로 다른 클래스가 물려 받는 것.
- 재사용, 유연성 증가
- Overriding : 부모 클래스의 메서드와 같은 메서드를 재정의 하는 것, 같은 이름의 메서드가 여러 클래스에서 다른 기능을 하는 것.
- Hide the internals of a class
- Access Control : public, internal, private …
- 데이터와 데이터를 다루는 방법을 묶는 것
- 내부의 구현은 감추고 모듈 내에서 응집도를 높이며 외부로 부터의 노출을 줄여 모듈간의 결합도를 떨어뜨리는 개념(Weak - Couping)
- Strong Cohesion and Weak Coupling (강한 응집력, 약한 결합력)
- Access a class through its parent interface
- 한 요소에 여러 개념을 넣어 놓는 것.
- 상속의 계층을 따라서 각각의 클래스에 한가지 이름을 줄 수 있다. 같은 명령을 다른 오브젝트에 줄 수 있다.
- Message passing 객체지향 관점에서 프로그램은 Object 에 message 를 보내는 것으로 실행
- a.method() : a 에 method() 라는 메시지를 보낸다.
- Overriding : 같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것 (상속)
- Overloading : 같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것
- method overloading
- operator overloading
- 객체 관계를 조직적으로 나타낼 수 있다
- 객체는 하나의 책임만을 맡아야 한다
- DB 정규화와 비슷함
- 목적 : 변화에 대한 유연성 확보
- 낮은 결합도, 높은 응집도 추구
- 모듈은 확장에는 열려있어야 하고 변경에는 닫혀 있어야함.
- 확장하기 쉬워야 하고, 변경하기 에는 좀 거시기 해야 함.
- 자식 클래스는 언제나 자신의 부모 클래스를 대체 할 수 있다는 원칙
- 즉 인터페이스만 알면 구현체를 몰라도 사용 가능해야 함.
- 다형성
- 클라이언트에서 사용하지 않는 메서드는 사용해선 안된다. 그러므로 인터페이스를 다시 작게 나누어 만든다.
- 하나의 일반적인 인터페이스 보다는 구체적인 여러개의 인터페이스가 나음
- 파생 클래스 입장에서 사용할 때 100% 구현할 수 있는 인터페이스만 사용해야 한다.
- 두 개 이상의 인터페이스가 필요한 경우 다중 인터페이스 상속으로 구현하는 것이 좋다.
- 첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
- 둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.