본문 바로가기
프로그래밍/파이썬

[파이썬] 객체(object) 개념 정리 ( 신원/타입/속성/메소드/클래스/OOP)

by 오 복 이 2022. 1. 9.

파이썬 프로그램에서 모든 데이터는 객체(object)라는 개념을 사용하여 저장됩니다.

가장 기본이 되는 데이터 타입인 숫자, 문자열, 리스트, 사전은 다 객체입니다.

클래스를 사용해서 사용자 정의 객체를 생성할 수도 있습니다.

또한 프로그램의 구조와 인터프리터의 내부 동작과 관련된 객체들도 있습니다

 

객체(object)

프로그램에서 저장되는 모든 데이터는 객체입니다.

각 객체는 신원(identity), 타입(클래스라고도 함)과 값을 가집니다.

 

객체의 신원(identity)

객체가 메모리에 저장된 위치를 가리키는 포인터라고 생각할 수 있습니다.

예)  a= 25라고 쓰면

25라는 값을 갖는 정수 객체가 생성되고

a는 그 위치를 가리키는 이름

 

객체의 타입(클래스)

객체의 내부적인 표현 형태와 객체가 지원하는 메서드 및 연산들을 설명합니다

특정 타입의 객체가 생성되면 그 객체를 그 타입의 인스턴스(instance)라고 부릅니다.

인스턴스가 일단 생성되면 그 인스턴스의 신원과 타입을 변경할 수 없습니다.

 

객체의 값을 변경할 수 있으면 그 객체는 변경 가능 (mutable)하다고 하고

값을 변경할 수 없으면 변경 불가능(immutable)하다고 합니다.

다른 객체에 대한 참조들을 담는 객체를 컨테이너(container) 혹은 컬랙션(collection)이라고 부릅니다.

 

객체의 속성(attribute)와 메서드(method) 

 

객체는 대부분 몇개의 속성과 메서드로 특정 지어집니다.

속성(attribute) 객체에 연결된 값이고

메서드(method) 호출될 때 객체에 대해 특정 연산을 수행하는 함수입니다.

다음 예에서 보듯이  속성과 메서드에는 점(.) 연산자를 사용해서 접근할 수 있습니다.

a = 3 + 4j     #복소수 생성
r = a.real     #실수부(속성) 얻기


b = [1, 2, 3]  #리스트 생성
b.append(5)    #메서드로 새로운 원소를 추가

 

문자열과 리스트 같은 내장 타입이 객체이고 사용할 수 있는 함수들이 메서드입니다

dir( )함수: 객체가 제공하는 메서들들을 나열

dir 함수 사용 예시

items = [32,42]
dir(items)

결과

 

 

이 밖에도 항상 이중 밑줄로 시작하고 끝나는 특수한 메서드들이 있습니다. (Magic method)

이 메서드들은 언어상에서 제공하는 다양한 연산자를 구현합니다.

예) __add__() 메서드는 +연산자를 구현

items = [37, 42]
items.__add__([73,101])

결과

 

 

객체 신원과 타입 확인하기

id() : 내장 함수로 객체의 신원을 나타내는 정수를 반환. 보통 이 정수는 객체의 메모리 상의 위치를 나타냅니다

is 연산자 :  두 객체의 신원을 비교

 

두 객체를 비교하는 여러 가지 방법

# 두 객체를 비교
def compare(a,b):
    if a is b:            #a와 b는 동일한 객체이다
        pass
    if a == b:            #a와 b는 동일한 값을 갖는다
        pass
    if type(a) is type(b): #a와 b는 동일한 타입이다
        pass

객체의 타입 = 객체의 클래스이고 그 자체도 객체입니다

이 객체는 고유하게 정의되기 때문에 주어진 타입의 모든 인스턴스에 대해서 항상 동일합니다

따라서 타입은 is 연산자로 비교할 수 있습니다. 모든 타입 객체는 타입 검사에 쓰일 수 있는 이름을 갖습니다.

이 이름들은  list, dict, file처럼 대부분 내장된 이름입니다.

type 사용하여 타입 검사

if type(a_list) is list:
    a_list.append(item)

if type(b_dict) is dict:
    b_dict.update(item)

타입은 클래스를 통해 특수화(specialization)가 가능하기 때문에

내장 함수인 isinstance(object, type)을 사용하여 타입을 검사하는 것이 좋습니다.

isinstance 사용하여 타입 검사

if isinstance(a_list, list):
    a_list.append(item)

if isinstance(b_dict, dict):
    b_dict.update(item)

 

 

 

class문 - 객체 지향 프로그래밍(OOP: Object-Oriented Programming)

class문은 새로운 객체 타입을 정의하며 객체지향 프로그램을 작성하는데 쓰입니다.

예를 들어 다음 클래스는 push(), pop(), length()  연산자를 갖는 간단한 스택을 정의합니다.

class를 사용한 Stack 클래스 정의하기

class Stack (object):
    def __init__ (self):    #스택을 초기화
        self.stack = [ ]
        
    def push (self, object):
        self.stack.append(object)
        
    def pop(self):
        return self.stack.pop()
    
    def length(self):
        return len(self.stack)

 

첫 번째 줄에서 class Stack(object)는 Stack을 object로 선언

파이썬에서는 괄호로 상속 관계를 기술합니다

이 코드의 Stack은 모든 파이썬 타입의 루트인 object로부터 상속을 받습니다.

클래스 정의에서 메서드는 def문으로 정의됩니다.

각 메서드의 첫 번째 인수는 항상 객체 자기 자신을 가리킵니다. 관습적으로 이 인수의 이름으로 self를 사용합니다.

객체의 속성과 관련된 연산에서는 명시적으로 self 변수를 참조해야 합니다.

시작과 끝이 이중 밑줄인 메서드는 특수 메서드(Magic Method)입니다.

예를 들어 __init__은 객체가 생성된 후 초기화를 위해 사용됩니다.

 

클래스는 다음과 같이 사용합니다.

위에서 구현한 Stack class 사용법

s = Stack()          #스택을 생성
s.push("apple")      #스택에 삽입
s.push("banana")    
s.push([1,2,3])         
x = s.pop()         #x는 [1, 2, 3]
y = s.pop()         #y는 banana
del s               #s를 파괴

 

 

앞의 예에서 스택을 구현하기 위해 완전히 새로운 객체를 생성했습니다

하지만 스택은 내장 리스트 객체와 거의 동일합니다.

따라서 다음과 같이 list에서 상속받고 메서드를 하나 추가해서 스택을 구현할 수도 있습니다

list를 상속받은 stack class

class Stack(list):
    #스택 인터페이스에 push() 메서드를 추가
    # 리스트에는 이미 pop() 메서드가 있음
    
    def push (self, object):
        self.append(object)

 

 

파이썬 완벽 가이드(데이비드 M. 비즐리(저),인사이트송인철,(역)인사이트) 를 읽고 요약,정리한 글입니다.

728x90
반응형