OOP(Object Oriented Programming)
기본 개념
- 세상에 실체가 있는 모든 물체를 클래스와 인스턴스, 함수, 변수라는 object로 변화시켜서 프로그램을 구성한다.
- OOP의 기본 전제는 기능(함수, 변수) 재사용이 가능하도록 설계 및 프로그래밍 했는 지이다.
- 최소비용으로 최대효율을 얻기 위한 개념의 일부이다.
의견
- 용어보다는, 현실에서 발생할 수 있는 특정 객체(object)를 컴퓨터라는 도구에 인식시키는 것이다.
- 대부분의 분야에서 OOP의 개념을 적용하여 프로그래밍을 수행한다.
- 기본개념: 설계(사람이 이해하는 방식)와 구현할 소스코드(컴퓨터가 이해하는 방식) 간의 상호이해가 중요하다.
- HW, SW의 성능증가(CPU 성능, SW 다중 실행) 덕에 OOP의 모든 기능을 활용할 필요는 없다.
- OOP를 무분별하게 활용하면 유지보수가 어려워질 수도 있기 때문에 설계방향 및 서비스 기능에 따라 사용해야 한다.
OOP의 어려운 점
- 하나의 패러다임이기 때문에 우열을 가릴 필요는 없다.
- 주관성이 높으므로, 보편적으로 활용되는 개념만 배운다.
(소프트웨어 서비스 설계 방향에 영향을 많이 받는다.) - 프로그래밍 뿐 아니라 다양한 도메인에서 재사용 가능한 클래스, 메소드 설계가 중요하다.
OOP 이전
- OOP 개념이 나오기 전에는, 배열과 함수, 변수를 많이 생성하고 활용하여 최대한 많은 기능을 적은 양의 소스코드 파일에 담았다.
- 속성과 기능이 증가할 때마다 배열과 함수를 계속 생성해야했기에 소스코드를 관리하는데 비효율적이었다.
- 이에 따라 속성과 기능을 object라는 최소 단위로 분리하는 OOP의 개념이 나오기 시작했다.
필요성
- 데이터 기반 의사결정(data-driven), 컴퓨터 하드웨어 성능, 데이터량 증가에 따라 OOP 활용도 증가하였다.
- 프로그래밍 패러다임: OOP, Procedural Programming, functional Programming
- 함수형은 함수의 사용을 극대화시켜 코드의 가독성을 높여주는 형태이다.
- 프로그래밍 코드를 특정 상황에 특정 함수를 사용하기 위해 고안된 방법이다.
- 절대적으로 좋은 프로그래밍은 아니다.
일상 생활
- 일상생활에서 볼 수 있는 것, 실제로 머리속에서 떠올릴 수 있는 것을 프로그래밍하는 것이 OOP의 중요한 점이다.
- 기능별로 개체가 효율적으로(재사용가능하도록) 분리되어야 한다. 그러므로 설계가 중요하다.
1 |
|
1 |
|
OOP의 구성
1. 캡슐화
- 기본개념: 내부 속성(변수)과 함수를 하나로 묶어서 클래스로 선언하는 일반적인 개념이다.
- 캡슐화 형태로 코드를 작성하지 않으면 특정 기능(함수, 변수)에 직접 접근하게 되는 상황이 된다.
- 기능이 많아질수록 재사용의 개념을 활용하기 어렵다.
1 |
|
2. 상속과 포함(Inheritance & Composition)
- 객체(object)의 종류는 현실 세계에 있는 대부분이기 때문에, 설계될 수 있는 다양한 객체(object)가 있다.
상속(Inheritance)
- ‘개는 동물이다.’ 또는 ‘선생님은 직장인이다.’
- 기본개념: 상위 클래스의 모든 기능(함수, 변수)을 재사용할 수 있다.
포함(Composition)
- ‘개는 몸을 갖고 있다.’
- 기본개념: 다른 클래스의 일부 기능(함수)만을 재사용한다.
1 |
|
3. 추상화
- 기본개념: 추상화(abstraction)는 복잡한 내용에서 핵심적인 개념 및 기능을 요약하는 것이다.
- object의 기능에 따라 추상클래스(상위클래스)를 상속받아 개별적으로 클래스(하위클래스)를 생성한다.
- 기본적으로 추상메소드를 선언하며 실제 실행되는 기능은 보여지지 않는다.
- 실제 실행되는 기능은 선언된 추상 클래스를 상속받은 다른 클래스의 메소드에서 확인할 수 있다.
- 추상클래스를 사용하는 이유: 대형 프로젝트를 진행하는 경우 또는 프로그램이 복잡해지는 경우 1차적인 설계를 위해 기능을 추상화시켜놓고, 활용여부는 차후에 결정하기 위함이다.
1 |
|
4. 다형성
- 다형성은 구현되는 하위클래스에 따라 클래스를 다르게 처리하는 기능이다.
- 상속과 유사하다고 느낄 수 있지만, 상속은 사위 클래스의 기능을 재사용한다.
- 위 그림과 같이 다형성은 상위클래스의 기능을 변경하여 사용하는 것이다.
1 |
|
OOP 설계
클래스 설계와 사용
- 클래스 설계가 중요한 이유는 코드 재사용성이다.
- 코드 블록을 구성한다.
1단계
- 코드 설계 시 사용할 object
- Users
- Customers
- Vendors
- Admin
- Products
- Purchases
2단계
- 코드 작성 전, 각 object별로 요구되는 속성과 어떤 기능을 위해 생성되었는지 설계한다.
- Users
- Attributes(속성)
- 이름
- 사용자가 관리자인지?
- Customers
- Attributes
- 이름
- 구매목록
- Attributes
- Vendors
- Attributes
- 이름
- 상품목록
- Attributes
- Admin
- 이름
- 사용자가 관리자임을 나타내는 구분값
- Attributes(속성)
- Products
- Attributes
- 이름
- 가격
- 공급업체
- Attributes
- Purchases
- Attributes
- 제품
- 고객
- 가격
- 구매완료기간
- Attributes
1 |
|
클래스의 인스턴스화
- 클래스를 생성했으면, 그것을 활용하기 위한 인스턴스화가 필요하다.
- object가 생성된 이후, object가 소프트웨어의 메모리 할당이 되면 인스턴스가 되는 것이다.
- object는 인스턴스를 포함할 수 있으며, 포괄적 의미를 갖는다.
- object는 프로그래밍 전체에서 쓰이는 포괄적인 의미를 가지므로 인스턴스와 비교하면서 학습하는 대상은 아니다.
- object가 생성된 이후, object가 소프트웨어의 메모리 할당이 되면 인스턴스가 되는 것이다.
1 |
|
파이썬 활용 및 OOP
데이터 캡슐화와 접근제어
- 캡슐화는 object 및 소스코드 구현에 대한 상세정보를 분리하는 과정이다.
- 모듈화가 가능해진다.(함수, 메소드, 클래스 등을 활용한 기능 분리)
- 기능이 분리되어있으니 디버깅을 하는 경우 편리하다.
- 프로그램이 기능별로 분리되어 있어 소스코드의 목적을 알기 쉽다.
- 접근제어자를 제공하지 않기 때문에 변수, 메소드, 함수에 직접 접근할 수 있다.
- 상단 표와 같은 직접 접근을 허용하지 않는 규칙이 있다.
- 파이썬의 변수나 함수를 감춰주는 기능으로, 외부에서 무분별한 접근을 막기 위해 위와 같은 개념이 생겨났다.
1 |
|
- 클래스이름과 속성에 대해 알고 있으면, 변형된 이름을 사용해 접근 가능하다.
1 |
|
- 프로그램이 길어지고 다양한 변수를 선언하는 경우 클래스의 속성이 충돌할 수 있다.
1 |
|
- 충돌이 발생하는 이유는 대체로 프로그램에서 중복되는 속성(attribute)을 활용하는 경우이다.
- 속성명을 다르게 해줘도 되지만 파이썬에서 활용할 수 있는 ‘비공개 속성’을 활용할 수 있다.
- 비공개 속성은 ‘__‘를 활용한다.
1 |
|
메소드 오버라이딩
- 메소드 오버라이딩은 같은 이름의 메소드를 신규 생성하는 것이다.
- 중복되는 기능은 기존 부모클래스의 메소드로 재사용하고, 다르게 사용하려면 재정의하는 개념으로 활용할 수 있다.
- 다형성 개념의 한 종류이다.
1 |
|
super
- Graduate(자식클래스)는 Student(부모클래스)가 가지고 있는 모든 매개변수(파라미터, arguments)를 사용한다.
- 상속을 통한 재사용을 하는 경우, 아래와 같이 다른 매개변수(graduation_date)도 신규 생성할 수 있다.
1 |
|