관리 메뉴

IT journey

Python - 클래스 1편 본문

개인공부공간/Python

Python - 클래스 1편

step 2021. 5. 27. 16:27
728x90
반응형

직접 내용 정리하고 만든 예이니 퍼가실 때는 출처를 남겨주세요:)

객체 지향 프로그래밍의 이해

1. 절차(procedural) 지향 프로그래밍

문제 해결을 위한 프로그래밍이 절차에 따라서 수행되는 방법을 말합니다.

단점으로는 재사용할 수 없고 확장성이 떨어집니다. 그리고 유지보수가 하기가 어렵습니다.

대표적인 예로는 C 등이 있습니다.

2. 구조적 프로그래밍

프로그래밍을 함수 단위로 나누고 호출되면서 수행되는 방법을 말합니다.

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

문제를 해결하기 위해여 우선 각 기능별로 객체를 생성한 후 그 객체들을 조합함으로써 큰 문제를 해결하는 상향식(Bottom-up)해결을 도입했습니다. 이 객체를 한 번 독립성과 신뢰성을 높게만 만들게 되면 수정 없이 재사용할 수 있으므로 개발 기간과 비용이 줄어들게 되었습니다. 이는 곧 재사용성과 확장성이 생겼다는 말입니다.

대표적인 예로는 C#, JAVA,파이썬 등이 있습니다.

 

**데이터 저장 방법

A = 10

(1) C언어

 

 

(2) Python

 

클래스

클래스와 객체

클래스는 객체의 틀이 되는 추상적인 개념이고 객체는 클래스에 정의된 요소들의 실체입니다.

흔히 클래스는 붕어빵틀로, 객체는 붕어빵으로 생각합니다.

 

빈 클래스 만들기

class S:
	pass

아무런 기능도 없는 클래스입니다. 이 클래스도 인스턴스(instance)를 생성하는 기능을 갖는다.

여기서 인스턴스란 클레스에 의해서 생성된 객체를 인스턴스라 부릅니다.

한 개의 클래스 안에 무수히 많은 인스턴스를 만들어낼 수 있습니다.

그렇다면 S 클래스의 인스턴스는 만드는 방법을 알아야 할 텐데요.

a=S()

S()의 결과 값을 돌려받은 a의 인스턴스가 마치 함수를 사용해서 그 결과를 받는 모습과 닮았습니다.

그렇다면 클래스 구성은 어떻게 되어있을까요? 바로 아래와 같이 되어있습니다.

class 클래스명 :
	변수

 

 

클래스 만들기

클래스는 크게 보면 필드와 메소드로 구성됩니다.

이 때 필드(field)란 클래스에 소속된 변수들을 말하고

메소드(method)란 클래스(객체)내에 어떤 기능을 가질 수 있도록 하는 함수를 말합니다.

그렇다면 변수나 함수를 필드와 메소드로 다르게 구별 지어부르는 이유는 무엇일까요?

그 이유는 클래스나 객체에 소속되어있다는 것을 알리기 위함입니다.

 

클래스 내의 메소드와 일반 함수(Python-함수)와의 차이점은 무엇일지 생각해보는 시간을 가져봅시다.😊

#클래스의 구조
class 클래스 이름:
      클래스 변수1
      클래스 변수2
      ...
      클래스 변수 N
      
      def 클래스 함수1(self,인수..):
      	수행할 문장
        수행할 문장
	  	...
      def 클래스 함수2(self,인수..):
	  	수행할 문장
		수행할 문장
		...
      def 클래스 함수N(self,인수..):
		수행할 문장
		수행할 문장
		...

 

전날에 배웠던 일반 함수를 꼼꼼히 보신 분이시면 아실 텐데요.😊

정답은 바로 아래에 있습니다.

더보기

self

메소드의 경우 매개 변수의 목록에 항상 추가로 한 개의 변수(self)를 맨 앞에 추가해야 합니다. 꼭 사용해야 하는 것은 아니지만 일반적으로 사용합니다. 

#클래스 안에 메소드 만들기
class 클래스 이름:
	def 메소드(self):
    		코드

#사용한 예
class Zoo:
  def animal(self):
    print("Hello animal")

turtle=Zoo() 
turtle.animal()

클래스는 대문자로 시작해야 하며 첫 번째 매개변수는 self로 지정해야 합니다.

인스턴스= 클래스()이므로 Zoo로 변수 turtle를 만들고 이 turtle이 Zoo의 인스턴스입니다.
클래스는 특정 개념을 표현만 할 뿐 사용하려면 인스턴스 생성이 필요합니다.

메서드를 호출하고 싶을 때는 인스턴스.메서드()를 이용해줍니다.

클래스에 의해서 만들어진 객체를 인스턴스라고도 합니다.

클래스를 만들고 만들어진 클래스를 사용하기 위해서는 인스턴스화 해야 한다고 말합니다.

 

그렇다면 객체와 인스턴스의 차이는 무엇일까요?

turtle=Zoo()라는 예가 있다고 생각해봅시다.

turtle은 객체이고 turtle라는 객체는 Zoo의 인스턴스(instance)입니다.

즉 인스턴스라는 말은 특정 객체(turtle)가 어떤 클래스(Zoo)의 객체인지를 관계 위주로 설명할 때 사용합니다. 즉 turtle은 객체와 turtle은 Zoo의 인스턴스라는 말을 씁니다. 

쉽게 설명하면 인스턴스 = 객체를 말합니다.

객체(object)라고 하면 보통 객체만 지칭할 경우를 말하고

인스턴스(instance)는 클래스와 연관지어서 말할 때 씁니다.

 

필드(field)와 일반적인 변수의 차이은 무엇일지 생각해봅시다.

필드는 일반적인 변수와 똑같습니다.

하지만 필드(field)는 해당 클래스 또는 객체 내부(네임스페이스)에서만 의미가 있습니다. 

즉, 필드가 통용되는 공간은 필드 내부와 객체 내부를 말합니다.

또한 필드(field)는 소유하고 있는 대상이 클래스라면 클래스 변수가 있는 것이고 

그 대상이 객체라면 객체 변수가 있다고 생각하면 됩니다.

 

클래스를 사용하는 이유를 알아봅시다.

기능과 데이터를 같이 이용하기 위해서입니다. 참고로,  함수는 기능만 할 수 있습니다.

(1) 클래스의 요소(멤버)

animal은 Zoo클래스의 요소(attribute, field) 또는 Zoo 클래스의 멤버라고도 합니다.

class Zoo:
  animal = "monkey"

 

(2) isinstance(인스턴스, 클래스)

특정 클래스의 인스턴스인지 확인함수입니다.

class Zoo:
  def animal(self):
    print("Hello animal")
  
  def ZooKeeper(self):
    self.animal()

turtle = Zoo()
turtle.ZooKeeper()
isinstance(turtle,Zoo)

(3) 속성(attribute)

필드와 메소드들을 통틀어 클래스의 속성이라고 부릅니다.

#클래스 속성 사용하기
class 클래스 이름:
	속성 = 값
 
#클래스 속성 사용한 예
class Zoo:
  feed = [] #클래스 속성

  def put_feed(self,feed):
    self.feed.append(feed) #클래스 이름으로 클래스 속성에 접근

monkey = Zoo()
monkey.put_feed('바나나')

giraffe = Zoo()
giraffe.put_feed('잎사귀')

print(monkey.feed)
print(giraffe.feed)

#클래스 속성은 클래스에 속해 있으며 모든 인스턴스에서 공유합니다.
#인스턴스 전체가 사용해야 하는 값을 저장할 때 사용합니다.

#참고로, 인스턴스 속성을 살펴봅시다.
#인스턴스 속성 구조
#클래스 속성 사용하기
class 클래스 이름:
	def __init__(self):
    	self.속성 = 값

#인스턴스 속성 사용한 예
class Zoo:
  def __init__(self):
    self.feed = [] #인스턴스 속성

  def put_feed(self,feed):
    self.feed.append(feed) 

monkey = Zoo()
monkey.put_feed('바나나')

giraffe = Zoo()
giraffe.put_feed('잎사귀')

print(monkey.feed)
print(giraffe.feed)

#인스턴스 속성은 인스턴스 별로 독립되어 있고 서로 영향을 주지 않습니다.
#각 인스턴스가 값을 따로 저장해야 할 때 사용합니다.

 

다시 한 번 클래스 변수(속성)와 인스턴스 변수(속성)의 차이에 대해 정리해 봅시다.

클래스 변수(속성)는 클래스의 이름 공간에 생성하고 모든 인스턴스 객체에 의해 공유 될 수 있습니다.

(즉, 클래스로부터 생성된 모든 인스턴스들이 접근할 수 있다는 것입니다.)

그리고 클래스 변수(속성)는 하나만 존재하기 때문에 어떤 객체가 클래스 변수를 변경하게 되면 다른 인스턴스에게도 변경된 내용이 반영되게 됩니다.

그리고 인스턴스가 생성되기 이전에 미리 메모리 공간이 할당되어있습니다.

그러나 인스턴스 (객체) 변수(속성)는 클래스로부터 생성된 인스턴스 객체의 이름 공간에 생성하고 각각의 인스턴스 객체 내에서만 참조됩니다. (즉, 서로 공유하지 않는다고 볼 수 있습니다.) 

그리고 인스턴스가 생성되는 시점에 메모리 공간에 할당되어 있습니다.

 

- 스폐셜 메서드 또는 매직 메서드

self를 써야만 해당 함수를 인스턴스의 함수로 사용할 수 있게 됩니다.

self는 간단히 말하면 이 함수를 부르는 객체가 해당 클래스가 인스턴스인지 확인해 주기 위한 장치 입니다.

단순히 확인하는 것에서 나아가 self를 이용하여 객체내의 정보를 저장하거나 불러올 수 있습니다.

앞 뒤로 __(밑줄 두 개)가 붙은 메서드는 파이썬이 자동으로 호출해주는 메서드로 이것을 스폐셜 메서드 또는 매직 메서드라고 부릅니다.

#__init__(initialize): 인스턴스(객체) 초기화
#속성 사용한 클래스 구조
class 클래스 이름:
    def __ init __(self):
        self. 속성 = 값

class Zoo:
  def __init__(self):
    self.hello = "Hello animal"
  
  def ZooKeeper(self):
    print(self.hello)

turtle = Zoo() #객체화 합니다(메모리에 객체를 생성,인스턴스화)
turtle.ZooKeeper()

(4) 메서드 안에서 메서드 호출하는 방법

self.메서드()형식으로 클래스안의 메서드를 호출합니다.

메소드를 호출 할 때 self에는 직접 우리가 값을 넘겨주지 않습니다. 파이썬이 자동으로 self에 값을 할당합니다. 

참고로 self는 C++에서는 this 포인터, JAVA나 c#에서는 this 참조와 같다고 보시면 되겠습니다.

class Zoo:
  def animal(self):
    print("Hello animal")
  
  def ZooKeeper(self):
    self.animal()

turtle = Zoo()
turtle.ZooKeeper()

(5) 인스턴스를 만들 때 값 받기

class 클래스 이름:
	def __init__(self, 매개변수1, 매개변수2):
    	self.속성 1 = 매개변수1
        self.속성 2 = 매개변수2
        
#Zoo 클래스로 인스턴스를 만들 때 동물, 나이, 먹이를 받아보겠습니다.
class Zoo:
  def __init__(self,animal,age,food):
    self.hello = "안녕하세요"
    self.animal = animal 
    self.age = age
    self.food = food
  
  def ZooKeeper(self):
    print('{0} 저는 {1} 사육사입니다.'.format(self.hello,self.animal))

monkey = Zoo('원숭이',20,'바나나')
monkey.ZooKeeper()

print("내가 사육하는 동물은",monkey.animal)
print("그 동물의 나이는",monkey.age,"입니다.")
print("그 동물이 좋아하는 먹이는",monkey.food,"입니다.")

- 특정 속성만 허용(다른 속성은 생성 제한)
__slots__ = ['속성이름1', '속성이름2']

class Zoo:
  __slots__=['animal','age']

turtle = Zoo()
turtle.animal = '거북이' #허용된 속성
turtle.age = 200 #허용된 속성
turtle.feed = '잡식'# 허용되지 않은 속성은 추가할 때 에러가 발생함

(6) 비공개 속성

클래스 안에서만 쓸 수 있는 속성입니다.

그렇다는 것은 클래스 밖에서 사용하게 될 시 에러가 난다는 말이라는 것을 쉽게 알 수 있을겁니다.

#구조
class 클래스 이름:
	def __init__(self, 매개변수):
    	self.__속성 = 값
        
#사용한 예
class Zoo:
  def __init__(self,animal,age,food,money):
    self.hello = "안녕하세요"
    self.animal = animal 
    self.age = age
    self.food = food
    self.__money = money
  
  def ZooKeeper(self,wallet):
    if (wallet>self.__money):
      print("먹이를 살돈이 없어..")
      return
      self.__money -= wallet

  def ZooKeeper(self,wallet):
    self.__money -= wallet
    print('{0}원 가지고 있어요.'.format(self.__money))

monkey = Zoo('원숭이',20,'바나나',3000)
monkey.ZooKeeper(11000)

 

 

 

이전 발행글

Python - 내장함수 1편

Python - 자료형 (숫자형,문자열,불린형)

Python-자료형(리스트,튜플)

Python-자료형(사전형,집합)

Python - 제어문

Python-함수

 

 

728x90
반응형

'개인공부공간 > Python' 카테고리의 다른 글

Python - 모듈(외장함수) 1편  (10) 2021.05.29
Python - 클래스 2편  (10) 2021.05.28
Python-함수  (17) 2021.05.26
Python - 제어문  (10) 2021.05.25
Python-자료형(사전형,집합)  (10) 2021.05.24
Comments