Python

객체 지향과 클래스

dldbwls0818 2024. 9. 27. 14:01

객체지향 프로그래밍

- 객체지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어를 설계하고 구현하는 데 사용되는 중요한 프로그래밍 패러다임 중 하나입니다. 이 패러다임은 프로그램을 "객체"라고 불리는 독립적인 개체로 나누고, 이러한 객체들 간의 상호작용을 통해 프로그램을 구성하는 개발 방법론입니다.

 

클래스 (중요)

-클래스는 객체를 만들기 위한 템플릿 또는 설계도입니다.

class의 기본 구조

객체란?

- 현실세계에서의 실제 개체나 추상적인 개념을 모델링한 것이다. 예를 들어, 자동차, 사람, 강아지 등이 객체가 될 수 있습니다. 객체는 데이터(속성, 상태)와 메서드(동작, 함수)로 구성됩니다.

 

인스턴스란?

- 클래스를 기반으로 실제로 생성된 객체를 인스턴스라고 합니다. 클래스는 여러 인스턴스를 생성 할 수 있으며, 각 인스턴스는 독립적인 데이터와 메서드를 가집니다.

 

속성, 멤버변수란?

- 객체는 데이터를 저장하기 위한 속성을 가집니다. 이러한 속성은 객체의 상태나 특성을 나타내며 변수로 표현됩니다.

예를들어 강아지 인스턴스(객체)의 속성은 색상, 나이, 이름 등이 될 수 있습니다.

 

메서드, 멤버함수란?

- 객체는 데이터를 조작하거나 특정 작업을 수행하기 위한 메서드를 포함합니다. 함수와 비슷하지만 객체의 상태에 접근하고 조작 할 수 있습니다. 강아지 인스턴스(객체)의 메서드는 짖기, 밥먹기, 애교부리기 등이 있을 수 있습니다.

 

객체생성

Rucy, PPomi가 객체가 되는것이다. 언뜻 보면 Dog()라는 클래스를 복사한 것처럼 보이지만

다른영역에 메모리가 만들어지기 때문에 주소가 다르다.

 

생성자

- 생성자는 클래스의 인스턴스가 생성될 때 자동으로 호출되는 특별한 메서드입니다.

- 객체의 초기화를 담당하며, 객체가 생성될 때 필요한 속성을 초기화하고 설정하는 역할을 합니다.

-   __init__이라고 이름이 정해져있습니다.

생성자 형태

자동으로 실행되며 객체에 따라 다른 주소를 갖고있는 메모리가 생긴다(인스턴스 변수).

# TypeError: Dog.__init__() missing 2 required positional arguments: 'name' and 'age'

__init__은 자동 생성되므로 객체를 생성할 때 함수의 실행처럼 매겨변수의 개수를 맞춰줘야한다.

 

메서드

- 함수와 비슷한 개념이지만, 클래스 내부에 정의되어 특정 객체에 연결된 함수 입니다. 해당 클래스의 모든 객체에서 공유되며, 객체의 동작을 정의하거나 특정 작업을 수행하는데 사용됩니다.

사용자가 임의적으로 class내부의 함수를 만들어서 객체 생성 이후 객체의 메서드로 사용한다.

 

클래스 변수와 인스턴스 변수

- 클래스 변수는 메서드가 아닌 클래스 내부에 만들어진 변수이고, 인스턴스 변수는 self를 참조한 def 내부에 저장이 되는 변수입니다.

PPomi객체의 family를 폼피츠로 바꿔도 원래 Dog클래스에서 할당받은 family는 변하지 않는다는것을 알 수 있다.

사실 클래스 변수를 직접 바꿔주는건 굉장히 위험하기 때문에 사용하지 않는경우가 대다수다.

 

메서드 타입

* 인스턴스 메서드

  - 객체의 상태를 조작하거나 객체에 특정 작업을 수행하는 메서드입니다. 대부분의 클래스 내의 메서드는 인스턴스              메서드 입니다.

 

* 클래스 메서드

- 클래스 레벨에서 동작하며, 모든 인스턴스가 공유하는 메서드입니다. 클래스 메서드는 @classmethod 데코레이터를        사용하여 정의하며, 첫번째 매개변수로 cls를 사용합니다.

* 정적(static) 메서드

- 특정 클래스나 인스턴스와 관련이 없는 메서드로, 클래스 내부에 정의되어 있지만 클래스나 인스턴스와 독립적으로            호출될 수 있습니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 정의합니다.

외부함수이름 에 @ 를 붙혀서 데코레이터 

 

클로저와 데코레이터

클로저

- 클로저는 프로그래밍 언어에서 중요한 개념 중 하나로, 함수와 그 함수가 참조하는 외부 변수(또는 자유 변수) 사이의 관계를 타나냅니다.

클로저는 이처럼 외부함수가 내부함수를 반환 할 수 있는 형태입니다. mul2 = mul(2) 결과를 복사하고 내부적을 wrapper라는 함수에 m값이 적용되어 들어가고 def wrapper(n) : return 2* n 로 바뀌게 된다

그 형태에 5를집어 넣게 되어 원하는 결과값을 출력한 것을 볼 수 있다.

 

데코레이터

- 데코레이터는 파이썬에서 함수나 메서드 등의 동작을 수정하거나 확장하기 위한 강력한 도구입니다.

- 데코레이터는 함수나 메서드를 래핑하거나 감싸서 추가 기능을 제공하며, 코드 재 사용성과 가독성을 향상 시킵니다.

time은 파이썬 내장 모듈로 소요 시간을 알려줍니다.

덧셈과 곱셈을 연산하는 func 함수를 1,2로 두개를 구성한 후 elacpsed() 함수로 클로저를 사용하여 wrapper 함수를 반환하고 wrapper함수는 func함수를 실행할 수 있도록 구성한다.

로직방향을 보기위해 print문을 사용하였고 다음과 같다

허나, elapsed()함수를 또 사용하게 된다면 다른 함수를 만들고 또 deco1 = elapsed(newfunc) 처럼 생성해야할까?

이럴 때 간편하게 사용하기 위해 @(엣) 데코레이터를 사용한다

 

이처럼 새로운 함수를 생성 후 @elapsed를 사용하게 된다면 elapsed의 클로저를 정의하여 사용 할 수 있게 된다!

데코레이터는 많이 활용되므로 꼭 복습하고 잊지 말아야한다.

 

------

번외로  random 모듈을 짧게 설명드리겠습니다.

파이썬에서 모듈을 사용할 때, import (모듈명) 으로 사용합니다.

random은 0보다 크거나 같고 1보다 작은 실수를 출력하며 이를 활용해 다양한 범위의 랜덤값을 사용할 수 있습니다.

ex) 1부터 10까지 랜덤값을 뽑고싶다. -> rd.random() * 10 + 1

 

문제 1)

 

문제 2)

 

정답 코드는 댓글로 자유롭게 남겨주세요!!

 

클래스 어노테이션

'Python' 카테고리의 다른 글

Python 스페셜 Method  (0) 2024.09.30
Python 상속  (0) 2024.09.27
콜백함수와 람다함수  (2) 2024.09.26
변수의 범위(지역변수, 전역변수, ...)  (0) 2024.09.26
사용자 정의 함수(꽃)  (0) 2024.09.26