객체

속성 + 동작

클래스에서 정의한 것을 토대로 메모리에 할당된 것

프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간

변수, 자료구조, 함수 또는 메서드

 

 

 

클래스

클래스 작성법 

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 데코레이터를 사용해서 정의한다.

주로 해당 클래스에 한정하는 용도로 사용된다.