본문 바로가기

Programming

[Python][문법] 기초 - 5. Class 1

반응형
#!/usr/bin/env python
# coding: utf-8

# # 1. 객체지향 프로그래밍(Class) I

# ### 1.1 객체와 클래스

# - 클래스
# - 인스턴스
# - 객체(object)

# In[ ]:


class Car:
    def __init__(self):
        self._speed = 0
        print('자동차가 생성되었습니다.')

    def get_speed(self):
        return self._speed

    def start(self):
        self._speed = 20
        print('자동차가 출발합니다.')

    def accelerate(self):
        self._speed = self._speed + 30
        print('자동차가 가속합니다.')

    def stop(self):
        self._speed = 0
        print('자동차가 정지합니다.')

# main

my_car = Car()
my_car.start()
print('속도 1: ', my_car.get_speed() )
my_car.accelerate()
print('속도 2: ', my_car.get_speed() )
my_car.stop()
print('속도 3: ', my_car.get_speed() )


# ### 1.2 self

# In[ ]:


class Car:
    def __init__(self):
        self._speed = 0

    def get_speed(self):
        return self._speed

    def start(self):
        self._speed = 20

    def accelerate(self):
        self._speed = self._speed + 30

    def stop(self):
        self._speed = 0

# main

my_car1 = Car()
my_car2 = Car()

my_car1.start()
my_car2.start()

my_car1.accelerate()

my_car2.accelerate()
my_car2.accelerate()

print('첫번째 자동차 속도: ', my_car1.get_speed() )
print('두번째 자동차 속도: ', my_car2.get_speed() )

my_car1.stop()
my_car2.stop()


# In[ ]:


class Radio:
    def __init__(self):
        print('라디오가 생성되었습니다.')
        pass

    def turn_on(self):
        print('라디오를 켭니다')
       
    def turn_off(self):
        print('라디오를 끕니다')


class Car:
    def __init__(self):
        self._speed = 0
        print('자동차가 생성되었습니다.')
        self._radio = Radio()

    def get_speed(self):
        return self._speed

    def start(self):
        self._speed = 20
        print('자동차가 출발합니다.')

    def accelerate(self):
        self._speed = self._speed + 30
        print('자동차가 가속합니다.')

    def stop(self):
        self._speed = 0
        print('자동차가 정지합니다.')

    def turn_on_radio(self):
        self._radio.turn_on()

    def turn_off_radio(self):
        self._radio.turn_off()

# main

my_car = Car()
my_car.start()
my_car.turn_on_radio()
my_car.accelerate()
my_car.turn_off_radio()
my_car.stop()


# ### 1.3 모듈과 클래스

# #### vehicle.py
#
# ```python
#
# def change_km_to_mile(km):
#     return km * 0.621371
#
# def change_mile_to_km(mile):
#     return mile * 1.609344
#
#
# class Car:
#     def __init__(self):
#         self._speed = 0
#
#     def get_speed(self):
#         return self._speed
#
#     def start(self):
#         self._speed = 20
#
#     def accelerate(self):
#         self._speed = self._speed + 30
#
#     def stop(self):
#         self._speed = 0
#
# class Truck:
#     def __init__(self):
#         self._speed = 0
#
#     def get_speed(self):
#         return self._speed
#
#     def start(self):
#         self._speed = 10
#
#     def accelerate(self):
#         self._speed = self._speed + 20
#
#     def stop(self):
#         self._speed = 0
#
#
# if __name__ == '__main__':
#     my_car = Car()
#     my_car.start()
#     my_car.accelerate()
#     print('속도: ', my_car.get_speed() )
#     my_car.stop()
# ```

# In[ ]:


import vehicle
#import vehicle as vh
#from vehicle import *

my_car = vehicle.Car()
#my_car = vh.Car()
#my_car = Car()

my_car.start()
my_car.accelerate()

speed_mile = vehicle.change_km_to_mile(my_car.get_speed())
#speed_mile = vh.change_km_to_mile(my_car.get_speed())
#speed_mile = change_km_to_mile(my_car.get_speed())

print('속도: ', speed_mile, 'mile' )

my_car.stop()


# ### 1.4 클래스와 데이터 타입

# In[ ]:


type(1)
type(3.14)
isinstance(1, int)

type('Hello World')
isinstance('Hello World', str)

type([1,2,3])
isinstance([1,2,3], list)

type({'line':1, 'rectangle':2, 'triangle':3})
isinstance({'line':1, 'rectangle':2, 'triangle':3}, dict)


# In[ ]:


from vehicle import *

my_car = Car()
type(my_car)
isinstance(my_car, Car)

my_truck = Truck()
type(my_truck)
isinstance(my_truck, Truck)


# ### 1.5 캡슐화와 접근지정

# - 캡슐화(encapsulation)
# - 상속성(inheritance)
# - 다형성(polymorphism)

# In[ ]:


# access_modifiers1

class Car:
    def __init__(self):
        self.price = 2000
        self._speed = 0
        self.__color = 'red'

my_car = Car()
print(my_car.price)
print(my_car._speed)
print(my_car.__color)


# In[ ]:


# access_modifiers2

class Car:
    def __init__(self):
        self._price = 0
        self._speed = 0
        self._color = None

    def get_price(self):
        return self._price

    def set_price(self, value):
        self._price = value

    def get_speed(self):
        return self._speed

    def set_speed(self, value):
        self._speed = value

    def get_color(self):
        return self._color

    def set_color(self, value):
        self._color = value

# main

my_car = Car()

my_car.set_price(2000)
my_car.set_speed(20)
my_car.set_color('red')

print('가격: ', my_car.get_price())
print('속도: ', my_car.get_speed())
print('색상: ', my_car.get_color())


# ### 1.6 property 이용하기

# In[ ]:


# car_property1

class Car:
    def __init__(self):
        self._price = 0
        self._speed = 0
        self._color = None

    @property
    def price(self):
        return self._price
       
    @price.setter
    def price(self, value):
        self._price = value

    @property
    def speed(self):
        return self._speed

    @speed.setter
    def speed(self, value):
        self._speed = value

    @property
    def color(self):
        return self._color

    @color.setter
    def color(self, value):
        self._color = value

# main

my_car = Car()

my_car.price = 2000
my_car.speed = 20
my_car.color = 'red'

print('가격: ', my_car.price)
print('속도: ', my_car.speed)
print('색상: ', my_car.color)


# In[ ]:


# car_property2

class Car:
    def __init__(self):
        self._price = 0
        self._speed = 0
        self._color = None

    def get_price(self):
        return self._price
       
    def set_price(self, value):
        self._price = value
   
    price = property(get_price, set_price)

    def get_speed(self):
        return self._speed

    def set_speed(self, value):
        self._speed = value

    speed = property(get_speed, set_speed)
   
    def get_color(self):
        return self._color

    def set_color(self, value):
        self._color = value
       
    color = property(get_color, set_color)

# main

my_car = Car()

my_car.price = 2000
my_car.speed = 20
my_car.color = 'red'

print('가격: ', my_car.price)
print('속도: ', my_car.speed)
print('색상: ', my_car.color)


# ### 1.7 예제: 요일 구하기(객체지향)

# In[ ]:


# 년월일을 입력받는 함수
# 반환값: 년월일을 튜플형태로 반환
def input_date():
    year  = int(input('년도를 입력하시오: '))
    month = int(input('월을 입력하시오: '))
    day   = int(input('일을 입력하시오: '))
   
    return year, month, day


# In[ ]:


# DayName 클래스

class DayName(object):

    # DayName 클래스 생성자
    def __init__(self, year, month, day):
        self._year  = year
        self._month = month
        self._day   = day
        self._name  = None
       
        self._year_month_days = [0,31,28,31,30,31,30,31,31,30,31,30,31]
        self._day_names = ['일요일','월요일','화요일','수요일','목요일','금요일','토요일']
       
        # 요일을 계산한다
        self._calculate_day_name()
       
    # 윤년인지를 체크하는 메서드
    def _is_leap(self, year):
        if year % 400 == 0:                 # 400으로 나뉘는 해: 윤년
            return True
        elif year % 100 == 0:               # 100으로 나뉘는 해: 평년
            return False
        elif year % 4 == 0:                 # 4으로 나뉘는 해  : 윤년
            return True
        else:
            return False
   
    # 요일을 계산하는 메서드
    def _calculate_day_name(self):
   
        total_days = 0
       
        for item in range(1, self._year):
            if self._is_leap(item):
                total_days = total_days + 366
            else:
                total_days = total_days + 365

        for item in range(1, self._month):
            total_days = total_days + self._year_month_days[item]

        if month >= 3:
            if self._is_leap(self._year):
                total_days = total_days + 1

        total_days += self._day
        remainder = total_days % 7
       
        self._name = self._day_names[remainder]
   
    # 요일 이름을 반환하는 메서드
    def get_name(self):
        return self._name
   


# In[ ]:


# main

year, month, day = input_date()

day_name = DayName(year, month, day)

print( day_name.get_name())


# ### 1.8 예제: 성적 처리 시스템(객체지향)

# In[ ]:


# student

class Student(object):

    def __init__(self, num, name, kor, eng, math):
   
        # 학생의 속성
        self._num  = num
        self._name = name
        self._kor  = kor
        self._eng  = eng
        self._math = math
       
        self._total = 0
        self._avg   = 0.0
        self._order = 0
       
        # 총점과 평균을 구한다.
        self._calculate_total()
        self._calculate_avg()
   
    def _calculate_total(self):
        self._total = self._kor + self._eng + self._math
       
    def _calculate_avg(self):
        self._avg = self._total / 3
   
    @property
    def num(self):
        return self._num
       
    @property
    def name(self):
        return self._name
       
    @property
    def kor(self):
        return self._kor
       
    @property
    def eng(self):
        return self._eng
       
    @property
    def math(self):
        return self._math
       
    @property
    def total(self):
        return self._total
       
    @property
    def avg(self):
        return self._avg
       
    @property
    def order(self):
        return self._order
       
    @order.setter
    def order(self, value):
        self._order = value


# In[ ]:


# grade_system

class StudentGradeSystem(object):

    def __init__(self):
   
        # 학생 객체를 저장할 리스트
        self._students = []
       
        # 반 성적을 저장할 속성
        self._class_avg = 0.0
        self._kor_avg   = 0.0
        self._eng_avg   = 0.0
        self._math_avg  = 0.0

    # 학생 등수를 구한다.
    def _calculate_student_order(self):
        temp_students = sorted(self._students, key = lambda x: x.total, reverse = True)
       
        order = 1
        for student in temp_students:
            student.order = order
            order = order + 1
           
        self._students = temp_students
   
    # 반 평균을 구한다.
    def _calculate_class_avg(self):
        total = 0
       
        for student in self._students:
            total = total + student.total
       
        self._class_avg = total / len(self._students)

    # 국어 평균을 구한다.
    def _calculate_kor_avg(self):
        total = 0
       
        for student in self._students:
            total = total + student.kor
       
        self._kor_avg = total / len(self._students)

    # 영어 평균을 구한다.
    def _calculate_eng_avg(self):
        total = 0
       
        for student in self._students:
            total = total + student.eng
       
        self._eng_avg = total / len(self._students)

    # 수학 평균을 구한다.
    def _calculate_math_avg(self):
        total = 0
       
        for student in self._students:
            total = total + student.math
       
        self._math_avg = total / len(self._students)

    # 반 성적 정보를 구한다.
    def _calculate_class_information(self):
        self._calculate_class_avg()
        self._calculate_kor_avg()
        self._calculate_eng_avg()
        self._calculate_math_avg()

    # 학생 객체를 등록한다.
    def register_student(self, student):
        self._students.append(student)

    # 학생 성적 및 반 성적을 처리한다.
    def process(self):
        self._calculate_student_order()         # 학생 순위를 구한다.
        self._calculate_class_information()     # 반 성적 정보를 구한다.

    # 학생 성적을 출력한다.
    def print_students(self):
        for student in self._students:
            print('번호: {:s}, 이름: {:s}, 국어: {:d}, 영어: {:d}, 수학: {:d}, 총점: {:d}, 평균: {:.2f}, 등수: {:d}'.format(
                   student.num, student.name,
                   student.kor, student.eng, student.math,
                   student.total, student.avg, student.order)
                 )

    # 반 성적 정보를 출력한다.
    def print_class_information(self):
        print('반 평균  : {:.2f}'.format(self._class_avg))
        print('국어 평균: {:.2f}'.format(self._kor_avg)  )
        print('영어 평균: {:.2f}'.format(self._eng_avg)  )
        print('수학 평균: {:.2f}'.format(self._math_avg) )


# In[ ]:


# main

student_grade_system = StudentGradeSystem()

student = Student('1', '김철수', 90, 80, 85)
student_grade_system.register_student(student)

student = Student('2', '박제동', 90, 85, 90)
student_grade_system.register_student(student)

student = Student('3', '홍길동', 80, 80, 80)
student_grade_system.register_student(student)

student_grade_system.process()
student_grade_system.print_students()
print()
student_grade_system.print_class_information()


# ---

# In[ ]:


# end of file


# In[ ]:





반응형
LIST