프로그래머스 파이썬 입문_15차시 클래스와 객체지향 프로그래밍, 16차시 상속, 17차시 Comprehension, 18차시 날짜와 시간

리냥·2022년 6월 7일
0

프로그래머스 파이썬 입문_15차시 클래스와 객체지향 프로그래밍, 16차시 상속, 17차시 Comprehension, 18차시 날짜와 시간


1-1. 자료형 다루기

  • 자료형
    type( a ) # type( 변수명 ) : 자료형
    isinstance( 42, int ) # isinstance( 값, 자료형 ) : 자료형 검사

1-2. 자료형 다루기 실습 하기

  • 문제
자료형을 확인하는 방법에 대해 알아봅시다. 다음 코드의 실행 결과를 확인해 보세요.

type(변수명)을 이용하면 변수의 자료형을 알 수 있어요.

  • 코드
my_list = [1, 2, 3]
my_dict = {"풀": 800, "색연필": 3000}
my_tuple = (1, 2, 3)
number = 10
real_number = 3.141592

print(type(my_list))
print(type(my_dict))
print(type(my_tuple))
print(type(number))
print(type(real_number))

2-1. 인스턴스 이해

  • 클래스
    함수나 변수들을 모아 놓은 집합체
  • 인스턴스
    클래스에 의해 생성된 객체
    인스턴스 각자 자신의 값을 가지고 있음

2-2. 인스턴스 이해 실습 하기

예제1

  • 문제
list1과 list2는 같은 값을 가지는 리스트입니다. 코드의 4번째줄에 있는것과 같이 is연산을 하면 둘이 같은 인스턴스인지를 알아볼 수 있고, 7번째줄에 있는 ==연산을 하면 둘이 같은 값을 가지는지 알아볼 수 있습니다. 다음을 실행해서 나오는 출력을 확인하고 is연산과 ==연산의 차이를 확인해 보세요.

인스턴스는 클래스에 의해 생성된 객체를 뜻합니다. 인스턴스의 클래스가 같더라도 각자 다른 값을 가질 수 있습니다.
  • 코드
list1 = [1, 2, 3]
list2 = [1, 2, 3]

if list1 is list1:
    print("당연히 list1과 list1은 같은 인스턴스입니다.")

if list1 == list2:
    print("list1과 list2의 값은 같습니다.")
    if list1 is list2:
        print("그리고 list1과 list2는 같은 인스턴스입니다.")
    else:
        print("하지만 list1과 list2는 다른 인스턴스입니다.")

예제2

  • 문제
다음 코드는 list1과 list2가 모두 list클래스의 인스턴스인지를 검사합니다. 코드의 빈칸을 채워넣어 정상 동작하도록 만들어 보세요.

인스턴스가 특정 클래스의 인스턴스인지 알아보는 방법으로 isinstance를 이용할 수 있습니다.
아래의 코드를 참고하여 문제를 해결해 보세요.
  • 코드
list1 = list("hello")
list2 = list("hello")

isinstance(list1, list)      #True
isinstance(list2, list)      #True

3-1. 클래스 만들기

  • 클래스 선언
class Human( ):
    '''사람'''
  • 인스턴스 생성
person1 = Human( )
person2 = Human( )

3-2. 클래스 만들기 실습 하기

예제1

  • 문제
다음 코드는 클래스 Car의 인스턴스로 taxi를 만들고 있습니다. taxi.name을 "택시"라고 저장해 보세요.

클래스를 선언하고 인스턴스를 생성하려면 다음과 같은 방법을 사용할 수 있습니다.
  • 코드
class Human():
    '''사람'''

person1 = Human()
person2 = Human()

person1.language = '한국어'
person2.language = 'English'

4-1.모델링

  • 모델링(modeling)
  • 클래스로 현실의 개념을 표현하는 것

5-1. 메소드 이해하기

  • 메소드(Method)
    -메소드는 함수와 비슷하다.
  • 클래스에 묶여서 클래스의 인스턴스와 관계되는 일을 하는 함수
class Human( ):
    '''인간'''
    def create( name, weight ): # 다음 강의에서 자세히 설명
        person = Human()
        person.name = name
        person.weight = weight
        return person

    def eat( self ):
        self.weight += 0.1
        print("{}가 먹어서 {}kg이 되었습니다".format(self.name, self.weight))

    def walk( self ):
        self.weight -= 0.1
        print("{}가 걸어서 {}kg이 되었습니다".format(self.name, self.weight))

person = Human.create("철수", 60.5)
person.eat()
  • self
    -메소드의 첫번째 인자
  • 인스턴스의 매개변수를 전달 할 때는 self 매개변수는 생략하고 전달

5-2. 메소드 이해하기 실습 하기

예제1

  • 문제
taxi는 Car클래스의 인스턴스로 "택시"라는 이름을 가지고 있습니다.taxi.run()을 호출할 수 있도록 Car클래스 밖에 정의되어 있는 run함수를 클래스 안으로 가져오세요. 가져온 다음에는 run의 매개변수인 car를 self로 변경하세요.

메소드는 클래스에 포함되어 있는 함수를 가리킵니다.
함수를 클래스 안으로 가져오려면 그 함수를 클래스 안에 넣어 들여쓰고, 메소드의 첫 번째 인자를 self로 변경해야 합니다.
  • 코드
class Human( ):
    '''인간'''
    def create( name, weight ): # 다음 강의에서 자세히 설명
        person = Human()
        person.name = name
        person.weight = weight
        return person

    def eat( self ):
        self.weight += 0.1
        print("{}가 먹어서 {}kg이 되었습니다".format(self.name, self.weight))

6-1. 특수한 메소드

  • 초기화 함수, 문자열화 함수
class Human( ):
    '''인간'''
    def __init__( self, name, weight ):
        '''초기화 함수'''
        self.name = name
        self.weight = weight

    def __str__( self )
        '''문자열화 함수
        return "{} ( 몸무게 {}kg )".format( self.name, self.weight )

person = Human( "사람", 60.5 ) # 초기화 함수 사용
print( person ) # 문자열화 함수 사용

6-2. 특수한 메소드 실습 하기

예제1

  • 문제
다음 코드는 완성된 Human클래스입니다. 19번째 줄에서 person을 Human클래스의 인스턴스로 만들고, person이 2번 걷고 1번 먹도록 만들어 보세요.

  • 코드
class Human( ):
    '''인간'''
    def __init__( self, name, weight ):
        '''초기화 함수'''
        self.name = name
        self.weight = weight

    def __str__( self )
        '''문자열화 함수'''
        return "{} ( 몸무게 {}kg )".format( self.name, self.weight )

person = Human( "사람", 60.5 )     # 초기화 함수 사용
print( person )                    # 문자열화 함수 사용
  • 코드
class Human():
    
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight
    
    def __str__(self):
        return "{} (몸무게 {}kg)".format(self.name, self.weight)
    
    def eat(self):
        self.weight += 0.1
        print("{}가 먹어서 {}kg이 되었습니다.".format(self.name, self.weight))
    
    def walk(self):
        self.weight -= 0.1
        print("{}가 걸어서 {}kg이 되었습니다.".format(self.name, self.weight))

# 아래에서 person을 이름과 몸무게를 가지는 Human클래스의 인스턴스로 만들어보세요.
person =


print(person)


1-1.상속

상속하는 클래스를 부모 클래스
상속받는 클래스를 자식 클래스
자식 클래스가 부모 클래스의 내용을 가져다 쓸 수 있는 것

class Animal( ):
    def walk( self ):
        print( "걷는다" )

    def eat( self ):
        print( "먹는다" )

class Human( Animal ):
    def wave( self ):
        print( "손을 흔든다" )

class Dog( Animal ):
    def wag( self ):
        print( "꼬리를 흔든다" )

1-2. 상속 실습 하기

  • 문제
Car클래스를 상속받는 Truck이라는 클래스를 만들고, load라는 메소드를 만들어 보세요. load메소드에서는 "짐을 실었습니다."라고 출력하면 됩니다.

Car클래스를 부모 클래스, Truck클래스를 자식 클래스로 만들어야 합니다.
  • 코드
class Animal():
    def walk(self):
        print("걷는다")
class Human(Animal):
    def wave(self):
        print("손을 흔든다")

2-1. 단순 오버라이드

  • 오버라이드(Override)
    같은 이름을 가진 메소드를 덮어 쓴다는 의미
class Animal( ):
    def greet( self ):
        print( "인사한다" )

class Human( Animal ):
    def greet( self ):
        print( "손을 흔든다" )

class Dog( Animal ):
    def greet( self ):
        print( "꼬리를 흔든다" )

2-2. 단순 오버라이드 실습 하기

예제1

  • 문제
Truck클래스는 Car클래스의 자식클래스입니다. Car클래스에 정의된 run을 Truck클래스에서 오버라이드해서 run을 실행하면 "트럭이 달립니다."라고 출력되도록 만들어 보세요.

오버라이드란 같은 이름을 가진 메소드를 엎어 쓴다는 의미입니다.
  • 코드
class Animal( ):
    def greet( self ):
        print( "인사한다" )

class Human( Animal ):
    def greet( self ):
        print( "손을 흔든다" )

class Dog( Animal ):
    def greet( self ):
        print( "꼬리를 흔든다" )

3-1. super()

  • super()

자식클래스에서 부모클래스의 내용을 사용하고 싶은 경우
super().부모클래스내용

class Animal( ):
    def __init__( self, name ):
        self.name = name

class Human( Animal ):
    def __init__( self, name, hand ):
        super().__init__( name ) # 부모클래스의 __init__ 메소드 호출
        self.hand = hand

person = Human( "사람", "오른손" )

3-2. super() 실습 하기

예제1

  • 문제
Truck클래스는 Car클래스의 상속을 받는 자식클래스입니다. Truck클래스의 __init__에서 name, capacity(몇톤트럭인지)를 입력받아 인스턴스의 값으로 저장하세요. (단, Truck클래스의 __init__에서 name을 설정하는 부분은 super()를 이용해서 처리하도록 만드세요.)
  • 코드
class Animal( ):
    def __init__( self, name ):
        self.name = name

class Human( Animal ):
    def __init__( self, name, hand ):
        super().__init__( name )        # 부모클래스의 __init__ 메소드 호출
        self.hand = hand

person = Human( "사람", "오른손" )

4-1.내 예외 만들기

  • 예외 정의
  • 사용자가 직접 예외처리를 하면 코드의 직관성을 높일 수 있다.
  • 파일을 하나 만들어 예외를 정의
  • Exception 클래스를 상속받아 만든다
try:
    sign_up( )
except BadUserName:
    print( "이름으로 사용할 수 없는 입력" )
except PasswordNotMatched:
    print( "입력한 패스워드 불일치")

4-2.내 예외 만들기 실습 하기

예제1

  • 문제
    다음 코드는 문구점 3곳을 검사하면서 풀이 있으면 문구점의 이름과 가격을 출력하고 MyException을 raise해서 즉시 for in문 전체를 종료합니다. 코드의 2번째 줄에 Exception클래스를 상속받는 MyException이라는 예외 클래스를 만들어 보세요.
-코드
```python
class BadUserName(Exception):             # 이름에 대한 예외처리
class PasswordNotMatched(Exception):      # 패스워드에 대한 예외처리

try:
    sign_up( )
except BadUserName:
    print( "이름으로 사용할 수 없는 입력" )
except PasswordNotMatched:
    print( "입력한 패스워드 불일치")

1-1. List

  • list
    파이썬의 유용한 도구
예1 [ i*i for i in range(1,11) ] # [ 계산식 for문 ]
예2 [ i*i for i in range(1,11) if i % 2 == 0 ] # [ 계산식 for문 조건문 ]
예3 [ ( x, y ) for x in range(15) for y in range(15) ] # [ 계산식 for문 for문 ]

1-2. List 실습 하기

  • 문제
list comprehension을 이용해서 list1이 1부터 100 사이의 8의 배수를 가지도록 만들어 보세요.

  • 코드
areas1 = [ i*i for i in range(1,11) ]                          # [ 계산식 for문 ]
areas2 = [ i*i for i in range(1,11) if i % 2 == 0]             # [ 계산식 for문 조건문 ]
areas3 = [ ( x, y ) for x in range(15) for y in range(15) ]    # [ 계산식 for문 for문 ]

2-1. Dictionary

  • 파이썬의 유용한 도구
  • 예시
{ "{}번".format(number):name for number, name in enumerate(students) } # [ 형식 for문 ]
{student:score for student, score in zip(students, scores)}

2-2. Dictionary 실습 하기

예제1

  • 문제
product_list에는 상품의 목록이 들어 있고, price_list에는 각 상품의 가격이 순서대로 들어있습니다. 딕셔너리 컴프리헨션을 이용해서 product_dict를 상품의 이름을 키로 가지고, 가격을 값으로 가지는 딕셔너리로 만들어보세요.
  • 코드
students = ["태연", "진우", "정현", "하늘", "성진"]
{"{}번".format(number):name for number, name in enumerate(students)}
    # {'2번': '정현', '0번': '태연', '1번': '진우', '4번': '성진', '3번': '하늘'}

1-1. datetime

  • datetime
    날짜와 시간을 사용하게 해주는 라이브러리

1-2. datetime 실습 하기

  • 문제
christmas_2016이 2016년 12월25일을 값으로 가지는 datetime클래스의 인스턴스가 되도록 만들어 보세요.

datetime은 날짜와 시간을 사용 할 수 있게 해주는 라이브러리입니다.
원하는 날짜와 시간으로 인스턴스를 만들기 위해서는 아래의 예와 같이 사용합니다.
  • 코드
start_time = datetime.datetime(2016, 2, 1)
import datetime

christmas_2016 =

print(christmas_2016)

2-1. timedelta

  • timedelta
  • 시간의 연산을 가능하게 해주는 클래스

2-2. timedelta 실습 하기

예제1

  • 문제
hundred_after가 지금으로부터 100일 후, 9시 정각을 값으로 가지는 datetime클래스의 인스턴스가 되도록 만들어 보세요. (단, 정각의 기준은 초 단위까지만 맞으면 됩니다.)
  • 코드
addtime = datetime.timedelta(days = 10)
datetime.datetime.now() + addtime    # 10일 후
datetime.datetime.now() - addtime    # 10일 전

thedate = datetime.datetime.now().replace(hour = 10, minute=0, second = 0)
          + datetime.timedelta(days = 3)       # 3일 후 10시 정각

profile
안녕하세요. 일로 인해 잠시 쉽니다 :)

0개의 댓글