본문 바로가기
SSAFY

[수업기록] OOP : 객체지향프로그램(1)

by 주니코니 2024. 7. 24.

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) 절차 지향과 객체 지향은 대조되는 개념이 아니다

- 객체 지향으로 문법을 쓰지만 실제 내부 동작은 절차지향으로 코드를 다시 이해해서 실행함