파이썬 기초 4-1. 클래스와 모듈

MANBOKWAK·2024년 1월 15일

파이썬 기초

목록 보기
8/15

클래스

1. 클래스란?

  • 프로그래밍 측면에서 어떠한 객체의 변수, 메서드의 집합으로 정의됨

  • 현실세계에서는 동일한 속성과 행위를 수행하는 객체의 집합으로 정의
    ex) 학생을 객체라고 생각하면 아래와 같은 변수와 메서드를 가지는 클래스로 정의될 수 있음

학생
학번
이름
성별
전공
수강과목
함수 : 수강하다()
  • 학생은 학번, 이름, 성별, 전공 등을 가지므로 모두 같은 객체임

  • 무조건 클래스를 사용할 필요는 없지만 *클래스를 적재적소에 사용하면 프로그래밍 과정이 편리해질 수 있음*

클래스 사용 예

  • 계산기를 사용한 클래스 예제
# 계산기에 3 -> + -> 4 -> 7 -> + -> 3 -> 10
#		 in   in   in   out  in    in   out
# in은 입력, out은 출력
result = 0

def add(num):
    global result
    result += num
    return result

print(add(3))
print(add(4))

  • 결괏값을 유지하기위해 global을 이용해 전역변수로 사용했음

  • 만약 계산기 2대가 필요한 경우에는 result1, result2로 나누어서 계산할 수 있음

# 계산기가 2대가 필요한경우
result1 = 0
result2 = 0

def add1(num):
    global result1
    result1 += num
    return result1

def add2(num):
    global result2
    result2 += num
    return result2

print(add1(3))
print(add1(4))
print(add2(3))
print(add2(7))

  • 계산기를 2대 사용하는 경우 똑같은 일을 수행하는 함수 add1, add2와 각 결과 값을 저장하는 변수 result1, rusult2가

  • 계산기를 점점 더 많이 사용할경우 코드의 길이와 번거로움이 많아짐 -> 클래스로 해결

# 클래스를 사용한경우
class calculation:
    def __init__(self):
        self.result = 0

    def add(self, num):
        self.result += num
        return self.result

cal1 = calculation()
cal2 = calculation()

print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))

  • claculation 클래스로 생성한 객체 cal1, cal2가 각각의 역할을 수행함

  • 결과값이 다른 계산기의 결과 값과 독립적으로 유지됨

  • 클래스를 사용하면 계산기 대수가 늘어나더라고 객체를 생성만 하면 되므로 함수를 사용하는 경우와 달리 매우 간단해짐


2. 클래스와 객체

  • 클래스는 과자틀 객체는 과자에 비유할 수 있음

  • 클래스(class)란 똑같은 무엇인가를 계속해서 만들어 낼 수 있는 설계 도면

  • 객체(object)란 클래스로 만든 피조물

  • 클래스로 만든 객체는 객체마다 고유한 성격을 가짐 -> 동일한 클래스로 만든 객체들은 서로 전형 영향을 주지 않음

# 클래스 가장 간단한 예
class cookie:
	pass

a = cookie()
b = cookie()
  • cookie클래스는 아무 기능을 갖지않은 껍질뿐인 클래스지만 객체를 생성할 수는 있음

class 예 - 사칙연산 클래스 만들기

  • 함수 : add - 더하기, sub - 빼기 , div - 나누기, mul - 곱하기, setdata - 사칙연산할 두수를 입력
### 사칙연산 클래스 Example
class Fourcal:
    def setdate(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

    def sub(self):
        result = self.first - self.second
        return result

    def mul(self):
        result = self.first * self.second
        return result

    def div(self):
        result = self.first / self.second
        return result

a = Fourcal()
a.setdate(4, 2)
print(a.add())
print(a.sub())
print(a.mul())
print(a.div())

  • 클래스내에 정의된 함수에서 self부분은 메서드를 호출한 객체 자체를 말함 -> 함수 호출시 객체를 매개변수로 넣어줄 필요없이 기본적으로 넣어줌

3. Constructor(생성자)

  • 생성자란 객체가 생성될때 자동으로 호출되는 메서드를 의미

  • 파이썬에서는 __init__을 사용하면 메서드가 생성됨

생성자를 사용하지 않는 경우

# 생성자가 없는 경우
# 위에 fourCal 코드를 사용

class Fourcal:
    def setdate(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

    def sub(self):
        result = self.first - self.second
        return result

    def mul(self):
        result = self.first * self.second
        return result

    def div(self):
        result = self.first / self.second
        return result
a = Fourcal()
print(a.add())
 

  • FourCal 클래스의 인스턴스a 에 setdata 메서드를 수행하지 않고 add메서드를 수행하면 위와같은 오류가 발생

  • setdata 메서드를 수행해야 a의 객체변수 first와 second가 생성되기 때문에 발생하는 오류

생성자를 사용하는 경우

# 생성자를 사용하는 경우 Example
class Fourcal:

    def __init__(self,first, second):
        self.first = first
        self.second = second

    def setdate(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

    def sub(self):
        result = self.first - self.second
        return result

    def mul(self):
        result = self.first * self.second
        return result

    def div(self):
        result = self.first / self.second
        return result

#a = Fourcal() # 매배견수를 제대로 전달해주지않아 오류발생
a = Fourcal(4,2)
print(a.add())

  • __init__을 통해 생성자를 명시해주었음

  • 위 코드를 실행한 경우 위와 같은 오류가 발생하는데 매개변수 first와 second에 해당하는 갑이 전달되지 않아서 발생하는 오류임

  • a = Fourcal(4,2)를 사용하면 오류가 발생하지않고 위처럼 6이 출력됨

  • 생성자에 매개변수를 제대로 전달해주었기 때문에 오류가 발생하지 않음

  • a 생성부의 주석처리를 바꿔가면서 코드를 실행해보면 오류가 뜨고 안뜨고를 확인해볼 수 있음


4. 클래스의 상속

  • 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받는 것

  • 클래스를 상속받기 위해서는 class 클래스명(상속받을 클래스명) : 의 형식으로 사용할 수 있음

예제

  • FourCal 클래스를 상속받아 a^b제곱 기능을 추가한 클래스를 만드는 예제
# MoreFourCal Example
class Fourcal:

    def __init__(self,first, second):
        self.first = first
        self.second = second

    def setdate(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

    def sub(self):
        result = self.first - self.second
        return result

    def mul(self):
        result = self.first * self.second
        return result

    def div(self):
        result = self.first / self.second
        return result

class MoreFourcal(Fourcal):
    def pow(self):
        result = self.first ** self.second
        return result

a = MoreFourcal(4,2)
print(a.add())
print(a.sub())
print(a.mul())
print(a.div())
print(a.pow())

  • MoreFourCal은 FourCal의 클래스의 기능을 상속받았으므로 FourCal의 모든 기능을 사용할 수 있음

메서드 오버라이딩

  • 부모 클래스의 기능을 상속받은 자식 클래스가 부모 클래스의 함수와 똑같은 이름을 다시 작성하는 것을 메서드 오버라이딩이라고 함

  • 메서드 오버라이딩 후 메서드를 자식 객체에서 그 메서드를 호출하면 자식 클래스에서 정의된 메서드가 호출됨

# FourCal 클래스는 위 코드의 FourCal 클래스를 사용
a = FourCal(4,0)
print(a.div)

  • 4를 0으로 나누려하기 때문에 위와 같은 오류가 발생
# 메서드 오버라이딩 Example
class SafeFourcal(Fourcal):
    def div(self):
        if self.second == 0:
            return 0
        else:
            return self.first / self.second

a = SafeFourcal(4,0)
print(a.div())

  • 오류가 발생하지 않도록 0으로 나우면 0을 반환하도록 메서드 오버라이딩한 코드

  • 오류가 발생하지 않고 0을 반환하는것을 확인할 수 있음


5. 클래스 변수

  • 객체 변수는 다른 객체의 영향을 받지 않고 독립적으로 그값을 유지함

  • 클래스 변수는 모든 객체가 공유하는 변수를 의미

class Family:
	lastname = "kim"

print(Family.lastname)

a = Family()
b = Family()

print(a.lastname)
print(b.lastname)

  • 클래스 변수는 위처럼 클래스 선언된 변수에 값을 할당하면됨

  • 클래스 변수는 위와같이 클래스 이름.클래스 변수 형식으로 사용할 수 있음

  • 위 예제에서 모든 객체가 같은 값을 공유하는 것을 확인할 수 있음 -> 같은 값, 같은 주소를 가짐

  • 일반적으론 클래스 변수보다 객체변수가 사용하는 비율이 높음


모듈

  • 모듈이란 함수나 변수 또는 클래스를 모아놓은 파일

  • 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일

1. 모듈 만들기

  • 간단한 모듈 만들기 예제
# 모듈 만들기 Example
def add(a,b):
	return a + b
    
def sub(a,b):
	retrun a - b
  • mod1.py로 저장

2. 모듈 불러오기

  • 모듈을 불러와 사용하는 방법

  • 방금 만듬 모듈 파일 mod1.py를 불러와 사용하는 방법

  • import 모듈명을 사용해서 모듈을 사용할 수 있음

import mod1

print(mod1.add(3, 4))
print(mod1.sub(4, 2))

모듈의 특정함수만 import하기

  • from 모듈명 import 함수명 형식으로 특정함수만 임포트 할 수 있음

  • 동일한 디렉토리에 있어야 모듈을 import할 수 잇음

print(add(3, 4))

  • 위와 같이 특정함수만 임포트할 수 있음, 사용 시 함수명만 사용하면됨

3. if name == "main"의 의미

# mod1.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

print(add(1, 4))
print(sub(4, 2))

  • mod1.py를 위와같이 내용을 수정하자
  • print문이 추가됨
import mod1

  • 다른 파일에서 mod1을 임포트하면 위와 같이 5 2가 출력된다.

  • import mod1을 수행하는 순간 mod1.py가 실행이되어 5 2 결괏값이 출력됨

  • 이러한 문제를 방지하려면 mod1.py를 아래와 같이 수정해야됨

# mod1.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

if __name__ == "__main__":
    print(add(1, 4))
    print(sub(4, 2))
  • 위와 같이 if __name__ == "__main__":문을 추가하면 다른 파일에서 mod1을 임포트해도 출력문이 실행되지 않음

  • mod1.py를 직접실행하면 if __name__ == "__main__":이 참이되어 출력문이 수행됨

  • mod1.py를 임포트하면 if __name__ == "__main__":이 거짓이 되어 출력문이 수행이 안됨


4. 클래스나 변수 등을 포함한 모듈

  • 모듈은 클래스나 변수등도 포함할 수 있음
PI = 3.141592

class Math:
    def solv(self, r):
        return PI * (r ** 2)

def add(a, b):
    return a + b
  • 원의 넓이를 계산하는 Math클래스, 두 값을 더하는 add 함수 그리고 원주율값 PI가 포함되어 있음
import mod2

print(mod2.PI)

a = mod2.Math()
print(a.solv(2))

print(mod2.add(mod2.PI, 4))

  • 위와같이 사용할 수 있음
profile
Backend/ DevOps를 지망하는 곽희상입니다.

0개의 댓글