본문 바로가기

Python 파이썬

클래스(Class), 객체지향 프로그래밍

728x90

OPP(Object Oriented Programing) 객체지향 프로그래밍이란?

현실세계를 모델링 하기위한 기법.

최초의 프로그래밍 언어들은 모두 ‘절차지향언어’였는데요,
대표적인 예로 ‘C언어’가 있습니다. C언어의 경우, ‘함수(function)’기능은 사용할 수 있지만 ‘클래스(Class) — 변수와 함수를 집합으로 활용하는 개념’ 기능은 없습니다. 따라서, 프로그래밍을 만들 때 모든 기능을 코딩해야 합니다. 이러한 ‘절차지향 방식’은 컴퓨터가 작업하는 순서와 유사하여, 컴퓨터의 연산처리 속도가 빨라진다는 장점이 있습니다.

다만, 소프트웨어의 발달로 정보량이 많아지고 다양한 기능의 요구가 늘어남에 따라 프로그램의 복잡도가 늘어나게 되면서 ‘객체지향 프로그래밍의 니즈’가 많아지게 됩니다. 객체지향 프로그래밍은 절차지향 프로그래밍에 비하여 코드를 간소화할 수 있기 때문에 팀 협업시 소통의 효율성을 높여주고, 유지보수를 더 편리하게 해주는 장점이 있습니다.

예를 들어 자동차를 만들 때,

‘엔진만들고 -> 바퀴만들고-> 차체 만들고-> 조립하고…’와 같은 순서로 프로그래밍 하는 것이 ‘절차지향’이라면,

‘객체지향’은 ‘자동차’라는 클래스를 만들고, 그 안에 들어갈 기능으로 엔진/바퀴/내부기능/컬러 등을 객체로 구성하는

방식이 ‘객체지향’에 가깝다고 볼 수 있습니다.

'참고' https://jalynne-kim.medium.com/

 

객체 지향의 중요 개념

다음에서 개념들을 알아보자.

추상화?

  • 객체로 정의할 대상에 대한 파악
  • 상속 시 공통 특성을 하나로 묶어 상위 타입을 정의

캡슐화?

  • 관련 있는 속성과 행위를 하나로 묶어 정의(클래스)
  • 공개할 것과 은닉할 것을 분류(private, public, setter, getter 등)(사실 파이썬은 은닉의 개념이 없다)

상속?

  • 기존 클래스를 확장하여 추가 특성을 정의 ( ~ is a ~ 고려)
  • 부모클래스를 정의 하고 상속받아 부모클래스의 기능을 사용하며 나의 클래스도 사용가능

다형성?

  • 하나의 타입으로 다양한 타입을 다룰 수 있는 특성
  • 추상화와 상속의 개념을 활용하는 것 

class?

  • class 는 객체지향의 핵심
  • class 란 객체를 정의해 놓은 설계도

위 글의 정의들과 설명이 어렵게 느껴질수 있다.

클레스가 무엇인가 생각해 본다면 붕어빵 기계를 생각해 보면 편하다!

클래스를 붕어빵 틀이라 생각하고

찍어 나오는 붕어 빵들을 객체(Object) 라고 생각 하면 편하다.

팥을 넣던, 피자를넣던, 슈크림을 넣던

결국 붕어빵(값만 다른) 객체인 것!

 

class 가 필요한 이유를 보자!

다음에 x좌표 와 y좌표를 저장하는 기능을 구현하려고 한다.

다음처럼 작성 할 수 있다!

 

# x,y 좌표를 저장하는 기능이 필요하다.
x = 10
y = 20
print(f"{x},{y}")

# 이런 좌표가 많다면???
x1 = 10
y1 = 20

x2 = 20
y2 = 10

x3 = 10
y4 = 20

.....

 

클래스(class)를 이용하면 좀 더 편리하게 정보를 관리 할 수 있다!

class Point:                        # 클래스 Point 를 정의한다.
    def __init__(self, x, y):   # self -> 클래스의 모든 인스턴스 메서드의 첫 번째 인자. 꼭 써야 함.
        self.x = x                    # 클레스 변수1 지정 (클래스 내에서 사용하기 위해 지정함.)
        self.y = y                    # 클레스 변수2 지정 (클래스 내에서 사용하기 위해 지정함.)
    def prt(self):                   # 클래스 함수를 Method 메소드 라고 부름.
        print(f"x = {self.x}, y = {self.y}")
       
p1 = Point(10, 20)
p2 = Point(10, 30)

p1.prt()
p2.prt()
 

 

변수명을 편하게 관리 할 수 있고 클래스를 이용해서 코드가 깔끔하다.

클래스는 추상화를 통해서 먼저 설계를 하는 작업이다.

쉽게 생각해 붕어빵은 이럴꺼야~ 이렇게 생기고~ 이런 맛이 날꺼야~ 하면서 추상화해

틀을 만들고 설계하는 것이다.

 

self 를 좀 더 알아보자!

위에서 잠깐 봤지만 아직 뭔지 잘 모르겠다! 좀 더 알아보자.
  • 클래스의 모든 인스턴스 메서드의 첫번째 인자.
  • 인스턴스 메서드를 호출한 객체를 참조하는 역할.
  • 인스턴스를 생성할 때마다 객체 변수가 만들어짐.
  • 객체가 인스턴스 메서드를 호출하면 해당 객체의 변수를 참조하기 위해 필요.
self의 구성
728x90