본문 바로가기

Python

[OOP01] 객체지향 프로그래밍 개념

- git 정리 : https://github.com/jihyeonjane/python/tree/master/python_OOP_practice

'''깃허브 파일 내용

python_OOP_practice/
|
|-- person.py
|   |-- programmer.py
|
|-- person_추상화.py
|   |-- actor.py   # 추상화 예시
|
|-- main.py # 위의 파일 실행
|-- polymorphism.py # 다형성 예시 파일(main.py와 비슷하나 동작 방식만 좀 다름)
|-- encapsulation.py # 캡슐화 예시 파일(main.py와 비슷하나 동작 방식만 좀 다름)
|
|
|-- inheritance.py # 다중상속 예시


'''

 

지금까지 객체지향 관련 알고 있는 거라고는 효율적인 유지보수를 위해...class 잘 써서 객체 관리 어쩌구...정도...

아주 옛날에 얼핏 배웠던 기억만 가물가물...그림으로 감 잡는게 제일 쉬웠던 기억이 있다.

- 관련 링크 : https://youtu.be/vrhIxBWSJ04?si=rE6dZzQndAluwzMf

--> 본 것 중에 가장 개념 정리 잘 돼 있는 영상이었음.

 

일단 객체지향 관련 키워드부터 정리해보자

1. 클래스 

2. 인스턴스(객체)

 

3. 상속(Inheritance) vs 인터페이스

4. 추상화(Abstraction)

5. 캡슐화(Encapsulation)

6. 다형성(Polymorphism)

 

7. 오버로딩, 오버라이딩, 결합도, 예외처리, 다중 상속 등등

 

1&2. 클래스 & 객체

 

아무래도 이 둘은 서로 관련성이 좀 높은 개념인 것으로 생각됨.

- 클래스 : 객체 생성을 위한 템플릿. 

- 인스턴스(객체) : 클래스에서 정의한 것을 기반으로 실제 할당(생성된)된 값. 데이터.

 

3. 상속(Inheritatnce) - git 코드(inheritance.py) 참고

- 기존 클래스(부모 클래스)를 활용하여 새로운 클래스(자식 클래스) 정의

- 기존 클래스의 멤버 변수와 메소드를 상속 받아 재사용 or 확장

- 계층 구조 형성 및 재사용 가능

** 그럼 인터페이스는? 기능을 '장착'하는거라고 생각하는게 편할듯.

** 다중 상속 : 여러 클래스 상속 받는 것

** 다이아몬드 상속 : 다중 상속 시 발생하는 문제인데... 직관성 떨어지게 돼서 지양하는게..

 

# 다중상속의 경우 아래와 같이 mro() 코드를 통해 호출 순서 확인
print(D.mro())

 

 

4. 추상화(Abstraction) - git 코드(person_추상화.py & actor.py) 참고

추상 클래스 사용 이유?
- 각 job 관련 py 파일들은 모두 person.py 함수를 상속받게 됨.
- 그런데 이때, 각 job에 따라 introduce 함수의 내용이 모두 다름.(고유 내용 모두 다름.)
- 때문에 introduce 함수는 각 job.py 파일에 대해 유동적이어야 함. 
- 이럴 때 추상 클래스 사용
- ** 추상 클래스 걸어놓으면 구현체 클래스는 무조건 이 추상 클래스에 대해 반드시 구현해야하는 제약 걸어놓을 수 있음. (구현 안 하면 실행 안되고 에러 뜸.)

 

 

5. 캡슐화(Encapsulation) - git 코드(encapsulation.py) 참고

- 함수 내에서는 자유롭게 값 설정이 가능하나, 
- 구현체 클래스에서 값 변경을 자유롭게 하지 못하게 하기 위해 캡슐화(비정상적인 값 출력을 방지하기 위해)

 

6. 다형성(Polymorphism) - git 코드(polymorphism.py) 참고

- 이건 개별적인 작업을 줄이기 위해 함수 리스트화해서 for loop 돌린 내용이었음.