코린이 성장일기

[멋사AI스쿨8기] TIL : 파이썬 문법 4일차(class) 본문

멋사 AI스쿨8기

[멋사AI스쿨8기] TIL : 파이썬 문법 4일차(class)

JJouni 2023. 1. 5. 17:17

오늘은 어제의 함수보다 좀 더 복잡한 class에 대해서 배웠다.

오늘도 여전히 Today I learned를 적어보자.

 


 

클래스 Class

  • 변수, 함수를 묶어서 코드를 작성하는 방법
  • 객체지향을 구현하는 문법
    • 객체지향? 실제세계를 모델링하여 프로그램을 개발하는 개발 방법론
      • 옛날부터 프로그램을 개발하려면 혼자서 개발 어려움, 여러 명이 개발해야 함.
      • 그러면 어떻게 하면 효율적으로 여러 명이 협업해서 개발할 수 있을까? > 객체지향 방법론
      • 이를 구현한 문법이 class다.
      • 파이썬은 완벽한 객체지향 언어라고 하기엔 아쉬움이 있다. java가 가장 완벽하고 깔끔한 객체지향 언어이다.
      • 파이썬도 class를 활용해서 객체지향 방법론을 적용해서 개발할 수 있다.
    • 협업을 용이하게 하기 위한 것
  • 클래스 사용법
    • 클래스 선언(코드작성) > 객체생성(메모리사용) > 메서드실행(코드실행)
      • 메서드 : 클래스 안에서 선언된 함수
      • 함수 : 클래스 밖에서 선언된 함수
    • 클래스는 빵 틀, 혹은 설계도라고 생각하면 이해하기가 쉽다.
      • 클래스 선언 (설계도작성) : 기능을 직접 사용할 수 없고, 어떻게 진행되는지 절차 보여줌
      • 객체생성(제품생산) : 철이나 등등을 사용해서 제품 만들기
      • 메서드실행(기능사용) : 정의해둔 알고리즘(절차)를 컴퓨터자원(CPU)를 사용해서 원하는 목적을 달성
  • 식별자 컨벤션
    • 변수, 함수 : snake_case
    • 클래스 : PascalCase, UpperCamelCase

 

 

그렇다면, 한 번 사용해보자.

# 클래스선언 : 코드작성
# 두개의 숫자와 덧셈기능, 뺄셈기능하는 것으로 만들어 볼 예정
# 계산기 설계 : Calculator : number1, number2, plus(), minus()
class Calculator:

    number1, number2 = 1, 2

    def plus(self):
        return self.number1 + self.number2

    def minus(self):
        return self.number1 - self.number2


# 객체생성 : 메모리사용
# 앞에 스네이크면 함수호출, 파스칼케이스면 클래스로 객체를 만들어주는 문법이구나 이해하면 됨
# calc에 객체를 생성하면 number1, number2, plus(), minus() 변수 총 4개가 들어가게 됨
calc1 = Calculator()
calc2 = Calculator()


# dir() : 객체에 들어있는 변수를 출력
[var for var in dir(calc1) if var[0] != '_']

 

 

여기서 self는 뭘까?

여기서 self는 객체자신이다. 클래스를 쓰는 이유는 객체를 생성해주기 위함이고, 각 객체가 똑같은 함수를 사용할 수 있기에 이를 구별하기 위해 self를 써주는 것이다. 

 

위의 코드에서, calc1.plus() : self.number1 + self.number2 : self == calc1

  • 즉, self.number1 + self.number2 이 결국 calc1.number1 + calc1.number2 가 된다.
  • calc2.plus() 에서는 calc2.number1 + calc2.number2

즉, 실행되는 메서드의 객체가 어떤 객체이냐에 따라 객체가 가진 변수, 즉 재료가 달라지기 떄문에 메서드 실행결과가 달라진다.

 

 

이제 class를 활용하여 은행계좌를 만드는 코드를 한번 짜보자.

class Account:

	balance = 0
    
    def insert(self, amount):
    	self.balance += amount
        
    def withdraw(self, amount):
    	if self.balance >= amount:
        	self.balance - amount
        else:
        	print(f'잔액이 {amount - self.balance}원 부족합니다')

 

 

그런데, balance가 초기값으로 세팅이 안되어 있다면 불량 객체가 만들어질 수 있다? 

지금 코드는 짧으니까 확인이 가능하지만 초기값이 많아지거나 코드가 길어지면 헷갈릴 수 있다. 이때 우리는 생성자를 사용한다. 

__init__()

이러한 형태의 메소드를 special methods라고 한다. 

 

오늘은 생성자, 초기화 메서드를 살펴보고자 한다.

설명은 아래와 같다.

  • 객체를 생성할 때 실행되는 메서드
  • 변수의 초기값을 설정할 때 주로 사용
  • 얘도 함수이기 때문에 초기값을 설정할 수 있다. 매서드에서 사용하는 변수는 초기에 값을 입력해주도록 설계 필요
  • 불량 객체(메서드 사용 x)가 만들어질 확률을 줄여줌

위의 은행계좌 만들기에서 활용해보자

# 클래스생성 : 설계도작성
class Account:

    def __init__(self, balance):  # 초기값 설정이 가능하다 balance=10000
        self.balance = balance

    def insert(self, amount):
        self.balance += amount
    
    def withdraw(self, amount):
        if self.balance >= amount:
            self.balance -= amount
        else:
            print(f'잔액이 {amount - self.balance}원 부족합니다.')

다른 special methods는 따로 공부해보자.

 

 

객체지향 방법에서 중요한 개념인 상속에 대해서 알아보자.

상속은 다른 클래스의 변수(매서드)를 가져와서 사용하는 방법으로, 기능이 점점 추가되는 핸드폰과 같은 것이다. 아이폰1, 아이폰2, 아이폰3은 개발될수록 기존 기능에 새 기능이 추가되는 것이다. 그렇기 때문에 코드로 구현하면 기존 기능이 계속 반복되게 되므로, 이런 경우 상속을 사용하면 손 쉽게 코드를 짤 수 있다.

class iPhone1:
    def call(self):
        print('calling!')

class iPhone2(iPhone1):
    def send_msg(self):
        print('send_msg!')

class iPhone3(iPhone2):
    def internet(self):
        print('internet!')

 

특별히, 파이썬 상속은 '다중상속'이 가능하다.

# 다중상속 , 클래스 3개 생성
class Human:
    def walk(self):
        print('walking!')

class Korean:
    def eat(self):
        print('eat kimchi!')

class Indian:
    def eat(self):
        print('eat curry!')

# 하나의 클래스가 2개의 클래스를 상속 받음
# 내부적으로는 Human을 Korean이 받고, Human을 받은 Korean이 Jin으로 상속되는 것
class Jin(Korean, Human):
    def skill(self):    # Jin은 스킬을 가지고 있음 
        print('coding') # coding하는 스킬

jin = Jin()
show_vars(jin)  # 위에서 선언한 함수
# >>> ['eat', 'skill', 'walk']

class Anchel(Indian, Human):
    def skill(self):    
        print('speak english!')

anchel = Anchel()
anchel.eat()
jin.eat()

# >> eat curry! 
#.   eat kimchi!

 

오늘 클래스에 대한 내용은 여기까지 배웠다. 클래스에 대해서는 내일 더 배우기로 하였는데, 아직 개념이 익숙하지 않다.. 컴퓨터의 언어를 이해하려면 시간이 좀 더 필요하겠다..

 

추가적으로 데코레이터과 회귀분석에 대해 배웠는데, 오늘은 데코레이션까지 작성하려고 한다. 

클래스 익히다가 시간이 다 가버렸다ㅜㅜ

 

 

데코레이터 decorator

  • 함수에서 중복되는 코드를 빼서 데코레이터 함수로 만들어 코드를 작성하는 방법
  • 원래 있던 함수에 새로운 기능을 추가한 함수로 변경할때 주로 사용함.
def func1():
	print('code1')
	print('code2')
	print('code3')

def func2():
	print('code1')
	print('code4')
	print('code3')
    
    
    
# 이 함수들에서 반복되는 코드를 데코레이터를 활용해 변경해보자.
# 위의 함수와 같은 값이 출력된다.

def deco(func):                     #func을 파라미터로 받고
  def wrapper(*args, **kwargs):     # 지역함수를 선언한다
      print('code1')
      func()
      print('code3')
  return wrapper                    # 지역에서 선언된 것을 전역으로 보낸다


# deco 함수의 파라미터 func에 func1이 들어감
# func1 함수는 deco 함수의 return 함수인 wrapper 함수로 변경

@deco
def func1():
    print('code2')

@deco
def func2():
    print('code4')

func1()
func2()

함수 위에 @표시와 함께 사용할 수 있다.

데코레이터의 활용으로 timer 데코레이터(결과 값이 나오는 시간체크), 패스워드를 맞춰야 함수의 실행이 가능하도록 하는 데코레이터를 작성해볼 수 있다.

 

 


TIL 소감

오늘은 클래스에 대해서 배우면서 생소한 개념이었다. 예전에 C를 배웠을 때는 함수만으로 모든 것을 구현했던 것 같은데, 함수 위의 함수 같은 느낌.. 친숙해지려면 시간이 좀 필요할 것 같다. 클래스를 선언하면서 든 생각은 강사님께서 말씀해주신대로 정말 실제세계를 모델링하는 느낌을 받았다. 특히 이름들을 선언해줄 때 그랬다. 알고리즘만 잘 훈련하면 정말 편리한 언어로 사용될 것 같다.

그리고 AI스쿨답게 상관계수분석방법을 코딩으로 구현하는 것을 보는데 신세계였다. 수학이 코딩이 되는 신기한 일. 재밌다. 근데 어렵다. 

열공열공..