Day 4 - Class vs. Instance

class에 대한 문제를 풀어보도록 하자. 오늘은 30 Days of Code 의 한 문제를 가져와봤다. (언제나 영어 해석하는 것부터가 challenge)

문제 해석

Objective

이번 challenge에서는 class와 instance의 차이를 배워볼 것입니다 블라블라

Task

  1. Person이라는 class를 만들되, instance variable인 age를 지정하라.
  2. 생성자(constructor)의 매개변수(parameter)로 initialAge라는 정수(integer)를 받아라.
  3. initialAge가 음수가 아니라면 age에 넣어주고, 음수라면 age0으로 설정 후 'Age is not valid, setting age to 0.'를 출력하라.
  4. 거기에다가 아래 instance methods들도 정의해줘라.
  • yearPasses()는 instance variable인 age를 1 증가시킨다.
  • amIOld()는 다음의 조건적 작업을 수행한다
    • age < 13 이면 'You are young.' 출력
    • 13<=age<18 이면 'You are a teenager.' 출력
    • 다른 모든 경우 'You are old.' 출력

Input Format

  • 첫 번째 input은 정수 T를 줄건데, 이것은 앞으로 넣을 테스트 케이스의 숫자이다.
  • 그 이후 input들은 Person의 age에 들어갈 T개의 정수들이다.

문제 풀이

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

1
2
3
4
5
6
7
8
9
t = int(input())
for i in range(0, t):
age = int(input())
p = Person(age)
p.amIOld()
for j in range(0, 3):
p.yearPasses()
p.amIOld()
print("")
  • 위 코드는 우리가 만들어야 할 class를 통해 p라는 객체를 만들고 그 객체에서 일련의 작업을 수행하는 것을 t번 반복하는 코드임을 알 수 있다.
    • t와 age는 차례로 input으로 받는다.
    • p라는 객체에 amIOld라는 메소드를 수행한 후 yearPasses라는 메소드를 3번 수행한 후에 다시 amIOld를 수행하여 자기가 늙었는지 확인하는 코드이다.

이제 위 코드가 잘 작동하도록 Person이라는 class를 만들어보자.

  • Task의 1,2번 age 설정하고 3번 조건문 넣어주기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Person:

    def __init__(self, initialAge):
    #parameter로 initialAge 쓰라고 했으니까 시키는대로 말을 잘 듣자.
    if initialAge<0:
    self.age = 0
    print('Age is not valid, setting age to 0.')
    else:
    self.age = initialAge

    이렇게 하여 음수를 넣으면 0으로 age를 설정하고 메시지 출력, 양수를 넣으면 그대로 age에 지정하는 조건으로 instance variable을 지정하는 class를 만들었다.

  • Task의 4번 메소드 중 yearPasses를 만들어주자.

    1
    2
    3
    4
    class Person: 			#초기화 생성자는 위에 있으니 생략

    def yearPasses(self): #모든 생성자의 parameter에 self는 필수!
    self.age += 1 #작동할때마다 age에 1을 더해주기.
  • Task의 4번 메소드 중 amIOld를 만들어주자. 조건문이 여러번 들어간다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Person: 			#위의 생성자들은 생략

    def amIOld(self):
    if self.age<13:
    print('You are young.')
    elif self.age<18:
    print('You are a teenager.')
    #이미 위에서 13 이상의 수만 남았으니 18 미만의 수에 대해서만!
    else:
    print('You are old.')

비교적 간단히 문제들을 해결했다.

이제 위의 모든 코드들을 합쳐주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person:

def __init__(self, initialAge):
if initialAge<0:
self.age = 0
print('Age is not valid, setting age to 0.')
else:
self.age = initialAge

def yearPasses(self):
self.age += 1

def amIOld(self):
if self.age<13:
print('You are young.')
elif self.age<18:
print('You are a teenager.')
else:
print('You are old.')

느낀 점

수업을 듣거나 개념공부 할 땐 헷갈리고 아리송하지만 일단 해보니 설명할 순 없지만 뭐라도 이해가 되긴 한다. 말로 표현 못하고 머릿속에서만 이해되는게 답답하니까 말로 표현할 수 있을 정도로 열심히 공부해보자.