객체지향과 클래스

현서·2025년 1월 2일

파이썬

목록 보기
18/27
post-thumbnail

1. 프로그래밍 방법론

  • 프로그램을 개발하는 다양한 접근 방식이나 철학
  • 프로젝트 규모, 요구 사항, 개발 팀의 특성에 따라 적합한 방법론이 달라지기 때문에 각 방법론의 특징과 장단점을 이해하는 게 중요하다.

1-1. 절차적 프로그래밍(Procedural Programming)

  • 절차(Procedure)를 중시하는 방식
  • 작업을 순서대로 실행하도록 프로그램을 구성.
  • 코드가 명령문으로 이루어져 있고, 작업 순서가 중요하다.
  • 변수와 함수가 함께 사용되며, 함수를 통해 프로그램의 기능을 분리하고, 코드 중복을 줄인다.

1-2. 객체지향 프로그래밍 (Object-Oriented Programming, OOP)

  • 객체(Object)라는 개념을 사용해 프로그램을 구성.
  • 객체는 데이터(속성)와 함수(메서드)를 하나의 단위로 묶은 것.
  • 클래스라는 틀을 이용해 객체를 정의하고, 이를 통해 여러 개의 객체를 생성할 수 있다.
  • 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism) 등의 특징을 활용해 코드를 재사용하고 확장할 수 있다.

1-3. 함수형 프로그래밍 (Functional Programming)

  • 함수를 중심으로 프로그램을 구성한다.
  • 수학적인 함수 개념에 기초하고 있으며 코드가 간결하고 직관적이다.
    ex) map, filter, reduce 등의 함수나 재귀를 주로 사용하여 데이터 처리를 간결하게 수행한다.

2. 클래스 만들기

  • 파이썬에서 클래스를 정의하려면 class 키워드를 사용.
  • 클래스 이름은 관례적으로 대문자로 시작하는 것이 좋다.
  • 클래스 내부에는 속성(멤버 변수)과 메서드(멤버 함수)를 정의할 수 있다.
class 클래스이름:
    # 클래스 속성(멤버 변수) 정의
    속성1 = 초기값1
    속성2 = 초기값2

    # 생성자 메서드 (생략 가능)
    def __init__(self, 매개변수1, 매개변수2, ...):
        # 인스턴스 속성 초기화
        self.속성1 = 매개변수1
        self.속성2 = 매개변수2

    # 메서드(멤버 함수) 정의
    def 메서드1(self, 매개변수1, 매개변수2, ...):
        # 메서드 동작 정의
        pass

    def 메서드2(self, 매개변수1, 매개변수2, ...):
        # 메서드 동작 정의
        pass
  • 객체(Object): 현실 세계에서의 실제 개체나 추상적인 개념을 모델링한 것.
    ex) 자동차, 사람, 은행 계좌 등.
    객체는 데이터(속성, 상태)와 메서드(동작, 함수)로 구성된다.
    클래스에서 만들어진 실제 존재하는 데이터(프로그램 내에서 사용된 것)

  • 클래스(Class): 객체를 만들기 위한 템플릿 또는 설계도.
    클래스는 객체의 공통 속성과 동작을 정의하며, 객체를 생성하는데 사용된다.
    ex) "자동차" 클래스는 모든 자동차 객체가 가져야 하는 속성(색상, 속도)과 메서드(주행, 멈춤)를 정의할 수 있다.

  • 인스턴스(Instance): 클래스를 기반으로 실제로 생성된 객체.
    클래스는 여러 인스턴스를 생성할 수 있으며, 각 인스턴스는 독립적인 데이터와 메서드를 가진다.
    객체가 어떤 클래스에서 나왔는지에 초점을 맞출 때 사용하는 용어

  • 속성(Attributes) 또는 멤버 변수(Fields): 객체는 데이터를 저장하기 위한 속성을 가진다.
    속성은 객체의 상태나 특성을 나타내며 변수로 표현된다.
    ex) 자동차 객체의 속성은 색상, 속도, 모델 등이 될 수 있다.

  • 메서드(Methods) 또는 멤버 함수(Functions): 객체는 데이터를 조작하거나 특정 작업을 수행하기 위한 메서드를 포함한다.
    메서드는 함수와 비슷하게 동작하지만, 객체의 상태에 접근하고 조작할 수 있다.
    ex) 자동차 객체의 메서드: 주행, 정지, 경적 울리기 등.

3. 객체(인스턴스) 생성

클래스를 정의한 후에는 이를 기반으로 객체(인스턴스)를 생성할 수 있다.

class Dog:
  pass # 내용이 없는 블록을 만들 때 사용
Dog()
 <__main__.Dog at 0x7e56cf26bb50>
Rucy = Dog()
print(Rucy)
print(type(Rucy))
print(id(Rucy))

PPomi = Dog()
print(PPomi)
print(type(PPomi))
print(id(PPomi))
 <__main__.Dog object at 0x7e56cf29fca0>
<class '__main__.Dog'>
138911307922592
<__main__.Dog object at 0x7e56cf2693c0>
<class '__main__.Dog'>
138911307699136

4. 객체 속성 초기화

객체를 생성한 후에는 객체의 속성을 초기화할 수 있다.
이를 위해 . 연산자를 사용하여 객체의 속성에 접근하고 값을 할당한다.
또한 . 연산자를 사용하여 객체의 메서드를 호출할 수 있다.

class Dog:
    name = ''
    age = 0
    family = ''

    def eat(self):
        print('사료를 먹습니다!')
Rucy = Dog()

Rucy.name = '루시'
Rucy.age = '15'
Rucy.family = '포메'

print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
Rucy.eat()

PPomi = Dog()
PPomi.name = '뽀미'
PPomi.age = '7'
PPomi.family = '폼피츠'

print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
PPomi.eat()
루시
15
포메
사료를 먹습니다!
뽀미
7
폼피츠
사료를 먹습니다!

5. 생성자(Constructor)

  • 클래스의 인스턴스가 생성될 때 자동으로 호출되는 특별한 메서드.
  • 생성자는 객체의 초기화를 담당하며, 객체가 생성될 때 필요한 속성을 초기화하고 설정하는 역할을 한다.
  • 파이썬에서 생성자 메서드는 __init__라고 이름이 정해져 있다.
  • 속성은 self를 사용하여 접근하고 설정한다. 이렇게 초기화된 속성은 객체가 생성될 때마다 다른 값을 가질 수 있다.
class 클래스이름:
    def __init__(self, 매개변수1, 매개변수2):
        self.속성1 = 매개변수1
        self.속성2 = 매개변수2
class Dog:
    def __init__(self):
        print(self, 'init 호출!')
Rucy = Dog()
 <__main__.Dog object at 0x7e56cf29e0e0> init 호출!
PPomi = Dog()
 <__main__.Dog object at 0x7e56cf29dcc0> init 호출!
class Dog:
    def __init__(self):
        self.name = ''
        self.age = 0
Rucy = Dog()
print(Rucy)
print(Rucy.name)
print(Rucy.age)
 <__main__.Dog object at 0x7e56cf29d540>
(공백)
0
PPomi = Dog()
print(PPomi)
print(PPomi.name)
print(PPomi.age)
 <__main__.Dog object at 0x7e56cf29d750>
(공백)
0
class Dog:
    def __init__(self, name, age, family='족보없음'):
        self.name = name
        self.age = age
        self.family = family
# Rucy = Dog() # TypeError: Dog.__init__() missing 2 required positional arguments: 'name' and 'age'

Rucy = Dog('루시', 15, '포메')
print(Rucy)
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
 <__main__.Dog object at 0x7e56cf29ddb0>
루시
15
포메
PPomi = Dog('뽀미', 7, '폼피츠')
print(PPomi)
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
 <__main__.Dog object at 0x7e56cf29efb0>
뽀미
7
폼피츠
class Counter:
    def __init__(self):
        self.num = 0
    def increment(self):
        self.num += 1
    def current_value(self):
        return self.num
    def decrement(self):
        self.num -= 1
    def reset(self):
        self.num = 0
KBBank = Counter()
print(KBBank.num)
print(KBBank.current_value())
KBBank.increment()
KBBank.increment()
KBBank.increment()
print(KBBank.current_value())
KBBank.decrement()
print(KBBank.current_value())
KBBank.reset()
print(KBBank.current_value())
0
0
3
2
0
HanaBank = Counter()
print(HanaBank.current_value())
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
print(HanaBank.current_value())
print(KBBank.current_value())
0
5
0

6. 클래스 변수와 인스턴스 변수

  • 클래스 변수: 클래스 자체에 속해 모든 인스턴스가 공유하는 변수로, 한 번 변경하면 모든 인스턴스에 영향을 미친다.
  • 인스턴스 변수: 각 인스턴스(객체)마다 별도로 존재하는 변수로, 인스턴스마다 독립적인 값을 가질 수 있어 다른 인스턴스에 영향을 주지 않는다.
class Dog:
    family = "포메" # 클래스 변수

    def __init__(self, name, age):
        # 인스턴스 변수
        self.name = name
        self.age = age

    def print_info(self):
        print(f'종: {Dog.family}')  # 클래스 변수
        print(f'이름: {self.name}') # 인스턴스 변수
        print(f'나이: {self.age}')  # 인스턴스 변수

Rucy = Dog('루시', 15)
PPomi = Dog('뽀미', 7)
Rucy.print_info()
PPomi.print_info()
종: 포메
이름: 루시
나이: 15
종: 포메
이름: 뽀미
나이: 7
Dog.family = '폼피츠'
Rucy.print_info()
PPomi.print_info()
종: 폼피츠
이름: 루시
나이: 15
종: 폼피츠
이름: 뽀미
나이: 7
Rucy.family = '포메'
Rucy.print_info()
print(Rucy.family)
print(PPomi.family)
종: 폼피츠
이름: 루시
나이: 15
포메
폼피츠

Dog.family = '폼피츠' 이므로 이미 클래스 변수는 '폼피츠'이다.
따라서 Rucy.print_info() 했을 때, 종은 '폼피츠'로 출력.

7. 메서드 타입

  • 인스턴스 메서드(Instance Method): 객체의 상태를 조작하거나 객체에 특정 작업을 수행하는 메서드. 대부분의 클래스 내부에 있는 메서드는 인스턴스 메서드.
    __init__(생성자: 객체가 생성될 때 초기값) 메서드도 인스턴스 메서드.

  • 클래스 메서드(Class Method): 클래스 레벨에서 동작하며, 모든 인스턴스가 공유하는 메서드.
    클래스 메서드는 @classmethod 데코레이터를 사용하여 정의하며, 첫 번째 매개변수로 cls를 사용한다.

  • 정적 메서드(Static Method): 특정 클래스나 인스턴스와 관련이 없는 메서드.
    클래스 내부에 정의되어 있지만 클래스나 인스턴스와 독립적으로 호출될 수 있다.
    정적 메서드는 @staticmethod 데코레이터를 사용하여 정의한다.

class Calculator:
    def add(self, x, y):
        return x + y

    @classmethod
    def subtract(cls, x, y):
        # cls.num = 20 : class에서 만든 변수를 사용할 수 있다.
        return x - y

    @staticmethod
    def multiply(x, y):
        return x * y
# 인스턴스 생성
calc = Calculator()

# 인스턴스 메서드 호출
result1 = calc.add(5, 3)
print(result1)  # 출력: 8

# 클래스 메서드 호출
result2 = Calculator.subtract(10, 4)
print(result2)  # 출력: 6

# 정적 메서드 호출
result3 = Calculator.multiply(6, 2)
print(result3)  # 출력: 12
8
6
12
메서드 유형호출 방법특징예시
인스턴스 메서드obj.method()self 사용, 객체 필요c.add(3, 4)
클래스 메서드Class.method()cls 사용, 클래스 변수 접근Calculator.subtract()
정적 메서드Class.method()클래스/객체 모두 호출 가능, 독립적Calculator.multiply()
profile
The light shines in the darkness.

0개의 댓글