Programming

; develop a program

Back-End/Python

[Python] 객체지향 프로그래밍(OOP)

Clloud_ 2022. 9. 26. 12:17
반응형

이번 포스팅에서는 파이썬의 객체지향 프로그래밍(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
더보기
def print_person_info(self)"
변수를 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}

 


반응형