[파이썬기초] 09. 객체와 클래스

일리삼·2022년 6월 5일

파이썬

목록 보기
9/10

1. 클래스의 기본

1.1 객체 지향 프로그래밍

  • 객체 지향 프로그래밍에서는 서로 관련 있는 데이터와 함수를 묶어서 객체(object)로 만들고, 이드 객체들이 모여서 하나의 프로그래밍이 됨
  • 이러한 객체들의 상호작용을 통해 프로그램을 완성함
  • 객체(object)는 속성과 동작을 가짐
    • 예를 들어, 자동차는 메이커나 모델, 색상, 연식, 가격같은 속성(attribute)을 가지며,
    • 주행할 수 있고, 방향 전환을 할 수 있고, 정지할 수 있는 등 이러한 것을 객체의 동작(action)이라고 함
    • 파이썬에서는 모든 것이 객체로 구현된다는 특징을 가짐
  • 클래스(class)란 객체에 대한 설계도로, 특정한 종류의 객체를 찍어내는데 사용
    • 클래스로부터 만들어지는 개별적인 객체를 그 클래스의 인스턴스(instance)라고 함
    • 서로 다른 인스턴스는 서로 다른 속성값을 가질 수 있음
  • 인스턴스 멤버에는 인스턴스 변수(instance variable), 멤버 변수(member variable), 혹은 필드(field)가 있으며, 각각의 인스턴스들이 개별적으로 가지는 속성을 저장하는 변수들임
    • 또한 인스턴스 메소드(instance method)도 인스턴스 내에 존재하는 함수로 멤버 중 하나에 속함

      파이썬에서는 모든 것이 객체로 구현된다.
      정수 뿐만 아니라 문자열이나 리스트 역시 객체로 구현되어 있다.

1.2 클래스 선언

  • 클래스는 객체를 좀 더 효율적으로 생성하기 위해 만들어지는 구문
class (클래스 이름):
	클래스 내용

...

(인스턴스 이름) = (클래스이름)(매개변수)

1.2.1 생성자

  • __init__(self, 추가적인 매개변수)
    • 객체를 만들 때 인스턴스 내부의 변수가 기본값을 가지도록 하는 역할을 하는 메소드
    • 객체가 생성될 때 자동으로 실행
    • 해당 함수를 클래스 내에 만들면 객체를 생성할 때 처리할 내용을 작성할 수 있음
  • 클래스 내부의 함수는 첫 번째 매개변수로 반드시 self를 입력해야함

1.2.2 메소드

  • 클래스가 가지고 있는 함수를 메소드(method)라고 부름
  • 클래스 내부에 메소드를 만들 때는 다음과 같이 사용
class (클래스이름):
	def (메소드이름)(self, 추가적인 매개변수):
    	(메소드 내용)
  • __str__(self)
    • 객체의 정보를 문자열로 반환하는 메소드
    • 보통은 객체의 정보를 표현하도록 재정의
  • 위의 두 메소드를 이용해 클래스를 만든 예제는 아래와 같다
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
        
    def __str__(self):
        return "이름은 {}이고, 나이는 {}살입니다.".format(self.name, self.age)
        
def q6():
    myDog = Dog('Mango', 3)
    print(myDog)

실행 결과

이름은 Mango이고, 나이는 3살 입니다.
  • 이렇게 만들어지는 myDog라는 객체는 Dog라는 클래스를 기반으로 만들어짐
  • 이를 상속 이라고 함

1.3 캡슐화

  • 인스턴스 변수를 외부에서 함부로 조작하는 것을 제한
  • 데이터를 보호하고 우연히 값이 변경되는 것을 방지함
  • getter와 setter를 이용해 캡슐화 구현하며, 인스턴스 변수 이름을 __<변수 이름> 형태로 선언해주면 됨
class Cat:
	def __init__(self, name, age):
    	self.__name = name
        self.__age = age
    def __str__(self):
    	return f'Cat(name='{self.__name}', age={self.__age})'
    
    def set_age(self, age):
    	if age > 0:
        	self.__age = age
   
    def get_age(self):
   		return self.__age

nabi = Cat('나비', 3)
print(nabi)
nabi.set_age(4)
nabi.set_age(-5)
print(nabi)

실행 결과

Cat('나비', 3)
Cat('나비', 4)

2. 클래스의 추가적인 구문

2.1 상속

  • 어떤 클래스를 기반으로 그 속성과 기능을 무려받아 새로운 클래스를 만드는 것을 상속이라고 함
  • 객체(인스턴스)가 어떤 클래스로부터 만들어졌는지 확인할 수 있는 함수로 isinstance()가 있음
isinstance(instance, class)
  • 이때 인스턴스가 해당 클래스를 기반으로 만들어졌다면 True, 전혀 상관이 없는 인스턴스와 클래스라면 False를 리턴함
  • 단순히 인스턴스를 확인하려면 type()을 이용해 알아볼 수도 있음
class Human:
	def __init__(self):
    	pass

class Student(Human):
	def __init__(self):
    	pass

student = Student()

print('isinstance(student, Human):', isinstance(student, Human))
print('type(student) == Human:', type(student) == Human)
  • Student 클래스는 Human 클래스를 상속받아서 만들어짐
  • isinstance()함수는 이러한 상속 관계 까지 확인하지만, 반면 type()함수는 이러한 상속관계를 확인하지 않음
    출력 결과
isinstance(student, Human): True
type(student) == Human: False

2.2 스페셜 메소드

  • 형태: __메소드이름__()
  • 보통은 직접적으로 호출되기보다 간접적으로 호출되는 메소드
  • len()이라던지 float(), int(), abs(), iter()과 같이 많은 내장함수들은 위의 특수 메소드로 구현이 가능
  • 연산자와 스페셜 메소드는 아래와 같다
x + y		__add__(self, other)
x - y		__sub__(self, other)
x * y		__mul__(self, other)
x ** y		__pow__(self, other)
x / y		__truediv__(self, other)
x // y		__floordiv__(self, other)
x % y		__mod__(self, other)
+x			__pos__(self)
-x			__neg__(self)
x < y		__lt__(self, other) # Less Then
x <= y		__le__(self, other) # Less then or Equal
x >= y		__ge__(self, other) # Greater than or Equal
x > y		__gt__(self, other) # Greater Than
x == y		__eq__(self, other) # EQual
x != y		__ne__(self, other) # Not Equal

2.3 클래스 변수

  • 클래스 변수는 class구문 바로 아래단계에 변수를 선언하기만 하면 됨
class (클래스이름):
	(클래스 변수) = ()

클래스 변수에 접근하기

(클래스이름).(변수이름)
  • 일반적인 변수로 만드나 클래스 변수로 만드나 사용에는 큰 차이가 없으나 '클래스가 가진 기능'을 명시적으로 나타내서 변수를 만든다는 것이 포인트
  • 뿐만 아니라 인스턴스 변수들 중에서 클래스가 공유해야 할 공통적인 속성이 있을 경우 사용

3. 가비지 컬렉터

>>> n = 100
>>> id(100)
4509016272
>>> id(n)
4509016272
>>> m = n
>>> id(m)
4509016272
>>> n = 200
>>> id(n)
4509015680
>>> n = n+1
>>> id(n)
4509016346
  • 변수명이란 객체에 대한 참조명이고, 100이라는 객체를 n이라는 이름의 변수를 통해서 접근
    • 최초 상태의 n은 100을 참조하고 있으며, m=n을 통해 m 역시 동일한 객체를 참조
    • n=200 을 통해 m과 n이 다른 개체를 참조하며, n = n+1를 통해 새롭게 할당된 n은 이전의 n과 서로 다른 객체를 참조한다는 것을 확인할 수 있음
  • n이 참조하고 있는 정수형 객체가 변경 불가능(immutable) 속성으로 정의되어 있음
  • 더이상 이 객체를 참조하는 변수가 존재하지 않으므로 메모리 낭비를 초래
    • 메모리상에 존재하는 객체 중에서 참조가 사라져서 더이상 참조할 방법이 없는 객체를 가비지(garbage)라고 부름
    • 주기적으로 이러한 가비지를 정리하는 메모리 관리 절차를 가비지 수집(garbage collection)이라고
profile
코린이의 취준 자취 기록장

0개의 댓글