즐겁게!! 자신있게!! 살아보세!!

재밌는 인생을 위하여! 영촤!

Language_Study/Python

[Python] 4.문법-클래스

Godwony 2021. 1. 19. 21:15
반응형

클래스

1.용어

1) class : 동일한 목적을 달성하기 위해 모인 변수와 함수의 집합
* 사용자 정의 자료형 : 사용자가 만드는 자료형

2) object : 프로그래밍에서 사용되는 모든 것

3) class object : 클래스와 동일한 의미

4) instance : class를 기반으로 만들어진 객체

2.파이썬에서 클래스 정의

class 클래스이름 : 
    코드 작성

3.method 생성

  • method : class 안에 만들어진 함수

1) member method : 만들기는 클래스에 만들지만 실제 사용은 instance 가 하는 메소드

  • python에서는 member method를 만들 때 매개변수가 반드시 1개 이상 있어야 한다.
    • 이 매개변수는 instance 자신의 참조가 대입됩니다.
    • 이름은 관습적으로 self 라고 합니다.
    • 도움말을 확인 할 때 첫번째 매개변수로 self가 있으면 이 메소드는 member method 입니다.
def 메소드이름(self, [다른매개변수를선언]):
    메소드 수행 내용

2) member method 호출

  • 자신의 클래스 내부에서 호출 : self.메소드이름(매개변수) -> self에는 아무것도 대입하지 않습니다.

  • 클래스 외부에서 호출 - 바운드 호출 : 인스턴스이름.메소드이름(매개변수) -> self에는 아무것도 대입하지 않습니다.

  • 클래스 외부에서 호출 - 언바운드 호출 : 클래스이름.메소드이름(인스턴스, 매개변수) -> self에 인스턴스를 대입해야 합니다.

3) 클래스의 인스턴스
생성자(매개변수)

class Student : 
    #member 메소드
    def func(self):
        print('member method')

obj= Student()
obj.func() #인스턴스가 메소드를 호출 - 권장 
Student.func(obj) #클래스가 메소드를 호출 

4.속성(field, attribute...)

  • 객체 안에 데이터를 저장할 수 있는 변수
  • 클래스 안에서 메소드 외부에 변수가 선언되면 클래스가 사용할 수 있고 인스턴스는 읽을 수만 있습니다.
    • 만약에 인스턴스가 메소드 외부에 선언된 변수를 수정하게 되면 인스턴스 안에 변수를 만들어서 저장을 합니다.
  • 메소드 안에서 만들어진 변수는 메소드 안에서만 사용이 가능한 지역변수가 됩니다.
  • 메소드 안에서 변수를 만들때 self.변수명을 사용하면 인스턴스가 별도로 소유하는 인스턴스 변수가 됩니다.
  • 파이썬의 인스턴스는 속성을 추가 할 수 있습니다.
    인스턴스이름.속성명=데이터
    이 속성이 존재하면 수정이고 없으면 추가해서 대입합니다.
class Student : 
    # 이 변수는 클래스와 인스턴스 모두 접근 가능하지만
    # 인스턴스는 수정 못함
    schoolName = "중앙"

    def method(self) :
        self.num= 1 # 인스턴스가 사용할 수 있는 변수 생성
        age = 20 # 메소드 안에서만 사용할 수 있는 변수 생성 

# 메소드 바깥에 있는 변수는 클래스와 인스턴스 모두 호출 가능 
print(Student.schoolName)
obj = Student()
print(obj.schoolName)

# 클래스가 수정
Student.schoolName="메가스터디"
print("클래스로 수정한 후 출력")
print(Student.schoolName)
print(obj.schoolName)

obj.schoolName="서울대학교"
print("인스턴스로 수정한 후 출력")
print(Student.schoolName)
print(obj.schoolName)

# 파이썬은 클래스에 없는 속성을 인스턴스에 추가 가능 
obj.name = "lee" 
print(obj.name)

# methoe 에서 self.num 과 age를 생성 
obj.method()
print(obj.num)  # 인스턴스가 호출가능
print(obj.age)  # age는 지역변수라서 인스턴스가 호출 불가능 

5.특수 속성

  • 파이썬이 용도를 정의해놓은 속성
  • __로 시작하고 __로 끝남
    • 대표적인 속성이 __doc__로 함수에서 이 속성에 문자열을 대입하면 help로 확인

6.Constructor (생성자)

  • __init__ 라는 이름으로 생성자를 만듭니다.

  • 첫번째 매개변수는 self 이고 이후에 매개변수 추가가 가능

    • 만들지 않아도 self만 가진 생성자가 클래스에 자동으로 추가
    • __init__(self) 는 존재합니다.
  • 새로 생성자를 추가하면 기본적으로 제공되는 생성자는 소멸됩니다.

  • 생성자를 만드는 이유는 다른 메소드를 호출하지 않고 인스턴스 속성을 초기화 하기 위해서 입니다.

  • 생성자를 호출하는 방법은 클래스이름(매개변수) 형태로 하고 호출하면 메모리 할당을 한 후 그 메모리에 대한 참조를 리턴합니다.

class Student : 
    # 생성자 - 매개변수 없이 호출하면 name=None 매개변수를 대입하면 그 값이 name에 대입 
    def __init__(self, name=None) :
        self.name = name

    def getName(self) :
        return self.name

    def setName(self, name) : 
        self.name = name 

obj = Student()
# 생성자가 없어도 setName을 호출하면 self.name이 만들어지기 때문에 문제가 안됨
obj.setName("lee")
print(obj.getName())

obj1 = Student()
print(obj1.getName())   # 생성자가 없으면 setName을 호출하지 않았기 때문에 nameadl djqtdma 

obj2 = Student("Steve") 
print(obj2.getName())

7.__del__

  • 인스턴스가 파괴될 때 호출되는 메소드
  • self 이외의 매개변수는 가질수 없음
  • 파이썬의 메모리 관리는 Refernce Count 방식 (참조횟수)
  • 참조횟수가 0이 되면 메모리에서 파괴됩니다.
  • 인스턴스가 변수에 대입되면 참조 횟수는 1 증가
    • del(변수명)을 호출하거나 None을 대입하면 참조 횟수가 1 감소
  • 참조 횟수를 확인하고자 하는 경우는 sys 모듈의 getrefcount 라는 함수에 인스턴스를 대입하면 됩니다.
import sys 
class temp : 
    # 소멸자 
    def __del__(self) : 
        print("인스턴스가 파괴됩니다.")

# 생성자를 호출해서 인스턴스를 생성한 후 t에 대입 - 참조 횟수 1 
t = temp()
# 인스턴스를 다른 곳에 대입하면 참조횟수가 1증가 합니다. 
k = t  # 굉장히 안좋은 케이스

print(sys.getrefcount(k))
# 변수에 None을 대입 - 참조 횟수가 1줄어듬 
t = None
#변수를 삭제 합니다. 참조횟수가 1줄어듬
del(k)   

8.정적메소드 : 클래스가 호출하는 메소드

1) static 메소드

  • 메소드 위에 @staticmethod 라고 기재하고 매개변수를 만들 때 self를 만들지 않습니다.

2) class 메소드

  • 메소드 위에 @classmethod 라고 기재하고 첫번째 매개변수는 클래스 자신이 대입되는 cls 를 추가

9.__slots__ 속성

  • 이 속성에 list로 문자열을 대입하면 문자열에 해당하는 속성만 사용 가능
  • DTO 클래스 만들 때 쓰면 좋다
class DTO : 
    def __init__(self, num=0, name=None):
        self.num=num
        self.name=name
    # name 과 num 이외의 속성은 만들 수 없도록 제한하기 
    __slots__ = ['name', 'num']

dto = DTO(1, "lee") 
dto.tel = "12343234" 

10.property

  • 객체 지향 프록래밍에서는 인스턴스가 변수를 직접 사용하는 것을 권장하지 않습니다.

    • getter와 setter를 이용해서 접근하는 것을 권장
  • 파이썬에서는 인스턴스 변수를 만들 때 __을 앞에 붙이면 인스턴스가 변수에 접근을 못합니다.

  • property(fget=None, fset=None, fdel=None, doc=None) 함수를 이용해서 getter와 setter 메소드를 지정할 수 있습니다.

    • 대부분 변수를 사용하는 것처럼 사용하지만 실제로는 property에 설정된 메소드를 호출합니다
class DTO : 
    def __init__(self, name=None):
        # private 처럼 클래스 외부에서는 __name에 접근할 수 없다. 
        self.__name=name

    def getName(self) :
        print("getter") 
        return self.__name

    def setName(self, name) :
        print("setter") 
        self.__name = name 

    # .name을 호출하면 getName이 호출되고, .name=값 을 호출하면 setName이 호출 
    name = property(fget=getName, fset=setName) 

dto = DTO('lee')
dto.name = "lll"
print(dto.name) 

11.연산자 오버로딩

  • 연산자의 기능을 변경하는 것
  • __add__(self, other) 이 메소드를 만들면 이 클래스의 인스턴스들은 +연산을 할 수 있음
    • 그 이외에도 sub(-),num(*)을 재정의하면 다른 연산자도 사용 가능
  • dir(인스턴스 나 클래스)로 사용할 수 있는 메소드를 확인해서 어떤 연산이 가능한지 확인을 할 필요가 있습니다.
li1 = [100, 300]
# print(dir(li1)) # 속성 확인 
li2 = [30, 70]
print(li1 + li2) # __add__ 가 있어서 더하기 가능  
print(li1 > li2) # __gt__ 가 있어서 > 가능 

__str__ = toString() 과 같다.

12.상속

class 클래스이름(클래스 이름 나열) :

  • 파이썬은 다중 상속이 되서 여러 개의 클래스로부터 상속 가능
    • 파이썬은 여러 클래스에 동일한 이름의 속성이나 메소드가 있으면 앞에 작성한 클래스의 것을 상속받습니다.

파이썬과 R의 차이

  • R : 분석만 가능 - 최근에는 프로그램을 만드는 것도 가능하지만 불편합니다.

  • python : 범용 프로그래밍 언어 - 분석을 쉽게 할 수 있는 라이브러리가 제공, 분석도 가능

  • 단순하게 분석해서 보기만 할거라면 R이 좋지만 결과물을 생성할려고 하면 python이 우세합니다.

  • 데이터 가공 : 파이썬 > R

  • 객체지향 문법을 알아야됨

반응형

'Language_Study > Python' 카테고리의 다른 글

[Python] 6. parsing  (0) 2021.01.19
[Python] 5.문법-자료형  (0) 2021.01.19
[Python] 3.문법-Function  (0) 2021.01.19
[Python] 2.문법 - 제어문  (0) 2021.01.19
[Python] 1.문법  (0) 2020.12.23