Class와 __init__함수

이찬영·2022년 2월 17일
0

Class 필요성?

객체(object)를 만들어내기 위한 틀이라고 생각하면 된다.

클래스 없이 단순히 def(함수)로만 정의할수도 있지만,
함수가 많아지면 관리하기 어려우니까 비슷한종류?카테고리?의 함수들끼리 class로 묶어서 정의하는 편이다.~라고 말하면 이해가 너무 안되었었다.

그래서 좀더 쉽게 클래스의 필요성을 설명하며 클래스가 무엇인지 잘 알아보쟈~

클래스는 위에서 말했던것 처럼 함수(def)만 이용해서 프로그램을 짤 수 있다.

함수를 쉽게 설명하자면, 지속적으로 하는 행동을 코드를 짜서 함수를 만든다. 함수가 계속해서 많아진다고 하면 그때!!! 클래스가 필요하게 된다.

아래의 코드를 보면서 이해 해보자!

학생의 GPA(학점)을 구하는 계산기를 클래스를 쓰지 않은 상태로 한번 만들어보자.

def calculateGPA(gradeDict):
   return sum(gradeDict.values())/len(gradeDict)

students = {}
name, age, gender, level, grades = "name", "age", "gender", "level", "grades"
john, jane = "john", "jane"
math = "math"
students[john] = {}
students[john][age] = 12
students[john][gender] = "male"
students[john][level] = 6
students[john][grades] = {math:3.3}

students[jane] = {}
students[jane][age] = 12
students[jane][gender] = "female"
students[jane][level] = 6
students[jane][grades] = {math:3.5}

print(calculateGPA(students[john][grades]))
print(calculateGPA(students[jane][grades]))

### 출력값 ###
3.3
3.5

위의 코드를 보면 학생의 GPA를 구하는 것뿐만 아니라, 학생의 다른 정보도 들어가 있다.

지금의 코드에서, 학생을 더 추가해야 한다면 더욱더 길어지고 복잡해진다.

그러나!!!!

클래스를 사용하면 깔끔하게 만들 수 있다.

class Student(object):
    def __init__(self, name, age, gender, level, grades=None):
        self.name = name
        self.age = age
        self.gender = gender
        self.level = level
        self.grades = grades or {}

    def setGrade(self, course, grade):
        self.grades[course] = grade

    def getGrade(self, course):
        return self.grades[course]

    def getGPA(self):
        return sum(self.grades.values())/len(self.grades)

john = Student("John", 12, "male", 6, {"math":3.3})
jane = Student("Jane", 12, "female", 6, {"math":3.5})

print(john.getGPA())
print(jane.getGPA())

### 출력값 ###
3.3
3.5

클래스 생성하기

클래스를 사용하기 위해서는 클래스를 생성하면 되는데 매우 쉽다~!

class Study:
    def python_study(self):
        print("공부중")

be_happy = Study()

be_happy.python_study()

### 출력값 ###
공부중

위에 예제 코드를 보면
Study라는 클래스가 있고 그속에 python_study라는 메써드가 있따. 나느 be_happy라는 변수를 만들어 그 안에 Study 클래스를 할당했고, 결과적으로 Study안에 있는 python_study 메서드를 be_happy.study()으로 접근할 수 있게 되었다.

__init__ 생성자 메서드

클래스로 구현한 계산기를 한번 예제로 보쟈~

class Calculator:
    def __init__(self,first_number,second_number):
        self.firstnumber = first_number
        self.second_number = second_number
    
    def addtion(self):
        return self.firstnumber + self.second_number
    
    def substraction(self):
        return self.firstnumber - self.second_number
    
    def multiplication(self):
        return self.firstnumber * self.second_number

number = Calculator(4,2)

print("덧셈의 결과는" +str(number.addtion()))
print("뺄셈의 결과는" +str(number.substraction()))
print("곱셈의 결과는" +str(number.multiplication()))
### 출력값 ###
덧셈의 결과는6
뺄셈의 결과는2
곱셈의 결과는8

Calculator라는 클래스를 생성하면서 4와 2의 값을 전달해준것을 볼 수 있다.

그런데, Calculator클래스에는 인자를 받는곳이 따로 정해져 있지 않는데 이값은 어디서 받는 걸까라는 생각을 할 수 있어야 한다.(물론 나도 처음에 못했지만 ㅜㅜ)

클래스를 생성하면서 4와 2를 Calculator 클래스에게 넘겨준 걸 볼 수 있다.

넘겨진 파라미터는 생성자 메서드인 __init__ 에서 self를 사용해 변수를 생성해준다. 그래서 다른 함수에서도 self. 변수명을 통해 이 변수에 접근할 수 있다.

그리고 또한 클래스 밖에서도 오브젝트명.변수명으로 접근할 수 있다.

--참고하면 좋은 글--
1번
2번

profile
개발을 탐구하자

0개의 댓글