객체지향언어를 시작하는 사람이라면 클라스, 메소드, 인스턴스, 객체 이게 다 무슨 소리야? 라는 의문을 시작으로 머리가 핑핑도는 것을 느낄것이다.
객체지향이 무엇인지 궁금한사람은 여기를 참조 :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