[Python] 클래스(Class)

is Yoon·2023년 8월 17일
0

Python

목록 보기
13/17
구분설명예시
클래스 class객체를 생성하기 위한 틀핸드폰
객체 object클래스로 선언된 변수갤럭시, 아이폰
인스턴스 Instance클래스로부터 생성된 객체
메소드 MethodClass Body 안에서 정의되는 함수계산 기능, 검색 기능
속성 Attribute객체가 가진 데이터 (특징). 변수크기, 색상, 가격



🔗 클래스 Class

  • 사용자 정의 객체를 생성하기 위한 틀 or 템플릿 or 설계도
  • 객체의 공통된 속성과 행위(동작)를 변수와 함수(메소드)로 정의한 것
  • 실체화되지 않은 추상적인 개념으로, 객체를 생성하기 위해 사용
class ClassName : 
	def method_name(self) :
		method_body 
	class_body
    
object = ClassName()

기본 구조

class ClassName :
	attr1 = 0       # 클래스 (지역) 변수 선언 및 초기화
	attr2 = 0
    
    # 생성자 (객체 생성)
    def __init__(self, param1, param2)
        self.attr1 = param1    # 인스턴스 변수 생성 및 초기화
        self.attr2 = param2

    # 메소드 (클래스 함수)
    def plus(self) :
        attr3 = self.attr1 + self.attr2
        return attr3

    # 소멸자 (기본적으로 설정되어 있긴 함)
    def __del__(self) :
        del self.attr1
        del self.attr2
  • __init__ 초기화 함수 : 인스턴스를 만들 때 실행되는 함수
  • __str__ 문자열화 함수 : 인스턴스 자체를 출력 할 때의 형식을 지정해주는 함수
class Human( ):
    '''인간'''
    def __init__( self, name, weight ):
        '''초기화 함수'''
        self.name = name
        self.weight = weight

    def __str__( self )
        '''문자열화 함수'''
        return "{} ( 몸무게 {}kg )".format( self.name, self.weight )

person = Human( "사람", 60.5 ) # 초기화 함수 사용
print( person ) # 문자열화 함수 사용

파이썬에서는 __str__ 메소드를 사용해 class 내부에서 출력 format을 지정할 수 있다.

class Coord(object):
    def __init__ (self, x, y):
        self.x, self.y = x, y
    def __str__ (self):
        return '({}, {})'.format(self.x, self.y)

point = Coord(1, 2)





💡 객체 Object

  • 속성과 행위로 구성된 대상
  • 클래스로 선언된 변수
  • 클래스의 특정한 인스턴스
  • 클래스로부터 생성된 실체로, 메모리에 할당되어 사용


💡 인스턴스 Instance

  • 클래스로부터 생성된 객체
  • 객체가 메모리에 할당된 상태이며, 런타임에 구동되는 객체
  • 오른쪽에 소괄호 ()를 붙여서 만듦


💡 메서드 Method

  • Class Body 안에서 정의되는 함수
  • 첫 번째 인수를 항상 self로 지정

클래스의 인스턴스의 attribute로서 호출되면, 그 메서드는 첫 번째 인자로 인스턴스 객체 self를 받는다. 첫 번째 인자를 설정하지 않으면 에러가 발생한다. 이 첫 번째 인자를 self라고 쓴다.

🔹Self

  • 인스턴스 자기 자신

🔹 인스턴스/클래스/정적 메소드

인스턴스 메소드

  • 기본적인 메서드

메소드가 클래스의 인스턴스로 호출이 되고 첫 번째 파라미터인 self로 인스턴스 자기자신이 자동으로 전달되는 방식이다. self.함수명() 형식으로 클래스 내외 다른 함수를 호출할 수 있다.

클래스 메소드

  • @classmethod 데코레이터 지정해야 사용 가능
  • 첫 번째 파라미터 : cls = 클래스 자체
  • 인스턴스 없이 호출 가능
  • 클래스 변수를 사용하기 위한 함수

메서드 안에서 클래스 속성, 클래스 메서드에 접근해야 할 때 사용하고, 클래스 생성자에 다른 형태의 파라미터를 전달하기위해 사용한다.

정적 Static 메소드

  • @staticmethod 데코레이터 지정해야 사용
  • 첫번째 파라미터 : 할당 X (접근도 불가능)

정적 메소드는 클래스와 관련이 있어서 클래스 안에 두기는 하지만 클래스나 클래스의 인스턴스(객체)와는 무관하게 독립적으로 동작하는 함수이다.

객체 생성 시에 따로 초기화할 속성 값을 전달하지 않으면 기존에 정의한 속성 값으로 객체의 속성을 정의한다는 의미를 갖는다. 유틸리티 메서드를 구현할 때 많이 사용한다.

class Store:
    def __init__(self, menu1, menu2):
        self.menu1 = menu1 
        self.menu2 = menu2

    def total_order(self):
        return (self.menu1 + self.menu2)

    @classmethod 
    def same4each(cls, double):
        return cls(double, double) 

    @staticmethod
    def nameofstore():
        print("가게 이름")

Order = Store(3,2)
Order.nameofstore()
5
가게 이름



💡 속성 Attribute

  • 클래스 내부에 포함돼 있는 메소드나 변수
  • __init__ 메서드 안에서 self.속성을 할당하여 생성
  • 인스턴스.속성 = 값
class ClassName :
	def __init__(self) :
	    self.속성 =
  • 비공개 속성은 해당 속성 앞에 던더 __를 붙이면 됨
    비공개 속성은 속성값을 변경 못하도록 막고 싶을 때 사용
    (클래스 외부에선 이 속성에 대해 접근할 수 없다.)




🔗 클래스 상속

이미 만들어진 클래스의 변수와 함수를 그대로 이어받고 새로운 내용만 추가하여 클래스를 선언할 수 있다. 필요한 경우에는 super() 함수를 사용하여 부모 클래스의 메소드를 명시적으로 호출할 수도 있다.

class 부모클래스 : 
	코드 블록 (속성, 메소드 정의)

class 자식클래스(부모클래스) :
	코드 블록 (추가적인 속성, 메소드 정의)

클래스 상속은 기존 클래스를 확장하고 재사용하는 방법이다. 상속은 코드의 재사용성을 높이고 유지보수를 용이하게 하는 데 도움을 준다.

자식 클래스에서 부모 클래스의 내용을 사용하고 싶은 경우 :
super().부모클래스내용 으로 호출하여 사용한다.


[예제] 여러 종류의 게임 캐릭터 만들기

class Character : 
	def __init__(self, name, health) :
    	self.name = name
        self.health = health
    def attack(self) :
    	print(f"{self.name}이(가) 공격합니다.")
# 자식 클래스에서 attact() 메소드를 재정의(Override)할 수 있다.

class Warrior(Character) :
	def __init__(self, name, health, strength) :
    	super().__init__(name, health)
    	self.strength = strength
    
    def attack(self) :
	    super().attack()
    	print(f"{self.name}의 강력한 공격!")
class Mage(Character) :
	def __init__(self, name, health, magic_power) :
    	super().__init__(name, health)
    	self.magic_power = magic_power
    
    def attack(self) :
	    super().attack()
    	print(f"{self.name}의 마법 공격!")

각 클래스를 인스턴스화하여 캐릭터 객체를 생성하고 메소드를 호출할 수 있다.

player1 = Warrior("전사", 100, 10)
player2 = Mage("마법사", 80, 15)

player1.attack()
player2.attack()
전사이(가) 공격합니다.
전사의 강력한 공격!
마법사이(가) 공격합니다.
마법사의 마법 공격!




⭐ 객체와 클래스를 사용하는 이유

코드 작성과 관리가 편하기 때문이다. 작은 규모의 프로그램을 만들 때는 괜찮지만, 규모가 커지면 클래스와 객체를 많이 이용한다. 또한 게임의 캐릭터와 같이 유사한 객체가 많은 프로그램을 만들 때도 주로 클래스와 객체를 이용해 코드를 작성한다.

# 예시 상황
로봇의 속성 : 이름, 위치
로봇의 동작 : 한 칸 이동
# 클래스, 객체 사용 X
robot_name = "R1"
robot_posi = 0

def robot_move() :
	global robot_posi
    robot_posi = robot_posi + 1
    print("{0} position : {1}".format(robot_name, robot_posi))
    
robot_move()
# R1 position : 1
만약 로봇을 한 대 더 추가하려면 위 cell의 내용을 그대로 한 번 더 적어야 한다.
# 클래스, 객체 사용
class Robot() :
	def __init__ (self, name, posi) :
    self.name = name
    self.posi = posi
    
    def move(self) :
    	self.posi = self.posi + 1
        print("{0} position : {1}".format(self.name, self.posi))
        
robot1 = Robot("R1", 0)
만약 로봇을 한 대 더 추가하려면
robot2 = Robot("R2", 0) 만 추가하면 된다.
profile
planning design development with data

0개의 댓글