Search
📝

TIL 22/07/27 (수)

TIL (Today I Learned)

OOP

객체

컴퓨터 프로그래밍의 패더라임 중 하나
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 객체들의 모임으로 파악하고자 하는 것
각각의 객체는 메시지를 송수신, 데이터 처리 가능

절차 지향 프로그래밍

순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 방법
컴퓨터 처리 구조와 유사해 실행 속도가 빠름
실행 순서가 정해져 있으므로 코드 순서가 바뀌면 동일한 결과를 못얻을 수 있음
유지 보수 & 디버깅이 어려움

객체 지향 프로그래밍 (Object Oriented Programming)

프로그램을 여러 개의 독립된 객체들과 그 객체 간의 상호작용으로 파악하는 프로그래밍 방법
데이터와 기능(메서드)를 분리, 추상화된 구조(인터페이스)
추상화: 현실 세계를 프로그래밍에 반영
장점
클래스 단위로 모듈화시켜 개발 가능하므로, 많은 인원이 참여하는 대규모 소프트웨어 개발에 적합
필요한 부분만 수정하기 쉽기 때문에 프로그램 유지 보수가 쉬움
단점
설계 시 많은 노력과 시간이 필요
다양한 객체들의 상호 작용 구조를 만들기 위해 많은 시간과 노력 필요
실행 속도가 상대적으로 느림
절차 지향 프로그래밍이 컴퓨터의 처리 구조와 비슷 해서 실행 속도가 빠름

객체

속성(변수)행동(메서드)으로 구성된 모든 것

클래스 & 객체 & 인스턴스

클래스: 설계도. 타입. 클래스를 만든다 → 타입을 만든다
객체: 실제 사례
인스턴스: 특정 클래스로 만든 객체.

객체 in Python

파이썬은 모든 것이 객체
속성과 행동이 존재: 객체.행동()
[3, 2, 1].sort(): 리스트.정렬()
'banana'.upper(): 문자열.대문자로()

객체와 인스턴스

객체는 특정 타입의 인스턴스
123, 900 5는 모드 int의 인스턴스
'hello', 'bye'는 모두 string의 인스턴스
[232, 89, 1], []은 모두 list의 인스턴스
타입과 실제 사례(값)
[1, 2, 3], [1], [], ['hi']: 모두 리스트 타입(클래스)의 객체
'', 'hi', '파이썬': 모두 문자열 타입(클래스)의 객체

객체의 특징

타입(type): 어떤 연산자(operator)와 조작(method)이 가능한가?
속성(attribute): 어떤 상태(데이터)를 가지는가?
조작법(method): 어떤 행위(함수)를 할 수 있는가?

객체와 클래스 문법

기초 문법

클래스의 정의: class MyClass :
인스턴스 생성: my_instance = MyClass()
메서드 호출: my_instance.my_method()
속성: my_instance.my_attribute

클래스와 인스턴스

객체의 설계도(클래스)를 가지고, 객체(인스턴스)를 생성
파이썬은 모든 것이 객체, 모든 객체는 특정 타입의 인스턴스

객체 비교하기

==
동등한(equal)
변수가 참조하는 객체가 동등한(내용이 같은) 경우 True
주소가 달라도 내용물이 같으면 ok
두 객체가 같아 보이지만 실제로 동일한 대상을 가리키고 있따고 확인해 준 것은 아님
is
동일한(identical)
두 변수가 동일한 객체를 가리키는 경우 True
주소까지 같아야만 ok
a = [1, 2, 3] b = [1, 2, 3] print(a == b, a is b) # True False a = [1, 2, 3] b = a print(a == b, a is b) # True True
Python

OOP 속성

속성

특정 데이터 타입/클래스의 객체들이 가지게 될 상태/데이터를 의미
클래스 변수, 인스턴스 변수가 존재

인스턴스 변수

인스턴스가 개인적으로 가지고 있는 속성(attribute)
각 인스턴스들의 고유한 변수
생성자 메서드(__init__)에서 self.<name>으로 정의
인스턴스 생성 후 <instance>.<name>으로 접근 및 할당

클래스 변수

한 클래스의 모든 인스턴스가 공유하는 값
같은 클래스의 인스턴스들은 같은 값을 갖게 됨
클래스 선언 내부에서 정의
<classname>.<name>으로 접근 및 할당
클래스 변수를 변경할 때는 항상 클래스.클래스변수 형식으로 변경
사용자가 몇 명인지 확인하고 싶다면?

OOP 메서드

메서드

특정 데이터 타입/클래스의 객체에 공통적으로 적용 가능한 행위(함수)

메서드의 종류

인스턴스 메서드
클래스 메서드
정적 메서드

인스턴스 메서드

인스턴스 변수를 사용하거나, 인스턴스 변수에 값을 설정하는 메서드
클래스 내부에 정의되는 메서드의 기본
호출 시, 첫번쨰 인자로 인스턴스 자기자신(self)이 전달됨

self

인스턴스 자기자신
파이썬에서 인스턴스 메서드는 호출시 첫 번째 인자로 인스턴스 자신이 전달되게 설계
매개변수 이름으로 self를 첫 번째 인자로 정의 → 파이썬의 암묵적 규칙

생성자(constructor) 메서드

인스턴스 객체가 생성될 때 자동으로 호출되는 메서드
인스턴스 변수들의 초기값을 설정
인스턴스 생성
__init__ 메서드 자동 호출

매직 메서드

Double underscore()가 있는 메서드는 특수한 동작을 위해 만들어진 메서드
특정 상황에 자동으로 불리는 메서드
예시

소멸자(destructor) 메서드

인스턴스 객체가 소멸(파괴)되기 직전에 호출되는 메서드

클래스 메서드

클래스가 사용할 메서드
@classmethod 데코레이터를 사용하여 정의
호출 시, 첫 번째 인자로 클래스(cls)가 전달됨
클래스 메서드 활용

데코레이터

함수를 어떤 함수로 꾸며서 개로운 기능을 부여
@데코레이터(함수명) 형태로 함수 위에 작성
순서대로 적용되기 때문에 작성 순서가 중요
데코레이터 없이 함수 꾸미기
데코레이터를 활용하면 쉽게 여러 함수를 원하는 대로 변경 가능

클래스 메서드와 인스턴스 메서드

클래스 메소드 → 클래스 변수 사용
인스턴스 메소드 → 인스턴수 변수 사용
인스턴스 변수, 클래스 변수 모두 사용하고 싶다면?
클래스 메서드는 인스턴스 변수 사용 불가능
인스턴스 메서드는 클래스 변수, 인스턴스 변수 둘 다 사용 가능

스태틱 메서드

인스턴스 변수, 클래스 변수를 전혀 다루지 않는 메서드
객체 상태나 클래스 상태 수정 불가
속성을 다루지 않고, 단지 기능(행동)만을 하는 메서드를 정의할 때, 사용
@staticmethod 데코레이터를 사용하여 정의
일반 함수처럼 동작하지만, 클래스의 이름공간에 귀속됨
주로 해당 클래스로 한정하는 용도로 사용
사용 예시

인스턴스와 클래스 간의 이름 공간 (namespace)

클래스를 정의하면, 클래스와 해당하는 이름 공간 생성
인스턴스를 만들면, 인스턴스 객체가 생성되고 이름 공간 생성
인스턴스에서 특정 속성에 접근하면, 인스턴스 → 클래스 순으로 탐색

메서드 정리

class MyClass: def method(self): return 'instance method', self @classmethod def classmethod(cls): return 'class method', cls @staticmethod def staticmethod(): return 'static method'
Python
인스턴스 메서드
호출한 인스턴스를 의미하는 self 매개 변수를 통해 인스턴스를 조작
인스턴스 메서드를 호출한 결과
클래스 메서드
클래스를 의미하는 cls 매개 변수를 통해 클래스를 조작
클래스 자체에서 메서드를 호출하는 경우
스태틱 메서드
클래스 변수나 인스턴스 변수를 사용하지 않는 경우에 사용
객체 상태나 클래스 상태 수정 불가
인스턴스는 클래스 메서드와 스태틱 메서드 모두 접근 가능

객체 지향의 핵심 개념

객체 지향의 핵심 4가지

추상화
상속
다형성
캡슐화

추상화

현실 세계를 프로그램 설계에 반영
복잡한 것은 숨기고, 필요한 것만 드러내기
예시

상속

두 클래스 사이에 부모 - 자식 관계를 정립 하는 것
클래스는 상속이 가능
모든 파이썬 클래스는 object를 상속 받음
하위 클래스는 상위 클래스에 정의된 속성, 행동, 관계 및 제약 조건을 모두 상속 받음
부모 클래스의 속성, 메서드가 자식 클래스에 상속되므로, 코드 재사용성 상승
상속 없이 구현하는 경우
학생/교수 정보를 나타내기 어려움
메서드 중복 정의
상속을 통한 메서드 재사용

상속 관련 함수와 메서드

isinstance(object, classinfo)
classinfoinstance이거나 subclass인 경우 True
issubclass(class, classinfo)
classclassinfosubclassTrue
super()
자식 클래스에서 부모 클래스를 사용하고 싶은 경우
mro 메서드 (Method Resolution Order): print(instance.mro())
해당 인스턴스의 클래스가 어떤 부모 클래스를 가지는지 확인하는 메서드
기존의 인스턴스 → 클래스 순으로 이름 공간을 탐색하는 과정에서 상속 관계에 있으면 인스턴스 → 자식 클래스 → 부모 클래스로 확장

상속 정리

파이썬의 모든 클래스는 object로부터 상속됨
부모 클래스의 모든 요소(속성, 메서드)가 상속됨
super()를 통해 부모 클래스의 요소 호출 가능
메서드 오버라이딩을 통해 자식 클래스에서 재정의 가능
상속 관계에서의 이름 공간은 인스턴스 → 자식 클래스 → 부모 클래스 순으로 탐색

다중 상속

두 개 이상의 클래스를 상속 받는 경우
상속 받은 모든 클래스의 요소 활용 가능
중복된 속성이나 메서드가 있는 경우 상속 순서에 의해 결정
예시

다형성 (Polymorphism)

동일한 메서드가 클래스에 따라 다르게 행동할 수 있음을 의미
서로 다른 클래스에 속해 있는 객체들이 동일한 메시지에 대해 다른 방식으로 응답 가능

메서드 오버라이딩

상속받은 메서드를 재정의
클래스 상속 시, 부모 클래스에서 정의한 메서드를 자식 클래스에서 변경
부모 클래스의 메서드 이름과 기본 기능은 그대로 사용하지만, 특정 기능을 바꾸고 싶을 때
상속받은 클래스에서 같은 이름으로 덮어쓰고, 부모 클래스의 메서드를 시키고 싶은 경우는 super() 사용

메서드 오버로딩

파이썬은 가변인자 *args 사용이 가능하기 때문에, 특별히 오버로딩 기능 지원 X

캡슐화

객체의 일부 구현 내용에 대해 외부로부터의 직접적인 액세스를 차단
ex) 주민번호
파이썬엔 암묵적으로 전재하지만, 언어적으로 존재하진 않음
다른 언어에 있는 상수 이런 것도 없음

접근 제어자 종류

Public Access Modifier
Protected Access Modifier
Private Access Modifier

Public Member

언더바 없이 시작하는 메서드나 속성
어디서나 호출 가능, 하위 클래스 override 허용
일반적으로 작성되는 메서드와 속성의 대다수를 차지
예시

Protected Member

언더바 1개로 시작하는 메서드나 속성
암묵적 규칙에 의해 부모 클래스 내부와 자식 클래스에서만 호출 가능
하위 클래스 override 허용
예시

Private Member

언더바 2개로 시작하는 메서드나 속성
본 클래스 내부에서만 사용 가능
하위 클래스 상속 및 호출 불가능 (오류)
외부 호출 불가능 (오류)
예시

getter 메서드와 setter 메서드

변수에 접근 가능한 메서드를 별도로 생성
getter 메서드: 변수의 값을 읽는 메서드
@property 데코레이터 사용
setter 메서드: 변수의 값을 설정하는 성격의 메서드
@변수.setter 사용
예시

디버깅

버그

소프트웨어에 발생하는 문제

디버깅

잘못된 프로그램을 수정하는 것
에러 메시지가 발생하는 경우
해당 위치를 찾이 메시지 해결
로직 에러가 발생하는 경우
명시적인 에러 메시지 없이 예상과 다른 결과가..
본인 잘못 ㅎㅎ. 다시 생각해 보고 다시 짜자!
오류가 많이 발생하는 곳
제어가 되는 시점: 조건/반복, 함수
디버깅
print 함수 활용
특정 함수 결과 ,반복/조건 결과 등 나눠서 생각, 코드를 bisection으로 나눠서 생각
개발 환경(text editor, IDE) 등에서 제공하는 기능 활용
breakpoint, 변수 조회 등
Python tutor 활용 (단순 파이썬 코드인 경우)
뇌컴파일, 눈디버깅

예외와 에러

문법 에러 (Syntax Error)

SyntaxError가 발생하면, 파이썬 프로그램을 실행되지 않음.
파일이름, 줄번호, ^ 문자를 통해 파이썬이 코드를 읽을 때(parser) 문제가 발생한 위치를 표현
줄에서 에러가 감지된 가장 앞의 위치를 가리키는 캐럿(caret)기호(^)를 표시
Invalid syntax: 문법 오류
assign to literal: 잘못된 할당

예외 (Exception)

실행 도중 예상치 못한 상황을 맞이하면, 프로그램 실행을 멈춤
문장이나 표현식이 문법적으로 올바르더라도 발생하는 에러
실행 중에 감지되는 에러들을 예외(Exception)라고 부름
예외는 여러 타입(type)으로 나타나고, 타입이 메시지의 일부로 출력됨
NameError, TypeError 등은 발생환 예외 타입의 종류(이름)
모든 내장 예외는 Exception Class를 상속받아 이뤄짐
사용자 정의 예외를 만들어 관리 가능
ZeroDivisionError: 0으로 나누고자 하는 경우
NameError: namespace 상에 이름이 없는 경우
TypeError: 타입 불일치, argument 누락, argument 개수 초과, argument type 불일치
ValueError: 타입은 올바르나 값이 적절하지 않거나 없는 경우
IndexError: 인덱스가 존재하지 않거나 범위를 벗어나는 경우
KeyError: 해당 키가 존재하지 않는 경우
ModuleNotFoundError: 해당 모듈이 없는 경우
ImportError: 모듈은 있으나 없는 클래스/함수를 가져오는 경우
KeyboardInterrupt: 임의로 프로그램을 종료하였을 때
IndentationError: Indentation이 적절하지 않는 경우

예외 처리

예외 처리

try 문(statement) / except 절(clause)을 이용하여 예외 처리 가능
try
오류가 발생할 가능성이 있는 코드 실행
예외가 발생되지 않으면, except 없이 실행 종료
except
예외가 발생하면, except 절이 실행
예외 상황을 처리하는 코드를 받아서 적절한 조치를 취함
예시

예외 메시지 처리 (as)

as 키워드를 활용하여 원본 에러 메시지 사용 가능