본문 바로가기
Python

[파이썬] 클래스 객체 지향 프로그래밍

by AI미남홀란드 2021. 1. 17.
728x90

1. 클래스 & 인스턴스

1) 클래스 생성

 

class  클래스 이름 : 

       변수

       함수

 

2) 인스턴스 생성의 기본 방법

클래스이름(매개변수)

=> 인스턴스가 생성된 것인데 1번밖에 사용을 못합니다.

변수이름 = 클래스이름(매개변수)

=>인스턴스를 생성하고 그 인스턴스의 참조를 변수에 저장한것 입니다.

변수이름으로 인스턴스를 사용할 수 있습니다.

 

3) 클래스 나 인스턴스를 이용해서 클래스 내부에 작성한 내용 접근

클래스 이름.함수이름(매개변수) 또는 인스턴스 이름.함수이름(매개변수) 의 형태로 . 이용해서 전급합니다

ex) class.fx(n) 이런식으로 가능하다


2. 클래스 안에 함수를 생성 - Method

-> 한번에 별도의 메모리 영역을 할당받아서 독립적으로 실행되는 것을 함수(function) 이라고 하는데 class 안에 만들어진 함수는 소속이 있다고 해서 보통 메소드라고 부른다.👌

 

1) 종류

-> 인스턴스 생성없이 호출할 수 있는 메소드 - static(class) method

-> 인스턴스를 생성하고 호출하는 메소드 - member method

 

2) 인스턴스를 생성 후 호출하는 메소드 - member method(멤버 메소드)

def 함수이름(self ,  매개변수 나열):

          함수의 내용작성

          return 데이터

 

-> 파이썬에서는 Member Method 를 만들 때 첫번째 매개변수로 자신의 인스턴스를 대입받을 수 있는 변수를 추가해야 합니다.

 이 이름은 관습적으로 self라고 합니다. 다른 대부분의 객체 지향 언어에서는 이를 숨겨 놓고 this 나 me 라고도 합니다.

 

-> 호출하는 방법

인스턴스이름.함수이름(매개변수)

self를 제외하고 매개변수를 대입합니다

 

클래스이름.함수이름(인스턴스 , 매개변수) Unbound 호출

=> 클래스 내부에서 호출할 때에는 self.함수이름(매개변수 나열)

 

class Student:
    # 인스턴스 생성후 호출 해야 하는 메소드
    def disp(self):
        print("hello my world")
#인스턴스 생성
student=Student()
# 인스턴스를 하나만 만들 떄에는 변수 이름을 클래스 이름으로 하는데
# 첫 글자를 보통 소문자로 한다

student.disp() #바운드 호출
Student.disp(student) # 언 바운드 호출

출력 결과 : hello my world
                 hello my world

-> 파이썬을 이렇게 멤버 메소드를 호출하는 방법이 2가지이므로 다른 개발자가 만든 코드를 볼 때 정확히 확인해야 합니다.

클래스 이름으로 호출한 것인지 아니면 언 바운드 호출인지 확인하셔야 합니다.


3. 클래스 안에 속성 만들기

1) field 또는 attribute

-> 클래스의 특징이나 인스턴스의 특징을 저장하기 위한 변수

2) 종류

-> 클래스 속성 : 모든 인스턴스가 공통으로 사용하기 위해서  만든 속성

생성할 때는 클래스 내부에서 메소드 바깥에 변수를 만들면 됩니다.

 

클래스 속성을 만들면 클래스이름.속성이름 으로 접근할 수 있고 인스턴스이름.속성이름 으로돋 접근할수 있습니다

 

읽을 떄에는 2가지가 동일한 결과를 가져오지만 수정을 하게되면 클래스이름 으로 접근했을 때는 클래스 속성을 수정하지만 인스턴스이름으로 수정하면 인스턴스에 동일한 이름으로 속성을 만들어서 수정합니다.

 

인스턴스를 가지고 없는 속성에 값을 대입하면 인스턴스에 속성이 새로 만들어져서 값이 대입됩니다.

 

3) 클래스 안에서 인스턴스만 사용할 수 있는 속성 만들기

-> 변수를 선언하면 메소드 안에서만 접근 가능한 지역 변수가 만들어진다.

 

-> self.변수명으로 선언하면 인스턴스가 접근할 수 있는 변수가 생성됩니다.

class Reple:
    #클래스에 만들어서 클래스와 인스턴스가 사용할 수 있는 변수가 됩니다.
    coinName="reple"
    
reple1=Reple()
reple2=Reple()

print(Reple.coinName) #클래스 이름으로 호출
print(reple1.coinName) #인스턴스 이름으로 호출
print(reple2.coinName) #인스턴스 이름으로 호출
-----> 결과: reple
                    reple
                    reple
print() #빈줄

Reple.coinName="stella" #클래스 이름을 이용해서 변경 클래스 이름으로 변경하면 공통하는 속성이 변경된다
print(Reple.coinName)
print(reple1.coinName)
print(reple2.coinName) 
-----> 결과 : stella
                     stella
                     stella
print()

#인스턴스를 가지고 속성을 변경
#인스턴스를 가지고 속성을 변경하면 인스턴스에 자신만의 속성이 생성되고
#자신을 변경
#다른 인스턴스 

reple1.coinName="ada"
print(Reple.coinName)
print(reple1.coinName)
print(reple2.coinName) 
-----> 결과 stella
                   ada.  << ada로 자신만 가지고 있는 인스턴스만 바뀐 모습을 볼 수가 있다.
                  stella

4. 접근자 메소드

-> 인스턴스가 자신의 속성을 리턴하고 속성의 값을 수정할 수 있도록 해주는 메소드

-> 속성의 값을 리턴하고 메소드를 getter라고 하고 속성의 값을 수정하는 메소드를 setter 라고 합니다.

-> 서버사이드 프로그래밍을 할 때는 속성에 직접 접근하지 말고 getter 와 setter를 이용해서 접근하는 것을 권장하고 클라이언트 사이드 프로그래밍을 할 때는 속성을 직접 접근하기도 합니다.

 

비교적 최근에 만들어진 코틀린이나 스위프트 같은 언어에서 속성을 직접 접근하는 형태로 데이터를 사용하는데 이것은 getter와 setter를 자동으로 생성해서 내부적으로 호출하도록 해주기 때문입니다.

 

* get 내가 주는거 set 보내는거 get(is) 판별

 

-> 이름을 만들 때 가져오는 메소드는 get 이나 is를 붙이고 , 속성이름을 붙입니다. 속성 이름을 붙일 때 첫글자는 대문자를 사용합니다.

name 이라는 속성을 가져오는 메소드 : getName

숫자인지 확인하는 메소드 - 참 또는 거짓으로 리턴 : isNum

=> 값을 설정하는 메소드는 get 대신에 set을 사용합니다.

name 이라는 속성을 변경하는 메소드: setName

 

 

class User:
        # 번호와 이름을 저장할 클래스 생성 해준다
       def getNumber(self):
              return self.number
       def setNumber(self):
              self.number=number
       def getName(self)
             return self.name
      def setName(self)
            self.name=name
user1=user()
user1=setNumber(1)
user1=setName("빈지노")

print(user1.getNumber()," : " getName())

결과: 1 : 빈지노

       

5. 특별한 속성

__doc__ : 함수를 설명하는 문자열로 없을 때는 none

 

-> 어떤 클래스나 인스턴스에 __로 시작하는 속성이나 메소드는 파이썬이 만들어준 속성이나 메소드로 직접 접근이 안되고 다른 특별한 방법을 이용해서 설정하거나 사용해야 합니다.

 

__iter__는 for 구문을 사용할 수 있는 iterator 라는 것을 구현해놓은 메소드 입니다.

 

__add__ 는 + 연산자를 사용할 수 있다는 의미입니다.


 

6. 생성자 와 소멸자

 

1) 생성자(Constructor)

-> 인스턴스를 생성 할 때 호출하는 특별한 목적의 메소드

-> python __init__() 이라는 이름으로 제공

-> self 라는 매개변수를 가져야 하며 self 이후에 매개변수를 추가할 수 있습니다.

매개변수를 추가하게되면 인스턴스를 생성할 때 그 매개변수를 대입해 주어야 합니다.

-> **되도록이면 매개변수에 초기값을 대입하는 것이 좋습니다.

-> 인스턴스의 속성을 초기화하기 위한 목적으로 생성

 

2) 소멸자

-> 인스턴스가 메모리에서 소멸될 때 호출되는 메소드

-> python dptjsms __del__() 이라는 이름으로 제공합니다.

-> 인스턴스가 소멸될 때 메모리 정리작업이나 외부와의 연결을 해제하기 위해서 사용합니다.

                                        H/W

사용자 <-> 프로그램 <-> OS(IOS , Window , Linux)

                                        [파일 ]

 


7. 파이썬에서 메모리 정리

-> 파이썬에서는 참조 카운트라는 개념을 이용해서 메모리 관리를 한다.

-> 참조 카운트는 생성자를 불러서 처음 만들면 1이 된다. 

다른 곳에 복사를 해주면 1씩 증가한다

 

-> 인스턴스를 사용하고 있는 변수에 none 이라는 값을 대입하면 참조 카운트가 1씩 감소합니다.

-> 참조 카운트가 0 이 되면 메모리에서 사라진다. 이 때 __del__ () 이라는 메소드를 호출합니다.

-> 

 

class User:

   #생성자- 인스턴스를 만들 때 호출하는 메소드

   #num과  name의 값을 대입받아서 자신의 속성에 대입해주는 생성자 

    def __init__(self,number=1,name='noname'):

        self.number=number

        self.name=name

    def __del__(self):

        print("메모리에서 사라집니다.")

      

    def getNumber(self):

        return self.number

    

    def setNumber(self,number):

        self.number=number

        

    #이름을 위한 getter 와 setter

    def getName(self):

        return self.name

    

    def setName(self,name):

    

        self.name=name

        

user1=User(20,"지코")

print(user1.getName(),":",user1.getNumber())

결과: 지코 :20

#메모리정리 : 인스턴스가 사용하던 메모리 공간을 해제

#클라이언트 애플리케이션 중에서 사용 시간이 긴 애플리케이션을 만들때는 메모리 정리가 중요하다. (게임 , 그래픽 편집 등 )

 

class User:
    #소멸자
    def __del__(self):
        print("인스턴스가 소멸될때 호출 됩니다.")
        
#인스턴스 생성        
user1=User()
#User1에 None을 대입하면 메모리 정리가 됩니다.
user1=None
----------------------------------------------
class User:
    #소멸자
    def __del__(self):
        print("인스턴스가 소멸될때 호출 됩니다.")
        
  #인스턴스 생성        
user1=User()
  #User1에 None을 대입하면 메모리 정리가 됩니다.
user1=None

user2=User()
  #user2 를 user3에 대입
user3=user2

  #다른 변수에 대입을 하면 참조 카운틀가 1이 증가합니다
  #none을 대입하면 참조 카운트는 1이 감소합니다
  #__def__는 참조카운트가 0일 때 호출합니다
  #쉽게 말해 변수에 변수를 넣어도 적용이 되지 않고 , none 값을 입력해야 된다.
user2=None
user3=None

8. 인스턴스 생성없이 호출 가능한 메소드

1) 정적 메소드 (static Method)

-> 인스턴스 생성없이 클래스 이름만을 가지고 호출하는 메소드

-> self. 을 할 수가 없다. self 가 없다.

-> 메소드 내에서 self.을 할 수가 없습니다.

-> 인스턴스를 이용해서 호출은 가능하며 , 메소드 외부에 만든 변수는 사용할 수 있습니다.

-> 만들 때에는 메소드 위에 @staticmethod 라는 decorator를 추가해 주어야 합니다.

 

9) 클래스 메소드(class Method)

-> 인스턴스 생성없이 이름만을 가지고 호출하는 메소드

-> selft가 없다

-> 메소드내에서 self.을 사용 할 수 없다.

-> 인스턴스를 이용하여 호출은 가능하며 메소드 외부에 만든 변수는 사용할 수 있습니다.

-> self 대신에 클래스 정보를 전달해주는 cls 라는 매개변수가 첫번째로 나와야 합니다.

-> 만들 때는 메소드 위에 @classmethod 라는 decorator 를 추가해 주어야 합니다.

 

기존에 클래스  메소드 이용법

 

->class User:

         def 이름(self):

             구문

  user1= User()

   user1.

이런 식으로 사용했다면

 

스태틱 , 클래식  메소드를 이용하면

class User:

      @staticmethod: << 스태틱 메소드

def smethod():

print("static Method")

def cmethod(cls):  << 클래스 메소드 

print("classic Method")

User.smethod() #스태틱 메소드는 인스턴스 생성없이 사용 가능하다.

User.cmethod() #클래스 메소드는 인스턴스 생성없이 사용 가능하다.


9, 클래스에서 확인할 내용

 

1) dir(클래스나 인스턴스 이름) 을 이용해서 수행 할 수 있는 작업을 조회

-> print(dir(str)) 이런식으로 도움말 처럼 확인해서 내가 이 걸로 수행할 수 있는 작업이 무엇인지를 조회 해보고 프로그래밍을 시작하면 더욱 더 도움이 된다.

 

-> 수행하려고하는 작업을 위한 메소드를 확인해보아야 한다. (help) 

2) help(클래스이름.메소드이름)

매개변수를 확인하고 매개변수에 self가  있는지 확인

=> 매개변수에 self 가 있으면 인스턴스를 생성해야한다 

 

3) help(클래스이름 , __init__)

-> 초기화 메소드를 확인합니다.

-> 초기화 메소드를 이용해서 인스턴스를 생성합니다.

 

***dir , help 가 영어로 되어있지만 자주 확인해보면 도움이 된다. 책이나 인터넷의. 소스코드는 예제나 목적에 따라 한가지 방법의 메소드만 호출해서 작업하는 경우가 많다. 그래서 실제 프로그램을 만드려고 하면  여러가지 형태로 변형을 해야하고 , 다른 메소드를 호출하기도 해야 한다. 그래서 습관화 해놓으면 좋다 ( .붙는 코드가 있으면 앞의 데이터를 dir(데이터)를 습관화!!!)

 

return 도 숫자나 bool , str , bytes , list , set ,dict가 아니면 역시 확인해봐야 한다.

훌륭한 개발자가 되기 위해선 도움말 , 도큐멘트를 옆에 두고 항상 찾아보는 습관을 가져야한다.

개발자는 배우는사람이 아니고 만들어주어야 하기때문에

 

 

10. __slots__

=> 파이썬에서는 클래스 안에 만들지 않은 속성을 인스턴스에 동적으로 추가 할 수 있습니다.

=> 다른 속성을 만들지 못하도록 하는 속성이 __slots__ 입니다.

=> 클래스 안에 __slots__ =[속성 목록] 을 추가하면 속성 목록 이외의 속성은 생성 할 수 없다.


11. Property

-> 속성 : field 라고도 하는데 클래스 안에 만들어지는 변수로 인스턴스가 사용하는 저장 공간

1) 접근 제한

-> 객체 지향 프로그래밍에서는 인스턴스가 속성에 바로 접근하는 것을 권장하지 않습니다.

이런문제 때문에 대다수의 객체 지향 언어는 getter 와 setter와 같은 접근자 메소드를 생성해서 속성에 접근하도록 한다

-> 파이썬에서는 속성에 접근할 수 없도록 할 때 private 대신에 속성이름에 앞에_를 붙입니다.

__로 시작하는 속성은 인스턴스가 접근할 수 없습니다.

 

2) property

-> 속성을 만들고 접근자 메소드를 만들어서 속성을 사용하는 것 처럼 하지만 실제로는 접근자 메소드를 호출하도록 하는 것

-> 생성방법

속성이름 = property(fget=None , fset = None , fdel=None , doc=None)

fget은 getter의 이름

fset은 setter의 이름

fdel은 삭제할 때 사용하는 이름

doc는 도움말 호출할 때 사용하는 이름

 

3) 서버 프로그래밍을 해야하는 경우에 알아두면 좋습니다.


12. 연산자 중복 정의

 

-> 제공되는 연산자의 기능을 다시만들거나 추가하는 것

-> __ 로 시작하는 메소드를 다시 만드는것

+ 는 숫자끼리 덧셈을 위한 연산자이다.

문자열 사이에서도 이 연산자를 사용할 수 있습니다.

=> 문자열은 str클래스인데 __add__라는 메소드를 생성해서 문자열끼리 결합하도록 만들었습니다
문자열끼리 + 를 하면 __add__라는 메소드를 호출해서 문자열을 결합시켜서 리턴해줍니다.

=> 연산자에 만들어진  메소드를 다시 정의해서 사용하도록 해주는 것이 연산자 중복 정의 입니다.

 

-> __str__(self)를  다시 만들어서 문자열을 리턴하도록 하면 print 함수에 인스턴스 이름만 대입하면 이 메소드를 호출하는 것과 동일한 작업을 수행합니다. 이 메소드는 디버깅을 위해서 사용을 합니다.

 

 

 

728x90

'Python' 카테고리의 다른 글

[파이썬] 상속  (0) 2021.01.23
[파이썬] 상속  (0) 2021.01.17
[파이썬] 객체지향 프로그래밍  (0) 2021.01.16
[파이썬] 파이썬의 기본 문법  (0) 2021.01.16
[파이썬] function 함수 2  (0) 2021.01.16