1.
객체 지향 프로그래밍1.1
객체 지향 프로그래밍 OOP객체 지향 프로그래밍 Object-Oriented Programming
, OOP
는 컴퓨터 프로그래밍의 패러다임 중 하나이다.
객체 지향 프로그래밍 OOP
는 시간이나 사건의 흐름에 따른 명령어들의 목록이라는 시각을 벗어나 독립된 단위인 객체 Object
들의 집합으로 보고자 하는 것이다. 각각의 객체 Object
는 메시지를 주고받고, 데이터를 처리할 수 있다.
객체 지향 프로그래밍 OOP
는 대규모 소프트웨어 개발에 많이 사용되고 소프트웨어 개발과 유지보수, 직관적인 코드 분석에 장점이 있다.
Java
, C++
, C#
, Python
, PHP
, Ruby
, Object-C
1.2
객체 지향의 요소클래스 Class
같은 종류의 혹은 문제해결을 위한 집단에 속하는 속성attribute
과 행위behavior
를 정의한 것이다.
객체Object
를 만들기 위한 설계도라고 볼 수 있다.
객체 Object
클래스Class
에 선언된 모양 그대로 생성된 인스턴스Instance
이다.
클래스Class
의 인스턴스Instance
라고도 한다.
인스턴스Instance
는 객체가 구현된 실체이고 실체화된 객체인 인스턴스는 메모리에 할당된다. 즉, 객체가 메모리에 할당되어 실제로 사용되면 인스턴스라고 부른다.
Method
, Message
, Attribute
, Constructor
, etc.
1.3
객체 지향의 특징추상화 Abstraction
세부정보를 숨기고 중요한 정보만 표현해 프로그램을 간단히 표시하는 것이다.
TV 리모콘 같은 경우, 사용자 입장에서는 리모콘 안에서 어떻게 작동하는지 세부정보는 모르지만 리모콘의 버튼들이 무슨 기능을 하는지는 알 수 있다. 제작자는 전원버튼을 표시하고 On/Off 한다는 중요한 정보는 표현하지만 그 기능을 구현되게 하는 세부정보는 숨긴다.
캡슐화 Encapsulation
변수(데이터)와 함수를 하나의 단위로 묶는 것이다.
정보은닉 information hiding
내부의 구현을 감추고 외부로의 노출을 최소화하고 외부로부터의 접근을 차단한다.
클래스의 외부에서는 외부로 노출된 특정 메서드에만 접근이 가능하고 클래스 내부에서 어떤 식으로 처리하는지는 알 수 없다.
높은 응집력high cohesion
과 약한 결합력weak coupling
이 목적이다.
응집력 cohesion
객체 내에서 특정 목적을 위해 구성한 요소인 메서드, 데이터들의 밀접함.
결합력 coupling
클래스와 클래스 사이의 의존성.
상속 Inheritance
클래스가 다른 클래스의 특성과 기능들을 물려받는 것을 말한다.
상위클래스를 하위클래스가 상속받아 상위클래스의 특성과 기능들을 재사용 할 수 있다.
다형성 Polymorphism
하나의 객체나 메서드가 여러 형태를 가질 수 있는 것을 말한다.
overloading
, overriding
, generic
, 형 변환 upcasting
downcasting
1.4
객체 지향 설계의 5원칙 SOLID
SRP
단일 책임 원칙Single Responsibility Principle (SRP)
객체는 오직 하나의 책임만 가져야 한다.
클래스의 목적을 명확히 해야 구조가 난잡하지 않고 코드를 유지, 보수하기 쉽다.
OCP
개방 - 폐쇄의 원칙Open-Closed Principle (OCP)
객체는 확장은 개방적이고 수정은 폐쇄적이어야 한다.
기존의 코드를 변경하지 않으면서 기능은 추가할 수 있도록 설계해야 한다.
LSP
리스코프 치환 원칙Liskov Substitution Principle (LSP)
자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다.
부모 클래스 대신 자식 클래스를 넣어도 동작하는데 문제가 없어야 한다.
다형성 polymorphism
ISP
인터페이스 분리 원칙Interface Segregation Principle (ISP)
자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
하나의 큰 인터페이스 보다는 여러개의 구체적인 인터페이스로 분할하는 것이 좋다.
DIP
의존성 역전 원칙Dependency Inversion Principle (DIP)
상위 모듈은 하위 모듈에 의존해서는 안되고, 둘다 추상화에 의존해야 한다.
클래스 사이의 의존관계는 구체적인 클래스 보다는 추상화한 클래스에 의존해야 한다.
인터페이스interface
를 활용하라는 의미이기도 하다.