24-01-14 제로베이스 데이터 분석 스쿨 11일차

Hanna Kim·2024년 1월 16일

zerobase-data-analytics

목록 보기
9/10
post-thumbnail

객체 지향 프로그래밍

객체 = 속성 + 기능
객체: 클래스에서 생성

  • 객체: 자동차
    • 속성: 색상, 길이, 가격
    • 기능: 전진, 후진, 정지
  • 프로그램 언어로 클래스 생성, 생성자 호출
    • 클래스에서 객체 생성자 호출 → 메모리에 객체 생성
    • 클래스: 단일 / 객체: 다수
  • 장점
    • 객체 간 결합도가 낮음 ⇒ 유지/보수/확장성 좋음
      = 코드 재사용, 모듈화에 좋음

클래스 생성

클래스: caass 키워드 + 속성 + 기능(함수)

  • 내용이 함수: 메소드
  • 내용이 데이터: 속성

클래스

  • 첫 글자 대문자로 작성
  • 속성: __init__ 메소드
    • __init__(self):
      • self: 나 자신
      • 클래스 안 매개변수: self로 처리
  • 클래스 생성 후 실행 → 실행되는 내용 X

객체

클래스 생성 = 클래스 이름과 동일한 생성자 호출 → 객체 생성
이때 매개변수 숫자와 일치하는 데이터 삽입

  • 생성자 호출 → 자동으로 init 메소드 호출
  • 호출 시 데이터를 init 메소드에 할당 ⇒ 초기화 (속성 값 초기화)
  • 생성자 호출: class 이름과 동일

레퍼런스 변수

객체 생성 시 할당되는 변수

  • ex: car1, car2
  • 레퍼런스 변수를 통해 객체 기능 접근
  • 주소값을 통해 객체 참조

객체 속성값 변경

  • 속성 접근 시 도트 접근 연산자를 통해 속성 변경
  • 매개변수 없이 class 생성 시 → 생성 시에도 매개변수 없이 호출
class Calculator:   # class 생성

    def __init__(self):  # 속성
        self.num1 = 0
        self.num2 = 0
        self.result = 0

    def add(self):     # 기능
        self.result = self.num1 + self.num2
        return self.result

    def sub(self):
        self.result = self.num1 - self.num2
        return self.result

    def mul(self):
        self.result = self.num1 * self.num2
        return self.result

    def div(self):
        self.result = self.num1 / self.num2
        return self.result

useCal = Calculator() # 객체
useCal.num1 = 50   # 객체 속성값 변경
useCal.num2 = 10

print(useCal.add())  # 호출
print(useCal.sub())
print(useCal.mul())
print(useCal.div())

메모리와 객체

  • 변수: 객체의 메모리 주소 저장
    • 메모리 주소를 이용해서 객체 참조 (레퍼런스 변수)
    • 하나의 객체가 다른 객체를 참조했을 경우, 하나의 객체 속성값만 변경해도 다른 객체 속성값도 함께 변경

개체 복사

얕은 복사

: 객체 주소를 복사하는 것. 객체 자체가 복사되지는 않는다.

  • 변수가 가리키는 객체가 동일

깊은 복사

: 객체 자체를 복사하는 것. 또 하나의 객체 생성

  • 변수가 가리키는 객체 다름

클래스 상속

클래스는 또 다른 클래스를 상속해서 내 것처럼 사용할 수 있다.

  • 클래스2(상속받는 클래스1):
    형태로 사용
class NormalCal:

    def add(self, n1, n2):
        return n1 + n2

    def sub(self, n1, n2):
        return n1 - n2

class CalChild(NormalCal):

    def div(self, n1, n2):
        return n1 / n2

    def mul(self, n1, n2):
        return n1 * n2

다중 상속

클래스 옆에 나열하여 활용

다중상속을 다수 사용할 경우, 헷갈릴 경우 있음.

class Car04(Car01, Car02, Car03):
    def __init__(self):
        pass

생성자

  • __init__()가 속성을 초기화한다.
    • 객체 생성 및 값 삽입 시, 해당 값을 변수에 할당함

상위 클래스 활용

속성 초기화

  • 상위 클래스 속성도 모두 사용하고 싶다면
    1. 상위 클래스의 init 메소드 호출

    2. super() 메소드로 속성 초기화, 사용

      # 1번
      P_Class.__init__(self, cNum1, cNum2)
      
      # 2번
      super().__init__(cNum1,cNum2)

상위 클래스 기능 활용

super().기능명()으로 활용 가능

클래스 오버라이딩

하위 클래스에서 상위 클래스 메서드 재정의

추상클래스

상위 클래스에서 하위 클래스에 메서드 구현 강요

  • 공통 기능은 있으나, 기능의 세부적인 실행안이 다를 때
    • ex. 일반 여객기 / 전투기 : 모두 비행 기능은 있으나 속도 차이 有
from abc import ABCMeta
from abc import abstractmethod

class AirPlane (metaclass = ABCMeta):
		@abstractmethod
    def flight(self):
        pass

class Airliner(AirPlane):
		def flight(self):
        print('시속 400km/h 비행!')

class FighterPlane(AirPlane):
		def flight(self):
        print('시속 1000km/h 비행!')

예외

문법적 문제는 없으나 실행 중 발생하는 예상하지 못한 문제

예외 관련 클래스는 Exception 클래스 상속

예외 종류

  1. ZeroDivision

  2. IOError (입출력)

  3. IndexError (길이)

  4. IndentionError (띄어쓰기 : 파이썬)

  5. ValueError (표시형)

  6. AttributeError (속성)

    div(1, 0) # ZeroDivision
    
    lists = [1, 2, 3, 4, 5]
    print(lists[6]) # IndexError

예외처리

예외 별도 처리 ⇒ 프로그램 전체 실행에 이슈 없도록 처리

try~except

예외 발생 예상 구문: try~except로 감쌈

  • Excel의 iferror 함수와 유사
    • 이슈가 없으면 원래 함수를 실행, 이슈가 발생하면 except 내용 출력
  • 예외가 발생할 것 같은 부분에 정확히 try ~ except로 묶기

try ~ except ~ else~

else~: 예외가 발생하지 않은 경우 실행하는 구문

finally

예외 발생과 상관없이 항상 실행

Exception 클래스

Exception 클래스 활용하여 예외 확인 가능

raise 객체 (예외 발생)

강제로 예외 발생

  1. 사용자 함수 선언 시 if~else~로 raise 객체 삽입
  2. 함수 사용 시 try~ except~ 형태로 사용
  3. Exception 클래스 활용하여 예외 확인 시, 사용자 함수에서 raise로 선언했던 기능 출력

  • 이때 raise Exception 뒤를 튜플 형태 (A, B)로 만들 수 있다.
    • try~ except~ + Exception 클래스를 활용하여 함수 출력 시
      • raise Exception (B)에 삽입한 문자열(str, int 무관)을 활용해

      • 분기 삽입 가능

      • raise Exception (B) == e.args [1] (인덱스 활용)

사용자 예외 클래스

Exception 클래스 상속하여 사용자 예외 클래스 만들기

  • 에러가 발생하면 출력되는 에러 메시지 사용자화

파이썬 w. 텍스트파일

텍스트파일

  • 열기: open()
  • 읽기: read()
  • 쓰기: write()
  • 닫기: close()

열기 모드

파일 모드는 파일 open 목적 설정

  • ‘w’: 쓰기 전용 (파일이 있으면 덮어씌움)
  • ‘a’: 쓰기 전용 (파일이 있으면 덧붙임)
  • ‘x’: 쓰기 전용 (파일이 있으면 에러 발생)
  • ‘r’: 읽기 전용 (파일이 없으면 에러 발생)

쓰기 모드

w 모드

  • 파일이 없으면 생성
  • 파일이 있으면 기존 텍스트를 삭제 후 덮어씀
# w = 읽기 모드
file = open('C:/Users/240114_1909.txt', 'w')

strCnt = file.write('Hello World!')
print(f'strCnt: {strCnt}')

file.close()

읽기 모드

read() 함수를 이용, 파일 문자열 읽기

# r = 쓰기 모드
file = open('C:/Users/240114_1909.txt', 'r')

str = file.read()
print(f'{str}') # == print(f'{file.read()}')

file.close()

닫기: with ~ as

파일 닫기 (file.close()) 생략 가능

  • enumerate: 튜플, 리스트, 스트링에 적용.
  • 각각의 index 값과 value 값을 enumerate 객체로 리턴
  • idx = 인덱스 / num = value 값
with open(url + '240114_2000.txt','a') as f

writelines

리스트, 또는 튜플 데이터를 파일에 쓰기 위한 함수

with open (url + '240114_2025_writelines.txt','a') as f:
    f.writelines(languages) # 개행 X
    f.writelines(item + '\n' for item in languages) # 개행 O
# {} == 딕셔너리 / {key : Value}
scoreDic = {'kor': 85, 'eng': 90, 'mat': 92, 'sci': 79, 'his': 82}
for key in scoreDic.keys():
    with open(url + '240114_2034_writelines.txt', 'a') as f:
        # value값 호출 시 딕셔너리명[key] 형태로 사용
        f.write(key + '\t:' + str(scoreDic[key]) + '\n')
with open(url +'240114_2034_writelines.txt', 'a') as f:
    print(scoreDic, file = f) #딕셔너리 자체로 저장
    print(scoreList, file = f) #리스트 자체로 저장

readlines()

파일의 모든 데이터를 읽어서 리스트 형태로 반환

  • 눈에 보이지 않는 개행까지 ‘텍스트\n’ 형태로 출력
with open (url + '240114_2043_readlines.txt','r') as f:
    print(f.readlines())
    print(type(f.readlines()))['hello python\n', 'hello world\n', 'hello sunday\n', 'hello today']
<class 'list'>

readline()

한 행을 읽어서 문자열로 반환

  • while문 활용, 한 줄씩 출력
  • print 함수 사용 시 개행 2줄씩 (텍스트 뒤쪽 \n & print 개행
scoreDic = {}
with open(url + '240114_2050_readlines.txt','r') as f:
    line = f.readline()

    while line != '':
        # split: 구분자를 설정하면 리스트로 구분
        tempList = line.split(':')
        # strip: 특정 문자열 삭제
        # 딕셔너리명[key[인덱스]] = value[인덱스]
        scoreDic[tempList[0]] = int(tempList[1].strip('\n'))
        line = f.readline()

print(scoreDic)

0개의 댓글