티스토리 뷰
📌 객체와 클래스
클래스는 객체에서 사용되는 속성(자료구조)과 메서드를 정의해 묶어준 것을 의미한다. 클래스가 설계도, 객체는 그 설계를 바탕으로 실체화한 것이라고 볼 수 있다. 객체는 인스턴스라고도 부른다.
객체 지향 프로그래밍은 복잡한 문제를 잘게 나누어 객체로 만들고, 객체를 조합하여 문제를 해결한다. 따라서 복잡한 문제를 처리하는 데에 유용하다.
📍 객체 : 클래스로부터 생성되어 클래스의 속성(자료구조)과 메서드를 가진다
📍 클래스 : 객체에서 사용될 속성과 메소드를 정의한 틀
📍 속성 : 클래스와 객체에서 사용되는 변수(자료구조). 멤버 변수라고 부른다.
📍 메서드 : 클래스와 객체에서 사용되는 함수. 멤버 메서드라고 부른다. (매개변수 self를 필수로 가진다)
📍 클래스 내부의 함수는 일반 함수와 구분하기 위해 메서드라고 부른다.
📍 파이썬은 완벽한 객체 지향 언어는 아니다.
👉 클래스 정의와 사용
class 클래스명 :
클래스 변수
def 메서드(self) :
코드
✔ 클래스는 여러 자료구조와 메서드를 묶어준다.
✔ 클래스 이름을 짓는 방법은 변수와 동일하다. 클래스명은 대문자로 시작한다.
✔ 메서드의 첫번째 매개변수는 반드시 self로 지정한다.
class Person :
num = 100
def hello(self) :
print('Hello ')
#메인 루틴
p1 = Person()
print(p1.num) #100
p1.hello() #Hello
✔ 클래스를 위와 같이 생성한 후, 메인 루틴에서 사용하고자 하는 클래스의 객체(인스턴스 변수)를 만든다.
✔ 클래스의 멤버 변수나 메서드에 접근할 때에는 객체명과 . 을 사용한다.
class Person :
num = 100
def __init__(self, name) :
self.name = name
def hello(self) :
print('Hello ',self.name)
#메인 루틴
p1 = Person('짱구')
print(p1.num) #100
p1.hello() #Hello 짱구
✔ __init__ 메서드는 객체를 생성할 때 호출하는 메서드를 말한다. 생성 시 호출된다고 해서 생성자라 부른다.
👉 생성자
class Person :
num = 100
#생성자를 정의하지 않은 경우, 기본 생성자가 자동 생성
# def __init__(self) :
# pass
def hello(self) :
print('Hello ')
#메인 루틴
p1 = Person()
print(p1.num) #100
p1.hello() #Hello
✔ 따로 생성자를 정의해주지 않으면 기본 생성자가 사용된다. 기본 생성자는 매개변수로 self만을 가진다.
✔ 기본 생성자를 사용하는 경우 객체 생성 시 클래스에 인수를 전달할 필요가 없다.
class Person :
num = 100
def __init__(self, name) :
self.name = name
def hello(self) :
print('Hello ',self.name)
#메인 루틴
p1 = Person('짱구')
print(p1.num) #100
p1.hello() #Hello 짱구
✔ __init__ 메서드는 객체를 만들 때 호출된다. 객체 생성 시 호출된다고 해서 생성자라고 한다.
✔ self는 말하자면 생성된 객체 자기 자신을 의미한다.
✔ 메인 루틴에서는 객체명과 .을 사용해서 멤버 변수나 메서드에 접근하는 것처럼
✔ 클래스 내부에서는 self 라는 키워드를 사용해 객체가 가진 멤버 변수나 메서드에 접근한다. (예) self.name
✔ 위와 같이 생성자를 통해 매개변수 name에 값을 받아와 self 키워드를 사용, 멤버 변수를 생성할 수 있다.
✔ 이렇게 객체 생성 시에 받아온 인수로 만든 객체마다 다른 값을 가지는 멤버 변수를 인스턴스 변수라고 한다.
def __init__(self, *args) :
args_list = []
for i in args :
list.append(i)
✔ 생성자 오버로딩이 가능한 다른 프로그래밍 언어와 달리 파이썬은 __init__ 메서드를 여러 개 가질 수 없다.
✔ 오버로딩을 구현하고자 한다면 매개 변수를 여러 형태로 받아올 수 있도록 가변 인자를 사용하고
✔ 조건문을 통해 분기점을 지정하는 형태로 구현할 수 있을 것 같다.
👉 멤버 변수의 종류 : 클래스 변수와 인스턴스 변수
1. 클래스 변수
class Person :
num = 100
def __init__(self, name) :
self.name = name
def hello(self) :
print('Hello ',self.name)
def print_num(self) :
print(Person.num)
#메인 루틴
p1 = Person('짱구')
p1.hello() #Hello 짱구
p1.print_num() #100
p2 = Person('유리')
p2.hello() #Hello 유리
p2.print_num() #100
✔ 클래스 변수는 예제에서의 num을 말한다.
✔ 클래스 변수를 클래스 내부에서 사용할 때는 클래스명과 함께 사용한다 (예) Person.num
✔ 하나의 클래스에 여러 객체가 생성되었어도, 객체끼리 공유하는 변수를 의미한다.
✔ 객체 모두가 공유해야 하므로, 클래스 내부의 전역 변수로 생성한다.
2. 인스턴스 변수
class Person :
num = 100
#self.name = name
def __init__(self, name) :
self.name = name
def hello(self) :
print('Hello ',self.name)
def print_num(self) :
print(Person.num)
#메인 루틴
p1 = Person('짱구')
p1.hello() #Hello 짱구
p1.print_num() #100
p2 = Person('유리')
p2.hello() #Hello 유리
p2.print_num() #100
✔ 위와 같이 생성자를 통해 매개변수 name에 값을 받아와 self 키워드를 사용, 멤버 변수를 생성할 수 있다.
✔ 이렇게 객체 생성 시에 받아온 인수로 만든 객체마다 다른 값을 가지는 멤버 변수를 인스턴스 변수라고 한다.
✔ 인스턴스 변수 또한 해당 객체 내부에서 전역 변수로 사용되므로, 생성 위치는 클래스 변수와 같다. (주석 참고)
✔ 하지만 객체가 달라도 동일 값을 공유하는 클래스 변수와는 다르게 인스턴스 변수는 객체마다 다른 값을 가진다.
👉 메서드의 종류
1. 인스턴스 메서드
class Myclass :
num = 10
def print_num(self) :
print(Myclass.num)
✔ 인스턴스 객체에 속한 메소드를 의미한다.
✔ 객체를 사용해 호출하고, self 매개변수를 사용한다.
✔ 객체가 생성되어야지만 사용 가능하다.
✔ 별다른 키워드가 필요하지 않다.
2. 정적 메서드 @staticmethod
class Myclass :
num = 10
@staticmethod
def print_num_s() :
print(Myclass.num*2)
✔ @staticmethod 를 붙여 정적 메서드임을 명시한다. 단지 편의를 위해서만 사용한다.
✔ 클래스로만 호출 가능하며, 매개 변수가 없다.
3. 동적 메서드 @classmethod
class Myclass :
num = 10
@classmethod
def print_num_c(cls) :
print(Myclass.num*10)
✔ @classmethod 를 붙여 동적 메서드임을 명시한다.
✔ 클래스로 호출 가능하며, cls 매개 변수를 사용한다.
👉 클래스의 멤버 변수 / 메서드 비교
멤버 변수 |
클래스 변수 | class명.변수명 | 객체들이 서로 공유 | 인스턴스/클래스 모두 사용 |
인스턴스 변수 | self.변수명 | 객체마다 다른 값 | 인스턴스만 사용 각각의 인스턴스 공간에 생성 |
|
메서드 | 인스턴스 메소드 | def 메소드명(self, 매개변수) | 인스턴스만 사용 | 인스턴스/클래스 변수에 접근 가능 |
정적 메소드 | @staticmethod def 메소드명(매개변수) |
인스턴스/클래스 사용 | 인스턴스/클래스 변수에 접근 불가능 | |
동적 메소드 | @classmethod def 메소드명(cls, 매개변수) |
클래스만 사용 | 클래스 변수에 접근 가능 (객체 생성 없이 클래스 변수 사용하기 위함) |
💬 메서드의 차이에 대해서는 아직 잘 모르겠다.
💬 파이썬 코딩도장 Unit35를 참고하자 : dojang.io/mod/page/view.php?id=2378
👉 접근 지정자
✔ 파이썬에서는 모든 멤버의 접근 지정자 기본값이 public이다.
✔ 외부에서의 직접적인 접근을 막고 메서드를 통한 간접 접근을 허용하고 싶다면 private 멤버로 생성해야 한다.
class Test :
def __init__(self, a, b) :
self.n1 = a
self.__n2 = b
def print_number(self) :
print(self.n1, self.__n2) # private 멤버는 내부 접근만 가능하다
test = Test(10,20)
print(test.n1) #10
#print(test.__n2) #error 발생 : private 멤버는 외부 접근이 불가능하다
test.print_number() #10 20
✔ private 멤버 : 클래스 내부에서만 접근이 가능한 멤버. 메서드를 통한 간접 접근만 가능하다.
✔ public 멤버 : 클래스 내부, 외부 모두에서 접근이 가능한 멤버
✔ private멤버는 접두사 __를 사용해 명시한다. 다만, 접미사는 언더바를 1개까지만 사용할 수 있다.
✔ 언더바를 2개 사용하면 특별 메서드로 인식하기 때문에 주의가 필요하다.
[참고] 엘리스 트랙-혼자 공부하는 파이썬 / 길벗-파이썬 코딩 도장 / 엘리스 트랙 - 예제 중심의 파이썬 입문 / 위키백과
'BackEnd > Python' 카테고리의 다른 글
[파이썬 기초] 05-3. 상속과 추상 클래스 (0) | 2021.03.23 |
---|---|
[파이썬 기초] 05-2. 특수 메서드 (매직 메서드) (0) | 2021.03.23 |
[파이썬 기초] 03-1. 내장 함수 사용하기(o-z) (0) | 2021.03.22 |
[파이썬 기초] 03-1. 내장 함수 사용하기(f-m) (0) | 2021.03.22 |
[파이썬 기초] 03-1. 내장 함수 사용하기(a-e) (0) | 2021.03.22 |