수달이네 기술 블로그

1. 파이썬 객체지향 본문

언어/Python

1. 파이썬 객체지향

슬픈 수달이 2025. 11. 5. 21:53

1. 프로그래밍 방법론

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

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

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

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

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

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

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

2. 객체

실제 개체나 추상적인 개념을 모델링한것.

1. 클래스

클래스: 객체를 만들기 위한 템플릿

파이썬에서 클래스를 정의하기 위해서 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 #아무것도 없어도 동작하도록 만듦.

인스턴스: 클래스를 기반으로 생성된 객체.

속성 or 멤버변수: 객체는 데이터를 저장하기 위한 속성을 가짐, 객체의 상태나 특성을 나타내며, 변수로 표현된다.

메서드 or 멤버함수: 객체는 데이터를 조작하거나 특정 작업을 수행하기 위한 메서드를 포함한다.

변수 = 클래스이름() #인스턴스 생성 후 변수에 저장
class Dog:
    pass
    
a = Dog()
print(a)   #<__main__.Dog object at 0x000001A87D0DD2B0>
b = Dog()
print(b)   #<__main__.Dog object at 0x000001A87CF3CA50>

위처럼 인스턴스를 생성할 수 있으며, 생성된 위치가 둘다 다르다.

2. 클래스 변수

클래스에 속하는 변수로, 클래스가 생성될 때 정의되고, 그 클래스로 만들어진 인스턴스가 공유하는 변수.

class Dog:
    name = "no name"
    age = 0
    family = "no family"
    
print(Dog().name)   #no name
print(Dog().age)    #0
print(Dog().family) #no family
    
a = Dog()
print(a.name)   #no name
print(a.age)    #0
print(a.family) #no family

위 클래스 변수는 변수와 값을 미리 세팅해둘 수 있다.

  • 위처럼 값을 세팅한 대로 불러낼 수 있으며 인스턴스 객체에도 똑같이 불러지는 것을 알 수 있다.
a.name = 'a'
a.age = 5
a.family = 'welci'

print(a.name)   #a
print(a.age)    #5
print(a.family) #welci

클래스 변수값을 수정하면 인스턴스 객체의 변수값을 수정한다.

  • 그러나 원래 class객체의 값은 변하지 않음.(메모리를 공유하는 것이 아닌, 새로운 값을 생성함)
  • 클래스 변수값 자체도 수정해 줄 수 있는데
Dog().age = 100
print(Dog.age) #0

Dog.age = 100
print(Dog.age) #100
  • 첫번째 예시는 Dog()로 인스턴스를 생성하고 age를 수정해줬으므로 바꾼 값은 사라진다.
  • 두번째 예시는 Dog자체의 값을 바꿔줬으므로 다음에 Dog()로 인스턴스를 생성했을 때 바뀐 값이 나온다.

3. 생성자

class Dog:
    name = "no name"
    age = 0
    family = "no family"

    def __init__(self):
        print(self, 'init호출')
        
c = Dog()   #<__main__.Dog object at 0x000001A87CF3E210> init호출

생성자는 위처럼 객체가 생성될 때 자동으로 실행되는 함수이다.

  • 이름도 __init__으로만 써야하는 특수메소드이다.
    def __init__(self):
        print(self, 'init호출')

클래스 내에 위와 같은 함수의 모양으로 생겼다.

  • self는 필수적으로 들어가는 값인데(self이름은 아무렇게나 써도 되지만, 관례적으로 통일)
  • 생성자 자체에서 어떤 객체가 자신을 불렀는지 모르므로, 어떤 객체가 자신을 불렀는지 표시해준다.
  • self를 이용하여 자기 자신의 객체를 보여줄 수 있다.(주소를 보냄)

3.5 인스턴스 변수

class Dog:
    def __init__(self):
        self.name = ''
        self.age = 0
        
rucy = Dog()
print(rucy)      # <__main__.Dog object at 0x000001A87D0DF620>
print(rucy.name) #
print(rucy.age)  # 0
print(Dog.age)
#---------------------------------------------------------------------------
# AttributeError                            Traceback (most recent call last)
# Cell In[40], line 1
# ----> 1 print(Dog.age)

# AttributeError: type object 'Dog' has no attribute 'age'

각 객체마다 별도로 저장되는 변수, 객체를 만들 때 마다 self키워드를 통해 생성자(__init__메서드)에서 정의됨.

  • 인스턴스 변수는 인스턴스 명으로만 접근 가능
  • 자신만의 데이터를 가질 수 있어 객체마다 다른 속성 값을 저장할 수 있게 된다.
class Dog:
    def __init__(self, name, age, family = "족보없음"):
        self.name = name
        self.age = age
        self.family = family
        
poppy = Dog('poppy', 3, 'pome')
print(poppy.name)
print(poppy.age)
print(poppy.family)
  • 위와 같이 매개변수를 입력하도록 하여 self.변수 = 매개변수를 사용하여
  • 아래 와 같이 생성자를 만들면 변수에 내용이 들어가는 것을 알 수 있다.
  • 또한, 기본 값을 위처럼 설정해줄 수 있다.

+) 클래스 변수 + 인스턴스 변수

class Dog:
    family= '포매'
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def print_info(self):
        print(f'종:{self.family}')
        print(f'이름:{self.name}')
        print(f'나이:{self.age}')
chan = Dog('차니', 15)
chan.print_info()

# 종:포매
# 이름:차니
# 나이:15

cogi = Dog('코기', 2)
cogi.print_info()
# 종:포매
# 이름:코기
# 나이:2

생성자에 넣어준 인스턴스 변수는 생성자로 생성할 때 마다 새로운 값이 들어간다.

Dog.family = '강아지'
chan = Dog('차니', 15)
chan.print_info()

# 종:강아지
# 이름:차니
# 나이:15

cogi = Dog('코기', 2)
cogi.print_info()
# 종:강아지
# 이름:코기
# 나이:2

위처럼 클래스 변수에 넣어준 값을 바꿀 경우 클래스 변수를 사용하고 있는 값은 모두 바뀐다.

그러나

cogi.family = '웰시코기'

Dog.family = '강아지'

cogi.print_info()
# 종:웰시코기
# 이름:코기
# 나이:2

위처럼 변수의 값을 직접 바꿔주면 이후 클래스 변수를 바꿔주더라도 변하지 않는다.

  • 주소값이 이전되었기 때문.

4. 메서드 타입

인스턴스 메서드: 객체의 상태를 조작하거나 객체에 특정 작업을 수행하는 메서드

  • self를 통해 인스턴스 객체의 값을 이용할 수 있다,

클래스 메서드: 클래스 레벨에서 동작하며 모든 인스턴스가 공유하는 메서드

  • @classmethod 데코레이터를 사용하여 정의한다.
  • cls를 통해 클래스 변수의 값을 이용할 수 있다.

정적 메서드: 특정 클래스나 인스턴스 메서드에 관련없는 메서드로 클래스와 관련없는 인스턴스에서도 호출될 수 있다.

  • @staticmethod데코레이터를 사용한다.,
  • 인스턴스변수, 클래스변수 모두 사용할 수 없다.

데코레이터를 통해 특별한 기능을 부여받는것이다.

class Calculator:          #인스턴스메서드
		num = 2
		
    def add(self, x, y):
        return x + y

    @classmethod           #클래스메서드
    def subtract(cls, x, y):
        return x - y + cls.num

    @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)  # 출력: 8

# 정적 메서드 호출
result3 = Calculator.multiply(6, 2)
print(result3)  # 출력: 12
  • 인스턴스 메서드는 Calculator 즉 클래스 명으로 메서드를 호출할 수 없다.
    • 인스턴스 값이 필요하기 때문
  • 반대로 클래스, 정적메소드는 둘다 가능하다.

'언어 > Python' 카테고리의 다른 글

0.모듈  (0) 2025.11.12
3. 파이썬 매직 메서드, 객체지향, 예외처리  (0) 2025.11.10
2. 파이썬에서의 상속  (0) 2025.11.05
17. 스레드  (0) 2025.09.04
16. 이터레이터, 제너레이터  (0) 2025.09.03