python - 클라스/메소드/인스턴스/객체/ self / 클라스생성자__init__ 개념

권수민·2023년 8월 21일
1
post-thumbnail

객체지향언어를 시작하는 사람이라면 클라스, 메소드, 인스턴스, 객체 이게 다 무슨 소리야? 라는 의문을 시작으로 머리가 핑핑도는 것을 느낄것이다.

객체지향이 무엇인지 궁금한사람은 여기를 참조 :https://velog.io/@stella_k/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%96%B8%EC%96%B4%EB%9D%BC%EB%8A%94-%EC%9D%98%EB%AF%B8%EA%B0%80-%EB%AD%94%EB%8D%B0

그렇다면 알아보자.

일단 이 코드를 예로 들겠다.

>>> class BusinessCard:
        def set_info(self, name, email, addr):
                self.name = name
                self.email = email
                self.addr = addr
        def print_info(self):
                print("--------------------")
                print("Name: ", self.name)
                print("E-mail: ", self.email)
                print("Address: ", self.addr)
                print("--------------------")
                
member1 = BusinessCard()
member1 => 이것의 값은 <__main__.BusinessCard object at 0x030248F0>
member1.set_info("Yuna Kim", "yunakim@naver.com", "Seoul")

member2 = BusinessCard()
member2.set_info("Sarang Lee", "sarang.lee@naver.com", "Kyunggi")

member2.name => 'Sarang Lee'
member2.email => 'sarang.lee@naver.com'
member2.addr => 'Kyunggi'

>>>

메소드

-클래스 내부에 정의돼있는 함수 => 메서드(method)라고 한다.

-함수를 정의할떄와 마찬가지로 앞에 def키워드를 사용해 생성한다.

-클래스의 메서드는 항상 self라는 기본 인자를 하나 갖고 있어야 한다.
=> 정의할때만 필요하고 호출할때는 필요없다.

 def set_info(self, name, email, addr):
 def print_info(self):
 

self
-클래스 내부에 정의된 함수인 메서드의 첫 번째 인자는 반드시 self여야 한다.

-‘self.변수명’과 같은 형태를 띠는 변수를 인스턴스 변수라하는데, 클래스 인스턴스 내부의 변수를 의미한다.

-클래스를 정의하는 순간 생성할 인스턴스의 이름이 member1인지 모르기 때문에 self라는 단어를 대신 사용하는 것이다.

즉, self는 생성되는 인스턴스 의미하고 자동으로 값이 전달된다.

더 자세한 self에 관해서는 : https://wikidocs.net/1742
=> self를 사용할때와 사용하지 않을때 차이점. 클래스.메서드(인자)로 부를수 있고
인스턴스.메서드()로 부를수 있지만 보통은 '인스턴스.메서드'로 사용.

인스턴스

-인스턴스란 설계도(클래스)를 바탕으로 실체화되어 메모리에 할당된 실체를 말한다.

-클라스를 실제로 사용하려면 인스턴스를 생성해야한다.
(클래스 이름뒤에 ()를 붙이면 된다.)

member1 = BusinessCard()
member1 
=>프린트하면 이값이 도출 <__main__.BusinessCard object at 0x030248F0>

-이 행위는 함수를 호출하는 것과 비슷하지만 조금은 다르다.
일단 인스턴스를 생성하면 클래스의 인스턴스가 메모리의 0x0302ABB0 위치에 생성되고 card1이라는 변수가 이를 바인딩하게 된다.(파이썬에서의 대입은 바인딩을 의미)

-클래스 인스턴스를 통해 메서드를 호출하는데 "."연산자를 통해 메소드를 불러낸다.

member1.set_info("Yuna Kim", "yunakim@naver.com", "Seoul")
  • 내부의 변수인 인스턴스 변수에 접근할때도 "."를 사용한다.
    인스턴스 변수란 클래스 인스턴스 내부의 변수를 의미한다고 말씀드렸죠?
    . => 클라스 내부 안으로 들어가 '->'의미를 가졌다고 생각하면 빠를것이다.
member2.name => 'Sarang Lee'
member2.email => 'sarang.lee@naver.com'
member2.addr => 'Kyunggi'

인스턴스 및 self.관련 심화:
https://velog.io/write?id=6f5623e4-a55b-4f62-97f1-009c92e19272

객체

객체란 어떤 관점에서 보는냐에 따라 의미가 조금 달라질 수 있지만 컴퓨처 공학에서의 객체는 변수, 자료 구조, 함수, 메서드, 식별자에 의해 참조된 메모리 상의 값 등을 의미한다.

클라스를 통해 만들어진 타입들도 객체고 그 클라스 안에있는 함수도, 자료형들도 모두 객체라고 생각하면된다.

그렇다, 파이썬에서는 모든 것이 객체인것. 이는 숫자, 문자열, 리스트, 딕셔너리, 함수, 클래스 등 모든 것을 포함한다.

클라스

-클라스를 이용하면 새로운 데이터 타입(객체)을 만들 수가 있다.
=> 정수,실수,문자열,리스트,튜플... 모두 클래스를 통해서 만들어진 타입이다. 확인은 type() 해보면 각 타입 앞에 class라는 키워드가 있다는것을 알 수 있다. 다만 차이는 이미 만들어져있다는것.

def foo():
        pass
        
type(foo)
<class 'function'>

-하나의 클래스를 이용해 여러 클래스 인스턴스를 만들 수 있다. (각각 새로운 객체)
=>member1 그리고 member2 => 2개의 클래스 인스턴스 생성

-클라스 = 메소드 + 자료형(field)라고 보면된다.
=> 데이터와 데이터를 조작하는 함수를 묶어놓아 복잡한 프로그램도 더욱 쉽게 작성할 수있다.

-네이밍 컨벤션으로 클라스 이름은 Pascal(각 단어를 대문자로 구별)로 표기해야한다.

-pass 키워드를 사용하면 클래스 내부에 아무것도 넣지 않은 상태로 클래스를 정의할 수 있다.

class BusinessCard:
     pass

생성자(initializer/constructor)

생성자라는 개념은 C++나 자바 같은 객체지향 프로그래밍 언어에도 있는 개념이다.
파이썬에서는 인스턴스 생성과 동시에 자동으로 호출되는 메서드인 생성자가 존재한다.

__init__ (self) 와 같은 이름의 메서드를 생성자라고 하며, 파이썬 클래스에서 '__'로 시작하는 함수는 모두 특별한 메서드를 의미한다.

여기서 constructor(생성자)라고도 불리운다. init메소드를 이용하여 정의한 생성자를 사용할 경우, 이 생성자를 constructor라고 불리는데, 말 그대로 같은 말이라고 보면될거같다.

그전에는 인스턴스가 생성시 함수호출이 함께 이루어지지 않았는데, 이 생성자를 넣은 함수가 있다면 그 함수가 바로 인스턴스 생성시 호출되어 실행된다.즉, 초기화를 다시 시키는점. => 주로 데이터를 다시 초기화하려고 많이쓰이기 때문에 속성값이 들어가있다.

그렇기에 이번에는 인스턴스 생성시 3개의 인자를 전달해야 정상적으로 인스턴스가 생성된다. (self는 제외) => 바로 init함수를 불러 호출해 수행하기 때문에 필요한 인자가 맞게 있어야 코드 실행이 가능.

>>> class BusinessCard:
        def __init__(self, name, email, addr):
                self.name = name
                self.email = email
                self.addr = addr
        def print_info(self):
                print("--------------------")
                print("Name: ", self.name)
                print("E-mail: ", self.email)
                print("Address: ", self.addr)
                print("--------------------")
                
                
member1 = BusinessCard("Kangsan Lee", "kangsan.lee", "USA")
member1.print_info()
--------------------
Name:  Kangsan Lee
E-mail:  kangsan.lee
Address:  USA
--------------------

		

소멸자(Destructor)

소멸자(del)는 클래스의 인스턴스가 소멸될 때 자동으로 호출되는 함수이다

class Account:
num_accounts = 0
def init(self, name):
self.name = name
Account.num_accounts += 1
def del(self):
Account.num_accounts -= 1

del Account =>하면 del 로 정의된 소멸자 메소드가 호출되어 실행한 후 객체가 소멸된다.

사진 및 내용 참조 : https://wikidocs.net/3456

profile
초보개발자

0개의 댓글