반응형

안녕하세요, 이번 포스팅에서는 파이썬을 이용한 데이터 분석에 대해 알아보고, 주식 시장 예측 모델링을 다룰 예정입니다.

새로운 분야에 뛰어들기 위해서는 이 분야에 필요한 전문적인 지식과 기술을 습득하는 것이 중요합니다. 최근 데이터 분석은 비즈니스 분야에서 많이 활용되고 있으며, 데이터 분석으로 얻은 인사이트를 기반으로 더 나은 전략을 수립할 수 있습니다.

데이터 분석을 위한 도구로는 파이썬이 가장 많이 사용되는 언어 중 하나입니다. 파이썬은 데이터를 가공하고 분석하기에 용이한 구조를 지니고 있으며, 더불어 다양한 라이브러리도 제공합니다.

이번 포스팅에서는 주식 시장 예측 모델링을 진행해보겠습니다. 주식 시장은 국내외 관심을 받는 대표적인 분야 중 하나입니다. 파이썬과 다양한 라이브러리를 활용하여 주식 시장의 데이터를 수집, 가공하고 이를 기반으로 시장 예측 모델을 만들어보겠습니다.

데이터 분석의 첫 번째 단계는 데이터 수집입니다. 이번 예시에서는 Yahoo Finance에서 제공하는 주식 데이터를 활용할 예정입니다. 주식 데이터는 다양한 정보를 포함하고 있으며, 향후 시장 동향을 예측하는 데 필요한 데이터를 선택해야 합니다.

다음으로는 데이터 전처리 과정입니다. 이 과정에서는 데이터의 결측값이나 이상치 등을 처리해야합니다. 또한 데이터에 대한 분석을 위해 그래프나 통계량 등을 계산하여 시각화하는 작업도 필요합니다.

마지막으로는 모델링입니다. 이 과정에서는 다양한 머신 러닝 알고리즘을 적용하여 모델을 만들고 성능을 검증합니다. 모델링 결과를 바탕으로 향후 시장 동향을 예측할 수 있습니다.

이번 포스팅에서는 파이썬과 다양한 라이브러리를 활용하여 주식 시장 예측 모델을 만드는 과정을 다루었습니다. 데이터 분석은 시대의 핵심 기술 중 하나이며, 앞으로 더욱 발전해 나갈 것입니다.

반응형

'Python' 카테고리의 다른 글

디자인 패턴  (0) 2022.04.14
OOP 5대 원칙(python 예제 포함)  (0) 2022.04.09
추상클래스(abstract class)  (0) 2022.04.09
덕 타이핑이란?  (0) 2022.04.09
opencv cv2.imshow 에러 해결방법  (0) 2022.03.31
반응형

디자인 패턴이란?

  • 소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 수 있는 훌륭한 해결책
  • "바퀴를 다시 발명하지 마라"
  • 이미 만들어져서 잘 되는 것을 처음부터 다시 만들 필요가 없다는 의미
  • 시스템을 개발할 때 공통되는 문제점이 있고 이를 해결하는 방법 또한 공통으로 존재함
  • 패턴은 공통의 언어를 만들어주며 팀원 사이의 의사소통을 원활하게 해줌

디자인 패턴의 구조

  • 콘텍스트
    • 문제가 발생하는 여러 상황을 기술 - 패턴이 적용될 수 있는 상황을 나타냄
  • 문제
    • 패턴이 적용되어 해결될 필요가 있는 여러 디자인 이슈를 기술
    • 이때 여러 제약 사항과 영향력도 문제 해결을 위해 고려
  • 해결
    • 문제를 해결하도록 설계를 구성하는 요소와 그 요소 사이의 관계, 책임, 협력 관계를 기술
    • 반드시 구체적인 구현 방법이나 언어에 의존적이지 않으며 다양한 상황에 적용할 수 있는 일종의 템플릿

디자인 패턴의 종류

  • GoF 디자인 패턴
    GoF(Gang of Fout)라 불리는 사람들
    에리히 감마(Erich Gamma), 리차드 헬름(Richard Helm), 랄프 존슨(Ralph Johnson), 존 블리시디스(John Vissides)
    소프트웨어 개발 영역에서 디자인 패턴을 구체화하고 체계화한 사람들
    23가지의 디자인 패턴을 정리하고 각각의 디자인 패턴을 생성(Creational), 구조(Structural), 행위(Behavioral) 3가지로 분류했다.

1. 생성 패턴

  • 객체 생성 관련 패턴
  • 객체 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성 제공

2. 구조 패턴

  • 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
  • ex) 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스 제공, 기존 객체를 서로 묶어 새로운 기능 제공

3. 행위

  • 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴
  • 한 객체가 혼자 수행할 수 없는 작업을 여러개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둠

GOF 디자인 패턴의 종류

  • 생성 패턴
    • 추상 팩토리
      • 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴
    • 팩토리 메서드
      • 객체 생성 처리를 서브 클래스로 분리해 처리하도록 캡슐화하는 패턴
    • 싱글턴
      • 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
  • 구조 패턴
    • 컴퍼지트
      • 여러 개의 객체들로 구성된 복합 객체와 단일 객체를 클라이언트에서 구별없이 다루게해주는 패턴
    • 데커레이터
      • 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴
  • 행위 패턴
    • 옵서버
      • 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성하는 패턴
    • 스테이트
      • 객체의 상태에 따라 객체의 행위 내용을 변경해주는 패턴
    • 스트래티지
      • 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
    • 템플릿 메서드
      • 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
    • 커맨드
      • 실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴


출처: https://gmlwjd9405.github.io/2018/07/06/design-pattern.html

 

[Design Pattern] 디자인 패턴 종류 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

반응형
반응형

OOP가 무엇일까?

Object-Oriented Programming의 약자로 객체지향 프로그래밍이란 뜻이다.

프로그래밍의 종류에는 절차지향, 객체지향, 함수지향이 있다. (더 있을 수 있는데 여기까지..)

절차지향은 말그대로 위에서부터 주우욱 읽어가는 코드로 C언어 등이 있다.(요즘은 구조체로 객체의 느낌이 나지만 자세히는 모름)

객체지향으론 유명하게 파이썬과 java가 있다. 객체를 구성해서 프로그래밍하는 것인데 class를 만드는 것이다.

함수지향은 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임이라한다. 자바스크립트 등이 있다.(잘 모르겠다...)

일반적으로는 객체지향을 잘 하면된다.- 제일 많이 쓰이니까!

객체지향이란 것은 객체를 생성해서 프로그래밍한다는 뜻인데 여기에는 룰이 존재한다. 그것이 5대 원칙이다. 지켰으면 좋겠다...라는 뜻

서론은 여기까지 하고, 5대원칙에 대해 설명해보자.

5대 원칙은 약자로 SOLID라고 하는데 각각 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), DIP(의존 역전 원칙), ISP(인터페이스 분리 원칙)의 앞글자를 따서 만들어졌다. 

각각에 대해 알아보자.

단일 책임의 원칙(Single Responsibility Principle, SRP)

하나의 모듈은 한 가지 책임을 가져야한다는 것이다. 다른말로 작성된 Class는 하나의 기능만 가지며, 그 Class가 제공하는 모든 서비스는 하나의 책임을 수행하는 데 집중되어야한다는 것이다. 

예를 들어보자. 회원가입의 기능을 하는 SignUp class가 존재한다고 하자. SignUp 클래스 안에는 회원 가입을 담당하는 기능만 존재해야 한다. (로그인이나, 유저 삭제 등의 기능이 들어가면 안된다.) SignUp 클래스를 고쳤을 때 회원가입 기능만 문제가 발생하여야한다. 

만약 단일 책임 원칙을 지키지 않았을 경우에는 하나의 class에 다양한 기능이 들어가 있다는 뜻인데, 해당 클래스를 수정했을 때 다른 모듈에 어떠한 영향을 미치는지 그 범위를 추측하기 힘들 수 있다.

아래의 예를 보면 유저를 입력하는 메소드에 비밀번호를 암호화하는 코드가 SignUp 클래스 안에 혼재해 있다. 비밀번호 암호화 코드를 다른 클래스로 빼자. 

class SignUp:
    def insertUser(self, userId, userPw):
        ...
        #something insert user to DB code
        ...
        #something password encrypt code
		...
class SignUp:
	SimplePasswordEncoder simple_password_encoder
    
	def insertUser(self, userId, userPw):
        ...
        #something insert user to DB code
        ...
        
 class SimplePasswordEncoder:
 	def encryptPassword(pw):
    	...

위와 같이 클래스단위로 구분했는데, 그럼 왜 SingIn 클래스에 암호화 메소드를 추가하지 않느냐? 라는 의문이 든다. 나도 그렇게 생각했는데 이것이 바로 단일 책임이라는 것이다. 클래스(객체)가 단일 책임만 갖는 것이다.

단일 책임의 장점은 변경이 필요할 때 수정할 대상이 명확하다는 것이다.

개방 폐쇄 원칙 (Open-Closed Principle, OCP)

확장에 대해 열려있고 수정에 대해서는 닫혀있어야 한다는 원칙으로, 각각이 갖는 의미는 다음과 같다.

  • 확장에 대해 열려있다: 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있다.
  • 수정에 대해 닫혀있다: 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다.

내 상사가 나한테 암호화 알고리즘의 고도화가 필요하다고 요청을 한다. 그럼 한 번 위의 코드에서 바꿔보자.

class SignUp:
	ComplexPasswordEncoder complex_password_encoder
    
	def insertUser(self, userId, userPw):
        ...
        #something insert user to DB code
        ...
        
 class ComplexPasswordEncoder:
 	def encryptPassword(pw):
    	...
        #something powerful encrypt code
        ...

SimplePasswordEncoder를 ComplexPasswordEncoder로 수정했다. 그런데, 기존의 코드였던, 그리고 암호화 정책과 무관한 SignIn 코드도 고쳐야만 했다.

이 부분은 수정에 대해 닫혀있다라는 원칙에 위배된다. 이 부분을 해결하려면 추상화를 이용해야한다.

추상화 관련 내용은 이 링크를 따라가자

내가 이해한 내용을 바탕으로 예제를 보자.

from abc import *

class SignUp:
	PasswordEncoder password_encoder
    
	def insertUser(self, userId, userPw):
        ...
        #something insert user to DB code
        ...
        
class PowerPWEncoder(metaclass=ABCMeta):
	@abstractmethod
    def encryptPassword(self, pw):
    	...
        #something powerful encrypt code
        ...

class PasswordEncoder(PowerPWEncoder):
	def encryptPassword(self, pw):
	   	return super().encryptPassword()

위와 같은 방식을 이용하면 상속 클래스만 바꿔도 패스워드 암호화 방식을 변경할 수 있다. 파이썬에서 인터페이스가 따로 존재하지 않으므로 위 코드에서 PasswordEncoder 클래스를 인터페이스 클래스로 사용하였다. 

 

인터페이스 분리 원칙(Interface Segregation Principle, ISP)

객체가 충분히 높은 응집도의 작은 단위로 설계됐더라도, 목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리해야한다. 즉, 인터페이스 분리원칙이란 클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는 것이다.

인터페이스 분리 원칙을 준수하면 모든 클라이언트가 자신의 관심에 맞는 퍼블릭 인터페이스만을 접근하여 불필요한 간섭을 최소화할 수 있다. 

위 코드에서 사용자가 비밀번호를 변경할 때 입력한 비밀번호가 기존의 비밀번호와 동일한지 여부를 판단해야하는 클라이언트가 있다고 생각해보자. 이때 PowerPWEncoder 클래스에서 encryptPassword를 동일하게 사용해줘야한다. 이유는 이미 기존의 비밀번호들은 강화된 암호화를 이용해 저장되어 있기 때문에 rawPW를 입력받아 강화된 암호화를 적용해서 기존의 암호와 비교해야하기 때문이다.

 

from abc import *

class SignUp:
	PasswordEncoder password_encoder
    
	def insertUser(self, userId, userPw):
        ...
        #something insert user to DB code
        ...
     
        
class PowerPWEncoder(metaclass=ABCMeta):
	@abstractmethod
    def encryptPassword(self, pw):
    	...
        #something powerful encrypt code
        ...
  
class PowerPWChecker(metaclass=ABCMeta):
	@abstractmethod
    def encryptPassword(self, pw):
    	...
        #something powerful encrypt code
        ...
    
    @abstractmethod
    def isCorrectPassword(self, rawPW, pw):
    	pass

class PasswordEncoder(PowerPWEncoder):
	def encryptPassword(self, pw):
	   	return super().encryptPassword()
        

        
class PasswordChecker(PowerPWChecker):
	def encryptPassword(self, pw):
	   	return super().encryptPassword()
    
    def isCorrectPassword(self, rawPW, pw):
    	encryptPW = encryptPassword(rawPW)
        return encryptPW.equals(pw).

이렇듯 클라이언트가 원하는 대로 인터페이스를 분리하여 불필요한 접근을 최소화해줄 수 있다.

 

리스코프 치환 원칙(Liskov Substitution Principle, LSP)

1988년 바바라 리스코프가 올바른 상속관계의 특징을 정의하기 위해 발표한 것이다. 하위 타입은 상위 타입을 대체할 수 있어야 한다는 것이다. 즉, 해당 객체를 사용하는 클라이언트는 상위 타입이 하위 타입으로 변경되어도, 차이점을 인식하지 못한 채 상위 타입의 퍼블릭 인터페이스를 통해 서브 클래스를 사용할 수 있어야 한다는 것이다.

두 가지를 지키면 된다고 한다.

  1. 하위 클래스는 상위 클래스에 정의된 것보다 사전조건을 엄격하게 만들면 안된다.
  2. 하위 클래스는 상위 클래스에 정의된 것 보다 약한 사후조건을 만들면 안된다.

하위 클래스의 메소드에 특정 변수가 필요한데, 상위 클래스의 메소드에 그 변수가 없을 경우 에러가 남.

상위 클래스의 메소드를 하위 클래스가 오버라이딩 할 경우 메소드의 기능은 동일해야함.

리스코프 치환 원칙을 준수하려면 상위 클래스의 메소드를 그대로 상속 받고 하위 클래스에서 필요한 기능을 추가하는 방향으로 가는 것이 좋다.

 

의존 역전 원칙 (Dependency Inversion Principle, DIP)

고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되며, 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다는 것이다.

고수준 모듈: 변경이 없는 추상화된 클래스(또는 인터페이스)

저수준 모듈: 변하기 쉬운 구체 클래스

다시 말하자면 메인 스트림이 고수준의 모듈인 인터페이스에 의존되고 인터페이스는 구현체에 의존되어야 한다는 것이다.

개방폐쇄원칙과 밀접한 관련이 있으며 의존 역전 원칙이 위배되면 개방 폐쇄 원칙 역시 위배되게 될 가능성이 높다.

 

위의 SOLID는 추상화의 중요성을 말하고 있는 듯하다. 추상 클래스를 잘 활용하여 확장, 수정이 용이한 객체 지향적인 코드를 프로그래밍해보자.


반응형

'Python' 카테고리의 다른 글

"파이썬으로 데이터 분석하기: 주식 시장 예측 모델링"  (0) 2023.04.19
디자인 패턴  (0) 2022.04.14
추상클래스(abstract class)  (0) 2022.04.09
덕 타이핑이란?  (0) 2022.04.09
opencv cv2.imshow 에러 해결방법  (0) 2022.03.31
반응형
  • 추상클래스란 미구현 추상메소드를 한개 이상 가지며, 자식클래스에서 해당 추상 메소드를 반드시 구현하도록 강제합니다.
  • 상속받은 클래스는 추상메소드를 구현하지 않아도, import할 때까지 에러는 발생하지 않으나 객체를 생성할 시 에러가 발생합니다.
  • 추상메소드는 생략하면 기본적인 클래스 기능은 동작합니다만, 추상메소드를 추가한 후에는 객체를 생성하면 에러가 발생합니다.
  • abc 모듈을 import해야 합니다. abc는 Abstract Base Class의 약자입니다.
  • 추상 메소드 위에 @abstractmethod 데코레이터를 달아줍니다.
  • 추상클래스의 매개변수에 metaclass=ABCMeta를 입력해줍니다.

예제를 한 번 봅시다.

from abc import *

class AbstractPerson(metaclass=ABCMeta):
	
    @abstractmethod
    def sleep(self):
		pass
    
    @abstractmethod
    def eat(self):
		pass
        
class Walter(AbstractPerson):

    def sleep(self):
		print('zzZ')

    def eat(self):
		print('냠냠')

위의 코드에서 추상 메소드를 구현하지 않으면 에러가 난다.

추상클래스를 공부하며 어려운 부분이 왜 사용하냐 인데 이는 상위 클래스인 추상클래스를 이용하여 코드를 재사용하면서 시간을 절약할 수 있고, 수정을 할 경우 다른 코드의 영향도를 적게하기 위하여 사용한다. 그리고 추상 클래스는 하위 클래스에게 추상메소드를 구현하라고 강요하는 역할을 한다.

반응형

'Python' 카테고리의 다른 글

디자인 패턴  (0) 2022.04.14
OOP 5대 원칙(python 예제 포함)  (0) 2022.04.09
덕 타이핑이란?  (0) 2022.04.09
opencv cv2.imshow 에러 해결방법  (0) 2022.03.31
pix2pix augmentation  (0) 2022.03.31
반응형

동적 타이핑의 한 종류로 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것을 말한다.

여기서 동적 타이핑이란, 자료형 검사가 컴파일이 아닌 런타임에 수행될 경우를 말한다. 파이썬과 같은 언어는 인터프리터 언어로 런타임때 자료형 검사가 진행된다.

클래스 상속이나 인터페이스 구현으로 타입을 구분하는 대신, 덕 타이핑은 객체가 어떤 타입에 걸맞은 변수와 메소드를 지니면 객체를 해당 타입에 속하는 것으로 간주한다. 비유를 하자면 아래와 같다.

만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.

즉, 객체의 타입을 구분할 때 이건 어떤 객체이기 때문에 무슨무슨 특징을 갖는다. 라고 하는 것 보다. 이 객체는 어떤 어떤 특징을 가졌기 때문에 어떤 객체이다. 라고 표현하는 것이 내 이해의 상한선이다...

농담을 섞자면 난 ESTJ이기 때문에 꼰대다 보다는 꼰대이니까 ESTJ랄까?

예제를 한 번 보자.

def calculate(a, b, c):
    return (a+b)*c

a = calculate(1, 2, 3)
b = calculate([1,2,3],[4,5,6],2)
c = calculate("a","b",3)

print(a)
print(b)
print(c)
9
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
ababab

이것이 바로 런타임에 자료형이 결정되는 덕타이핑이라는 것이다.

반응형
반응형

정말 개같은 에러가 계속 났다. 아래와 같은 에러인데 검색해서 모든 방법을 다 해봤다.

conda에서 지우고 다시 깔고 opencv-contrib-python 깔고 다해봤는데 다 다다다다다안됐다.

cv2.error: OpenCV(4.5.5) /io/opencv/modules/highgui/src/window.cpp:1268: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

 

그럼 어떻게 해결했느냐?

pip list를 입력해서 opencv-python-headless가 있으면 지우자

pip uninstall opencv-python-headless

그럼 드디어 웹캠이 된다.....

반응형

'Python' 카테고리의 다른 글

추상클래스(abstract class)  (0) 2022.04.09
덕 타이핑이란?  (0) 2022.04.09
pix2pix augmentation  (0) 2022.03.31
기본적인 베이스 코딩 구조(Class 개념 - 붕어빵 비유)  (0) 2022.02.03
exception print하기  (0) 2022.01.26
반응형

pix2pix 태스크를 진행할 때 데이터 셋을 모을 필요가 있다.

나의 경우 구글맵 실사 이미지를 2D 이미지로 변환하는 태스크를 수행한다.

이때 학습 이미지 화질이나 질감 등에 크게 영향을 끼치지 않는 증강기법을 적용한다.

flip, rotate를 적용하면 좋을 것 같다.

def h_flip(input_image, real_image):
    input_image = cv2.flip(input_image,1)
    real_image = cv2.flip(real_image,1)
    return input_image, real_image

def v_flip(input_image, real_image):
    input_image = cv2.flip(input_image,0)
    real_image = cv2.flip(real_image,0)
    return input_image, real_image

def rotate90(input_image, real_image):
    input_image = cv2.rotate(input_image,cv2.ROTATE_90_CLOCKWISE)
    real_image = cv2.rotate(real_image,cv2.ROTATE_90_CLOCKWISE)
    return input_image, real_image
    
def rotate180(input_image, real_image):
    input_image = cv2.rotate(input_image,cv2.ROTATE_180)
    real_image = cv2.rotate(real_image,cv2.ROTATE_180)
    return input_image, real_image
    
def rotate270(input_image, real_image):
    input_image = cv2.rotate(input_image,cv2.ROTATE_90_COUNTERCLOCKWISE)
    real_image = cv2.rotate(real_image,cv2.ROTATE_90_COUNTERCLOCKWISE)
    return input_image, real_image

기존에 노가다로 625개의 데이터 셋을 구비했는데 이러한 증강기법으로 3750개로 늘어났다.

반응형
반응형

흔히 코딩할 때 쓰이는 친구들을 이용해서 적당한 구조를 만들어보자.

일단 파이썬도 자바와 동일하게 객체지향이기 때문에 클래스(Class)를 많이 사용한다.

클래스는 붕어빵 틀과 같다. 그리고 클래스로 객체를 만들 수 있는데 이는 인스턴스라고도 하고 객체라고도 한다.

즉, 붕어빵 틀인 클래스로 붕어빵인 객체(인스턴스)를 만드는 것이다. 이 때 붕어빵 틀은 고정되어 있지만 붕어빵안에는 슈크림, 팥 등 다양한 것이 들어갈 수 있다. 무슨 이야기인지 밑의 코드로 확인하자.

class FishBread:
    def __init__(self):
        self.source = 'red_bean'

    def set_source(self, source):
        self.source = source

    def get_source(self):
        return self.source

if __name__ == '__main__':
    fish_bread = FishBread()
    fish_bread.set_source('puff')
    what_source = fish_bread.get_source()
    print(what_source)

차근차근 살펴보자 먼저, FishBread 클래스를 생성(정의)한다. FishBread는 붕어빵 틀 답게 소스(팥, 슈크림 등)을 세팅해주는 기능이 있다. 여기서 __init__메소드는 객체(인스턴스)를 생성할 때 딱 한번 제일 처음으로 실행되는 메소드이므로 번역하자면 붕어빵 틀의 기본 소스는 팥(red_bean)인 셈이다.

메인으로 넘어와서 fish_bread = FishBread()로 객체(인스턴스)를 생성해준다. 즉 붕어빵 틀로 붕어빵을 만들어 낸다.

이때 fish_bread.set_source('puff')로 붕어빵의 소스를 슈크림(puff)로 세팅한다.

그러면 fish_bread는 슈크림을 가지고 있는 붕어빵이 된다.

그리고 fish_bread.get_source()로 어떤 소스가 담겨있는지를 what_source변수에 넣어주고 프린트한다.

그렇다면 손님이 팥붕과 슈붕을 모두 주문했다면 어떻게 할까?

답은 간단하다.

if __name__ == '__main__':
    fish_bread_1 = FishBread()
    fish_bread_2 = FishBread()
    fish_bread_1.set_source('puff')
    fish_bread_2.set_source('red_bean')
    what_source_1 = fish_bread_1.get_source()
    what_source_2 = fish_bread_2.get_source()
    print(what_source_1)
    print(what_source_2)

위와 같이 코딩을 해내면 1개의 붕어빵 틀로 두가지 맛의 붕어빵을 만들 수 있다.

안에 피자맛을 넣어도 좋다.

암튼 클래스를 이용한다면 다음과 같은 절차를 따르면 된다.

1. 클래스 생성

2. 메인에서 객체(인스턴스)생성

3. 인스턴스를 이용하여 메소드 사용

반응형

'Python' 카테고리의 다른 글

opencv cv2.imshow 에러 해결방법  (0) 2022.03.31
pix2pix augmentation  (0) 2022.03.31
exception print하기  (0) 2022.01.26
log threading 로깅이 서비스에 방해되지 않게 하기  (0) 2021.08.31
pip install opencv-python 에러  (0) 2021.07.13

+ Recent posts