티스토리 뷰
1. 클래스 선언과 객체 생성
객체는 속성(상태, 특징)과 행위(행동, 동작, 기능)로 구성된 대상을 의미한다. 객체는 자동차나 로봇 같은 사물일 수도 있고 사람이나 동물일 수 있으며 어떤 개념일 수도 있다. 프로그래밍 언어에서 객체를 만들 때는 주로 현실 세계를 반영해서 만든다. 객체의 특징인 속성은 변수로, 객체가 할 수 있는 일인 행동은 함수로 구현한다. 즉 객체는 변수와 함수의 묶음 이다. 예를 들어, 객체가 자전거라면 바퀴의 크기, 색깔 같은 속성은 변수로 구현하고 전진, 방향 전환, 정지 같은 동작은 함수로 구현한다.
객체를 만들고 이용할 수 있는 기능을 제공하는 프로그래밍 언어를 객체지향 프로그래밍 언어 혹은 객체지향 언어라고 한다. 파이썬도 객체지향 언어이다.
클래스 선언
객체를 만들려면 먼저 클래스를 선언해야 한다. 클래스는 객체의 공통된 속성과 행위를 변수와 함수로 정의한 것이다. 다시 말해 클래스는 객체를 만들기 위한 기본 틀이고 객체는 기본 틀을 바탕으로 만들어진 결과이다. 객체는 클래스에서 생성하므로 객체를 클래스의 인스턴스라고 한다. 예를들어, 붕어빵을 만드는 틀이 클래스라면 이 틀로 만들어진 붕어빵은 객체이다. 같은 붕어빵 틀에서 나왔지만 붕어빵 안에 무엇을 넣느냐에 따라 단팥맛, 크림맛, 치즈맛, 초콜릿 맛이 된다. 이것은 마치 객체의 속성을 규정한 변수에 무슨 값을 할당하느냐에 따라 객체의 속성이 달라지는 것과 같다.
클래스 선언을 위한 기본 구조
class 클래스명( ): [변수1] # 클래스 변수 [변수2] . . . def 함수1(self[, 인자1, 인자2, . . . , 인자n]): # 클래스 함수 <코드 블록> . . . def 함수2(self[, 인자1, 인자2, . . . , 인자n]): <코드 블록> . . . |
클래스명은 보통 로마자 알파벳 대문자로 시작하며 여러 단어가 연결된 클래스 이름은 가독성을 위해 대문자로 시작하는 단어를 연결해 클래스 이름을 만든다.
클래스에서 정의한 함수의 첫 번째 인자는 self이다. 여기서 self는 객체 생성 후에 자신을 참조하는데 이용된다. 위에서 대괄호([ ])안에 있는 인자는 필요한 만큼 사용할 수 있으며, 필요없으면 생략할 수 있다.
객체 생성 및 활용
클래스의 구조를 살펴봤으니 실제로 클래스를 선언하고 객체를 생성해 활용하는 예를 단계별로 살펴보자. 예제로 사용할 클래스는 자전거 클래스이다. 자전거 클래스를 만들기 전에 우선 자전거가 갖는 속성과 동작을 정의해야한다.
-자전거의 속성: 바퀴 크기, 생상
-자전거의 동작: 지정된 속도로 이동, 좌/우회전, 정지
자전거의 속성과 동작을 바탕으로 자전거 클래스를 만들자. 우선 자전거 클래스를 선언하고 객체를 생성한 후 클래스에 변수와 함수를 추가해서 클래스를 완성하겠다.
다음은 자전거 클래스를 선언한 것이다. 클래스에는 클래스명(bicycle)만 있고, 코드 부분에는 pass만 있어서 실제로는 아무 일도 일어나지 않는다.
In: class Bicycle( ): # 클래스 선언 pass |
선언된 클래스로부터 클래스의 인스턴스인 객체를 생성하는 방법은 다음과 같다.
객체명 = 클래스명( ) |
클래스명( )의 클래스는 앞에서 미리 선언돼 있어야 한다. 객체명은 변수명을 만들 때와 같은 규칙을 적용해서 만든다.
In: my_bicycle = Bicycle( ) |
앞에서 선언한 Bibycle 클래스에는 변수도 없고 함수도 없으므로 아직은 어떤 작업도 수행할 수 없지만 my_bicycle 객체는 Bicycle 클래스의 인스턴스이다. 다음과 같이 객체를 실행하면 객체의 클래스와 객체를 생성할 때 할당받은 메모리의 주솟값을 출력한다.
In: |
my_bicycle |
Out: |
<__main__.Bicycle at 0x1dd5bdfc240> |
출력 결과에서 my_bicycle 객체의 클래스는 Bicycle임을 확인할 수 있다. 또한 at 다음의 16진수 숫자는 생성된 객체의 메모리 주소로서 객체를 생성할 때마다 달라진다.
객체에 속성을 설정하려면 다음과 같이 '객체명. 변수명'에 '속성값'을 할당한다.
객체명.변수명 = 속성값 |
다음은 앞에서 생성한 my_bicycle 객체에 속성값을 설정하는 예이다.
In: my_bicycle.wheel_size = 26 my_bicycle.color = 'black' |
객체의 변수에 접근해서 객체의 속성을 가져오려면 다음과 같은 방법을 이용해야 한다.
객체명.변수명 |
다음은 객체의 속성값을 가져와서 출력하는 예이다.
In:
|
print("바퀴 크기:", my_bicycle.wheel_size) # 객체의 속성 출력 print("색상:", my_bicycle.color) |
Out:
|
바퀴 크기: 26 색상: black |
다음은 앞에서 선언한 Bicycle 클래스에 함수를 추가하겠다.
In:
|
class Bicycle():
def move(self, speed): print("자전거: 시속 {0}킬로미터로 전진".format(speed))
def turn(self, direction): print("자전거: {0}회전".format(direction))
def stop(self): print("자전거({0}, {1}): 정지 ".format(self.wheel_size, self.color)) |
Bicycle 클래스에 '지정된 속도로 이동', '좌/우회전', '정지' 동작을 나타내는 move(), turn(), stop() 함수를 각각 추가햇다. 객체를 생성한 후에는 '객체명. 변수명 = 속성값'으로 속성값을 설정하고 '객체명. 변수명'으로 속성값을 가져왔지만, 클래스의 함수 안에서는 'self.변수명 = 속성값'으로 속성값을 설정하고 'self.변수명'으로 속성값을 가져온다. stop() 함수에서는 self. wheel_seize와 self.color로 객체의 속성값을 가져와서 출력했다.
클래스에 함수를 추가했으니 객체의 메서드를 호출하는 방법을 알아보자. 객체의 메서드를 호출 할 때는 다음과 같은 방법을 이용한다.
객체명.메서드명([인자1, 인자2, . . . , 인자[n]) |
메서드명은 클래스에서 정의한 함수이다. 객체에서 메서드를 호출할 때 인자는 클래스에서 정의한 함수의 인자만큼 필요한다. 단, 클래스를 선언할 때 추가했던 함수의 인자 self는 필요하지 않다. 따라서 클래스에서 self만 인자로 갖는 함수를 객체에서 이용할 때는 소괄호 안에 인자를 지정하지 않는다.
앞에서 구현한 Bicycle 클래스에서 객체를 생성한 후에 속성을 설정하고 객체의 메서드를 호출하는 방법을 살펴보겠다.
In:
|
my_bicycle = Bicycle( ) # Bicycle 클래스의 인스턴스인 my_bicycle 객체 생성
my_bicycle.wheel_size = 26 # 객체의 속성 설정 my_bicycle.color = 'black'
my_bicycle.move(30) # 객체의 메서드 호출 my_bicycle.turn('좌') my_bicycle.stop( ) |
Out:
|
자전거: 시속 30킬로미터로 전진 자전거: 좌회전 자전거(26, black): 정지 |
Bicycle 클래스에서 my_bicycle 객체를 생성한 후 속성을 설정하고 메서드를 호출한다. Bicycle 클래스에서 함수를 정의할 때 self 외의 인자가 있는 move( ), turn( ) 함수의 경우에는 객체의 메서드를 호출할 때 인자를 입력했고 self 인자만 있는 stop( ) 함수의 경우에는 인자 없이 객체의 메서드를 호출했다.
객체 초기화
앞에서는 Bicycle 클래스를 선언하고 객체를 생성한 후에 객체의 속성을 설정했다. 하지만 클래스를 선언할 때 초기화 함수 __init__( )를 구현하면 객체를 생성하는 것과 동시에 속성값을 지정할 수 있다. __init__( ) 함수는 클래스의 인스턴스가 생성될 때 자동으로 실행되기 때문에 __init__( ) 함수에 초기화하려는 인자를 정의하면 객체를 생성할 때 속성을 초기화 할 수 있다.
다음은 Bicycle 클래스에 __init__( ) 함수를 추가한 코드이다.
In: class Bicycle(): def __init__(self, wheel_size, color): self.wheel_size = wheel_size self.color = color def move(self, speed): print("자전거: 시속 {0}킬로미터로 전진".format(speed)) def turn(self, direction): print("자전거: {0}회전".format(direction)) def stop(self): print("자전거({0}, {1}): 정지 ".format(self.wheel_size, self.color))
위의 __init__(self, wheel_size, color) 함수는 wheel_size와 color를 인자로 입력받아 함수 내에서 'self.변수명 = 인자'로 객체의 속성을 초기화 했다. 클래스에 __intit__( ) 함수가 정의돼 있으면 객체를 생성할 때 다음과 같이 __init__( )함수의 인자를 입력(self는 제외)한다.
객체명 = 클래스명(인자1, 인자2, 인자3, . . . , 인자n) |
다음 코드는 Bicycle 클래스에서 객체를 생성할 때 속성값을 지정해서 초기화하는 방법을 보여준다.
In: my_bicycle = Bicycle(26, 'black') # 객체 생성과 동시에 속성값을 지정 my_bicycle.move(30) # 객체 메서드 호출 my_bicycle.turn('좌') my_bicycle.stop( ) Out: 자전거: 시속 30킬로미터로 전진 자전거: 좌회전 자전거(26, black): 정지
클래스에서 초기화 함수 __init__(self, wheel_size, color)를 구현하지 않았을 때는 객체를 생성한 후에 속성을 지정해야 하지만 초기화 함수를 정의한 후로는 객체를 생성하면서 객체의 속성을 지정할 수 있게 되겠다.
출처: 파이썬 철저입문
'beginner > 파이썬 분석' 카테고리의 다른 글
문자열과 텍스트 파일 데이터 다루기 ② (0) | 2019.01.15 |
---|---|
문자열과 텍스트 파일 데이터 다루기 ① (0) | 2019.01.14 |
객체와 클래스 ② (0) | 2019.01.14 |
파이썬을 계산기처럼 이용하기 (0) | 2019.01.13 |
[Quest]이중 for문을 이용한 구구단 (0) | 2019.01.11 |