본문 바로가기

Python

주식 알고리즘 만들기 - 5.1) 클래스

반응형

2022.10.09 - [Python] - 주식 알고리즘 만들기 - 4. 함수와 모듈 (모듈)

 

주식 알고리즘 만들기 - 4. 함수와 모듈 (모듈)

2022.10.09 - [Python] - 주식 알고리즘 만들기 - 4. 함수와 모듈 (함수) 주식 알고리즘 만들기 - 4. 함수와 모듈 (함수) 2022.10.09 - [Python] - 주식 알고리즘 만들기 - 3. 제어문 (연습문제) 출처 : 2) 반환값..

jiain.tistory.com

드디어 클래스를 배우는 시간이 왔습니다. 증권사(대신증권, 이베스트증권, 키움증권) API를 사용하려면 반드시 클래스라는 개념을 잘 알아야 하기 때문이죠. 왜냐하면 국내 증권사에서 제공하는 API가 대부분 클래스를 이용한 객체지향 프로그래밍 방식으로 개발됐기 때문입니다. 

 

자, 이제 주식 트레이더를 위해서 주식정보를 제공하는 프로그램을 만든다고 생각해 봅시다. 

주식에 필요한 주식정보(이름, 전일가, 현재가, 날짜)를 저장해야합니다.

포트폴리오에 엔씨소프트가 있으니 2022.10.7 기준으로 한 번 해보도록 하겠습니다.

 

먼저, 주식 정보를 받아올 수 있는 함수를 만들겠습니다.

def stock_impo(name, pre_price, cur_price, date ):
        print("-------------------------")
        print("종목 : %s" % name)
        print("전일가: %s" % pre_price)
        print("현재가: %s" % cur_price)
        print("날짜: %s" % date)
        print("-------------------------")

 

이제 데이터를 입력해보도록 하겠습니다.

 

name = "엔씨소프트"
pre_price = 350500
cur_price = 349000
date = '2022-10-07'

stock_impo(name, pre_price, cur_price, date)

-------------------------
종목 : 엔씨소프트
전일가: 350500
현재가: 349000
날짜: 2022-10-07
-------------------------

자 여기서 우리는 의문이 생기기 시작하죠. name2, pre_price2 로 다른 종목을 입력해서 저장해야하는데 종목 수가 몇천개가 되다보니 이걸 언제 다 입력할까라는 두려움이 생기기 시작합니다. 단순 반복작업을 이렇게 힘들게 계속할 필요가 있을까요? 아무래도 이것이 클래스가 필요한 이유가 아닐까요?

 

1) 클래스의 기초

 

절차지향 프로그래밍과 객체지향 프로그램의 차이점에 대해서 알아봅시다. 

 

데이터와 데이터를 처리하는 함수가 분리돼 있고 함수를 순차적으로 호출함으로써 데이터를 조작하는 프로그래밍 방식을 절차지향 프로그래밍이라고 합니다.

 

절차지향 프로그래밍 방식과 달리 객체지향 프로그래밍은 객체를 정의하는 것에서 시작합니다. 앞서 예시로 사용한 주식정보를 통해 객체지향 프로그래밍에서 말하는 객체라는 개념을 배워봅시다.

 

새로운객체를 만든다는 건 우리가 앞서서 얻은 데이터와 함수를 합쳐서 객체를 만드는 것입니다.

 

구조물 (데이터)
현대공장(함수)

 

소나타(객체)

즉, 자동차 본체 구조 , 외부구조를 만드는 함수(현대차 공장)에 넣어서 완제품(객체)를 제작하는 것입니다.

본체구조 외부구조가 무엇인가에 따라서 우리는 소나타(객체), 그랜져(객체), 산타페(객체)가 만들어지는 겁니다.

이해가 되시나요?

 

 

2) 클래스 정의

 

파이썬에서 함수를 사용하기 전에 먼저 함수를 정의한 것처럼 클래스 역시 사용하기 전에 먼저 정의해야 합니다. 

함수는 def 인것처럼 클래스도 class 라는 키워드를 사용합니다. 

 

파이썬에서 클래스를 정의한다는 것은 새로운 데이터 타입을 정의한 것이기 때문에 이를 실제로 사용하려면 인스턴스라는 것을 생성해야 합니다. 즉 클래스에서 부품을 조립해서 만들어진 자동차가 인스턴스에 해당되고 자동차를 만드는 기본 틀이 클래스에 해당됩니다.

 

파이썬에서 정의된 클래스를 이용해 인스턴스를 생성하려면 다음과 같이 클래스 이름 뒤에 ()를 넣으면 됩니다

 

가장 간단한 형태의 클래스 정의를 보여주기 위해 변수나 함수를 넣지 않고 pass라는 키워드만 사용했습니다. pass 키워드를 사용하면 클래스 내부에 아무것도 넣지 않은 상태로 클래스를 정의할 수 있습니다.

 

class Make_Car:
        pass
 

 

car1 = Make_Car()
car1

 

<__main__.Make_Car at 0x7ff54566bbd0>

 

클래스를 만들어서 인스턴스를 생성해보면 'Make_Car'라는 클래스의 인스턴스가 메모리의 0x7ff54566bbd0 위치에 생성되고 car1이라는 변수가 이를 바인딩하고 있는 것을 볼 수 있습니다.

 

 

type(car1)
__main__.Make_Car
 
 
인스턴스의 타입을 보면 Make_Car 타입(객체) 인것을 확인할 수 있습니다.
 
 
3) 클래스에 메서드 추가하기

 

앞에 클래스는 예를 들기 쉽게 만든 클래스입니다. 이제 본론으로 돌아가서 주식정보를 출력하는 프로그램을 다시 짜보도록 하겠습니다. 앞서 정의한 Make_Car클래스는 클래스 내부에 변수나 함수가 없었습니다. 그래서 인스턴스를 만들었음에도 해당 인스턴스로 할 수 있는 일이 없었습니다. 이번에는 Stock_total_info: 클래스에 데이터를 입력하고 이를 저장하는 기능을 수행하는 함수를 추가해보겠습니다. 이 함수를 우리는 메서드(method) 라고 부릅니다.

다음 코드를 분석해봅시다.

 

class Stock_total_info:
        def stock_info(self, name, pre_price, cur_price, date):
                self.name = name
                self.pre_price = pre_price
                self.cur_price = cur_price
                self.date = date

 

코드를 보면 메서드는 함수를 정의하는 def 명령어를 동일하게 사용한다는 것을 알 수 있습니다.

stock_info 는 5개의 인자를 받는데 self라는 인자가 새로보입니다. 이게 무엇인지 궁금해지기 시작하죠

하지만 제대로 설명하기는 이른 시기입니다.

일단 클래스 내부에 정의된 함수인 메서드의 첫 번째 인자는 반드시 self여야 한다고 외우도록 합시다.

 

 

관심종목1 = Stock_total_info()

관심종목1.stock_info("엔씨소프트",350500,349000,"2022-10-07")

관심종목1.date

2022-10-07

 

코드를 해석해보면 Stock_total_info() 타입을 가진 관심종목1이라는 인스턴스를 생성했고, stock_info()메서드 함수를 이용해서 데이터를 관심종목1에 넣은 것으로 해석할 수 있습니다. 관심종목1만 출력하면 <__main__.Stock_total_info at 0x7ff5454cb7d0> 바인딩 주소가 나오지만, 관심종목1.date 라는 인스턴스 변수와 같이 입력해 데이터 값이 나오는 것을 확인할 수 있습니다.

 

자 이번엔 정보를 출력하는 메서드 print_info()를 추가하기 위해서 만들어보도록 하겠습니다. 인자가 필요없이 출력이 가능하도록 만들어야하기 때문에 print_info(self)를 넣어야합니다.

 

        def print_info(self):
                print("--------------------")
                print("종목명: ", self.name)
                print("전일가: ", self.pre_price)
                print("현재가: ", self.cur_price)
                print("날짜: ", self.data)
                print("--------------------")

관심종목1이라는 인스턴스에 데이터들이 잘 입력된 것을 확인할 수 있습니다. 

def stock_info(self, name, pre_price, cur_price, date): 메서드는 데이터 입력을 받는 메서드이고,

print_info()는 데이터 입력받은 메서드를 이용해서 출력하는 메서드라는 것을 알 수 있죠.

자, 그러면 이제부터  우리는 함수랑 클래스랑 차이를 비교할 수 있지 않을까요?

 

name = "엔씨소프트"
pre_price = 350500
cur_price = 349000
date = '2022-10-07'

stock_impo(name, pre_price, cur_price, date)

-------------------------
종목 : 엔씨소프트
전일가: 350500
현재가: 349000
날짜: 2022-10-07
-------------------------

 

함수는 name1, name2 처럼 각 변수를 하나씩 일일이 늘려나가야 했습니다. 즉, 신분증으로 치면 성명1: 홍길동 , 성명2: 장길산이라고 입력해야 한다는 소리죠 

 

class Stock_total_info:
        def stock_info(self, name, pre_price, cur_price, date):
                self.name = name
                self.pre_price = pre_price
                self.cur_price = cur_price
                self.date = date
        def print_info(self):
                print("--------------------")
                print("종목명: ", self.name)
                print("전일가: ", self.pre_price)
                print("현재가: ", self.cur_price)
                print("날짜: ", self.date)
                print("--------------------")

클래스로 정의한 순간 우리는 인스턴스를 늘려나가면서 데이터를 입력하고, 인스턴스.출력메서드()만 입력하면 언제든지 변경할 수 있습니다. 이제는 다른 메서드를 만들어서 인스턴스가 가진 데이터로 언제든지 다양하게 이용할 수 있게 된 것이죠. 즉, 성명 : 홍길동, 성명 : 장길산 인 신분증을 만들 수 있는 원리가 됩니다.

 

 

728x90