Study/Python

파이썬_클래스와 모듈

김 도경 2024. 9. 26. 19:06

[2024.09.26] 필수온라인 강의 Part1 파이썬 기본기 다지기 CH04 클래스와 모듈

클래스

 

  • 객체 지향 프로그래밍
    - 객체 지향 프로그래밍(object oriented programming)
       - 프로그램 설계 방법론
       - 프로그램을 여러 개의 독립적인 단위 '객체'라는 기본 단위로 나눔
       - '객체'들의 상호작용을 통해 프로그램을 설계하고 개발하는 방식
       - 코드 재사용 용이, 유지 보수 용이, 대형 프로젝트 적합
       - 단점 : 실행속도가 느림, 객체가 많으면 프로그램 용량 커짐, 설계시 많은 시간 소요

  • 클래스
    - 동일한 무언가를 계속 만들어내는 설계 도면을 의미 (젤리는 만드는 틀 같은 느낌)

  • 객체
    - 클래스로 만들어진 모든 것을 의미 (젤리 틀에 의해 만들어진 젤리)

  • 클래스로 만드느 객체 
    - 객체마다 고유한 성질을 가지고 동일한 클래스로 만든 객체들은 서로에 영향을 주지 않음 (젤리마다 맛이랑 색이 달라도 서로에게 영향을 주지 않음, 젤리를 하나 먹었다고 해서 다른 젤리들에게 영향을 주는 것이 아님)

  • 클래스 선언
    - class 키워드를 사용하여 선언
 class 클래스 이름 : 
 	클래스 내용
class TeddyBearJelly:      #예시
  pass

 

  • 객체와 인스턴스
    - 객체(object) : 'a = classname()'로 만들었다면 a 는 객체 / 'red_jelly = TeddyBearJelly()'는 red_jelly가 객체
    - 인스턴스(instance)  : red_jelly는 TeddyBearJelly의 인스턴스
                - 특정 객체가 어떤 클라스의 객체인지를 과나계를 설명할 때 쓰는 말 : 관계성 표현의 단어!!!!
    - 인스턴스 생성
        - 클래스 기반으로 만들어진 객체를 인스턴스라고 부름
        - 클래스 인스턴스를 생성하려면 클래스 이름 뒤에 ( )괄호를 적으면 됨    : 인스턴스 이름 = 클래스 이름()

  • 메소드
    - 클래스가 가지고 있는 함수
    - 클래스 내부의 함수의 첫번째 매개변수는 반드시 self 입력!
                         : 객체 호출시, 호출한 객체 자신이 전달되기 때문에 self를 사용하는 것
class 클래스 이름 :
	def 메소드 이름(self, 추가적인 매개변수) : 
	    pass
class TeddyBearJelly :                     # 곰돌이 젤리 클래스 선언
  def set_info(self, color, taste):        # 'set_info' 함수 선언 : 젤리 생성시 필요한 속성 입력
    self.color = color
    self.taste = taste

  def print_info(self):                     # 'print_info' 함수 선언 : 젤리 속성 출력
    print("===================")
    print("Color : ", self.color)
    print("Taste : ", self.taste)
    print("===================")
    
yellow_jelly = TeddyBearJelly()             # 젤리 객체 선언

yellow_jelly.set_info("yellow", "lemon")    # 젤리 객체의 필요한 속성 입력  # 메소드 사용

print(yellow_jelly.color)              -> yellow 출력
print(yellow_jelly.taste)              -> lemon 출력

yellow_jelly.print_info()

-> 출력
===================
Color :  yellow
Taste :  lemon
===================

 

  • 생성자
    - 클래스로부터 인스턴스가 생성될 때 자동으로 실행되는 함수
    - 클래스를 실행하면 가장 먼저 생성자인 '__init__' 함수가 호출
    - '__init__' 함수는 인스턴스의 생성과 동시에 필요한 정보를 입력받도록 구현하는 역할
class 클래스 이름 :
    def __init__(self, 추가적인 매개변수) :
        pass

- 클래스 내부 첫번째 매개변수는 self! (중요함) : 객체 호출 시 객체 자신이 전달! (위에 동일내용있음)

class TeddyBearJelly :                         # 곰돌이 젤리 클래스 선언
  def __init__(self, color, taste):            # 'set_info' 메소드를 '__init__' 메소드로 이름 변경
    self.color = color
    self.taste = taste

# 젤리 리스트 선언
jelly = [
    TeddyBearJelly("red", "strawberry"),
    TeddyBearJelly("yellow", "lemon"),
    TeddyBearJelly("green", "apple")   
] 

print(jelly[0].color)           -> red 출력
print(jelly[0].taste)           -> strawberry 출력

 

  • 상속 : 물려받다는 의미
    - 새로운 클래스를 만들 때, 기존 클래스의 기능을 받기 위함
    - 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경할 때 사용
    - 기존 클래스가 라이브러리 형태로 제공 or 수정되지 않을 때 사용
    - 상위 클래스(부모, parent, super class) / 하위 클래스(자식, child, sub class)
    - 상속 선언 : 자식 클래스 선언 시 소괄호로 부모클래스 포함

    - 메소드 오버라이딩 : 부모 클래스의 메소드를 자식 클래스에서 재정의
         - 일반적인 경우 : 자식 클래스에서 생성된 객체의 메소드를 부르면 부모 클래스 메소드 무시
         - 부모 메소드 호출 : 둘다 수행하고 싶을 때 사용 : super() 키워드 사용하여 호출
# 부모 클래스 선언
class Jelly :
  def __init__(self, color, taste):
    self.color = color
    self.taste = taste

  def print_info(self):
    print("부모 클래스입니다.")
    print("젤리")
    
red_jelly = Jelly("red", "strawberry")       # 부모 클래스로 객체 생성
red_jelly.print_info()                       # 부모 클래스의 print_info() 함수 

-> 부모클래스 입니다. 젤리 출력

# 자식 클래스 선언 
class TeddyBearJelly(Jelly):           # 자식 클래스를 선언할 때 소괄호로 부모 클래스를 포함 : 일반적인 메소드 오버라이딩
  def print_info(self):
    print("자식 클래스입니다.")
    print("곰돌이 젤리")
    print("Taste : ", self.taste)
    print("Color : ", self.color) 
# 자식 클래스에서 생성된 메소드로 부모 클래스의 메소드 무시

yellow_jelly = TeddyBearJelly("yellow", "lemon")       # 자식 클래스로 객체 생성
yellow_jelly.print_info()                              # 자식 클래스의 print_info() 함수

-> 출력 값
자식 클래스입니다.
곰돌이 젤리
Taste :  lemon
Color :  yellow


# 자식 클래스 선언
class HeartJelly(Jelly):               # 자식 클래스를 선언할 때 소괄호로 부모클래스를 포함
  def print_info(self):
    super().print_info()               # 부모 메소드 호출 : super() 키워드를 사용하여 자식 클래스에서 부모 클래스 호출 가능
    print("자식 클래스입니다.")
    print("하트 젤리")
    print("Taste : ", self.taste)
    print("Color : ", self.color)
    
green_jelly = HeartJelly("green", "apple")          # 자식 클래스로 객체 생성
green_jelly.print_info()                            # 자식 클래스의 print_info() 함수

-> 출력값
부모 클래스입니다.
젤리
자식 클래스입니다.
하트 젤리
Taste :  apple
Color :  green

 

  - 다중 상속
     - 자식 클래스를 선언할 때, 소괄호로 원하는 부모클래스를 여러개 포함 가능 (개수 상관 없음)

  class 부모 클래스1:
        pass
  class 부모 클래스2:
        pass
  class 자식 클래스(부모 클래스1, 부모 클래스2):
        pass

 

 

모듈 : 여러 변수와 함수를 가지고 있는 집합

 

내부모듈

 - 파이썬에 기본적으로 내장되어있는 모듈

 - 파이썬 공식 홈페이지 참조 : https://docs.python.org/ko/3/library/index.html

 

  • import
    - 모듈 전체를 가지고 올 때 사용
    - 모듈을 사용할 때, 모듈 뒤에 도트(.)를 입력하고 원하는 변수나 함수를 입력
import 모듈 이름
import math                  # 파이썬 math 모듈은 수학 함수가 담겨있음

print(math.floor(1.2))       # 모듈을 사용할 때는 모듈 뒤에 도트(.) 입력하고 원하는 변수나 함수를 입력
print(math.ceil(1.2))​
  • from
    - 모듈 내에서 필요한 것만 가져올 때 사용
    - 모듈에는 많은 변수와 함수가 있음 -> 활용하고 싶은 것만 선택해서 사용가능
    - 여러개를 가지고 오고 싶은 변수 또는 함수 입력가능
from 모듈 이름 import 가져오고 싶은 변수 또는 함수
form 모듈 이름 import *   # 모듈 모두를 가지고오고 싶을 때 사용
from math import floor, ceil

print(floor(1.2))
print(ceil(1.2))

 

  • as
    - 모듈의 별칭을 붙일 때 사용
    - 모듈을 가지고 올 때, 이름 충돌하는 경우 발생할 때 사용
    - 모듈의 이름이 너무 길어서 줄이고 싶을 때 사용함!
import 모듈 as 모듈의 별칭
import math as m

print(m.floor(1.2))
print(m.ceil(1.2))

 

외부모듈

- 외부 모듈은 파이썬에서 기본적으로 제공해주는 것이 아닌, 외부 사람들이 만들어서 배포한 모듈

- 외부 모듈 종류
     - NumPy  : 수치 계산

     -  Pandas  : 데이터 처리
     -  Matplotlib  : 데이터 시각화
     -  Seaborn  : 데이터 시각화
     -  BeautifulSoup  : 웹 데이터 수집
     -  Scikit-Learn : 머신러닝

 

- 외부모듈 실습 : seaborn으로 실습

seaborn : 데이터 시각화의 고급버전

 

외부모듈 사용하기

1. 모듈 설치       : 패키지가 없는 경우, 설치 명령어 사용 : pip install seaborn

pip install 모듈 이름

 

2. 불러오기        : import 구문을 통해서 불러오고, as로 별칭 지정해주기

import seaborn as sns

 

3. 데이터 불러오기   : seaborn 라이브러리에서 제공하는 titanic 데이터를 불러오기 : load_dataset() 활용

titanic = sns.load_dataset('titanic')  # titanic 데이터 불러오기

 

4. 데이터 파악      : head() 함수를 통하여 상단 5개의 행을 파악

titanic.head()              # .head() : 데이터의 상단 5개 행 출력

- 어떤 데이터를 담고 있는지 확인이 가능함

 

- info( ) 함수 : 행과 열의 크기, 컬럼명, 결측치, 데이터 타입 확인

print(titanic.info())           # 행과 열의 크기, 컬럼명, 컬럼별 결측치, 컬럼별 데이터 타입

 

5. 데이터 시각화

- swarmplot( ) 함수 : 데이터의 분산까지 고려하여 데이터 포인트가 서로 중복되지 않도록 시각화. 즉, 데이터가 퍼져 있는 정도를 입체적으로 파악 가능 : 매개변수(x축 변수, y축 변수, 데이터 셋 , hue : 특정 열 데이터로 색상을 구분하여 출력)

sns.swarmplot(x='class', y='age', data=titanic, hue='sex')             # 이산형 변수의 분포 - 데이터 분산 고려 (중복 X)

성별정보로 색상을 다르게 표현했고, x는 클라스, y는 나이를 표현 한 것

모듈과 패키지

 

  • 모듈을 만들기 : 현업에서 일을 하다보면 모듈을 생성하거나, 기존에 있는 모듈을 입맛대로 만들어야하는 경우가 다수 발생
    - 그래서 모듈을 만들 줄도 알아야함

1. 폴더 만들기

2. 폴더 안에 py 파일 생성하기

3. 파일 안에 코드 추가하기

4. 메인.py 파일 만들기
- 메인.py에는 모듈을 불러올거고, 모듈1에서 구현한 add함수를 불러와서 출력까지 해볼 것.

5. 출력해보기 (구글 코랩 노트북에서 메인.py 파일 실행해보기)

 - ! python 키워드 사용

 - .py 파일이 있는 경로 입력

! python /content/module_folder/main.py      # main.py 파일 실행

-> 1 + 2 + 3인 6이 출력
  • 패키지 : 모듈이 모여서 구조를 이룬 것
    - 도트(.)를 사용하여 파이썬 모듈을 디렉터리 구조로 관리할 수 있게 해줌
          - 모듈 이름이 A.b인 경우, A는 패키지이고 b는 A패키지의 b모듈 의미
예외처리(오류, 예외처리기법)

 

오류 : 구문오류와 예외(런타임 오류)

  • 구문오류 : 프로그램 실행 전에 발생하는 오류
     - 조건문, 반복문의 들여쓰기, 괄호개수 등 문제로 발생
     - 실행조차 되지 않음 : 예외 처리 방법으로 해결 X : 보통 문법문제라 수정으로 해결

  • 런타임 오류 : 프로그램 실행 중에 발생하는 오류
     - 예외 처리를 통해 문제를 해결 할 수 있음

myList = [1, 2, 3, 4]

myList[3]                    # myList[3]은 myList에서 얻을 수 있는 값으로 수정하여 오류 해결

 

  • 예외 처리 기법
    - 예외 처리는 예외를 해결하는 것
    - 프로그램이 강제로 종료되는 일 없이 예외 처리를 하고 정상적으로 종료

    - try- except 구문
try : 
	예외가 발생할 가능성이 있는 코드    # try 문 안에는 예외가 발생할 가능성이 있는 모든 코드 삽입
except : 
	예외가 발생했을 때 실행할 코드      # except 문 안에는 예외가 발생했을 때 실행할 모든 코드 삽입
try :
  myList = [1, 2, 3, 4]
  myList[7]
except :
  print("예외가 발생하였습니다.")
try :
  myList = [1, 2, 3, 4]
  myList[7]
except :
  pass                      # except 문 안에 pass 키워드를 넣으면 아무것도 출력하지 않고 강제 종료도 막을 수 있음

 

- try- except-else 구문

try : 
	예외가 발생할 가능성이 있는 코드    # try 문 안에는 예외가 발생할 가능성이 있는 모든 코드 삽입
except : 
	예외가 발생했을 때 실행할 코드      # except 문 안에는 예외가 발생했을 때 실행할 모든 코드 삽입
else : 
	예외가 발생하지 않았을 때 실행할 코드 # else 문 안에는 예외가 발생하지 않았을 때 실행할 코드 삽입
try :
  Number = int(input("숫자 입력 : "))
except :
  print("예외가 발생하였습니다.")
else :
  print("입력한 숫자는 ", Number, "입니다.")

숫자 입력에 숫자를 넣으면 else문이 나오고 문자를 넣으면 except의 print가 나옴

 

- try- except-finally 구문

try : 
	예외가 발생할 가능성이 있는 코드    # try 문 안에는 예외가 발생할 가능성이 있는 모든 코드 삽입
except : 
	예외가 발생했을 때 실행할 코드      # except 문 안에는 예외가 발생했을 때 실행할 모든 코드 삽입
finally : 
	예외 발생 여부와 상관없이 무조건 실행할 코드 # finally 문 안에는 예외 발생 여부와 상관없이 무조건 실행할 코드 삽입
try :
  Number = int(input("숫자 입력 : "))
except :
  print("예외가 발생하였습니다.")
finally :
  print("finally 문은 무조건 실행하는 코드")

 

- try- except-else-finally 구문

try : 
	예외가 발생할 가능성이 있는 코드    # try 문 안에는 예외가 발생할 가능성이 있는 모든 코드 삽입
except : 
	예외가 발생했을 때 실행할 코드      # except 문 안에는 예외가 발생했을 때 실행할 모든 코드 삽입
else : 
	예외가 발생하지 않았을 때 실행할 코드 # else 문 안에는 예외가 발생하지 않았을 때 실행할 코드 삽입
finally : 
	예외 발생 여부와 상관없이 무조건 실행할 코드 # finally 문 안에는 예외 발생 여부와 상관없이 무조건 실행할 코드 삽입
try :
  Number = int(input("숫자 입력 : "))
except :
  print("예외가 발생하였습니다.")
else :
  print("입력한 숫자는 ", Number, "입니다.")
finally :
  print("finally 문은 무조건 실행하는 코드")

 

-> 이 부분은 각각을 서로 다르게 계속 조합하여서 쓸 수 있음! 이것을 맞는 것을 잘 꺼내서 사용하는 게 중요함