<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 파이썬 객체지향 프로그래밍 기초 1
객체
프로그램이 어떤 작업을 수행하기 위해서는 (1)데이터와 (2)데이터를 조작하는 행위, 두 가지 요소가 필요하다. 일반적으로 데이터는 변수(variable)에 넣어서 사용하고 데이터를 조작하는 일은 함수(function)로 구성해서 쉽게 실행시킬 수 있도록 만들어 놓는다.
객체(object)는 서로 연관된 데이터와 그 데이터를 조작하기 위한 함수를 하나의 집합에 모아놓은 것을 말한다.
집합의 원소가 되는 변수나 함수는 멤버(member) 또는 속성(attribute)이라고 한다. 특히 객체에 합쳐진 함수는 함수가 아니라 메서드(method)라고 부른다.
예
Step1:  위 프로그램에서 사각형의 가로 길이를 나타내는 변수 h, 사각형의 세로 길이를 나타내는 변수 v, 그리고 이 사각형의 면적을 계산하는 함수 area()는 제각기 떨어져 있다. 하지만 객체 지향 프로그래밍에서는 이 세가지를 하나의 객체(object)로 묶을 수 있다. 
다음은 이 프로그램을 객체 지향 방식으로 다시 구현한 것이다.
Step2:  이 부분은 클래스(class) 구현이라고 한다. 실제로 길이 변수들을 저장하고 면적을 계산하는 코드는 다음과 같다.
Step3:  위 프로그램에서 r이 바로 객체이다. 어떻게 위와 같은 코드를 만드는지에 대해서는 곧 자세히 설명할 것이다.
객체 r은 사각형의 가로 길이와 세로 길이를 나타내는 변수 h와 v 그리고 면적을 계산하는 함수 area()가 합쳐져서 만들어진 것이다. 객체 r에 포함된 이 변수들과 함수, 즉 속성을 꺼내려면 객체 이름 뒤에 점(.)을 붙인 다음 속성 이름을 치면 된다. 다음과 같이 입력해 보면 알 수 있다.
Step4:  클래스
객체 지향 프로그래밍에서 객체를 만들려면 객체를 바로 만들지 못하고 항상 클래스(class)라는 것을 만든 후에 그 클래스를 이용하여 객체를 만들어야 한다.
위 예제에서 Rectangle은 클래스이고 r은 Rectangle 클래스로 만들어진 객체이다. 객체와 클래스의 관계는 "붕어빵"과 "붕어빵을 굽는 틀"에 비유할 수 있다. 즉, 정해진 속성, 여기에서는 가로 길이 h와 세로 길이 v라는 속성을 가지도록 사각형 클래스를 한 번 만들어 놓으면 이 속성을 가지는 실제 사각형은 얼마든지 많이 만들 수 있다.
<img src="https
Step5:  이 사각형들의 면적은 다음과 같이 계산한다.
Step6:  생성자
파이썬에서 클래스를 정의하는 문법은 다음과 같다.
```
class 클래스이름(object)
Step7:  연습 문제 2
사각 기둥의 부피를 계산하기 위한 클래스를 만든다. 이 클래스는 다음과 같은 속성을 가진다.
밑면의 가로 길이 a, 밑면의 세로 길이 b, 높이 h
부피를 계산하는 메서드 volume
겉넓이를 계산하는 메서드 surface
<ASSISTANT_TASK:>
Python Code:
h = 10
v = 20
def area(h, v):
    return h * v
a = area(h, v)
print(a)
Explanation: 파이썬 객체지향 프로그래밍 기초 1
객체
프로그램이 어떤 작업을 수행하기 위해서는 (1)데이터와 (2)데이터를 조작하는 행위, 두 가지 요소가 필요하다. 일반적으로 데이터는 변수(variable)에 넣어서 사용하고 데이터를 조작하는 일은 함수(function)로 구성해서 쉽게 실행시킬 수 있도록 만들어 놓는다.
객체(object)는 서로 연관된 데이터와 그 데이터를 조작하기 위한 함수를 하나의 집합에 모아놓은 것을 말한다.
집합의 원소가 되는 변수나 함수는 멤버(member) 또는 속성(attribute)이라고 한다. 특히 객체에 합쳐진 함수는 함수가 아니라 메서드(method)라고 부른다.
예: 사각형의 면적 구하기
예를 들어 사각형의 면적을 구하는 프로그램을 만든다고 하자. 필요한 변수와 함수는 다음과 같다.
가로 길이와 세로 길이라는 두 개의 데이터를 넣을 변수
두 길이를 곱해서 면적을 구하는 함수
객체지향을 사용하지 않고 파이썬으로 구현하면 다음과 같아진다.
End of explanation
class Rectangle(object):
    
    def __init__(self, h, v):
        self.h = h
        self.v = v
        
    def area(self):
        return self.h * self.v
Explanation: 위 프로그램에서 사각형의 가로 길이를 나타내는 변수 h, 사각형의 세로 길이를 나타내는 변수 v, 그리고 이 사각형의 면적을 계산하는 함수 area()는 제각기 떨어져 있다. 하지만 객체 지향 프로그래밍에서는 이 세가지를 하나의 객체(object)로 묶을 수 있다. 
다음은 이 프로그램을 객체 지향 방식으로 다시 구현한 것이다.
End of explanation
r = Rectangle(10, 20)    
a = r.area()
print(a)
Explanation: 이 부분은 클래스(class) 구현이라고 한다. 실제로 길이 변수들을 저장하고 면적을 계산하는 코드는 다음과 같다.
End of explanation
r.h
r.v
r.area()
Explanation: 위 프로그램에서 r이 바로 객체이다. 어떻게 위와 같은 코드를 만드는지에 대해서는 곧 자세히 설명할 것이다.
객체 r은 사각형의 가로 길이와 세로 길이를 나타내는 변수 h와 v 그리고 면적을 계산하는 함수 area()가 합쳐져서 만들어진 것이다. 객체 r에 포함된 이 변수들과 함수, 즉 속성을 꺼내려면 객체 이름 뒤에 점(.)을 붙인 다음 속성 이름을 치면 된다. 다음과 같이 입력해 보면 알 수 있다.
End of explanation
a = Rectangle(1, 1)   # 가로 1, 세로 1인 사각형
b = Rectangle(2, 1)   # 가로 2, 세로 1인 사각형
c = Rectangle(4, 2)   # 가로 4, 세로 2인 사각형
d = Rectangle(6, 3)   # 가로 6, 세로 3인 사각형
e = Rectangle(8, 5)   # 가로 8, 세로 5인 사각형
Explanation: 클래스
객체 지향 프로그래밍에서 객체를 만들려면 객체를 바로 만들지 못하고 항상 클래스(class)라는 것을 만든 후에 그 클래스를 이용하여 객체를 만들어야 한다.
위 예제에서 Rectangle은 클래스이고 r은 Rectangle 클래스로 만들어진 객체이다. 객체와 클래스의 관계는 "붕어빵"과 "붕어빵을 굽는 틀"에 비유할 수 있다. 즉, 정해진 속성, 여기에서는 가로 길이 h와 세로 길이 v라는 속성을 가지도록 사각형 클래스를 한 번 만들어 놓으면 이 속성을 가지는 실제 사각형은 얼마든지 많이 만들 수 있다.
<img src="https://datascienceschool.net/upfiles/4aac5f2a9d454d398e8e73cc2f4bc9b9.png" style="width:100%;">
예를 들어 위에서 만들어 놓은 Rectangle 클래스로 다음과 같이 5개의 사각형을 만들 수도 있다.
End of explanation
print(a.area())
print(b.area())
print(c.area())
print(d.area())
print(e.area())
Explanation: 이 사각형들의 면적은 다음과 같이 계산한다.
End of explanation
class triangle:
    
    def __init__(self, b, h):
        self.b = b
        self.h = h
        
    def area(self):
        return self.b * self.h
a = triangle(10, 20)
a.area()
Explanation: 생성자
파이썬에서 클래스를 정의하는 문법은 다음과 같다.
```
class 클래스이름(object):
def __init__(self, 속성값1, 속성값2, 속성값3):
    self.속성이름1 = 속성값1
    self.속성이름2 = 속성값2
    self.속성이름3 = 속성값3
```        
이 때 속성값 인수는 필요하지 않다면 없어도 된다. 
여기에서 class 블럭안에 정의된 __init__란 함수는 생성자(constructor)라고 하며 클래스 정의에서 가장 중요한 함수이다.
객체를 생성할 때는 클래스이름이란 이름을 가진 함수를 호출해야 하는데 이 때 실제로는 __init__로 정의된 생성자 함수가 호출된다. 생성자 함수 내부에서는 생성자를 호출할 때 넣은 입력 변수, 즉 인자의 값을 속성값으로 저장한다.
즉, __init__은 초기값을 저장한다고 보면 된다
연습 문제 1
삼각형의 넓이를 계산하기 위한 클래스를 만든다. 이 클래스는 다음과 같은 속성을 가진다.
밑변의 길이 b 와 높이 h
삼각형의 넓이를 계산하는 메서드 area
End of explanation
class 사각기둥부피:
    
    def __init__(self, a1, b1, h1):
        self.a1 = a1
        self.b1 = b1
        self.h1 = h1
        
    def volume(self):
        return self.a1 * self.b1 * self.h1
    
    def surface(self):
        return 2(self.a1*self.b1+self.b1*self.h1+self.h1*self.a1)
make_sample = 사각기둥부피(10,20,2)
make_sample.volume()
make_sample.surface()
Explanation: 연습 문제 2
사각 기둥의 부피를 계산하기 위한 클래스를 만든다. 이 클래스는 다음과 같은 속성을 가진다.
밑면의 가로 길이 a, 밑면의 세로 길이 b, 높이 h
부피를 계산하는 메서드 volume
겉넓이를 계산하는 메서드 surface
End of explanation
<END_TASK>