ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Part.5 클래스
    Python 2023. 2. 7. 21:40

     

     

     

     

    Ch05-01. 모듈과 패키지

     

    모듈이란?

    모듈은 함수나 변수, 클래스를 모아 놓은 파일이다. 모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다.

     

    모듈의 종류

    • 표준 모듈 : 파이썬과 함께 따라오는 모듈
    • 사용자 생성 모듈 : 프로그래머가 직접 작성한 모듈
    • 서드 파티 모듈 : 파이썬 재단도 프로그래머(본인)도 아닌 다른 프로그래머 또는 업체에서 제공한 모듈

    외부 모듈을 사용할 수 있도록 하는 방법은 import 파일명 

    확장자는 생략하고 파일에 있는 변수나 함수는 파일명.변수 도는 파일명.함수()로 호출

     

    실제로 모듈을 만들어보자

    variable = 3
    
    def addition(x, y):
    	return(x,y)
        
    라 정의하고 이름을 my_func.py라고 저장한 뒤에 불러보자.
    _
    import sys
    sys.path.append('/content/sample_data')
    _
    import my_func
    _
    my_func.variable
    
    # result
    3
    _
    my_func.addition(3,4)
    # result
    
    7

     

     

    Import

    Import는 다른 모듈 내의 코드에 대한 접근을 가능하게 하는 것으로, 변수, 함수, 클래스 등이 포함된다. 

    import 모듈 
    
    또는 
    
    from 모듈 import 함수이름1, 함수이름2 
    
    와 같은 형태로 입력. 
    와일드카드 *를 이용하면 모듈 내 모든 것을 가져온다.

    만약 import를 입력하면 어떤 폴더에서 가져올까?  sys.path를 통해 확인가능!

    직접 위치를 추가하려면?  sys.path.append(‘검색할 경로‘)

     

    __name__ 변수란?

    파이썬이 내부적으로 사용하는 특별한 변수로, 현재 실행중인 파일의 이름은 __main__이라는 이름으로, 불러온 모듈의 경우 모듈의 이름이 __name__이란 변수에 저장된다.

    print(__name__)
    
    # result
    __main__
    
    import sys
    sys.path.append('/content/sample_data')
    import my_func
    
    # result
    실행된 모듈 이름 my_func

     

    패키지란?

    모듈들을 모아놓은 디렉토리 패키지에서 특정한 모듈을 가져올 때는 from my_package import my_module 과 같은 형식으로 불러오면 된다.

    • 주의 python 3.3버전이전에는 디렉토리가 패키지로 인정받기 위해서는 __init__.py라는 파일이 내부에 있어야 했다
    from test_package import test_module1
    
    # result
    test_package.test_module1
    _
    
    import test_package.test_module2
    
    # result
    test_package.test_module2

     

    패키지 안의 모든 모듈을 불러오려면?

    모듈 안의 모든 내용을 불러올 때 와일드 카드 *를 썼다.

     

    그렇다면 패키지 안의 모든 모듈을 불러오려면 어떻게 해야할까?

    패키지 디렉토리 안에 __init__.py라는 이름의 파일을 만들고 __all__ = [‘모듈이름1’, ‘모듈이름2‘] 이런 식으로 와일드카드 *로 부를 수 있는 모듈 이름들을 직접 지정해 주어야 한다.

    from test_package import *
    
    test_package.test_module1
    test_package.test_module2

     


     

     

    Ch05-02. 객체와 클래스

     

    객체와 클래스

    파이썬에서 class란 변수와 메소드(객체 내에 정의된 함수를 메소드라 부른다)를 정의하는 일종의 틀이다. 그리고 이러한 틀을 통해 생성된 것들을 객체(object) 또는 class의 instance라 부른다.

    석고상을 만들 때 그것을 만들기 위한 틀을 만들고 거기에 석고를 부어서 잔뜩 찍어내는 걸 생각하면 된다. 여기서 틀이 class이고 찍어져 나온 결과물이 객체이다.

    Class와 객체의 관계는 제품 설계도와 제품, 붕어빵기계의 틀과 붕어빵 같은 관계라고도 생각할 수 있다.

     

    파이썬에서 클래스 정의하는 방법

    class human:             - class의 이름 정의
      def __init__(self, height, age): 	 - class가 처음 호출될 때 실행될 method
        self.height = height    	  - class 변수
        self.age = age
        
      def how_old(self, var1, var2): 	- class 메소드
        print(self.age, '살 입니다.')
        print(var1)
        print(var2)
      def how_tall(self):
        print(self.height, 'cm 입니다.')
        
        _
        
        sh = human(170, 17)
        
        # result
        17
        _
        
        sh.height
        
        # result
        170
        _
        
        sh.how_old('첫번째 변수', '두번째 변수')
        
        # result
        20 살 입니다.
        첫번째 변수
        두번째 변수

     

    객체를 정의하는 법

    sh = human(180, 31)
    
    변수 부르는 법
    sh.height
    
    메소드 호출
    sh.how_old()
    또는
    human.how_old(sh)

     

    같은 클래스의 두 객체는?

    hello1 = human(180, 31)
    hello2 = human(180, 31)
    
    hello1 == hello2?
    False!
    
    똑같은 값을 통해 객체를 생성했지만 objec는 생성될 때 마다 
    새로운 메모리 공간에 값을 생성하기 때문에 엄밀히 말하면 다른 값이다!

     

    객체에 변수 추가하기

    hello = human(180, 31)
    hello.weight = 90
    
    이런 식으로 객체이름.변수이름 = 값 을 입력함으로써 객체에 변수를 추가할 수 있다.

     

    메소드 생성에 유의할 점

    메소드를 클래스 내부에 선언할 때는 첫 번째 매개변수는 반드시 현재 클래스의 객체가 되어야 합니다.

    관습적으로 이를 self라는 단어로 표시합니다.

     

    만약 메소드 내부에서 변수선언을 할 때 self.와 함께 선언을 하지 않을 경우 그 변수는 그 메소드의 지역변수가 됩니다.

     

     

     


     

     

    Ch05-03. 객체지향과 절차지향

     

    객체지향과 절차지향

    • 절차지향(구조적 프로그래밍) : 데이터 구조와 그 데이터를 변화 시키는 알고리즘으로 구성
    • 객체지향 : 객체들이 메시지를 통하여 통신함으로써 원하는 결과를 얻는다. 각 객체는 고유의 데이터와 데이터를 처리할 수 있는 메소드로 구성

    사실 python은 모든 것이 객체이다.

    이전에 보았던 string이나 list 또한 객체이다.

    ‘abcd’.upper() 이라는 호출을 통해 대문자로 바꾸었던 것을 기억하는가?

    x = 'abcd'
    _
    x.upper()
    
    # result
    'ABCD'
    _
    x = 3
    x = 3.5

     


     

     

    Ch05-04. 특수 매소드

     

    생성자와 소멸자

    - 생성자: __init__()

    객체가 생성된 후 가장 먼저 호출되는 메소드 첫번째 매개변수는 self이며 이후에 매개변수 추가 가능 주로 멤버 변수의 초기화 코드로 작성

    - 소멸자: __del__()

    객체가 소멸될 때 호출되는 메소드 외부 자원을 사용하는 경우 해제하는 코드를 주로 작성 self 이외의 매개변수를 받지 않음

    * del 객체이름 을 입력하면 삭제할 수 있다

    class human:
      def __init__(self):
        self.height = 3
        self.age = 3
    
      def __del__(self):
        print('삭제됐지롱')
    _
    sh=human()
    _
    del sh
    
    # result
    삭제됐지롱

     

    정적 메소드

    @staticmethod 데코레이터로 수식

    인스턴스를 생성하지 않고 클래스를 이용해서 직접 호출할 수 있는 메소드 메소드 내에서 멤버 변수를 호출할 수 없고, self 매개변수도 사용하지 않습니다. 

    class 클래스이름: 
        @staticmethod 
        def 메소드이름(매개변수): 
        	실행문장
    class human:
      def __init__(self):
        self.height = 3
        self.age = 3
    
      @staticmethod
      def addition(x, y):
        return x+y
    
    _
    human.addition(3,4)
    
    # result
    7

     

    클래스 메소드

    @classmethod 데코레이터로 수식

    정적 메소드와 유사하지만, 첫 번째 변수로 클래스 객체가 전달되는 것이 다름. 

    cls 매개변수 사용 

    class 클래스이름: 
    	@classmethod 
    	def 메소드이름(cls): 
    		실행문장

     

    예제

    class student:
      count = 0
      @classmethod
      def cmethod(cls):
        print("클래스 메소드")
        print(cls.count)
      
      @staticmethod
      def smethod():
        print("정적 메소드")
    
    student.cmethod()
    student.smethod()
    
    # result
    클래스 메소드
    0
    정적 메소드

     

     

    심화학습 : private, public 변수

    Private 멤버는 내부에서는 접근이 가능하지만 클래스 외부에서 접근이 안 되는 멤버.

    Public 멤버는 클래스 외부에서 접근이 가능한 멤버.

    python의 경우 기본적으로 모든 멤버는 public

     

    예제

    아래와 변수 이름 앞에 __를 붙여주면 은닉할 수 있고 
    setter를 통해 값을 바꿀 수 있으며 getter를 통해 값을불러올 수 있다.
    
    class human:
      def __init__(self):
        self.__age = 31 
        
      @property
      def age_getter(self):  		#getter
        return self.__age
        
      @age_getter.setter
      def age_setter(self, value): 	#setter
        self.__age = value
        
    _
    sh.age_getter
    
    # result
    31
    _
    sh.age_setter = 36
    _
    sh.age_getter
    
    # result
    36

     


     

    Ch05-05. 실전 문제풀이

    mypi = 3.14
    # 원의 면적 반지름 * 반지름 * 3.14
    def area(r):
      return mypi * r * r
    #자체적으로 실행
    if __name__=='__main__':
      print(round(area(12),(2)))
      print(area(10))
      
    # result
    452.16
    314.0
    def plus(x, y):
      return x + y
    def minus(x, y):
      return x - y
    def mutiply(x, y):
      return x * y
    def divide(x, y):
      return x / y
    
    if __name__=='__main__':
      print(plus(12, 3))
      print(minus(12, 3))
      print(mutiply(12, 3))
      print(divide(12, 3))
      
    # result
    15
    9
    36
    4.0
    class car:  # 클래스명은 대문자로 시작
      def __init__(self):   # 전역변수 선언할 때 사용, 생성자
        self.color = 'red'    # 속성/데이터/필드 초기화
        self.wheel_size = 18
        self.displacement = 2000
      def forward(self):    # 메서드. 함수 정의
        print('전진')
      def backward(self):
        print('후진')
      def turn_left(self):
        print('좌회전')
      def turn_ringht(self):
        print('우회전')
    
    if __name__ == '__main__':
      # mycar : 객체이름. reference name, 인스탄스 이름
      mycar = car()   # 차라는 클래스를 이용하여 내차 생성
      print(mycar.color)    # 객체명, 속성
      mycar.backward()     # 객체명, 메소드명()
    
    # result
    red
    후진

     

     

     

     

    'Python' 카테고리의 다른 글

    [Phthon] 문자열 함수  (0) 2023.04.05
    [Python] Part.6 상속과 예외처리  (0) 2023.02.15
    [Python] Part.4 함수 심화학습  (0) 2023.02.07
    [Python] Part.3 함수 및 변수  (0) 2023.02.07
    [Python] Part.2 제어문  (2) 2023.02.06
Designed by Tistory.