Python_기초문법8

Jingi·2024년 1월 24일

Python

목록 보기
8/32
post-thumbnail

1. 객체 지향 프로그래밍


1. 절차 지향 프로그래밍

  • 프로그램을 '데이터'와 '절차'로 구성하는 방식의 프로그래밍 패러다임

  • 특징

    • 데이터와 함수가 분리되어 있으며, 호출의 흐림이 중요
    • 코드의 순차적인 흐름과 함수 호출에 의해 프로그램이 진행
    • 컴퓨터의 작업 처리 방식과 유사하기 떄문에 객체 지향 언어를 사용하는 것에 비해 더 빨리 처리되어 시간적으로 유리
    • 실제로 실행되는 내용이 무엇인가가 중요
    • 하드웨어의 발전으로 컴퓨터 용량과 문제의 복잡성이 급격히 증가함에 따라 위기가 왔다.
  • 장점

    • 실행속도가 빠르다
  • 단점

    • 어려운 유지보수와 디버깅
    • 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려움

2. 객체 지향 프로그래밍

  • 데이터와 해당 데이터를 조작하는 메서드를 하나의 객체로 묶어 관리하는 방식의 프로그래밍 패러다임


[출처]https://usefultoknow.tistory.com/entry/%EC%A0%88%EC%B0%A8%EC%A7%80%ED%96%A5Procedural-Programming-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5Object-Oriented-Programming-%EC%9E%A5%EB%8B%A8%EC%A0%90-%EB%B0%8F-%EC%B0%A8%EC%9D%B4%EC%A0%90

절차지향객체지향
데이터와 해당데이터를 처리하는 함수(절차)가 분리
함수 호출의 흐름이 중요
데이터와 해당 데이터를 처리하는 메서드(메시지)를 하나의 객체로 묶음
객체간 상호작용과 메시지 전달이 중요

2. 객체


1. 클래스

  • 파이썬에서 타입을 표현하는 방법
  • 객체를 생성하기 위한 설계도
  • 데이터와 기능을 함께 묶는 방법을 제공
  • 변수(정보) + 메서드(행동)

2. 객체

  • 클래스에서 정의한 것을 토대로 메모리에 할당된 것
  • 속성행동으로 구성된 모든 것

3. 클래스와 객체

  • 클래스로 만든 객체를 인스턴스 라고도 함
  • 클래스(가수)와 객체(아이유)
  • 클래스를 만든다 == 타입을 만든다
  • 변수 name의 타입은 str 클래스다.
    • 변수 name은 str 클래스의 인스턴스이다
    • 데이터 타입은 모두 클래스이다.
      name = 'Alice'
      print(type(name)) # <class 'str'>
  • 문자열 타입의 변수는 str 클래스로 만든 인스턴스다.
  • 'hello', '파이썬' -> 문자열 타입(클래스)의 객체(인스턴스)
  • [1, 2, 3], [1] -> 리스트 타입(클래스)의 객체(인스턴스)
    `hello`.upper()
     문자열.대문자()
     객체.행동()
     인스턴스.메서드()
    [1, 2, 3].sort()
      리스트.정렬해()
      객체.행동()
      인스턴스.메서드()
  • 하나의 객체는 특정 타입의 인스턴스이다.

4. 객체의 특징

  • 타입 : 어던 연산자(operator)와 조작(method)이 가능한가?
  • 속성 : 어떤 상태(데이터)를 가지는가?
  • 조작접 : 어떤 행위(함수)를 할 수 있는가?

**객체(Object) = 속성(Attribute) + 기능(Method)**


3. 클래스


1. 파이썬에서 타입을 표현하는 방법

  • 객체를 생성하기 위한 설계도
  • 데이터와 기능을 함께 묶는 방법을 제공

2. 클래스 구조

# 클래스 정의 _ 소괄호 생략 가능
class Person:
  pass

# 인스턴스 생성
iu = Person()

# 메서드 호출
iu.메서드()

# 속성(변수) 접근
iu.attribute
  • 클래스(제공의 역할)는 병사를 생산 -> 그 병사들이 메서드 호출 및 속성 값 사용
# 클래스 정의
class Person:
  # 속성(클래스 안에 속해있는 변수)
  blood_color = 'red'
  # __ __ : 개발자가 직접 호출하는 것이 아닌 자동 호출 되는 것
  # 보통 객체를 생성할 때 자동으로 호출
  # 초기화를 담당
  def __init__(self, name):
    self.name = name
  
  def singing(self):
    return f'{self.name}가 노래합니다.'

# 인스턴스 생성
singer1 = Person('BTS')
singer1 = Person('Blackpink')

# 메서드 호출
print(singer1.singing()) # BTS가 노래합니다.
print(singer1.singing()) # Blackpink가 노래합니다.

# 속성(변수) 접근
print(singer1.blood_color) # red
print(singer1.blood_color) # red

3. 생성자 함수

class Person:
  def __init__(self, name):
  self.name = name

singer1 = Person('BTS')
  • 객체를 생성할 때 자동으로 호출되는 특별한 메서드
  • init이라는 이름의 메서드로 정의되며, 객체의 초기화를 담당
  • 생성자 함수를 통해 인스턴스를 생성하고 필요한 초기값을 설정

4. 인스턴스 변수

class Person:
  def __init__(self, name):
    # 인스턴스 변수
    self.name = name

singer1 = Person('BTS')
  • 인스턴스(객체) 마다 별도로 유지되는 변수
  • 인스턴스마다 독립적인 값을 가지며, 인스턴스가 생성될 때마다 초기화 됨

5.클래스 변수

class Person:
  # 클래스 변수
  blood_color = 'red'
  def __init__(self, name):
    # 인스턴스 변수
    self.name = name

singer1 = Person('BTS')
  • 클래스 내부에 선언된 변수
  • 클래스로 생성된 모든 인스턴스들이 공유하는 변수

6. 인스턴스 메서드

class Person:
  blood_color = 'red'
  def __init__(self, name):
    self.name = name

singer1 = Person('BTS')
  • 각각의 인스턴스에서 호출할 수 있는 메서드
  • 인스턴스 변수에 접근하고 수정하는 등의 작업을 수행

7. 인스턴스와 클래스 간의 이름공간(namespace)

  • 클래스를 정의하면, 클래스와 해당하는 이름 공간 생성
  • 인스턴스를 만들면 인스턴스 객체가 생성되고 독립적인 이름 공간 생성
  • 인스턴스에서 특정 속성에 접근하면, 인스턴스 -> 클래스 순으로 탐색
class Person:
  name = 'unknown'
  def talk(self):
      print(self.name)

p1 = Person()
p1.talk()  # unknown

# p2 인스턴스 변수 설정 전/후
p2 = Person()
p2.talk() # unknown
p2.name = 'kim'
p2.talk() # kim

print(Person.name) # unknown
print(p1.name) # unknown
print(p2.name) # kim
  • p1은 인스턴스 변수가 정의되어 있지 않아 클래스 변수(unkwnown)가 출력됨
  • p2는 인스턴스 변수가 정의되어 인스턴스 변수(kim)가 출력됨
  • Person 클래스의 값이 kim으로 변경된 것이 아닌
    p2 인스턴스의 이름공간에 name이 kim으로 저장됨.

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

  • 각 인스턴스는 독립적인 메모리 공간을 가지며, 클래스와 다른 인스턴스 간에는 서로의 데이터나 상태에 직접적인 접근이 불가
  • 객체 지향 프로그래밍의 중요한 특성 중 하나로, 클래스와 인스턴스를 모듈화하고 각각의 객체가 독립적으로 동작하도록 보장
  • 이를 통해 클래스와 인스턴스는 다른 객체들과의 상호작요에서 서로 충돌이나 영향을 주지 않으면서 독립적으로 동작할 수 있음
    • 코드의 가독성, 유지보수성, 재사용성을 높이는데 도움을 줌

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

  • 클래스 변수를 변경할 때는 항상 클래스.클래스변수 형식으로 변경
class Circle():
  pi = 3.14
  def __init__(self, r):
    self.r = r
    
c1 = Circle(5)
c2 = Circle(10)

# c2 인스턴스 변수 pi를 할당
c2.pi = 5

print(Circle.pi)  # 3.14 (클래스 변수)
print(c1.pi) # 3.14 (클래스 변수)
print(c2.pi) # 5  (새로운 인스턴스 변수)

# 클래스 변수 변경
Circle.pi = 5 

print(Circle.pi)  # 5 (클래스 변수)
print(c1.pi) # 5 (클래스 변수)
print(c2.pi) # 5  (새로운 인스턴스 변수)

4. 메서드


1. 메서드 종류

  • 인스턴스 메서드
  • 클래스 메서드
  • 정적 메서드

2. 인스턴스 메서드

  • 클래스로부터 생성된 각 인스턴스에서 호출할 수 있는 메서드
    • 인스턴스의 상태를 조작하거나 동작을 수행

1) 인스턴스 메서드 구조

  • 클래스 내부에 정의되는 메서드의 기본
  • 반드시 첫 번째 매개변수로 인스턴스 자신(self)을 전달받음
  • self 외의 이름도 가능하지만 파이썬 개발자들의 룰로 무조건 self를 사용
class MyClass:
  # 무조건 self를 사용해야 작동
  def instance_methon(self,arg1,...):
    pass

2) self 동작 원리

  • upper method를 사용해 문자열 'hello'를 대문자로 변경
'hello'.upper()
  • 하지만 실제 파이썬 내부 동작
str.upper('hello')
  • str 클래스가 upper 메서드를 호출했고, 그 첫번째 인자로 문자열 인스턴스가 들어간 것

    • 인스턴스 메서드의 첫번째 매개변수가 반드시 인스턴스 자기 자신인 이유
  • 'hello'.upper() 은 str.upper('hello')를 객체 지향 방식의 메서드로 호출하는 표현이다.

  • 'hello'라는 문자열 객체가 단순히 어딘가의 함수로 들어가는 인자가 아닌 객체 스스로 메서드를 호출하여 코드를 동작하는 객체 지향적 표현

3. 생성자 메서드

  • 인스턴스 객체가 생성될 때 자동으로 호출되는 메서드
    • 인스턴스 변수들의 초기값을 설정
      -생성자 메서드 구조
# 클래스 정의
class Person:
    def __init__(self, name):
        print(f'인스턴스가 생성되었습니다. {name}')
  
person1 = Person(' ') # 인스턴스가 생성되었습니다.
person2 = Person('지민') # 인스턴스가 생성되었습니다. 지민

4. 클래스 메서드

  • 클래스가 호출하는 메서드
    • 클래스 변수를 조작하거나 클래스 레벨의 동작을 수행
  • 클래스 메서드 구조
    • @classmethon 데코레이터를 사용하여 정의
    • 호출 시, 첫번째 인자로 호출하는 클래스(cls)가 전달됨
class Myclass:
  # @classmethod이 기호가 없으면 클래스 메서드가 아니다.
  @classmethod
  def class_method(cls, arg1, ....):
    pass
  • 예시
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('BTS')
person2 = Person('Blackpink')

Person.number_of_population() # 인구수는 2입니다.

5. 스태틱(정적) 메서드

  • 독립적으로 동작하는 메서드
    • 주로 클래스와 관련이 있지만 상호작용이 필요하지 않은 경우에 사용
  • 스태틱 메서드 구조
    • @staticmethod 데코레이터를 사용하여 정의
    • 호출 시 필수적으로 작성해야 할 매개변수가 없음
    • 즉, 객체 상태나 클래스 상태를 수정할수 없으며 단지, 기능만을 위한 메서드로 사용
class Myclass:
  @staticmethod
  def static_method(arg1, ...):
    pass
  • 예시
class Stringut:
    @staticmethod
    def reverse_string(string):
        return string[::-1]
    
    @staticmethod
    def capitalize_string(string):
        return string.capitalize()
    
text = 'hello, world!'

reverse_text = Stringut.reverse_string(text)
print(reverse_text) # !dlrow ,olleh

capitalized_text = Stringut.capitalize_string(text)
print(capitalized_text) #hello, world!

5. 메서드 정리

  • 인스턴스 메서드
    -인스턴스의 상태를 변경하거나, 해당 인스턴스의 특정 동작을 수행

  • 클래스 메서드

    • 인스턴스의 상태에 의존하지 않는 기능을 정의
    • 클래스 변수를 조작하거나 클래스 레벨의 동작을 수행
  • 스태틱 메서드

    • 클래스 및 인스턴스와 관련이 없는 일반적인 기능을 수행

1. 각자의 역할

  • 클래스가 사용해야 할 것

    • 클래스 메서드
    • 스태틱 메서드
  • 인스턴스가 사용해야 할 것

    • 인스턴스 메서드

2. 클래스가 할 수 있는 것

  • 클래스는 모든 메서드를 호출 할 수 있음
  • But, 클래스는 클래스 메서드와 스태틱 메서드만 사용하도록 한다.

3. 인스턴스가 할 수 있는 것

  • 인스턴슨느 모든 메서드를 호출 할 수 있음
  • But, 인스턴스는 인스턴스 메서드만 사용하도록 한다.

절차 지향과 객체 지향은 대조되는 개념은 아니다.

  • 객체 지향은 기존 절차 지향을 기반으로 두고 보완하기 위해 객체라는 개념을 도입해 상속, 코드 재사용성, 유지보수성 등의 이점을 가지는 패러다임
profile
데이터 분석에서 백엔드까지...

0개의 댓글