Day 12 - Inheritance

이번에는 클래스의 상속에 대한 문제를 풀어보도록 하자. 오늘도 30 Days of Code 의 한 문제.

문제 해석

Task

  • 상위 클래스인 Person의 완성된 코드와, 하위 클래스인 Student의 클래스 선언까지는 주어진다. 상속을 이용해서 Student가 다음의 작업을 수행하도록 코드를 완성시켜라.
  1. Student에서 생성자는 4개의 매개변수를 받는다: firstName #str, lastName #str, idNumber #int, scores #array-of-int
  2. calculate()라는 메소드는 Student 객체의 점수평균을 내서 상응하는 알파벳 문자를 리턴한다.

Input Format

  • 에디터에 이미 제공된 코드를 통해 Student 클래스 생성자에 필요한 인자들은 다 넣어주고, calculate 메소드도 (별도 인자 없이) 호출할 것이다..
  • 첫 번째 줄은 firstName, lastName, idNumber이 공백으로 구분되어 입력된다.
  • 두 번째 줄은 test scores의 개수를 나타내며, 세 번째 줄은 공백으로 구분된 점수들의 나열이다.

문제 풀이

HackerRank에 기본세팅 되어 이미 주어진 코드는 다음과 같다.

  • Person 클래스 정의
    1
    2
    3
    4
    5
    6
    7
    8
    class Person:
    def __init__(self, firstName, lastName, idNumber):
    self.firstName = firstName
    self.lastName = lastName
    self.idNumber = idNumber
    def printPerson(self):
    print("Name:", self.lastName + ",", self.firstName)
    print("ID:", self.idNumber)
    • 친절하게 완성된 상위클래스에는 인자로 들어온 세 개의 정보를 class 내의 instance variable에 담아주는 생성자와, 이를 이름과 id번호로 출력하게끔 하는 printPerson이라는 메소드가 정의되어 있다.
  • input과 실행명령들
    1
    2
    3
    4
    5
    6
    7
    8
    9
    line = input().split()
    firstName = line[0]
    lastName = line[1]
    idNum = line[2]
    numScores = int(input()) # not needed for Python
    scores = list( map(int, input().split()) )
    s = Student(firstName, lastName, idNum, scores)
    s.printPerson()
    print("Grade:", s.calculate())
    • 첫번째 줄에서 주어진 이름, 성, id번호를 split으로 공백 기준으로 나눈 리스트가 line이라는 변수에 담겼다.
    • line 안에 있는 요소들이 각 변수이름으로 할당되었다.
    • 두 번째 줄, 즉 점수의 개수가 numScores 라는 변수에 정수형으로 type casting되어 담겼다. #not needed for Python은 무슨 말인지 모르겠다.
    • 세 번째 줄, 공백으로 구분된 시험점수가 split으로 갈라지고, map함수를 통해 정수로 모든 요소들이 각각 type casting되었고, 그 결과물도 list형으로 type casting되어 scores라는 변수에 담겼다.
    • 드디어 s라는 객체가 Student 클래스로 생겨났고, 메소드인 printPerson()을 수행하게 되었다.
    • Task output에서 요구하는 Grade 관련 출력에 대해서는 마지막 줄에 print로 grade는 따로 있는 걸 보니, printPerson() 메소드는 이름과 id번호만 출력하는, 상위클래스에서 상속받은 그대로 사용하면 된다.

먼저 생성자를 상속받고 필요한 건 더 넣자.

  • 하위 class 선언할 때 소괄호 안에 상위클래스명을 넣어주고, 상위 클래스의 __init__을 넣어준다.
  • initializer의 parameter에는 상위클래스의 parameter과 동일하게 넣어주거나 추가되는 parameter이 있다면 뒤에 덧붙인다.
    • 하위클래스에서 우리는 scores라는 게 추가되므로 이것만 instance variable로 따로 할당해준다.
      1
      2
      3
      4
      class Student(Person):
      def __init__(self, firstName, lastName, idNumber, scores):
      Person.__init__(self, firstName, lastName, idNumber)
      self.scores = scores

calculate 함수를 만들어준다.

  • scores의 안에 있는 numScores개의 점수들의 평균을 내고, 그 결과값에 따라 알파벳 문자를 return해줘야 한다.
    • 평균을 내기 위해 점수를 더해 numScores로 나누어 그 결과를 aver_scores라는 변수에 할당. 처음엔 for문으로 변수에다가 더해 넣었는데 생각해보니 굳이 그럴 필요 없는 것 같아서 sum 함수로 변경했다.
    • if문으로 aver_scores에 해당하는 문자로 return.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      class Student(Person):
      def calculate(self):
      aver_scores = sum(self.scores)/numScores
      if aver_scores < 40:
      return 'T'
      elif aver_scores < 55:
      return 'D'
      elif aver_scores < 70:
      return 'P'
      elif aver_scores < 80:
      return 'A'
      elif aver_scores < 90:
      return 'E'
      else:
      return 'O'

느낀 점

생성자를 상속받아 만드는 것을 익힐 수 있었다.
if문이 너무 여러개라서 뭔가 줄여보고 싶은데 잘 모르겠다.
lambda 모듈을 소환해서 reduce를 쓰는 것도 생각해봤는데 어차피 numScores값도 주어졌으니 sum이 훨씬 간편할 것 같다.