본문 바로가기
study/python

파이썬 객체 지향 개념 정리 - 클래스, 생성자

by kuah_ 2023. 11. 12.

 

 

 

 

* 객체 지향 프로그래밍(Object Oriented Programming)

- 현실세계의 사물과 사물들이 메시지를 통해 상호작용하는 구조를 소프트웨어로 구현한 프로그래밍 방식

- 현실세계의 사물 = 소프트웨어상의 객체

- 다수의 사용자가 기존의 절차지향 프로그램을 사용하면 병목현상이 발생하여, 함수 처리의 부하를 감소시키기 위해 개발

- 프로그램의 유지보수성을 향상시킴

- 절차지향 프로그램의 개선안일 뿐, 완전히 대체되는 것은 아님

 

 

* 함수

- 독립적인 기능을 수행할 수 있는 코드의 집합

- 정의 > 호출 2단계를 거침

- 인수와 매개변수는 이름을 다르게 하는 것이 좋음

 

 

* 클래스(class)

- 공통 기능을 갖는 함수들을 하나로 묶을 수 있는 단위

- 객체를 생성할 수 있도록 객체 내에서 공유할 수 있는 자료와 그 자료들을 처리하는 함수를 묶어 정의한 것.

- 구성요소 : 멤버(Member) + 생성자(Constructor) / 변수 + 메서드(생성자 포함) 이라고도 함

- 멤버 : 멤버변수(자료) + 메서드(기능) (=속성, 행위)

- 속성(attribute) : 자료를 뜻함. 변수 또는 필드

- 행위(action) : 기능을 뜻함. 함수 또는 메서드

- C언어의 구조체와 비슷한 역할을 하는 일종의 사용자 정의형 자료구조

- 함수처럼 외부에서 넘겨받는 매개변수가 없고, 객체를 생성하기 위한 생성자 함수를 포함

- 객체를 통해 함수를 호출하기 때문에 클래스 내부의 메서드 밖에는 '함수들을 반환하는' return문이 없음

- 클래스 정의 > 객체 생성 > 생성한 객체 사용 3단계를 거침

 

 

* 객체(object)

- 소프트웨어로 '구현 할' 현실세계의 사물

- 클래스에 의해 만들어지는 결과물

- 클래스의 속성에 실제 자료가 들어가고, 실제 자료를 동작시키는 함수가 하나로 묶여진 단위

- 객체를 생성하지 않으면 클래스의 멤버를 쓸 수 없음

- 클래스와 객체는 1 : N의 관계를 가짐

- 운영체제의 제어를 받으며, 소스코드 안에 직접적으로 보이진 않음

 

 

* 인스턴스(instance)

- 클래스에 의해 소프트웨어에 '구현 된' 실체

- https://cerulean85.tistory.com/149 

- 방금, 가장 최근 만들어진 것(즉시성)

- 실체화된 인스턴스는 메모리에 할당

- 객체와 확실하게 구분되는 개념은 아님

 

 

* 생성자

- 메서드의 일종으로, __init__이라는 이름과 self라는 매개변수를 포함하여 선언됨

- self 매개변수는 생성자 내에서 클래스의 멤버를 호출하는 데 이용

- 매개변수는 객체가 생성되는 시점에서 외부의 실인수를 받아 멤버변수에 초기화하는 역할

- 객체 생성과 동시에 지역변수 초기화 역할을 함

- 초기화 대상이 없으면 생략할 수 있으며, 생략 시 파이썬에서 기본 생성자를 만들어줌

- 참고자료 : 생성자를 여러개 만들고 싶을 때 (클릭 시 링크로 이동)

 

 

* 메서드

- 클래스에 포함된 함수

- 객체 생성 후 참조변수명을 통해 접근

- 함수의 선언과 동일하지만 멤버변수를 사용하기 위해 self라는 매개변수를 포함하고 있음

- self는 기본적으로 작성하는 것. 별도의 인수를 받지는 않음.

 

 

* 객체 생성

- 클래스의 생성자를 이용하여 생성 (객체를 생성하면 생성자가 제일 먼저 실행)

- 참조변수 = 클래스명(실인수) 와 같이 객체 생성

- 실인수(actual parameters, arguments) : 생성자의 매개변수에 전달할 실제 값(인수)

- 가인수(formal parameters) : 메서드에 정의된 매개변수

- ex ) obj = calc_class(10, 20)

  1. 클래스 calc_class에 10, 20의 인수를 가지고 접근.

  2. 가장 먼저 생성자가 실행됨. 생성자에 10, 20이 대입되어 멤버변수 초기화와 동시에 객체를 생성.

  3. 참조변수 obj에 생성된 객체를 가리키는 주소 저장.

  대입연산자 '='는 연산자 우선순위의 가장 마지막이기 때문에

  '='의 오른쪽부터 실행된 후 obj에 값이 할당되는 구조로 생각하면 좋음.

 

 

* 멤버 호출

- 생성된 객체의 참조변수를 이용하여 객체의 멤버 호출

- 참조변수.멤버(변수 or 메서드)

- 클래스에 의해 서로 독립적인 객체가 만들어지고, 참조변수에 의해 객체를 참조하는 메커니즘

 

 

* class 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 클래스 정의
class calc_class :
  # 클래스 변수 : 자료 저장
  x = y = 0
 
  # 생성자 : 객체 생성 + 멤버변수 초기화
  # 메서드 내부가 아닌 
  # 클래스 내부 && 메서드 바깥에서 변수가 선언되었다는 것을 표시하기 위해
  # self 키워드를 씀. 안쓰면 클래스 멤버 변수로 간주되지 않음.
  def __init__(self, a, b) :
    print('~~객체 생성~~')
    self.x = a # 10
    self.y = b # 20
 
  # 클래스 함수 (메서드)
  def plus(self) : # self : 멤버(변수+함수) 참조 객체
    p = self.x + self.y # 변수 연산
    # p : 지역변수
    # self.x, self.y : 전역변수  
    # 지역변수, 전역변수 개념은 기준에 따라 달라질 수 있음
    return p 
  
  # 클래스 함수 / 멤버 함수(기능)
  def minus(self) : 
    m = self.x - self.y # 변수 연산
    return m 
 
# 객체 생성
# class(1) -> object(n) 생성
obj = calc_class(1020)
print(type(obj)) # <class '__main__.calc_class'>
print(obj) # <__main__.calc_class object at 0x000001866E62BB50(주소값)> 
obj2 = calc_class(1020)
print(obj2) # 다른 주소 출력
 
# 멤버 호출
# object.member()  
print('plus = ', obj.plus()) # plus = 30 
print('minus = ', obj.minus()) # minus = -10
 
cs

 

 

* 생성자 예제

Q. 클래스 내부에 num1, num2 멤버 변수와 나눗셈 함수 div와 제곱 함수 squ를 선언하고 결과를 출력하는 프로그램

0을 입력할 경우 나눗셈 오류 문장 출력

 

 

A. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ver.1 (사용자 정의 생성자)
class Calc_class: 
  def __init__ (self,x,y): 
    self.num1 = x
    self.num2 = y
  def div(self):
    if self.num1 <= 0 or self.num2 <= 0 :
      return print("나눗셈연산은 0으로 나누기가 불가능합니다. 다시 입력하세요.")
    else : 
      return self.num1 / self.num2
  def squ(self):
      return self.num1 ** self.num2
 
obj = Calc_class(int(input("1번째 정수를 입력하세요:")),int(input("2번째 정수를 입력하세요:")))
print ("나눗셈 : ",obj.div())
print ("제곱 : ",obj.squ())
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ver.2 기본 생성자 사용
class calc_class12: 
    def member_clear(self,x,y):
        self.num1 = x
        self.num2 = y
    def div(self):
        try : 
          return self.num1 / self.num2
        except ZeroDivisionError : # 에러메시지 복붙
          print("나눗셈연산은 0으로 나누기가 불가능합니다. 다시 입력하세요.")
    def squ(self):
        return pow(self.num1, self.num2) # pow 제곱 함수
 
c1 = calc_class12()
c1.member_clear(int(input("정수를 입력하세요 : ")),int(input("정수를 입력하세요 : ")))
print ("나눗셈 : ",c1.div())
print ("제곱 : ",c1.squ())
cs

 

 

 

 

댓글