반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
Archives
Today
Total
관리 메뉴

Learner's Log님의 블로그

객체와 클래스 - 객체 지향 프로그래밍 본문

Python/[A to Z]Python

객체와 클래스 - 객체 지향 프로그래밍

Learner's Log 2025. 2. 8. 18:39

프로그래밍을 하다 보면 데이터와 기능을 하나로 묶어 관리하고 싶을 때가 많습니다. 이때 사용하는 것이 바로 객체(Object)클래스(Class)입니다.

1️⃣객체(Object)란?

객체는 속성(데이터)과 동작(메서드)을 하나로 묶은 개념입니다. 예를 들어, 자동차를 객체로 생각해보겠습니다. 자동차는 색상, 브랜드, 속도 같은 속성이 있고, 달리기, 멈추기 같은 동작을 가질 수 있습니다.

class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color

    def drive(self):
        print(f"{self.color} {self.brand}가 달립니다!")

my_car = Car("Tesla", "빨간색")
my_car.drive()
    

 

  • 객체를 만들고 이용할 수 있는 기능을 제공하는 프로그래밍 언어를 객체지향 프로그래밍(Object- Oriented Programming, OOP) 언어 혹은 객체지향 언어라고 함

2️⃣클래스(Class) 선언

클래스는 객체를 만들기 위한 설계도입니다. 즉, 클래스를 정의하면, 그 클래스를 기반으로 여러 개의 객체를 만들 수 있습니다.

  1. 객체를 만들려면 먼저 클래스를 선언해야 함
  2. 클래스는 객체의 공통된 속성과 행위를 변수와 함수로 정의한 것
  3. 클래스는 객체를 만들기 위한 기본 틀이고 객체는 기본 틀을 바탕으로 만들어진 결과
  4. 객체는 클래스에서 생성하므로 객체를 클래스의 인스턴스(Instance)라고 함
#클래스 선언을 위한 기본 구조
class 클래스명():
    [변수1] #클래스변수
    [변수2]
    def 함수1(self[, 인자1, 인자2, • • , 인자n]): # 클래스 함수
    	〈코드 블록〉
    def 함수2(self[, 인자1, 인자2, • • , 인자n]):
    	〈코드 블록〉
class Dog:
    def __init__(self, name, breed):
        self.name = name
        self.breed = breed

    def bark(self):
        print(f"{self.name}가 멍멍 짖습니다!")

3️⃣ 객체 생성 및 활용

  • 객체의 메서드를 호출 할 때
  • 객체명.메서드명([인자1, 인자2, • • • , 인자n])
  • 메서드명은 클래스에서 정의한 함수명
  • 객체에서 메서드를 호출할 때 인자는 클래스에서 정의한 함수의 인자만큼 필요
  • 클래스를 선언할 때 추가했던 함수의 인자 self는 필요하지 않음
  • 클래스에서 self만 인자로 갖는 함수를 객체에서 이용할 때는 소괄호 안에 인자를 지정하지 않음
my_dog = Dog("초코", "푸들")
your_dog = Dog("바둑이", "진돗개")

my_dog.bark()  # 초코가 멍멍 짖습니다!
your_dog.bark()  # 바둑이가 멍멍 짖습니다!

4️⃣ 객체 초기화 (`__init__` 메서드)

클래스를 만들 때, 초기값을 설정할 수 있도록 도와주는 메서드입니다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        print(f"안녕하세요! 저는 {self.name}이고, {self.age}살입니다.")

p1 = Person("홍길동", 25)
p1.introduce()
    
  • __init__(self, wheel_size, color) 함수는 wheel_size와 color를 인자로 입력받아 함수 내에서 'self.변수명 = 인자'로 객체의 속성을 초기화
  • 클래스에 __init__()함수가 정의돼 있으면 객체를 생성할 때 __init__() 함수의 인자를 입력(self는 제외)함

5️⃣ 인스턴스 메서드

객체마다 다르게 동작하는 메서드입니다.

  • 인스턴스 메서드는 함수를 정의할 때 첫 인자로 self가 필요(self는 클래스의 인스턴스 자신을 가리킴)
  • 인스턴스 메서드는 각 객체에서 개별적으로 동작하는 함수를 만들고자할 때 사용하는 함수
#인스턴스 메서드의 구조

class 클래스명():

    def 함수명(self[, 인자1, 인자2, • • , 인자n]):
        self. 변수명1 = 인자1
        self. 변수명2 = 인자2
        self. 변수명3 = 데이터
        〈코드 블록〉
class Cat:
    def __init__(self, name):
        self.name = name

    def meow(self):
        print(f"{self.name}가 야옹합니다!")

c = Cat("나비")
c.meow()  # 나비가 야옹합니다!
    

6️⃣ 정적 메서드 (`@staticmethod`)

객체와 관계없이 동작하는 메서드입니다.

  • 정적 메서드는 클래스와 관련이 있어서 클래스 안에 두기는 하지만 클래스나 클래스의 인스턴스(객체) 와는 무관하게 독립적으로 동작하는 함수를 만들고 싶을 때 이용하는 함수
  • 함수를 정의할 때 인자로 self를 사용하지 않으며 정적 메서드 안에서는 인스턴스 메서드나 인스턴스 변수에 접근할 수 없음
  • 함수 앞에 데코레이터(Decorator) 인 @staticmethod를 선언해 정적메서드임을 표시
#정적 매서드의 구조

class 클래스명():
    @staticmethod
    def 함수명([인자1, 인자2, • • , 인자n]):
    	<코드 블록>
class Math:
    @staticmethod
    def add(a, b):
        return a + b

print(Math.add(3, 5))  # 8
    

 

정적 메서드는 날짜 및 시간 정보 제공, 환율 정보 제공, 단위 변환과 같이 객체와 관계없이 독립적으로 동작하는 함수를 만들 때 주로 이용

7️⃣ 클래스 메서드 (`@classmethod`)

클래스를 대상으로 동작하는 메서드입니다.

  • 클래스 메서드도 객체를 생성하지 않고 클래스명을 이용해 바로 호출
  • 클래스 메서드를 사용하기 위해서는 함수 앞에 데코레이터인@classmethod를 지정
#클래스 메서드의 구조

class 클래스명():
    @classmethod
    def 함수명(cls[, 인자1, 인자2, • • • , 인자n]):
    	〈코드 블록〉
class Counter:
    count = 0

    @classmethod
    def increment(cls):
        cls.count += 1
        print(f"현재 카운트: {cls.count}")

Counter.increment()  # 현재 카운트: 1
Counter.increment()  # 현재 카운트: 2
    

 

클래스 메서드는 생성된 객체의 개수를 반환하는 등 클래스 전체에서 관리해야 할 기능이 있을 때 주로 이용

8️⃣객체와 클래스를 사용하는 이유

  • 코드를 더 효율적으로 관리할 수 있습니다.
  • 현실 세계를 더 쉽게 표현할 수 있습니다.
  • 대규모 프로그램을 만들 때 구조적으로 관리할 수 있습니다.

클래스와 객체를 사용하지 않은 코드

robot_name = 'R1'  # 로봇 이름
robot_pos = 0  # 로봇의 초기 위치

def robot_move():
    global robot_pos
    robot_pos = robot_pos + 1
    print("{0} position: {1}".format(robot_name, robot_pos))

 

  • robot_name과 robot_pos 변수에 각각 로봇의 속성을 지정했고 함수 robot_move()는 로봇을 한 칸 이동한 후에 로봇의 이름과 위치를 출력
  • 한 대의 로봇을 구현하기 위해 두 개의 변수(robot_name과 robot_pos)와 하나의 함수(robot_move()) 를 만들었음

만약 더 많은 로봇을 구현해야 한다면 그만큼 변수와 함수도 더 늘어날것, 로봇이 늘어남에 따라 같은 비율로 변수와 함수가 증가하고 코드 작성과관리는 상당히 힘들어 지기 때문

로봇 클래스를 선언

class Robot():
    def __init__(self, name, pos):
        self.name = name  # 로봇 객체의 이름
        self.pos = pos  # 로봇 객체의 위치

    def move(self):
        self.pos = self.pos + 1
        print("{0} position: {1}".format(self.name, self.pos))
  • Robot 클래스에서 속성값(self .name와 self .pos)은 __init__() 함수에서 초기화하고 move()함수에 한 칸 이동하는 기능을 구현

 Robot 클래스의 인스턴스 robot1과 robot2 객체를 생성

robot1 = Robot('R1', 0)
robot2 = Robot('R2', 10)

 

클래스와 객체를 이용하지 않은 코드 에서 로봇의 개수에 비례해 변수와함수가 늘어났던 것에 비교하면 코드가 간단해졌음

 

즉, 

• 클래스를 선언한 이후에는 로봇이 필요할 때마다 로봇 객체만 생성하면 됨
• 객체가 아무리 늘어나도 변수나 함수를 추가로 구현할 필요가 없음
• 객체와 클래스 없이 로봇을 구현할 때보다 코드의 양도 줄고 관리도 편리해짐

9️⃣ 클래스 상속 (Inheritance)

  • 처음부터 클래스를 만들 수도 있지만 이미 만들어진 클래스의 변수와 함수를 그대로 이어받고 새로운 내용만 추가해 서 클래스를 선언할 수도 있음
  • 자식 클래스가 부모 클래스로부터 상속을 받으면 자식 클래스는 부모 클래스의 속성(변수)과 행위(함수)를 그대로 이용할 수 있음
  • 부모 클래스에서 정의한 함수와 자식 클래스에서 정의한 함수 이름이 같은 경우 부모 클래스의 함수를 호출하려면 명시적으로 '부모 클래스 이름.함수명()'으로 호출하거나,'super().함수명()'을 사용
  • 초기화 함수 __init__()에서 많이 이용
class 자식 클래스 이름(부모 클래스 이름):
	〈코드 블록〉
class Animal:
    def speak(self):
        print("동물이 소리를 냅니다!")

class Dog(Animal):
    def speak(self):
        print("멍멍!")

class Cat(Animal):
    def speak(self):
        print("야옹!")

dog = Dog()
cat = Cat()

dog.speak()  # 멍멍!
cat.speak()  # 야옹!
    

 

 

반응형

'Python > [A to Z]Python' 카테고리의 다른 글

함수(Function)  (0) 2025.02.06
리스트 튜플 세트 딕셔너리  (0) 2025.01.03
변수와 문자열 다루기(+메서드)  (0) 2025.01.02
논리연산과 비교연산  (0) 2024.12.31
python 환경 설정💻  (0) 2024.12.30