객체
속성 + 동작
클래스에서 정의한 것을 토대로 메모리에 할당된 것
프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간
변수, 자료구조, 함수 또는 메서드
클래스
클래스 작성법
class 클래스명(대문자로 시작, 단어가 바뀌면 다시 대문자) :
class MyClass:
pass
class Student :
pass
객체(인스턴스) 생성
클래스이름() : 생성자 호출
클래스를 작성하고 나면 클래스를 이용해서 객체(인스턴스)를 생성할 수 있다.
s1 = Student()
Student 클래스로 객체를 생성해서 객체 주소값을 변수s1에 할당하였다.
s1은 인스턴스의 주소를 가진 변수지만, 인스턴스를 지칭할 수 있는 것이 이 변수밖에 없기 때문에 s1을 Student 클래스의 인스턴스라고 부를 수 있다.
s1은 Student클래스에 선언한 특징(속성, 메서드)를 가지고 있다.
'.' 을 이용해서 대상.속성은 대상의 속성을 가져오는 것처럼 s1.으로 s1의 속성값, 메서드를 이용할 수 있는데,
현재 Student 클래스에 선언된 속성이 없기 때문에 이용할 것이 없다.
인스턴스 변수
class Student:
def __init__(self,name,age,score):
self.age=age
self.name=name
self.score=score
클래스에 속성을 작성하였다.
__init__메서드는 생성자(Constructor)로 생성자 안에 생성하려는 속성을 작성하면된다.
실제로 각각의 인스턴스(학생)는 다른 속성을 가질 수 있고, 인스턴스마다 다른 값을 가지는 것은 인스턴스변수로 저장한다.
self는 만들어진 인스턴스를 지칭하는 것이고, self.변수는 인스턴스마다 다른 값을 가질 수 있는 인스턴스 변수이다.
(self, name, age, score) 에서 name, age, score은 매개변수일 뿐이다. 받아온 변수 값을 인스턴스 변수에 할당하는 것이다.
s1 = Student()
#TypeError: __init__() missing 3 required positional arguments: 'name', 'age', and 'score'
생성자에 매개변수를 설정하면 객체를 만들 때 매개변수에 맞는 인자를 모두 설정해주어야 한다.
__init__ 메서드에 설정된 인자 name, age, score가 존재하지 않기 때문에 오류가 발생한다.
s1 = Student('홍길동',20,100)
print(s1.name) #홍길동
print(s1.age) #20
print(s1.score) #100
s2 = Student('김철수',22,70)
print(s2.name) #김철수
print(s2.age) #22
print(s2.score) #70
생성자에 필요한 모든 인자를 넣어주면 객체(인스턴스)가 생성된다.
각각의 인스턴스는 각각의 인자들을 가지고 인스턴스변수를 설정하게 된다.
클래스 변수
학생들이 이름, 나이, 점수는 각각의 다른 값을 가질 수 있기 때문에 인스턴스변수로 관리했다.
학생들이 공통으로 가지고 있는 속성도 있을 텐데 이것을 모두 하나씩 할당하면 같은 코드가 중복된다.
인스턴스마다 별도로 가지는 데이터가 아닌, 공통적으로 가지는 데이터는 클래스변수로 선언할 수 있다.
class Student:
school = '땡땡고등학교'
def __init__(self,name,age,score):
self.age=age
self.name=name
self.score=score
클래스 변수는 클래스 내부에 선언한다.
print(Student.school) #땡땡고등학교
print(s1.school)#땡땡고등학교
print(s2.school)#땡땡고등학교
클래스변수는 공통값으로 인스턴스가 존재하지 않더라도 사용할 수 있고, 인스턴스로도 클래스변수에 접근가능하다.
클래스변수는 클래스명.클래스변수 처럼 클래스 접근 방식이 선호된다.
메서드
클래스 내부에서 데이터를 활용해 동작하는 함수
인스턴스 메서드 : 인스턴스 변수를 활용
클래스 메서드 : 클래스 변수를 활용
static 메서드 : 인스턴스 변수, 클래스 변수를 활용하지 않는 함수
클래스 메서드, 클래스 변수는 인스턴스가 없어도 사용가능하기 때문에 인스턴스 변수를 사용할 수 없다.
인스턴스가 생성되지 않더라도 클래스 메서드, 클래스 변수는 존재하기 때문에 인스턴스 메서드에서는 클래스 변수를 활용할 수 있다.
인스턴스메서드
class Student:
school = '땡땡고등학교'
def __init__(self,name,age,score):
self.age=age
self.name=name
self.score=score
def say_hello(self):
print(f'안녕하세요 저는 {self.age}살 {self.name}입니다.')
인스턴스 메서드, 인스턴스 변수는 인스턴스가 생성 된 이후 사용가능하다.
인스턴스 메서드는 인스턴스를 의미하는 self가 첫번째 인자로 고정된다.
클래스 내에서 인스턴스 변수, 인스턴스 메서드를 사용하기 위해서는 항상 self. 형태로 사용한다.
s1.say_hello() #안녕하세요 저는 20살 홍길동입니다.
인스턴스메서드는 인스턴스.메서드로 사용한다.
class Student:
school = '땡땡고등학교'
def __init__(self,name,age,score):
self.age=age
self.name=name
self.score=score
def say_hello(self):
print(f'안녕하세요 저는 {self.age}살 {self.name}입니다.')
print(f'{Student.school}학교에 다닙니다.')
인스턴스 메서드에서 클래스명.클래스변수로 클래스 변수에 접근할 수 있다.
클래스 변수 school을 사용하기 위해서 Student.school 처럼 클래스명을 이용해야 한다.
클래스명 없이 school으로 접근하면 오류가 발생한다.
s1.say_hello()
#안녕하세요 저는 20살 홍길동입니다.
#땡땡고등학교학교에 다닙니다.
클래스메서드
class Student:
school = '땡땡고등학교'
student_cnt=0
def __init__(self,name,age,score):
self.age=age
self.name=name
self.score=score
Student.plus_student_cnt
def say_hello(self):
print(f'안녕하세요 저는 {self.age}살 {self.name}입니다.')
print(f'{Student.school}학교에 다닙니다.')
@classmethod
def plus_student_cnt(cls):
cls.student_cnt+=1
클래스메서드는 @classmethod 데코레이터로 구분한다.
인자는 클래스자체를 의미하며 보통 cls로 쓴다. cls.클래스변수로 클래스변수를 이용한다.
print(Student.student_cnt) #2
Student.plus_student_cnt()
Student.plus_student_cnt()
Student.plus_student_cnt()
print(Student.student_cnt) #5
클래스 메서드를 실행하고 클래스변수의 값이 변화된 것을 확인했다.
스태틱메서드
클래스변수, 인스턴스변수를 사용하지 않기 때문에 cls, self 인자를 사용하지 않는다.
객체 상태나 클래스 상태를 변경할 수 없는 것이다.
@staticmethod 데코레이터를 사용해서 정의한다.
주로 해당 클래스에 한정하는 용도로 사용된다.
'Language > Python' 카테고리의 다른 글
자료구조 : 트리(tree), 이진탐색트리 파이썬으로 구현하기 (0) | 2022.09.16 |
---|---|
파이썬 객체지향 - 추상화, 상속, 다형성, 캡슐화 (0) | 2022.07.28 |
파이썬 immutable / mutable (0) | 2022.07.27 |
딕셔너리 메서드 - get, setdefault, pop, update (0) | 2022.07.26 |
셋(set) 메서드 - add, update, remove, discard (0) | 2022.07.26 |