이번 포스팅에서는 파이썬의 객체지향 프로그래밍(OOP)에 대하여 공부를 해보고자 한다.
객체지향 프로그래밍(OOP)
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 말 그대로 객체를 사용하여 데이터를 표현하는 프로그래밍 기법을 말한다.
각각의 객체들은 메시지를 주고받거나 데이터를 처리할 수 있다.
객체지향 프로그래밍의 구성요소는 기본적으로 클래스, 객체, 메소드 3가지가 있다.
객체(Object)란 연관성 있는 데이터와 함수(메소드)들을 묶어서 가지고 있는 프로그램 모듈이다.
속성(Attribute)은 객체의 데이터 및 상태를 말한다.
메소드(Method)는 객체가 제공하는 기능을 말하고, 주로 객체가 가지고 있는 속성을 처리하는 기능을 제공한다.
객체는 속성(변수) + 메서드(함수)이므로 객체는 어떤 것에 대한 속성과 메서드를 함께 모으는 한 가지 방법이라고 생각할 수 있다. (속성 - 정보/메서드 - 행동)
클래스(Class)
클래스(Class)는 객체가 가지는 속성과 메소드를 정의한 객체의 설계도 같은 역할을 한다.
클래스를 구현(정의) 하고 그 클래스로부터 객체를 생성해서 사용한다.
객체를 생성하는 작업을 Instance화(Instantiate)라고 하고 클래스로부터 생성된 객체를 인스턴스(Instance)라고 한다.
클래스 정의(구현)
class 클래스이름 : # 선언부
클래스 코드 블록 # 구현부
메소드들을 구현
instance 생성 및 사용
변수 = 클래스이름([생성자에 전달할 값들, ...]) #instance 생성
변수.속성 #attribute 사용
변수.메소드 #메소드 호출
객체의 속성(Instance 변수)
객체의 속성(Attribute)은 가변이다.
클래스 선언 시 instance 변수를 선언하지 않고, 생성된 객체에 속성을 추가한다.
인스턴스(Instance)에 속성 추가할 때는 생성자(Initializer)나 함수에서 동적으로 인스턴스 변수를 만들어 넣는다.
생성자(Initializer)를 이용해 객체가 필수적으로 가져야 할 인스턴스 변수를 정의한다.
객체를 이용해 직접 변수를 만들어 값을 대입할 수도 있다.
같은 클래스에서 생성된 객체들이라도 서로 다른 instance 변수를 가질 수 있다.
Attribute(속성) 추가/수정, 조회
속성을 추가할 때는 Initializer (생성자)를 이용하고, 객체를 생성할 때 추가한다.
객체.속성명 = 값
속성 명의 변수가 객체에 없으면 추가, 있으면 수정한다.
메소드를 통해서 추가/변경 도 가능하다.
속성을 조회할 때는 객체.속성명 을 사용한다.
예제 1
순서 1. Person 클래스의 객체를 생성한다.
순서 2. Person 객체( ) 속성(instance 변수)에 값을 추가한다.
p = Person()
p.name = "손흥민"
p.age = 30
p.address = "한국"
p.email_address = 'abc@a.com'
p.tall = 183.4
속성(Attribute) 값들을 조회한다.
print("이름:", p.name)
print("나이:", p.age)
print("주소:", p.address)
print("이메일주소:", p.email_address)
print("키:", p.tall)
[실행결과]
이름: 손흥민
나이: 30
주소: 한국
이메일주소: abc@a.com
키: 183.4
예제 2
값이 있는 속성(Attribute)에 다른 값을 대입하여 변경한다.
p.age = 10
p.address = '영국'
속성(Attribute) 값들을 조회한다.
print("이름:", p.name)
print("나이:", p.age)
print("주소:", p.address)
print("이메일주소:", p.email_address)
print("키:", p.tall)
[실행결과]
이름: 손흥민
나이: 10
주소: 영국
이메일주소: abc@a.com
키: 183.4
객체의 메소드(Instance Method)
메소드는 객체가 제공하는 기능/동작이다.
def 메소드이름(self [, 추가 매개변수들 선언]):
클래스에 정의한 객체의 함수를 메소드라고 한다.
주로 인스턴스(instance) 변수들을 처리하는 작업을 구현한다.
메소드는 첫 번째 매개변수로 반드시 객체 자신(메소드 소유객체)을 받는 변수를 선언한다.
첫번째 인자로 instance 자체를 받는 변수를 선언하고, 변수명은 보통 self를 지정한다.
메소드를 호출할 때는 객체.메소드이름([argument, ...]) 를 사용한다.
Initializer(생성자)
Initializer(생성자)는 클래스로부터 객체를 생성할 때 호출되는 특수메소드를 말한다.
주로 객체를 생성하는 시점에 속성(attribute)을 초기화하는 역할을 한다.
Inializer를 이용해 초기화하는 속성(attribute)들이 그 클래스의 객체가 가져야 하는 공통 속성(attribute)이 된다.
Initializer(생성자) 구문
def __init__(self [, 추가 매개변수 선언]):
self.속성명 = 값
self 매개변수는 메소드의 첫 번째 매개변수로 필수 매개변수이다.
모든 메소드는 1개 이상의 변수를 선언해야 하고, 첫 번째 매개변수의 이름은 관례적으로 ' self '라고 지정한다.
현재 객체를 받는 변수는 생성자와 메소드이고, 생성자는 현재 생성하고 있는 객체, 메소드는 메소드를 호출한 객체를 말한다.
메소드/생성자를 정의할 때 호출 시 전달되는 argument를 받는 변수는 두 번째부터 선언한다.
예제 1
순서 1. 클래스를 정의한다.
순서 2. Initializer(생성자)를 선언한 메소드를 정의한다.
순서 3. 변수를 초기화한다.
class Person2:
def __init__(self, name, age):
self.name = name
self.age = age
객체를 생성하고 속성(Attribute) 값들을 추가/수정 및 조회한다.
p2 = Person2()
p = Person2("손흥민", 30)
print(p.name, p.age)
p2 = Person2('이강인', age=21)
print(p2.name, p2.age)
[실행결과]
TypeError => 2개의 변수가 선언되었으므로 최소한 두 개의 속성을 가져야한다.
손흥민 30
이강인 21
예제 2
순서 1. 클래스를 정의한다.
순서 2. Initializer(생성자)를 선언한 메소드를 정의한다.
순서 3. 변수를 초기화한다.
순서 4. 각각의 다른 변수를 가진 메소드를 정의한다.
class Person3:
def __init__(self, name, age, address=None):
self.name = name
self.age = age
self.address = address
def print_person_info(self):
info = f"이름: {self.name}, 나이: {self.age}, 주소: {self.address}"
print(info)
def add_age(self, add_age=0):
self.age = self.age + add_age
변수를 self 만 선언했을 경우, 호출받을 때 받을 인수(argument)가 없다.
self를 이용해 객체의 attribute, method들을 사용
def add_age(self, add_age=0):
매개변수로 받은 값을 age 속성에 더하는 메소드
객체를 생성하고 속성(Attribute) 값들을 추가/수정 및 조회한다.
p = Person3("김민정", 22)
p.name, p.age, p.address
p.print_person_info()
p.add_age(3)
p.print_person_info()
p.__dict__ # attribute들을 dictionary로 반환.
[실행결과]
('김민정', 22, None)
이름: 김민정, 나이: 22, 주소: None
이름: 김민정, 나이: 25, 주소: None
{'name': '김민정', 'age': 25, 'address': None}
'Back-End > Python' 카테고리의 다른 글
[Python] 상속(Inheritance) (0) | 2022.09.27 |
---|---|
[Python] 정보 은닉(Information Hiding) (0) | 2022.09.27 |
[Python] 일급 (시민) 객체(first-class citizen) (2) | 2022.09.25 |
[Python] 함수의 매개변수(Parameter) (0) | 2022.09.25 |
[Python] 함수(Function) 정의 및 호출 기본 (0) | 2022.09.24 |