프로젝트형 IoT 서비스 개발 4회차/1. 인터페이스 개발

[Day50] 2022-04-08(금) Python기본11 - Class 개념 보충 설명 - 김서연 강사님

powerstone 2022. 4. 8. 14:03
728x90

[1] Class 개념 보충 설명

 1. mymodule.py

def myfunction():
    print("myfunction시작")
    print("__name__?????:", __name__)
    print("myfunction종료")


print("mymodule시작")
print("__name__?????:", __name__)
print("mymodule종료")

  2. Person.py

"""
    1. 생성자 __init__, 소멸자는 __del__
    2. pyton 클래스 안에 정의되는 모든 메소드에는 매개변수의 첫 번째에 self가 정의되어야 한다.
        self => 현재 작업 중인 자기 자신의 객체를 의미, JS의 this와 동일한 개념
    3. 객체가 갖고 있는 기본 속성을 정의하고 싶은 경우
        생성자를 정의하면서 매개변수로 정의하는 변수가 객체가 갖고 있는 특성(인스턴스 변수)이 된다.
        객체가 갖고 있는 고유한 값을 정의할 때 사용
        객체가 제 기능을 실행할 수 있게 하기 위해서 외부에서 처음 만들어질 때 셋팅할 값이 있으면 설정
        동일한 특성을 나타내는 변수는 이름을 모두 동일하게 작업한다.
        <인스턴스 변수와 매개변수의 구분>
        - 인스턴스변수는 객체의 변수이므로 self.변수명
        - 매개변수는 변수명 그대로 사용
    4. 클래스 내부에서 다루는 변수는 3가지 종류
        - 인스턴스 변수 : self.변수명 으로 접근 (객체마다 다른 고유의 값을 저장)
        - 지역 변수 : 메소드 내부에서 선언되는 변수로, 변수명으로 접근 (메소드 범위를 벗어나면 메모리에서 해제)
        - 클래스 변수 : 클래스 바로 밑에 정의하는 변수 (정적 변수) - 모든 객체가 공유해서 사용하는 변수
                       클래스명으로 접근 - 클래스명.변수명
"""
import mymodule


class Person:
    count = 0   # 클래스 변수

    def __init__(self, empno, deptname):
        print("객체생성")
        self.empno = empno
        self.dept = deptname
        Person.count += 1   # 클래스 변수 접근 방식 : 객체 생성 시 마다 +1

    def __del__(self):
        print("객체가 소멸됨")
        Person.count -= 1   # 클래스 변수 접근 방식 : 객체 소멸 시 마다 -1

    def display(self):
        print("display")
        print(id(self))

    def setEmpNo(self, empno):
        self.empno = empno

    def getEmpNo(self):
        return self.empno


print("==========================")
mymodule.myfunction()
print("==========================")
print("Person시작")
print("__name__?????:", __name__)
print("Person종료")
"""
__name__ 변수는 실제 실행 중인 모듈의 이름이 저장
단독으로 직접 실행했을 때는 __main__이 이름이고, 모듈을 import해서 실행하는 경우에는 모듈의 이름이 전달
"""
if __name__ == "__main__":
    obj = Person("001", "전산실")
    # 파이썬에서 메소드를 호출하는 방법
    obj.display()
    print(id(obj))
    print(Person.count)     # 클래스 변수 출력 - 객체 생성시마다 +1 했으므로 1 출력

    obj2 = Person("002", "인사과")
    obj2.display()
    print(id(obj2))
    print(Person.count)     # 클래스 변수 출력 - 객체 생성시마다 +1 했으므로 2 출력

  3. 출력 결과

  4. __name__ 변수

    - 현재 코드가 실행되고 있는 파일(모듈) 이름이 저장

    - 현재 실행 중인 파일에서는 "__main__"이 저장되고, 현재 실행 중인 파일에서 다른 모듈을 불러올 경우(import),

      그 모듈이 실행되는 동안은 해당 모듈명(파일명)이 저장

    - 따라서 위 코드 중 Person.py 에서 프로그램을 실행 시,

      ① import mymodule 실행되어, mymodule.py 내에서 함수를 제외한 코드(print 세줄)가 실행되며,

        이 때, __name__에는 "mymodule"이 저장되어 있어서 print해보면 mymodule이 출력

      ② mymodule.myfunction( ) 함수 실행 시, 역시 __name__에는 "mymodule"이 저장되어 있고, mymodule이 출력

      ③ Person.py 내에 있는 __name__에는 "__main__"이 저장되어 있어서, __main__ 출력


    ※ if __name__ == "__main__": 을 사용하는 이유

      - import로 모듈을 불러오는 순간 함수나 클래스를 제외한 모듈 내의 코드들이 실행되기 때문에,

        모듈 내에서 if __name__ == "__main__": 없이 테스트 코드를 입력해서 함수나 클래스를 테스트를 할 경우,

        이후에 모듈을 외부 파일에서 사용해야 할 때, 테스트 코드들을 삭제해야 한다.

      - 즉, 모듈 내 테스트 코드를 지우고 싶지 않은 경우, if __name__ == "__main__": 내에 테스트 코드를 적으면,

        외부 파일에서 import로 해당 모듈을 불러와도 테스트 코드가 실행되지 않아 유용하다.


[2] Class 작성 연습

출처 - https://blog.naver.com/heaves1

  1. Tv.py

class Tv:
    def __init__(self):
        self.color = "black"
        self.power = False
        self.channel = 0

    def Power(self):	# 메소드명을 변수명 power와 동일하게 설정 불가 - P 를 대문자로
        self.power = not self.power

    def channelUp(self):
        self.channel += 1

    def channelDown(self):
        self.channel -= 1

    def print(self):
        print("color :"+self.color, end="\t")
        print("power :"+"%-5s" % str(self.power), end="\t")
        print("channel :"+str(self.channel))

  2. Prob01.py

from Tv import Tv

myTv = Tv()
myTv.print()
myTv.Power()
myTv.print()
myTv.channelUp()
myTv.channelUp()
myTv.print()

  3. 실행 결과

 

- 끝 -

728x90