Back-End/Python

class

pshoon25 2022. 12. 7. 17:01

이전 글은 여러 번 반복하여 사용하는 코드를 '함수'로 정의하여 사용하는 것을 배웠다.

 

이번에는 변수메소드를 한 번에 다룰 수 있는 객체(Object)클래스(Class)에 대해 알아보자.


객체(Object)란 무엇일까 ?

 

객체의 언어적 뜻은 물건, 물체 라는 뜻이다.

현실 세계에서 객체는 사람일수도 있고, 책상, 의자 같은 물건이 될 수도 있다.

 

객체구성요소는 속성과 기능이다.

속성이란 상태 및 특징을 의미하고,

기능이란 동작 및 행동을 의미한다.

 

자동차를 예로 들면, 

속성은 색상, 무게, 회사 등이 될 수 있고,

기능은 전진, 후진, 정지 등이 될 수 있다.

 

프로그래밍에서

속성은 변수로

기능은 메소드(method)로 나타낸다. 

즉, 객체는 변수와 메소드의 묶음이다.

 

파이썬에서는 이러한 객체를 만들고 이용할 수 있는 기능을 제공한다.

이러한 기능을 제공하는 프로그래밍 언어를 객체 지향 프로그래밍 (Object - Oriented Programming. OOP) 또는 객체 지향 언어라고 한다.


그렇다면 클래스(Class)는 무엇일까 ?

 

클래스는 객체의 공통된 속성과 기능을 변수와 메소드로 정의한 것이다.

클래스는 객체를 만들기 위한 기본 틀이고 객체는 기본 틀을 바탕으로 만들어진 결과이다.

 

예를 들어,

동물이라는 클래스를 생성할 때,

속성은 종류, 성별, 무게 등으로 되며,

기능은 울음 소리, 보행 방법, 용변 방법 등이 될 수 있다.

 

고양이, 강아지, 너구리, .. 등이 객체가 되는 것이고,

고양이의 속성은 '고양이과 동물', '암컷', '3.6kg',

고양이의 기능은 '야옹', '사족보행' 등이 될 수 있다.

 

객체는 클래스에서 생성하므로 객체를 클래스의 인스턴스(Instance)라고 한다.


🔎클래스는 파이썬에서 어떻게 작성해야 하는지 알아보자 !🔎

 

클래스(Class)생성자, 변수, 메소드 로 구성된다.

class <클래스명> :
    -생성자                 # 변수 초기화 : 변수에 값을 초기화 하는 역할
    -변수(인스턴스 변수)       # 데이터 저장
    -메소드(인스턴스 메소드)    # 변수값 변경, 조회, 등 변수의 데이터 값을 다루는 역할

 

 

우선, 생성자 부터 알아보자.

class Pet:
    def __init__(self):     # 생성자 : __init__ 모든 클래스에서 사용되는 생성자의 이름
        print('__init__생성자')

# 생성자 호출
p = Pet()   # 객체 생성(인스턴스화) : 객체 생성하면 _생성자 : _init__이 호출 된다.

 

생성자의 시작은 def __init__(self): 로 시작되며,  모든 클래스에서 사용되는 생성자의 이름이다.

__init__()는 초기화 함수이며, 객체를 생성하는 것과 동시에 속성 값을 지정할 수 있다.

초기화 함수는 클래스의 객체가 생성될 때 자동으로 실행되기 때문에 속성을 초기화 할 수 있다.

 

생성자 안에는 객체의 속성을 추가할 수 있다.

즉, 인스턴스 변수를 지정할 수 있다는 것이다.


변수(인스턴스 변수)를 보자 !

 

예를 들어,

Pet이라는 클래스가 존재한다.

Pet의 속성은 '종', '성별', '무게'를 가지고 있다고 하면,

인스턴스 변수는 '종', '성별', '무게' 세 가지가 되며 생성자 안에 인스턴스 변수로 선언 된다.

# 생성자 안에 인스턴스 변수 선언_(username, userage)
class Pet:
    def __init__(self, species, sex, weight):          # 생성자는 변수를 초기화 해준다. 
        self.animalSpcies=species                      # 인스턴스 변수
        self.animalSex=sex                             # 인스턴스 변수
        self.animalWeight=weight

# 생성자 호출
cat = Pet('Sham', 'female', '3.5kg')                   # 객체 생성 파라미터에 species, sex, weight 값 입력
print("종:{} 성별:{} 무게 :{}".format(cat.animalSpcies, cat.animalSex, cat.animalWeight))     # 클래스 접근은 변수.(cat.) 으로 접근한다. 
# 출력값
# 종:Sham 성별:female 무게 :3.5kg

여기서 cat는 클래스(Class)에 포함되는 하나의 객체가 된 것이다 !

*인스턴스 변수는 생성자 안에 추가되며 함수 호출시 인자값을 인스턴스 변수로 전달할 수 있다.

 

🤚여기서 잠깐 !

클래스 내에서 변수는 세 가지가 있다.

class <클래스명> :
    <클래스 변수>                          # 클래스 변수 : 임의의 메모리에 저장
    def __init__(self, <로컬 변수>) :      # 로컬 변수 : Stack 메모리에 저장
        self.<인스턴스 변수> = <value>      # 인스턴스 변수 : heap 메모리에 저장
  1. 클래스 변수 : 프로그램 실행할 시 생성 → 프로그램 종료시 소멸
    1. 용도 : 데이터 누적 용
  2. 로컬 변수 : init (함수) 호출시 → 함수 종료시 소멸
    1. 임시적인 data 저장용
  3. 인스턴스 변수 : 객체 생성시 생성 → 객체 소멸시 소멸

위의 세 가지 속성은 꼭 알고 가자 !


메소드(Method)

클래스에서 정의할 수 있는 메소드는 아래 세 가지가 있다.

- 인스턴스(Instance) 메소드 : 각 객체에서 개별적으로 동작하는 함수를 만들고자 할 때 사용하는 함수

- 정적(Static) 메소드 : 객체와 관계 없이 독립적으로 동작하는 함수를 만들때 주로 이용

- 클래스(Class) 메소드 : 생성된 객체의 개수를 반환하는 등 클래스 전체에서 관리해야할 기능이 있을때 주로 이용

 

인스턴스(Instance) 메소드

# 생성자 안에 인스턴스 변수 선언_(username, userage)
class Pet:
    def __init__(self, species, sex, weight):          # 생성자는 변수를 초기화 해준다. 
        self.animalSpcies=species                      # 인스턴스 변수
        self.animalSex=sex                             # 인스턴스 변수
        self.animalWeight=weight                       # 인스턴스 변수
        print("종:{} 성별:{} 무게 :{}".format(self.animalSpcies, self.animalSex, self.animalWeight))

    def jump(self, height):
        self.animalHeight = height
        print(f'점프 높이 : {self.animalHeight}')
# 생성자 호출
cat = Pet('Sham', 'female', '3.5kg')                   # 객체 생성 파라미터에 species, sex, weight 값 입력
cat.jump(100)                                          # 메소드 height에 값 입력
dog = Pet('Maltese', 'male', '7kg')
dog.jump(35)

# 출력값
# 종:Sham 성별:female 무게 :3.5kg
# 점프 높이 : 100
# 종:Maltese 성별:male 무게 :7kg
# 점프 높이 : 35
⭐️ Parameter 안에 self에 대하여,
- 인스턴스 메소드는 함수를 정의할 때 첫 인자로 self가 필요하다.

- self는 클래스의 인스턴스(객치) 자신을 가리킨다.
- 인스턴스 메소드에서는 self를 이용해 인스턴스 변수를 만들고 사용한다.
- 인스턴스 메소드 안에서 'self.함수명()' 형식으로 클래스 내의 다른 함수를 호출할 수 있다.

정적 메소드(Static method) → 객체와 관계 없이 독립적으로 동작하는 함수를 만들때 주로 이용

정적 메소드는 클래스와 관련이 있어서 클래스 안에 두기는 하지만 클래스나 클래스의 인스턴스(객체)와는 무관하게 독립적으로 동작하는 함수를 만들고 싶을 때 이용하는 함수이다.

함수를 정의할 때 인자로 self를 사용하지 않으면 정적 메소드 안에서는 인스턴스 메소드나 인스턴스 변수에 접근할 수 없다.

 

정적 메소드의 기본 구조는 아래와 같다.

class <클래스명>() :
	@staticmethod
    def <함수명>() :
        <코드 블록>

정적 메소드, 클래스 메소드를 사용하기 위해서는 데코레이터(@, Decorator)가 필요하다.

@staticmethod 를 선언해 정적 메소드임을 표시한다.

그 후, 함수를 작성하면 된다.

*정적 메소드에서는 함수 인자의 self를 사용하지 않는다.


클래스 메소드 (Class method) → 클래스 전체에서 관리해야할 기능이 있을때 주로 이용

클래스 메소드는 클래스 변수를 사용하기 위한 함수이다.

 

클래스 메소드의 기본 구조는 아래와 같다.

class <클래스명>() :
	@classmethod
    def <함수명>(cls,) :
        <코드 블록>

@classmethod를 선언해 클래스 메소드임을 표시한다.

클래스 메소드는 함수를 정의할 때 첫 번째 인자로 클래스를 넘겨받는 cls가 필요하며 이를 이용해 클래스 변수에 접근한다.


🔎이제 마지막으로 상속에 대하여 알아보자 !

 

클래스는 다른 클래스 안에 포함이 될 수 있다.

 

예를 들어, 

Pet 이라는 클래스가 있고, Cat, Dog, ...의 클래스가 존재한다고 가정하면,

Cat 과 Dog 의 속성 및 기능에는 공통되는 부분이 있을 것이다.

이러한 공통되는 부분을 Pet 클래스에 추가하고 Cat, Dog의 클래스는 Pet 클래스의 속성 및 기능을 상속 받아 사용하는 것이다.

Pet 클래스는 부모 클래스가 되는것이고, Cat, Dog 클래스는 자식 클래스가 되는것이다.

 

class Pet:                                   # Dog와 Cat 클래스의 공통적인 속성과 기능을 제공
    def __init__(self, name, age):           
        self.name = name
        self.age = age
    def cry(self) :
        return 'cry'

class Dog(Pet):                               # 상속 방법 : 클래스명(부모 클래스) 기입
    def __init__(self, name, age, species):
        super().__init__(name, age)           # 부모 클래스의 생산자를 가져올 경우, super()을 사용
        self.species = species
    def cry(self) :
        super().cry()
        return '멍멍'

class Cat(Pet):
    def __init__(self, name, age, sex):
        super().__init__(name, age)
        self.sex = sex
    def cry(self) :
        super().cry()
        return '야옹'


d = Dog("망치", 2, "불독")
print("강아지 이름:{}    나이:{}   성별:{}".format(d.name, d.age, d.species))
print(d.cry())

c = Cat("야옹이", 2, "암컷")
print("고양이 이름:{}    나이:{}   성별:{}".format(c.name, c.age, c.sex))
print(c.cry())

# 출력값
# 강아지 이름:망치    나이:2   성별:불독
# 멍멍
# 고양이 이름:야옹이    나이:2   성별:암컷
# 야옹

Cat과 Dog 클래스의 속성 중 name, age가 공통 된다고 가정하자.

그러면 공통되는 속성을 부모 클래스 Pet에 인스턴스 변수로 추가를 한다.

 

자식 클래스에서 부모 클래스의 속성을 상속받기 위해서

1. 클래스명 괄호에 부모 클래스를 기입해야 한다. (class Dog(pet) : )

2. 부모 클래스의 생산자를 가져올 경우, super()함수와 초기화 함수를 사용한다. (super().__init__(name, age) )

3. 부모 클래스의 생산자가 아닌 인자를 가져올 경우, super()함수와 가져올 <함수명>을 입력해주면 된다.

*추가로, 부모 클래스에서 상속받은 return값을 자식 클래스에서 return을 변경하여 사용할 수 있다.

 

클래스 사용시 인자값을 입력해주면 부모 클래스로부터 상속을 받아 사용을 할 수 있게 된다!

 

객체와 클래스를 사용하는 이유는 코드 작성 및 관리가 편리하기 때문이다 !

코드 내용이 길 경우에는 내용이 복잡해지기 때문에 클래스와 객체를 사용하여 관리하는 것이 용이하다.

 

객체와 클래스에 대해 잘 이해하고 있으면 코드를 효율적으로 작성할 수 있고, 라이브러리를 활용하는데 도움이 될 것이다.

 

💪꼭 알아 두도록 하자 !💪

'Back-End > Python' 카테고리의 다른 글

PyAutoGUI  (2) 2022.12.21
try, except, finally  (0) 2022.12.08
def  (0) 2022.12.05
for, while  (2) 2022.11.27
if  (0) 2022.11.27