240724 파이썬반
1. 객체 지향 프로그램
1) 절차 지향이란?
- 절차(순서)와 데이터(부가적) 프로그램을 구성하는 프로그래밍 방식
- 함수 호출 흐름이 중요(순서가 있기에, 일부만 재사용 어려움) -> 결과물 중시
- 한계 : 하드웨어의 발전으로 소프트웨어 대응 어려워짐
2) 객체 지향이 그래 등장함
- 데이터와 해당 데이터를 조작하는 메서드 중심이 되는 프로그래밍 방식
- 즉, 데이터를 하나의 객체(클래스)로 바라봄 -> 행동 부여
- 객체 간 상호작용과 데이터 전달 중요해짐
3) 객체
- 파이썬에서 타입을 표현하는 방법
- 객체(클래스) = 데이터 + 메서드
- 클래스에서 정의한 것을 토대로 메모리에 할당된 것
- 속성(변수)과 행동(메서드)으로 구성된 모든 것
4) 인스턴스
- 예를 들어 가수(클래스), 아이유, bts..(객체)
- 아이유는 가수의 인스턴스다, 아이유는 객체다.
name = 'Junho' #str(Junho)의 결과물, name은 str 클래스의 인스턴스이다.
print(type(name)) # <class 'str'>
[1,2,3,], [] , ['hi']
#리스트 타입(클래스)의 객체(인스턴스)
[1,2,3].sort()
리스트.정렬해()
객체.행동()
인스턴스.메서드() #oop 관점
즉,
(1) 하나의 객체(object)는 특정 타입의 인스턴스(instance)이다.
(2) 객체(object) = 속성(attribute, 변수) + 기능(Method)
2. 클래스
1) 클래스
- 객체를 생성하기 위한 설계도(청사진)
- 클래스 이름은 스네이크 케이스가 아닌 파스칼 케이스(Pascal Case) 방식으로 작성
class MyClass:
pass
class Person:
pass
iu = Person() # 인스턴스 생성 및 활용
iu.메서드() # 클래스가 가진 여러 기능들, 메서드 호출
iu.attribute #속성(변수) 접근
2) 클래스 구조
(1) init : 프로그래밍에서의 초기화 : 생성, 시작을 의미
- 클래스에서의 init => 객체 생성 때 (프로그래밍에서) 자동 호출되는 특별한 메서드
- __init__ : 객체 초기화 담당
- 생성자 메서드 : 생성자 함수를 통해 인스턴스를 생성하고 필요한 초기값을 설정
(2) 인스턴스 변수
- 인스턴스(객체)마다 별도로 유지되는 변수
(3) 클래스 변수
- 메서드에 속해있지 않고 클래스 내부에 선언된 변수
- 클래스로 생성된 모든 인스턴스들이 공유하는 변수
(4) 인스턴스 메서드
- 각각의 인스턴스에서 호출할 수 있는 메서드
# 클래스 정의
class Person:
#속성
blood_color = 'red'
#메서드
def __init__(self,name):
self.name = name
def singing(self):
return f'{self.name}이 노래합니다.'
# 인스턴스 생성
singer1 = Person('iu')
# (인스턴스) 메서드 호출
print(singer1.singing()) #iu이 노래합니다.
# 속성(변수) 접근 #객체 모두의
print(singer1.blood_color) #red
# 인스턴스 속성(변수)# iu만의
print(singer1.name) #iu
3) 클래스 변수와 인스턴스 변수
class.class_variable로 클래스 변수 참조하기
class Circle:
pi = 3.14
def __init__(self, r):
self.r = r #인스턴스 변수
c1 = Circle(5)
c2 = Circle(10)
print(c1.r)
print(c2.r)
c1.pi = 100 # c1의 인스턴스 변수 pi를 생성 # 실제값 변경 불가
print(Circle.pi) #3.14 #올바른 사용법
print(c1.pi) #100 #본인의 인스턴스 변수 pi를 생성
print(c2.pi) # 3.14 #본인을 만든 클래스 변수를 참조
3. 메서드
1) 메서드 종류
- 인스턴스 메서드 : 클래스 안에 있는 함수, 반드시 첫 번째 매개변수로 인스턴스 자신(self == 위치인자)을 전달받음, 인스턴스 변수 참조하거나 변경할 때, 클래스 변수 건들 수 있음
- 클래스 메서드 : 클래스 변수를 조작하거나 클래스 레벨의 동작을 수행, 인스턴스 상태 절대 건들지 않음
- 정적 메서드 : 인스턴스던 클래스던 절대 건들지 않음
2) self 동작 원리
- 예를 들어
'hi'.upper() # 실제 코드 작동 방식은 아래와 같음
str.upper('hi') #근데 이건 절차지향방식이라 위로 작성함
즉, 객체 지향 방식의 메서드로 호출하는 표현(단축형 표현이다~)
3) 생성자 메서드
- 자동호출
- self 매개변수 반드시 쓰고 시작
예제
class Person:
def __init__(self, name):
self.name = name
# self.ssafy = name #이래도 가능 #근데 굳이 다르게 할 필요가 없음
#왼쪽 name은 인스턴스 변수 name
# 오른쪽 name : 함수 매개변수 이름
print('인스턴스가 생성되었습니다.')
def greeting(self):
print(f'안녕하세요 {self.name}')
person1 = Person('지민') #인스턴스가 생성되었습니다.
person1.greeting() #안녕하세요 지민
Person.greeting('person1')
4) 클래스 메서드
- @classmethod : 데코레이터를 사용하여 정의
- 데코레이터 : 함수를 꾸미는 함수 == 기능을 추가
- 원본은 유지한 채로 기능을 추가
- 호출시, 첫번째 인자로 해당 메서드를 호출하는 클래스 자기자신이 전달됨( 'cls' )
- 클래스 메서드 : 클래스 변수를 조작하거나 클래스 레벨의 동작을 수행
class Person:
count = 0
def __init__(self, name):
self.name = name
Person.count += 1
@classmethod
def number_of_population(cls):
print(f'인구 수는 {cls.count}입니다.')
person1 = Person('iu')
person2 = Person('BTS')
Person.number_of_population() #cls 입력안해도 자동으로 넘어감!!
#인구 수는 2입니다.
5) 스태틱(정적) 메서드
- 클래스와 인스턴스와 상관없이 단독으로 동작하는 메서드
- @staticmethod 데코레이터를 사용하여 정의
- 호출 시 필수적으로 작성해야할 매개변수가 없음
- 그렇기에 객체 상태나 클래스 상태를 수정못함, 단지 기능(행동)만을 위한 메서드로 사용
class StringUtils:
def __init__(self) -> None:
pass # 작성하지 않더라도 내부에서 실행해주지만.. 쓰는 것을 권장함~
#클래스가 호출함
#굳이 인스턴스 안만들어도됨!!
@staticmethod
def reverse_string(string):
return string[::-1]
@staticmethod
def captialize_string(string):
return string.capitalize()
text = 'hello, world'
StringUtils.reverse_string(text) #'dlrow ,olleh'
6) 메서드 정리
- 인스턴스 메서드 : 인스턴스 상태를 변경하거나 해당 인스턴스의 특정 동작 수행(self 매개변수 필요)
- 클래스 메서드 : @ 인스턴스의 상태에 의존하지 않는 기능을 정의, 클래스 변수를 조작하거나 클래스 레벨의 동작을 수행(cls 매개변수 필요)
- 스태틱 메서드 : @ 클래스 및 인스턴스와 관련이 없는 일반적인 기능을 수행(매개변수 불필요)
- 파이썬은 규율이 강한 언어가 아니다.. 그러나 이건 약속~해줘~
- 클래스가 사용해야 할 것
(1) 클래스 메서드
(2) 스태틱 메서드
- 인스턴스가 사용해야 할 것
(1) 인스턴스 메서드
7) 클래스와 인스턴스 간 이름 공간
- 클래스와 인스턴스 모두 서로의 존재를 모른다
- 예를 들어 가수가 class라면 iu와 bts라는 인스턴스끼리는 서로의 존재를 모름(다른 이름 공간)
- 독립적 메모리 공간의 장점 : 서로 간 상호작용에 영향을 주지 않게, 재사용 가능하도록, 유지보수성
8) 매직 메서드(magic method == __)
- 개발자가 호출x, 특정 시점에 자동 호출
- ex. __str__(self) #내장함수 print에 의해 호출되어 객체 출력을 문자열 표현으로 변경
9) 데코레이터
- 다른 함수의 코드를 유지한 채로 수정하거나 확장하기 위해 사용되는 함수
10) 절차 지향과 객체 지향은 대조되는 개념이 아니다
- 객체 지향으로 문법을 쓰지만 실제 내부 동작은 절차지향으로 코드를 다시 이해해서 실행함
'SSAFY' 카테고리의 다른 글
[관통PJT] 2주차 : 데이터 사이언스 기초(numpy, pandas) (1) | 2024.07.26 |
---|---|
[수업기록] OOP : 객제지향프로그램(2), 에러와 예외 (2) | 2024.07.25 |
[수업기록] 데이터 구조(2) (3) | 2024.07.23 |
[수업기록] 데이터 구조(1) (0) | 2024.07.22 |
[수업복습] git repo (0) | 2024.07.20 |