Python

OOP 1

Disciple428 2024. 2. 1. 00:15
  • 객체 지향 프로그래밍

cf) 절차 지향 프로그래밍 → 프로그램을 ‘데이터’와 ‘절차’로 구성하는 프로그래밍 패러다임.

절차 = 순서가 중요함! 프로그램마다 정해진 절차가 중요. 데이터와 함수(절차)가 분리되어 있음. 함수 호출 흐름이 중요.

코드의 순차적인 흐름과 함수가 프로그램을 진행한다. 프로그램 초창기에는 절차 지향 프로그래밍을 많이 썼다고 함.

 

소프트웨어의 위기 → 하드웨어가 크게 발전했는데 이를 소프트웨어가 못 따라감.

절차가 강조되다보니 데이터를 중간에 재사용하지도 못하고 중간에 함수 하나가 오류나면 전체가 다 망가짐.

그래서 객체 지향 프로그래밍이 등장.

데이터와 해당 데이터를 조작하는 메서드를 하나의 객체로 묶어버림!

엥? 절차 지향에서는 데이터와 함수를 별개로 보았는데?!!

그리고 데이터는 함수의 재료일 뿐이었고 함수가 주요 주체였다!

그런데 데이터와 함수를 하나로 묶어서 관리하게 됨.

새로운 기술은 아니지만, 관점의 변화인 셈.

 

ex) 절차 지향에서는 전사도, 마법사도 공격을 하려면 똑같은 공격 함수를 사용함.

객체 지향에서는 클래스를 활용하고 각 클래스(객체) 안에 여러 메서드가 있고 그걸 사용함.

데이터와 함수 분리, 함수 호출 흐름이 중요 vs 데이터와 메서드를 하나의 객체(클래스)로 묶음.

객체 간 상호작용과 메시지 전달이 중요

 

  • 객체

클래스 : 파이썬에서 타입을 표현하는 방법, 객체를 생성하는 설계도.

 

객체 : 클래스에서 정의한 것을 토대로 메모리에 할당된 것 (속성 + 행동 으로 구성됨)

메모리 주소를 가진 것은 전부 객체임! 변수 ,함수, 클래스… 전부다 객체!

 

객체의 속성 = 변수 / 행동 = 메서드

클래스 라는 설계도로 객체를 찍어내는 것이다. (청사진, blue print)

가수 라는 클래스로 도장 찍듯 객체를 찍어내고 우리가 활용함.

 

인스턴스 = 클래스로 만든 객체

 

클래스는 타입을 표현한다. 클래스를 만든다 = 타입을 만든다

문자열 타입의 변수는 str 클래스로 만든 인스턴스

일일이 str() 함수로 문자열 타입으로 정의하지 않은 것은 절차 지향이 아니라 객체 지향이기 때문임.

 

인스턴스는 메서드를 호출할 수 있다. 클래스 안에 함수가 포함되어 있기 때문이다.

ex) ‘hello’.upper()

= 문자열.대문자로()

= 객체.행동()

= 인스턴스.메서드()

 

하나의 객체는 특정 타입의 인스턴스이다.

 

객체의 특징 :

타입 → 어떤 연산자와 조작이 가능?

속성 → 어떤 상태(데이터)를 가지는가?

조작법 → 어떤 행위(함수)를 할 수 있는가?

 

파이썬에서의 객체는 속성 + 기능 의 결합!

 

지금까지 변수명 같은건 snake case 를 썼는데 클래스는 파스칼 케이스(=camel case)를 사용해서 명명한다.

일종의 스타일 가이드임. 그래서 클래스는 언더 바 안 쓰고 대문자로 시작한다.

클래스는 소괄호 생략할 수 있다. 함수는 무조건 넣어야 하지만!

 

클래스는 병사를 생산하고 병사들은 열심히 나가서 메서드와 속성 값을 진행함.

클래스는 자기가 나서는게 아니라 병사들이 쓸 수 있는 메서드를 제공함.

메서드가 클래스에 속해있으니 함수의 재사용성이 크게 증가함.

그냥 클래스로 인스턴스 만들면 다 메서드를 쓸 수 있잖음!

 

독립적인 이름공간을 가지는 이점

각 인스턴스는 독립적인 개체임!

수많은 객체들이 일해도 서로 영향을 주지 않고 각자 독립적으로 일할 수 있다!

절차 지향에서처럼 순서가 있다는 것은 서로 영향을 줄 수밖에 없다는 것이기도 한데, 유지 보수 입장에서 굉장히 복잡함.

 

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

인스턴스 변수는 독립적으로 존재한다. 없으면 클래스 변수 따라간다~

 

  • 메서드

1. 인스턴스 메서드 : 인스턴스에서 호출하는 메서드임. 인스턴스의 상태를 조작하거나 동작을 수행함.

가지고 있는 것은 클래스지만 이를 활용하는 것은 인스턴스다. 반드시 첫 번째 매개변수로 인스턴스 자신(self)을 전달받음.

예외 없다! 무조건 첫 번째 인자로 자기자신을 받아야 동작이 된다!

함수 정의에서 self 말고 다른 매개변수 명을 지정해도 상관은 없지만, self를 보통 많이 쓴다고 함!

그리고 변수명을 뭘로 해도 자기자신을 첫 번째 인자로 넣어야 하는 것은 동일!

생성자 메서드 → 인스턴스 만들 때마다 자동으로 호출됨.

따로 정의해줘서 초기 설정을 부여해도 되고 정의하지 않아도 내부적으로 알아서 호출함.

 

2. 클래스 메서드 : 클래스를 컨트롤 함. 데코레이터를 사용함. 어떤 함수를 꾸며줌.

호출 시 첫 번째 인자로 호출하는 클래스(=cls)가 전달됨.

 

3. 정적 메서드 (=스태틱 메서드) : 클래스, 인스턴스와 상관없이 독립적으로 동작하는 메서드

이전 두개는 모두 첫 번째 인자로 자기자신을 받았는데, 인스턴스-클래스와 관련없는 일반함수가 필요할 때

독립적으로 사용하기 위한 그런 메서드가 바로 정적 메서드다. 얘도 데코레이터를 사용함.

일반 함수이기 때문에 호출 시 필수적으로 작성할 매개변수가 없다. 기능적으로 일반함수가 필요할 때 사용한다.

호출은 클래스가 한다. →  클래스 . 스태틱 메서드(인스턴스 변수)

즉, 클래스는 2개의 메서드를 호출한다.