본문 바로가기
Study/PYTHON,Django

PYTHON(3)-객체지향(OOP)

by 왕방개 2024. 1. 9.

안녕하세요. 오늘은 객체 지향 프로그래밍에 대해서 공부해보겠습니다..

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

클래스는 프로그램을 이용해서 객체를 만들어주는 역할을하고 객체는 클래스에 의해 만들어지는 결과물을 말합니다.

 1.클래스란?(Class)

클래스는 속성(attribute)와 행위(action)으로 구성됩니다. 클래스의 속성은 자료를 나타내며, 변수와 필드의 개념입니다.

클래스의 행위는 자료를 연산하거나 조작하는 역할로, 메소드와 함수의 개념을 의미합니다. 그럼 함수와 클래스의 차이에 대해서 말해보자면, 함수는 정의 후 호출되는 과정을 가지고 있습니다. 클래스는 정의하고 객체를 생성한뒤 생성한 객체를 사용하는  과정을 거쳐야합니다.

 

함수형식)
def 외부함수(매개변수):
	변수선언
   def 내부함수(매개변수):
   		명령문
    	return 값
   return 내부함수
클래스 형식)
class 클래스명:
	변수 선언
    def 생성자():
    	명령문
    def 함수명():
    	명령문

왼쪽은 함수 형식에서 def 명령어로 함수명과 매개변수를 이용하여 선언하고, 마지막으로 내부함수를 호출할수 있도로고 return 문으로 반환합니다 . 반면 오른쪽은 클래스형식은 객체를 통해서 함수를 호출하기 때문에 함수들을 반환하는 return문이 없습니다. 

 

2.클래스의 구성요소

# 015.5일차-실습-2-해답
# 클래스 정의
class calc_class :
    # 변수 선언
    x = y = 0
    # 생성자 : 객체 생성 + [멤버변수 초기화]
    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) 생성
obj1 = calc_class(10, 20) # 생성자 -> 객체1  
# object.member()  
print('plus = ', obj1.plus()) # plus =  30
print('minus =', obj1.minus()) # minus = -10

#객체 생성
obj2=calc_class(0,0)

# 객체 멤버 변수에 값 할당
obj2.x = 200
obj2.y = 50
# 현재 객체의 멤버 메소드 호출
result_plus = obj2.plus()
result_minus = obj2.minus()
print('plus = ', result_plus)  # 현재 객체의 plus =  250
print('minus =', result_minus)  # 현재 객체의 minus = 150

 

 

파이썬에서 제공하는 클래스는 일반 변수나 함수와 구분하기 위해서 클래스 선언부에서 선언한 변수는 멤버변수, 클래스 본체에서 정의하는 함수는 메서드라고 합니다. 멤버변수와 메서드를 클래스의 멤버라고 부릅니다. 또, 함수 형태로 선언하지만 '__init__'이라는 별도의 이름을 갖는 생성자(Constructor)로 구성됩니다. 결국 크래스는 객체를 생성하는 역할이기 때문에 객 내에서 공유할 수 있는 자료와 이러한 자료를 처리하는 함수들을 묶어서 객체가 만들어질 수 있도록 정의해 놓은 것을 말합니다.

 

1)멤버 변수:클래스 선언부에 x,y을 선언합니다. 

 

2)생성자: 생성자는 함수의 선언과 유사하지만 차이점은 이름이 정해져 있고, self라는 매개변수를 사용한다는 점입니다. __init__ 이라는 이름과 self는 생성자 내에서 클래스의 멤버를 호출하는데 이용됩니다. 매개변수는 객체가 생성되는 시점에서 외부의 실인수를 받아서 멤버변수를 초기화하는 역할입니다.

 

직접 생성하지 않아도 메모리 할당을 하고 참조를 리턴하는 매개변수가 self 만 있는 생성자가 제공됩니다.만약 self을 생략하면 오류가 발생합니다.

직접 생성자를 만들면 제공되는 생성자는 소멸됩니다.

생성자를 만드는 이유는 처음부터 속성을 만들거나 속성을 원하는 값으로 초기화하기 위해서 생성됩니다.

파이썬에서는 생성자를 만들 때 __init__ 이라는 이름을 사용합니다

 

3)메서드: 클래스 내부에 있는 함수입니다. 위의 예시에서 plus와 minus를 의미합니다.

 

4)객체 생성: 클래스의 생성자를 이용하여 객체를 생성합니다.  obj2라는 객체가 이를 의미합니다.

 

5)멤버 호출: 생성된 객체의 참조변수를 이용하여 객체의 멤버를 호출할 수 있습니다.

 

다른 예시를 하나 더 보겠습니다.

class DatePro:
  #멤버 변수
  content="날짜처리클래스"
  
  #생성자
  def __init__ (self,year,month,day):
    self.year=year
    self.month=month
    self.day=day
  
  #객체 메서드  
  def display(self):
    print("%d-%d-%d"%(self.year, self.month,self.day))
  
  #클래스 메서드
  @classmethod #함수장식자
  def date_string(cls,dateStr):#cls는 일반메소드의 self대신 cls를 씀
    year=dateStr[:4]
    month=dateStr[4:6]
    day=dateStr[6:]
    
    print(f"{year}년 {month}월 {day}일")
    
#객체 멤버    
date=DatePro(1995,10,25) #참조변수로 객체생성
print(date.content) 
print(date.year)
date.display()

#클래스 멤버
print(DatePro.content)
print(DatePro.year) #attribute error
DatePro.date_string("19951025")

1)멤버변수: content변수

2)생성자:생성자에서 'self.멤버변수'로 선언된 변수는 객체 멤버 변수만 되고, 클래스 멤버변수는 될 수 없다.

3)객체 메서드:self를 포함해 함수가 정의된다.

4)클래스 메서드: @classmethod 라는 함수 장식자를 이용하여 먼저 선언후 클래스 메서드를 정의한다.

5)객체 멤버: 생성자를 이용하여 객체를 생성하고, 객체 멤버변수와 객체 메서드를 호출하여 날짜정보를 출력한다

6)클래스 멤버: 클래스 멤버로 호출합니다.self로 지정되지않은 content는 클래스 멤버 변수가 가능합니다.하지만 year은 객체 멤버 변수만 되므로 호출할수 없는 오류가 뜹니다.

 

3.클래스 상속

https://heytech.tistory.com/109 이분 블로그를 참고해서 썼습니다.

 

[Python] 클래스 상속, 메서드 오버라이딩(method overriding), 슈퍼(super) 함수에 대해 알아보자!

본 포스팅에서는 클래스 상속(Class Inheritance)의 의미를 알아보고 파이썬으로 실습합니다. 또한, 메서드 오버라이딩(method overriding)과 슈퍼 함수(super)까지 알아봅니다. 📚목차 1. 클래스 상속이란?

heytech.tistory.com

클래스 상속은 기존에 정의한 클래스의 속성 및 메서드를 그대로 사용할 수 있도록 클래스 간에 물려주거나 받는것을 의미합니다. 즉, 클래스 상속은 중복된 메서드를 재정의할 필요가 없다는 장점이 있습니다.

class SportsTeam: #부모클래스
    def __init__ (self, team_name):
        self.team_name= team_name
        print(f"{self.team_name} 팀에 대한 정보입니다.")
    def won(self, won):
        print(f"{self.team_name} 팀은 {won}회 승리하였습니다.")
    def loss(self, loss):
        print(f"{self.team_name} 팀은 {loss}회 패배하였습니다.")
    def draw(self, draw):
        print(f"{self.team_name} 팀은 {draw}회 비겼습니다.")

class SoccerTeam(SportsTeam): #자식클래스
    def __init__ (self, team_name):
        self.team_name = team_name
                
class BasketballTeam(SportsTeam): #자식클래스
    def __init__ (self, team_name):
        self.team_name = team_name

mcfc = SoccerTeam('Manchester United')
mcfc.won(24)
mcfc.loss(4)
mcfc.draw(5)

lal = BasketballTeam('LA Lakers')
lal.won(35)
lal.loss(25)
lal.draw(2)

 

클래 상속은 여러 클래스를 정의함에 이써어서 동일한 속성이나 기능을 지원하는 메서드를 중복으로 정의할 필요가 없다는 장점이 있습니다.추가로 예외처리하는 메서드 오버라이딩 기술이 있습니다. 메서드 오버라이딩은 부모 클래스로부터 상속받은 특정 메서드를 자식 클래스에서 재정의하는 작업을 의미합니다.

class SportsTeam:
    def __init__ (self, team_name):
        self.team_name= team_name
        print(f"{self.team_name} 팀에 대한 정보입니다.")
    def won(self, won):
        print(f"{self.team_name} 팀은 {won}회 승리하였습니다.")
    def loss(self, loss):
        print(f"{self.team_name} 팀은 {loss}회 패배하였습니다.")
    def draw(self, draw):
        print(f"{self.team_name} 팀은 {draw}회 비겼습니다.")

class SoccerTeam(SportsTeam):
    def __init__ (self, team_name):
        self.team_name = team_name
                
class BasketballTeam(SportsTeam):
    def __init__ (self, team_name):
        self.team_name = team_name
    def draw(self, draw):
        print(f"{self.team_name} 팀은 {draw}회 연장전에 돌입했습니다.")

mcfc = SoccerTeam('Manchester United')
mcfc.won(24)
mcfc.loss(4)
mcfc.draw(5)

lal = BasketballTeam('LA Lakers')
lal.won(35)
lal.loss(25)
lal.draw(2)

주의하실 점 메서드 오버라이딩을 활용하면 부모 클래스에서 정의한 메서드의 기능을 자식 클래스에서 재활용이 불가능하다는 점을 고려하셔야 합니다. 그럼에도 슈퍼(super)함수는 부모클래스 내 메서드를 자식 클래스에서 이용하면서 동시에 필요한 부분만 재정의하여 사용할 수 있게 도와줍니다.

class SportsTeam:
    def __init__(self, team_name):
        self.team_name = team_name
        print(f"{self.team_name} 팀에 대한 정보입니다.")

    def won(self, won):
        print(f"{self.team_name} 팀은 {won}회 승리하였습니다.")

    def loss(self, loss):
        print(f"{self.team_name} 팀은 {loss}회 패배하였습니다.")

    def draw(self, draw):
        print(f"{self.team_name} 팀은 {draw}회 비겼습니다.")


class SoccerTeam(SportsTeam):
    def __init__(self, team_name):
        super().__init__(team_name)


class BasketballTeam(SportsTeam):
    def __init__(self, team_name):
        super().__init__(team_name)

    def draw(self, draw):
        super().draw(draw)
        print(f"{self.team_name} 팀은 {draw}회 연장전에 돌입했습니다.")


mcfc = SoccerTeam('ManchesterUnited')
mcfc.won(24)
mcfc.loss(4)
mcfc.draw(5)

lal = BasketballTeam('LA Lakers')
lal.won(35)
lal.loss(25)
lal.draw(2)

 

'Study > PYTHON,Django' 카테고리의 다른 글

Django(2)-데이터베이스 연동  (0) 2024.01.25
Django(1)-웹 프로그래밍 기초  (0) 2024.01.24
Python(4)-OOP심화  (0) 2024.01.19
Python(2)-모듈,패키지  (0) 2024.01.05
Python(1)-Python 기초  (0) 2024.01.02