강의/computer science

[ComputerScience] 프로그래밍 언어 개요(python의 Module과 Class, 객체지향(OOP)의 4가지 원칙)

하기싫지만어떡해해야지 2024. 9. 6. 16:23

이 게시글은

서울대학교 데이터사이언스대학원

조요한 교수님의

데이터사이언스 응용을 위한 컴퓨팅 강의를

학습을 목적으로 재구성한 것입니다


python의 Module

 

module이란 쉽게 말하면 python 파일을 뜻한다

 

import math라고 가장 위에 선언해주면

math라는 python 파일 안에 있는 각종

definition이나 statement를 사용할 수 있다

접근을 위해서는

math.sqrt()

이런 방식으로 한다

 

from math import sqrt와 같은 방식으로

math 모듈 안에 있는 sqrt 함수만 가져올 수도 있지만

이름 충돌 확률이 있어 권장되지 않는 방식이라고 한다

 

 

python의 class

 

class는 주로 구글링해보면

설계도(blueprint)라는 개념에 자주 비유가 된다

 

클래스는 변수들과 함수들이 정의되어있는

하나의 object이다

 

class는 객체지향의 개념을 배우면

더욱 깊게 이해할 수 있지만

객체지향은 이후 수업에서 더욱 자세하게 배우므로

이 수업에는 간략하게만 설명한다고 한다

 

python에서 클래스를 구현하려면

초기화 init함수 앞에 무조건 인자로

자기 자신인 self를 넣어주는데

통상적으로 self라고 부르나, 반드시 인수명이

self일 필요는 없다

 

 

알아두면 좋을 python의 class에서 특이점은

파이썬은 모든 데이터 타입들이 다 class로 구성되어있다고 한다

int, float, str, bool 등등의 모든 타입이 class로 구성되어있고

data type이 built-in으로 구현되어있는 C언어와

가장 큰 차이점이라고 한다

 

그래서 파이선에서는

help(int)와 같이 하면 int data type에 대한

설명을 볼 수 있다고 한다

 

앞에서 말했듯 class는 설계도(blueprint)에

주로 비유가 된다고 했는데

한마디로, class는 그냥 정의 그 자체일 뿐

실체가 없는 것이다

 

설계도가 완성되었다고 집이 건축된 것이 아니듯

설계도는 그냥 집을 이렇게 건축할 것이라는 정의일 뿐

집이라는 건축물의 실체가 아니다

 

따라서 실체가 없는 class는 메모리 상에도

올라가지 않는다

 

프로그램 상에서 클래스 객체를 생성하면

클래스가 실행이 되고 메모리에 올라와서

클래스 인스턴트인 class object가 만들어진다

 

Object-Oriented Programming (OOP) Principles

객체지향에는 가장 유명한

대표적인 원칙 4가지가 있다

 

객체 지향의 개념에 대해서는 다른 수업에서

매우 자세하게 다루도록 하고

이번에는 class를 배우면서 객체지향 4원칙에 대해서만

간략하게 다뤄보자고 하셨다

 

1) Encapsulation (캡슐화)

클래스와 관계가 있는 여러 가지 메소드들을 번들링을 시키는 것이다

예시를 들자면 Account(계좌)라는 class를 정의하면

account와 관련된 account_holder, balance 등등은

Account class안에다 정의한다는 것이다

 

이러한 캡슐화는 reusability(재사용성)이 올라가는데

모든 메소드들이나 속성들이 한 개의 class로

번들링이 되어있기 때문에 재사용성이 높다

 

또한, 수정이 필요할 때는 class 내부에서만

수정하면 되므로 complexity를 낮춰준다

 

2) Abstraction (추상화)

class는 복잡한 시스템에서 세부사항을 감추고

중요한 개념만 드러내는 것을 뜻한다

class 내부의 메소드들이 구체적으로 어떻게 동작하는지를

외부에서 몰라도 되도록 하는 것이다

위 코드에서 Shape는 추상 class로

Shape에서의 area 메소드는 Shape를 상속받는

클래스들이 무조건 구현하도록 되어있다

 

그래서 Shape를 상속받는 Rectangle이라는 클래스에서

area함수를 정의해주는 모습을 볼 수 있다

 

Shape 함수에서는 딱히 구체적인 area 코드를

구현하지않고 중요한 Interpace만 드러냈다

 

개발자 관점에서는 class 내부에서 특정 메소드가

어떻게 구체적으로 동작하는지 모르기 때문에

편하게 느껴질 수 있다

 

추상화도, class 내부에선 수정이 생길지라도

이를 사용하는 바깥에서는 수정을 고려할 필요가 없기때문에

complexity를 줄여준다

 

3) Inheritance (상속)

Child 클래스가 Parent 클래스를

물려받는 것을 의미한다

 

위 코드를 참고하면

Vehicle이 Parent(Base) Class이고

Car은 Vehicle을 상속받은 Child(Derived) Class이다

 

이렇게 부모인 Vehicle을 상속받은

Car Class는 Vehicle 클래스에 있는

display_info 메소드를

따로 Car 클래스에 정의할 필요없이 사용할 수 있다

 

이는 반복적인 코드의 작성을 막아준다

 

4) Polymorphism (다형성)

 

이름이 같은 메소드들이 여러개 있어도

그 주인이 누구냐에 따라 다른 방식으로

수행이 될 수 있는 것을 뜻한다

 

이게 되지않으면 개발자는 프로그래밍을 할 때 

if/else로 하나하나 예외처리를 해줘야했을 것이다