본문 바로가기
IT & 데이터 사이언스/Python

[Python] Python의 클래스

by 바른 호랑이 2024. 4. 22.
728x90
반응형

안녕하세요. 바른 호랑이입니다.

이번 게시글에서는 Python의 클래스에 대해 알아볼 예정입니다. 

 

- 클래스(Class)

ㆍ클래스는 python 프로그래밍의 핵심으로 python을 활용하여 본격적인 서비스나 프로그램을 개발하기 위해서는 반드시 알고 넘어가야 하는 개념임.

ㆍC언어와 같은 절차지향언어(Procedural Programming : 개체를 순차적으로 처리하여 프로그램 전체가 유기적으로 연결되어야 함.)는 별도의 클래스가 없지만, 객체 지향 프로그래밍을 추구하는 언어들은 대부분 클래스와 같은 개념을 가지고 있으며, python과 같은 OOP(Object Oriented Programming : 다수의 객체를 만들어 이들끼리 서로 상호작용하게끔 만듦.)을 추구하는 언어들이 클래스를 사용하는 이유는 다음과 같음.

특 징 세 부 내 용
추상화 및 캡슐화 데이터(속성)과 메서드(기능)을 단일 단위로 캡슐화 할 수 있으며, 이는 추상화를 촉진하여 불필요한 세부 사항들을 보이지 않게 숨겨 복잡한 시스템을 더 쉽게 관리 및 조작할 수 있게 해줌.
코드 재사용성 클래스는 상속이 가능하며, 특성과 메서드를 상속받은 다음 필요에 따라 수정하거나 추가하여 클래스를 만들어 사용할 수 있기 때문에 코드 재사용성이 높아짐.
모듈화 및 유지 관리 가능성 각 클래스는 시스템 내의 특정 엔터티 또는 개념을 나타내므로 코드 명확성을 높이고 복잡성을 줄여주며, 코드를 모듈식 구성 요소로 구성하는데 도움이 되어 유지 관리 및 디버그가 쉬워짐.
다형성 클래스는 다양한 개체가 동일한 메시지(메서드 호출)에 다양한 방식으로 응답이 가능하기에 코드의 유연성과 동적 동작이 가능해지며 다양한 기능 구현이 쉬워짐.
데이터 무결성 및 보안 클래스 사용시, 공개 ,비공개, 보호와 같은 액세스 수정자와 캡슐화를 통해 데이터에 대한 액세스를 제어할 수 있으며, 이는 의도치 않은 수정이나 무단 액세를 방지해줌.

 

+ 캡슐화(Encapsulation) : 데이터와 알고리즘을 하나로 묶어 하나의 캡슐처럼 만드는 것으로 외부에서는 데이터와 코드의 형태를 알 수 없음.

+ 상속(inheritance) : 상위 클래스의 내용을 하위 클래스가 이어 받는 것임.

+ 다형성(polymorphism) : 상속과 연관된 개념으로 하나의 객체가 상황에 따라 다른 여러 객체로 구성되는 것으로 오버로드, 오버라이드 다형성이 대표적임.

+ 추상화(abstraction) : 실존하는 객체의 특성 중 프로그램을 만드는데 필요한 부분만 파악해서 추출하고 필요하지 않은 것은 제거하는 것임.

 

객체지향 프로그래밍과 그 특징(추상화, 캡슐화, 상속성, 다형성) / 파이썬 예시

객체(Object)? 객체지향 프로그래밍(OOP)? '객체(Object)' 하면 무엇이 떠오르시나요 어떤 분들은 일반적인 사물을 뜻하는 단어를 떠올릴 수도 있고, 어떤 분들은 예술용어인 오브제를 떠올릴 수도 있

fierycoding.tistory.com

 

 

객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화 -

객체 지향 프로그래밍은 객체의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미합니다. 객체 지향 프로그래밍의 기본적인 개념과 그 설계를 바르게 하기 위

www.codestates.com

# 클래스를 사용하지 않아 코드가 복잡해진 예시
result_01 = 0
result_02 = 0

def adder01(num):
  global result_01 
  result_01 += num
  return result_01

def adder02(num):
  global result_02 
  result_02 += num
  return result_02

print(adder01(3), adder01(4), adder02(3), adder02(7), sep=' / ') 

# 클래스를 이용하여 간소화
class Calculator:
  def __init__(self):
    self.result = 0
  
  def adder(self, num):
    self.result += num
    return self.result
  
cal_01 = Calculator()
cal_02 = Calculator()

print(cal_01.adder(3), cal_01.adder(4), cal_02.adder(3), cal_02.adder(7), sep= ' / ')

실행결과

# 가장 간단한 클래스 예시
# 아래 코드는 아무런 기능도 가지고 있지 않은 껍질뿐인 클래스지만, 인스턴스를 생성하는 기능은 가지고 있음.

class Simple:
  pass

# Simple class의 인스턴스 만들기
# 클래스에 의해 만들어진 객체를 인스턴스라 하며, obj_01이 객체가 되고, obj_01은 Simple class의 인스턴스가 됨.
obj_01 = Simple()
print(type(obj_01))

실행결과

# self 살펴보기
'''
python의 클래스에서 메서드를 사용하기 위해서는 반드시 첫 parameter는
self를 사용해야함. self는 객체가 해당 클래스의 인스턴스 중에 하나인지
확인하는데 사용되며, 인스턴스 중 하나 일때에만 함수 결과값을 출력해줌.
self를 활용하여 해당 클래스의 인스턴스가 가진 속성 값들을 불러와 사용할 수 있음.
단, 종속관계가 만들어질 수 있으므로 해당 내용은 충분한 검토 후 작성이 이루어져야 함.
메서드는 함수의 일종으로 클래스 안에 속해있고 클래스의 멤버 변수들을 활용해 구현된 것임.
'''

class Service:
  def setname(self, name):
    self.name = name
  def sum(self, parameter_01, parameter_02):
    result = f'{self.name}님이 요청한 결과값은 {parameter_01+parameter_02}입니다.'
    return result

test = Service()
test.setname('Peter')
print(test.sum(1, 2))

실행결과

# __init__ 살펴보기
'''
__init__ 이란 클래스의 인스턴스를 만들때 반드시 입력되어야 하는 값들을
입력받을 수 있도록 설정하는 것으로 특정 객체를 해당 클래스의 인스턴스로
선언하기 위해서는 반드시 해당 값들을 입력해야함.
'''

class Service:
  def __init__(self, name):
    self.name = name
  def sum(self, parameter_01, parameter_02):
    result = f'{self.name}님이 요청한 결과값은 {parameter_01+parameter_02}입니다.'
    return result

service_01 = Service('Anne')
print(service_01.sum(37, 45))

실행결과

# class의 기본 구조
'''
class 클래스 이름[(상속 클래스명)]:
  [변수 1]
  [변수 2]
  [변수 3]
  ...
  [변수 N]
  def 클래스 함수1(self[, 인수1, 인수2, ...])
    <수행할 코드문>
    ....
  def 클래스 함수2(self[, 인수1, 인수2, ...])
    <수행할 코드문>
    ....
  ...
'''
# 사칙연산 클래스 만들기
class basic_cal:
  def __init__(self):
    pass
  def sum(self, num_01, num_02):
      result = num_01 + num_02
      return result
  def sub(self, num_01, num_02):
      result = num_01 - num_02
      return result
  def mul(self, num_01, num_02):
      result = num_01 * num_02
      return result
  def div(self, num_01, num_02):
      result = num_01 / num_02
      return result

bc_01 = basic_cal()
print(bc_01.sum(17, 81), bc_01.sub(1, 8), bc_01.mul(1, 8), bc_01.div(1, 8), sep=' / ')
# 메서드의 또다른 호출 방법 - 해당 방법을 때에는 반드시 인스턴스 이름을 인수로 넣어줘야함.
print(basic_cal.sum(bc_01, 17, 81), basic_cal.sub(bc_01, 1, 8), basic_cal.mul(bc_01, 1, 8), basic_cal.div(bc_01, 1, 8), sep=' / ')

실행결과

# 클래스의 상속(inheritance)
'''
상속(inheritance):
특정 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있도록 만드는 것으로
해당 기능을 그대로 사용할 수도 있고 새로 만드는 클래스의 특징에 맞게 오버라이딩 
또는 오버로딩해서 사용할 수도 있음. 단 python에서는 원칙적으로 오버로딩을 지원하지
않으므로 변칙적으로 구현해야함.
'''
# 상위 클래스 선언
class travel:
  def __init__(self):
    pass
  def go(self):
    return f'여행지로 출발합니다.'
  def tour_start(self):
    return f'관광을 시작합니다.'
  def tour_end(self):
    return f'관광이 종료합니다.'
  def come_back(self):
    return f'집으로 되돌아옵니다.'

class philippine_travel(travel): # 상속받을 상위 클래스 명칭 입력
  def __init__(self, city_name):
    self.city_name = city_name
  def tour_start(self): # 메서드 오버라이딩
    return f'{self.city_name}관광을 시작합니다.'
  def tour_end(self): # 메서드 오버라이딩
    return f'{self.city_name}관광을 종료합니다.'
  def __add__(self, other): # 연산자 오버로딩
    if isinstance(other, philippine_travel):
      return f"이번 여행의 목적지는 {self.city_name}(와)과 {other.city_name}입니다."
    else:
      return f"이번 여행의 목적지는 {self.city_name} 1곳 입니다."
    

travel_01 = travel()
travel_02 = philippine_travel('cebu')
travel_03 = philippine_travel('manila')

print(type(travel_01), type(travel_02))
print(travel_01.go(), travel_02.go(), sep=' / ')
print(travel_01.tour_start(), travel_02.tour_start(), sep=' / ')
print(travel_01.tour_end(), travel_02.tour_end(), sep=' / ')
print(travel_01.come_back(), travel_02.come_back(), sep=' / ')
print(travel_02 + travel_03, travel_02 + 1, sep=' / ')

실행결과

 

728x90
반응형

댓글