OOP (Object-oriented Programming)
OOP (Object-Oriented Programming)
- OOP는 코드를 구성하는 방법에 대한 규칙이자 실행 방법들에 대한 방법일 뿐
- OOP를 지원하는 언어들
- 예) Java, C#, JavaScript, TypeScript, Dart, ...
- OOP를 사람들이 좋아하는 이유는 매우 직관적이고 데이터와 코드를 잘 구성해주기 때문
- OOP를 사용하여 object를 중심으로 데이터를 다루는 함수는 매우 직관적이고 생각해내기 아주 쉬움
- 언어에서 코드를 객체지향적으로 만들어 사용할 수 있는 특정 툴을 쓸 수 있다면 OOP를 꼭 사용하지 않아도 됨
- Class에는 Property(속성), Method, Inheritance가 있음
Why We Need OOP
- 코드를 더 나은 방법으로 만들어 줌. 더 프로페셔널하고 이해하기 쉬운 방법으로
- 객체지향프로그래밍의 신비한 점은 데이터를 기반으로 동작하는 함수로 데이터를 캡슐화할 수 있다는 것
- 다른 종류의 데이터와 함수들을 동일한 하나의 파일에 모두 가지고 있는 것 대신에 객체 지향 프로그래밍을 사용하면 우리의 데이터를 좀 더 구체화하여 구성할 수 있음
- 그럼으루써 앱의 구조를 훨씬 더 이해하고 작업하기 쉽도록 도와줄 것
- OOP는 우리가 필요한 구조와 정신적 규칙과 모델을 줌
Class
- 클래스는 우리의 데이터가 어떻게 생겨야하는지에 대한 청사진과 같음
- 클래스는 데이터의 구조를 정의할 수 있도록 해줌
- 클래스는 우리가 캡슐화하고 싶은 것을 캡슐화하도록 도와줌
- 클래스는 데이터를 정의하고 그 데이터를 기반으로 동작하는 함수를 정의하는 걸 도와줌
Method
- method는 클래스 안에 있는 함수
- method의 첫번째 argument는 self가 되어야함
- method는 항상 그것들의 class를 참조함
- method의 첫번째 argument로 넘겨주는 것은 클래스 object임
Inheritance (상속)
- 상속은 객체지향프로그래밍을 더 나은 방향으로 도와주는 것
- 우리의 코드를 저장하고 다시 사용할 수 있도록 해주기 때문
- 일부 클래스의 가장 일반적인 property들을 분리시킬 수 있고 그 property들을 공유할 수 있음
OOP (Object-oriented programming )
- 속성에 데이터를, 메소드에 절차코드를 넣는 '오븍제트' 콘셉트 기반으로하는 프로그래밍 패러다임을 의미
- 오브젝트의 특징은 연관된 것 끼리 참조한다는 것
- OOP에서 오브젝트 간의 상호작용하다록 설계하는 컴퓨터 프로그램임
- 많은 언어들에서 OOP가 사용됨 (C++, Java, Python)
추상화 (abstract)
- 현실 세계/개념/대상에서 원하는 특징/속성(attribute)를 뽑아내는 과정
* variable
- 클래스를 실체화 시키면 인스턴스라고 함
- 인스턴스를 통해서 클래스의 변수나 함수 같은 속성(attribute)에 접근할 수 있음
class vs. object
- 클래스는 설계도
- 객체는 설계도로 구현한 모든 대상을 의미
object vs. instance
- 클래스 타입으로 선언되었을 때 객체라고 부르고
- 그 객체가 메모리에 할당 되어 실제 사용될 때 인스턴스라고 부름
- 객체는 '실체'에 초점!
- 인스턴스는 '관계'에 초점을 맞춤
- 객체를 클래스의 인스턴스라고도 부른다
- 객체와 인스턴스를 엄격하게 나누긴 어려움
OOP특징#1. 상속 (Inheritance)
- 공통된 특징
- 상속을 받은 하위 클래스는, 상속된 특성 외의 자신만의 특징을 추상화!
OOP특징#2. 캡슐화 (encapsulation)
- 응집도는 높아야! / 결합력은 낮아야!
- 연관이 높은 속성은 클래스 안에 모아둠 (그러면 응집력 업!)
(1) 응집도 (cohesion)
- 프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지 나타내는 정도
- 일반적으로 한 요소가 특정 목적을 위해 밀접하게 연관된 기능들을 모여서 구현되어 있음
- 응집도가 높으면 프로그램을 쉽게 이해할 수 있고 유지보수성이 높아짐
- 낮은 응집도의 문제
* 이해하기 힘듬
- 따로 재사용하기 힘듦
- 유지보수하기 어려움
- 다른 클래스의 변화가 민감 (다른 클래스에 의존적일 수 있음)
(2) 결합도 (coupling)
- 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지
- 또한 얼마나 의존적인지 나타내느 정도
- 요소가 결합도가 낮다는 것은 다른 요소들과 관계를 그다지 맺지 않은 상태를 의미
- 높은 결합도의 문제
* 연관된 다른 클래스가 변경되면 같이 변경해야 함
- 수정하려는 클래스를 이해하기 위해 연관된 다른 클래스를 함께 분석해야 함
OOP특징#3. 다형성(polymorphism)
오버라이딩 (overiding)
- 부모클래스에서 정의된 메소드를 자식클래스에서 새롭게 정의
오버로딩 (overloading)
- 같은 클래스 안에 동일 이름의 메소드가 여러개! (단, 인자의 개수/타입이 달라야!, 반환값은 상관없음)
- 파이썬은 오버로딩이 없음
객체지향의 오해
1) oop는 실세계 real world를 모델링하는 것인다?
추천 도서
- GoF의 디자인 패턴
- 그래디 부치의 'UML을 활용한 객체지향 분석 설계'
Reference