ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 80 - (파이썬) 클래스 문법 기본
    study with Q - 파이썬 2024. 8. 27. 09:50

    # 클래스 : 함수(와 변수)를 묶어 놓은 것

    → 객체를 만들어내기 위한 설계도

     

    • 클래스 (설계도)
      • 이름
      • 귀여움
      • 야옹함
      • 양말
      • 사냥
    • 객체 = 인스턴스
      • "레오", 100, 100, 100, 0
      • "미루", 100, 30, 90, 80
      • "별이", 100, 10, 0, 20
      • "여름", 100, 60, 10, 60

    그런데 클래스는 변수 뿐만 아니라 함수까지 가져야 진정한 클래스라고 할 수 있다.

    이름
    귀여움
    야옹함
    양말
    사냥
    
    def create_cat(이름, 귀여움, 야옹함, 양말, 사냥):
      return {"이름":이름, "귀여움":귀여움, "야옹함":야옹함, "양말":양말, "사냥":사냥}
    def sum_cat(애옹):
      return 애옹["귀여움"] + 애옹["야옹함"] + 애옹["양말"] + 애옹["사냥"]
    def average_cat(애옹):
      return sum_cat(애옹)/4

     

    그래서 위의 것들을 이용해서 클래스를 만들어보겠다.

     

    #클래스 (설계도)
    class 클래스이름:
     	# 클래스 내용
        
    #클래스 이름과 같은 이름의 객체를 만든다
    
    #변수를 추가
    
    #변수 사용

     

    더보기

    넣어보면

    #클래스 (설계도)
    class 애옹:
      pass
      # 클래스 내용
    
    #객체(인스턴스)
    레오 = 애옹()
    
    #변수 추가
    레오.이름 = "레오"
    레오.귀여움 = 100
    레오.야옹함 = 100
    레오.양말 = 45
    레오.사냥 = 30
    
    #변수 사용
    print(레오.이름)
    print(레오.귀여움)
    >>>
    레오
    100

     

    그렇지만 이건 하나하나 입력하는 것과 다를 바가 없으므로-

    # 클래스의 함수(인스턴스 함수)

       ※ 클래스가 갖는 모든 함수는 첫 번째 매개변수로 self를 가져야 한다.

    #클래스 (설계도)
    class 애옹:
      def 초기화(self, 이름, 귀여움, 야옹함, 양말, 사냥):
        self.이름 = 이름
        self.귀여움 = 귀여움
        self.야옹함 = 야옹함
        self.양말 = 양말
        self.사냥 = 사냥
    
    #객체(인스턴스)
    레오 = 애옹()
    
    #함수 호출방법 (1)
    애옹.초기화(레오, "레오", 100, 100, 45, 30)
    print(레오.이름, 레오.양말)
    
    #함수 호출방법 (2)
    레오.초기화("레오", 100, 100, 45, 30)
    print(레오.이름, 레오.양말)

     

    → 두 번째 호출방법이 쉽기 때문에 더 많이 사용

    그래서 총합과 평균까지 추가해보면...

    #클래스 (설계도)
    class 애옹:
      def 초기화(self, 이름, 귀여움, 야옹함, 양말, 사냥):
        self.이름 = 이름
        self.귀여움 = 귀여움
        self.야옹함 = 야옹함
        self.양말 = 양말
        self.사냥 = 사냥
      def sum(self):
        return self.귀여움 + self.야옹함 + self.양말 + self.사냥
      def average(self):
        return self.sum()/4
    
    #객체(인스턴스)
    레오 = 애옹()
    
    #함수 호출방법 (2)
    레오.초기화("레오", 100, 100, 45, 30)
    레오.sum()
    레오.average()
    print(레오.이름, 레오.양말)

     

     

    #특별한 이름의 함수

       ※ 클래스 이름과 같은 함수를 생성자(contructor) 라고 부르는데!

     생성자는 __init__를 이용해서 만들 수 있다. 따라서 초기화라는 함수를 따로 호출할 필요 없이 객체를 처음 만들 때 매개변수에 이름과 성적 등을 지정해서 생성할 수 있다.

     

    이렇게

    더보기
    #클래스 (설계도)
    class 애옹:
      def __init__(self, 이름, 귀여움, 야옹함, 양말, 사냥):
        self.이름 = 이름
        self.귀여움 = 귀여움
        self.야옹함 = 야옹함
        self.양말 = 양말
        self.사냥 = 사냥
      def sum(self):
        return self.귀여움 + self.야옹함 + self.양말 + self.사냥
      def average(self):
        return self.sum()/4
    
    #객체(인스턴스)
    레오 = 애옹("레오", 100, 100, 45, 30)
    
    #함수 호출
    레오.sum()
    레오.average()
    print(레오.이름, 레오.양말)

     

     

    #클래스 사용

    #클래스 (설계도)
    class 애옹:
      def __init__(self, 이름, 귀여움, 야옹함, 양말, 사냥):
        self.이름 = 이름
        self.귀여움 = 귀여움
        self.야옹함 = 야옹함
        self.양말 = 양말
        self.사냥 = 사냥
      def sum(self):
        return self.귀여움 + self.야옹함 + self.양말 + self.사냥
      def average(self):
        return self.sum()/4
    
    #객체(인스턴스)
    #레오 = 애옹("레오", 100, 100, 45, 30)
    
    #함수 호출
    #레오.sum()
    #레오.average()
    #print(레오.이름, 레오.양말)
    
    
    #클래스 사용
    
    야옹들 = [
      애옹("레오", 100, 100, 45, 30),
      애옹("미루", 100, 30, 90, 80),
      애옹("별이", 100, 70, 0, 90),
      애옹("여름", 100, 15, 5, 70)
    ]
    
    print("이름", "총점", "평균", sep="\t")
    for 애옹 in 야옹들:
      총점 = 애옹.sum() 
      평균 = 애옹.average()
      print(애옹.이름, 총점, 평균, sep="\t")
    
    >>>
    이름    총점    평균
    레오    275 	68.75
    미루    300 	75.0
    별이    260 	65.0
    여름    190 	47.5

     

    #클래스 사용 조금 더 심화

    → 이름/총합/평균까지 def에 넣으면...

    #클래스 (설계도)
    class 애옹:
      def __init__(self, 이름, 귀여움, 야옹함, 양말, 사냥):
        self.이름 = 이름
        self.귀여움 = 귀여움
        self.야옹함 = 야옹함
        self.양말 = 양말
        self.사냥 = 사냥
      def sum(self):
        return self.귀여움 + self.야옹함 + self.양말 + self.사냥
      def average(self):
        return self.sum()/4
      def print(self):
        print(self.이름, self.sum(), self.average(), sep="\t")
    
    
    
    야옹들 = [
      애옹("레오", 100, 100, 45, 30),
      애옹("미루", 100, 30, 90, 80),
      애옹("별이", 100, 70, 0, 90),
      애옹("여름", 100, 15, 5, 70)
    ]
    
    print("이름", "총점", "평균", sep="\t")
    for 애옹 in 야옹들:
      애옹.print()

     

    #클래스 사용 조금 더더 심화

     

    ...는 pass

     

    #클래스 이름 규칙

    : 파이썬의 대부분의 이름은 스네이크 케이스로 이름을 짓는다. eg)create_cat

    : 클래스는 대문자 캐멀케이스로 이름을 짓는다. eg) CreateCat, Student

     

    #왜 사용하는가

    어려운 단계에서는... 그런게 있는데...

    더보기

    그런거

    1) 상속보다 구성(컴포지션)이 안전하다

    2) 리스트(컬렉션)은 클래스로 감싸서 "퍼스트 클래스 컬렉션"으로 만드는 것이 안전하다

    라는 설계적인 패턴이 있는디...

    지금은 모르겠지 뭐

    초급 단계에서는 필요성을 느끼기 힘들기 때문에 모듈을 배우로 활용해봐야 알게 될 것...

     

    #그래서 왜 사용하냐고요

    1) 함수와 변수를 모았으므로(응집했으므로) 가독성이 좋아지고 코드 변경과 유지 보수 때 확인해야 하는 범위가 줄어든다.

    2) 클래스를 사용하는 사람이 클래스를 만든 사람의 의도에 따라 코드를 작성하게 만들어 코드 중복을 줄여 코드 변경과 유지 보수를 쉽게 만든다.

     

    ※ 클래스의 인스턴스 변수를 제대로 숨기지 못하면 코드 중복이 발생하기 때문에 절레절레 상황을 맞닥뜨릴 수 있다.


    참고로) 윤인성님의 유튜브에서 긁어오자면...

    더보기

    생성자
    윤인성 님이 번역하신 "파이썬 매일 코딩"이라는 책에 조금 자세하게 나오지만[...]

    사실 "클래스 이름을 가진 함수"는 __new__()라는 함수를 호출합니다.
    그리고 __new__()에서 __init__()을 호출합니다.

    근데 __new__() 함수는 일반적인 개발자가 만지는 함수가 아닙니다.
    기본적으로 __init__()을 만지고, 여기에서 초기화 등을 진행하므로
    이를 "생성자(contructor)"라고 표현했습니다.

    소문자로 시작하는 클래스
    파이썬에서 대문자로 시작하는 단어는
    모두 "대문자 캐멀케이스를 따른 것"이고, "클래스"입니다.

    하지만 "대문자 캐멀케이스는 클래스이다"이지
    "클래스는 모두 대문자 캐멀케이스이다"는 아닙니다.

    str, list, int, ...처럼
    소문자로 시작하는 클래스도 있습니다!

    여담으로
    type("") 등을 입력하면 [class 'str']가 나왔는데
    문자열도 정수도 부동소수점도 모두 클래스였던 것입니다[따단]

    그리고 클래스였기 때문에
    a = "이름,나이"
    a.split(",")
    처럼 뒤에 쩜을 찍고 함수를 호출할 수 있던 것입니다[따단]

Designed by Tistory.