객체지향프로그래밍(1) - 객체란? 속성과 기능

    결론부터

    “객체 지향 프로그래밍”이란, 컴퓨터 프로그래밍의 패러다임 중 하나로 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위. 즉 여러 개의 독립된 객체들과 그 객체들 간의 상호작용으로 파악하는 프로그래밍 방법.
    → 과거 절차지향 프로그래밍이 주류였는데, 이를 보완하는 혹은 이와는 다른 프로그래밍 방법론으로 제시된 것이 객체 지향 프로그래밍이라고 이해했다.

    절차지향 프로그래밍?

    프로그램을 명령어의 연속으로 간주하고, 프로그램의 동작을 프로시저(함수 또는 메서드)에 의해 제어하는 방식.순서가 정해져 있어 실행이 빠르지만, 큰 큐모의 프로젝트에서 절차지향적인 방식은 코드의 유지보수성과 확장성을 제한 할 수 있다.

    1. 객체란?

    ‘속성과 행동으로 구성된 모든 것’. 즉, 데이터와 해당 데이터를 조작하는 동작(메서드)을 함께 묶은 개념이다.

     

    “이러한 객체를 이용하면, 특정한 현실 세계의 개체나 추상적인 개념을 모델링하여 프로그래밍에 사용할 수 있다” 참고로, 파이썬에서는 ‘클래스’(Class)라는 템플릿을 기반으로 객체를 만들고, 자바스크립트는 ‘프로토타입’을 기반으로 객체를 만든다.

     

     

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        
        def greet(self):
            print("안녕하세요, 저는 {}입니다.".format(self.name))
    
    # Person 클래스의 인스턴스(객체) 생성
    person1 = Person("Alice", 25)
    person2 = Person("Bob", 30)
    
    # 객체의 속성에 접근하여 값을 출력
    print(person1.name)  # 출력: Alice
    print(person2.age)   # 출력: 30
    
    # 객체의 메서드 호출
    person1.greet()  # 출력: 안녕하세요, 저는 Alice입니다.
    person2.greet()  # 출력: 안녕하세요, 저는 Bob입니다.

     

     

    위 코드에서 ‘Person’ 클래스는 사람을 나타내는 객체를 생성하기 위한 템플릿이라고 생각하면 된다. ‘name’과 ‘age’라는 속성(attribute)을 가지고 있으며, ‘__init__’이라는 메서드를 사용하여 객체를 초기화한다. ‘greet’ 메서드는 객체의 속성을 활용하여 인사말을 출력한다.

     

    이렇게 클래스를 정의한 이후, ‘Person’클래스를 기반으로 ‘person1’ 과 ‘person2’라는 두 개의 객체(인스턴스)를 생성한다. 객체의 속성은 점(.)을 통해 접근할 수 있으며, 객체의 메서드도 호출할 수 있다.

     

    비유하자면, ‘클래스’는 ‘붕어빵틀’, ‘객체’는 그걸로 만들어낸 개별적인 ‘하나하나의 붕어빵’이다. 붕어빵을 하나, 두 개만 만들려면 그냥 붕어빵을 만들면 되지만, 붕어빵을 만 개 만들려면 틀이 있는게 훨씬 효율적이라는 건 쉽게 알 수 있다.

    >> 신기한(?) 사실

    파이썬은 모든 것이 객체다. 즉, 파이썬에서 모든 값, 데이터 유형, 함수, 클래스, 모듈 등 모든 개념이 객체로 취급된다는 것이다. 예를 들어 우리가 사용하는 자료형 숫자, 문자열, 리스트 튜플 등의 데이터 유형은 모두 객체이다. 각 객체는 해당 데이터 유형의 특정한 속성과 메서드를 가지고 있다. 함수와 클래스도 파이썬에서 객체로 취급된다. 함수는 함수의 코드와 함수를 호출하기 위한 메서드를 가지고 있다. 클래스는 객체의 설계도로서 속성과 메서드를 정의하며, 클래스를 기반으로 한 객체는 해당 클래스의 속성과 메서드를 상속받는다.

    객체의 설계도(클래스)를 가지고 객체(인스턴스)를 생성한다 라고 생각하면 된다.

     

     

    2. 객체는 '속성 + 기능'

    “여기서 속성은 클래스 내에 정의된 변수들, 기능은 클래스 내에 정의된 메서드들 정도로 이해했다.

     

    "속성"

    특정 객체가 갖게 될 상태 혹은 데이터를 의미한다. 구체적으로 말하면, 클래스 변수와 인스턴스를 포함한다(가리킨다.)

     

    1. 클래스 변수

    • 클래스 자체에 속하는 변수
    • 해당 클래스로 생성된 모든 인스턴스들이 공유한다.
    • 한 인스턴스에서 값을 변경하면 다른 인스턴스들에도 영향을 준다.

     

     

    class Person:
        class_variable = 10
    
    person1 = Person()
    person2 = Person()
    
    # 위와 같이 Person 클래스를 정의.
    # 그리고 이 Person을 기반으로
    # 두 개의 인스턴스를 생성했다고 가정하자.
    
    print(person1.class_variable)  # 출력: 10
    print(person2.class_variable)  # 출력: 10
    
    Person.class_variable = 20
    
    print(person1.class_variable)  # 출력: 20
    print(person2.class_variable)  # 출력: 20

     

     

    2. 인스턴스 변수

    • 클래스의 인스턴스(객체)마다 별도로 가지는 변수.
    • 객체가 생성될때 초기화되며, 해당 객체의 속성으로 사용된다.
    • 객체마다 독립적으로 값을 유지하고 변경할 수 있다.

     

     

    class Person:
        def __init__(self, name):
            self.name = name
    
    person1 = Person("Alice")
    person2 = Person("Bob")
    
    print(person1.name)  # 출력: Alice
    print(person2.name)  # 출력: Bob
    
    person1.name = "Charlie"
    
    print(person1.name)  # 출력: Charlie
    print(person2.name)  # 출력: Bob

     

     

    클래스 변수와 인스턴스 변수는 각각 다른 용도와 동작을 가지고 있다. 클래스 변수는 클래스 전체에서 공유되는 값으로서 클래스의 상태를 나타내는데 사용할 수 있다. 반면에 인스턴스 변수는 객체의 특정한 속성 값을 저장하고, 해당 객체와 관련된 동작을 수행하는 데 사용된다.

     

    ‘__init__’이 뭐지..?

    객체가 생성될 때 호출되는 특수한 메서드. (특수한 동작을 위해 만들어진 메서드를 일컫는 매직메서드 중 하나로, 아래 메서드 파트에 언급될 예정이다.)
    객체의 초기 상태를 설정하는데 사용된다. 이 메서드 내에서 인스턴스 변수를 정의하고 초기값을 할당하는 것이 일반적이다.(꼭 그런 것은 아니다.)

    Q. 다른 메서드와 뭐가 다르지?
    일반적으로 클래스의 다른 메서드들은 인스턴스를 생성한 후에 점(’.’)을 사용하여 해당 인스턴스에 연결하여 호출해야 실행된다. 하지만 ‘__init__’메서드는 예외적으로 객체 생성 시 자동으로 호출되므로, 별도로 호출할 필요가 없다.

    Q. 꼭 init 메서드로 속성을 미리 정의해두지 않아도 되는건가?
    맞다. ‘__init__’메서드를 사용하지 않고도 인스턴스를 생성한 후에 속성값을 부여할 수도 있다. 모든 속성 값을 미리 정의해야 하는 것은 아니기 때문. 객체 생성 후에 속성값을 동적으로 추가하거나 변경할 수 있다.
    단, 그러한 방식은 init 메서드를 사용하는 것보다 초기화 단계를 명시적으로 처리하지 않는다는 점에서 주의해야 한다. ‘__init__’메서드를 사용하면 객체의 생성과 초기화를 한 번에 처리할 수 있으므로, 일관성과 코드의 가독성을 높일 수 있다.

     

     

    “기능”

    객체의 기능은 메서드로 정의 된다. 메서드는 클래스 안에 정의된 모든 함수이다. 클래스 내부에 정의된 함수들을 ‘메서드(method)’라고 부른다. 메서드의 종류에는 클래스 메서드, 인스턴스 메서드, 정적 메서드가 있다.

     

    1. 클래스 메서드(Class Method)

    • 클래스 전체에 대해 동일한 동작을 수행하는 메서드
    • 클래스 레벨에서 호출되며, ‘@classmethod’ 데코레이터를 통해 정의된다.
    • 첫번째 인자로 클래스 자체를 나타내는 ‘cls’를 받는다.

    2. 인스턴스 메서드(Instance Method)

    • 특정 인스턴스에 대해 동작하는 메서드
    • ‘@classmethod’ 데코레이터가 붙어있지 않으면 인스턴스 메서드라고 보면 된다.
    • 해당 클래스의 인스턴스에 대해 호출되며, 일반적으로 ‘self’라는 이름의 첫 번째 인자를 받는다. self는 ‘자기참조변수’로 이 self 인자를 통해 메서드가 호출된 인스턴스 자기자에 접근할 수 있다.

    3. 정적 메서드(Static Method)

    • 클래스의 일부로 존재하지만, 인스턴스와는 독립적으로 동작하는 메서드.
    • 클래스나 인스턴스의 상태에 의존하지 않는 독립적인 기능을 제공하기 위해 사용
    • ‘@staticmethod’데코레이터를 사용하여 정의되며, 첫 번째 인자로 특정 인스턴스나 클래스를 받지 않는다.
    • 클래스와 밀접한 연관성이 없는 기능을 제공할 때 활용한다.
    ‘__’이 기호와 같이 쓰이는 메서드들은 뭐지? : “매직메서드

    클래스를 정의하는 코드를 보다보면 ‘__init__’ 혹은 ‘__str__’처럼 더블 언더스코어와 함께 쓰이는 메서드들이 있다. 이러한 double underscore(’__’)로 둘러싸인 메서드는 특정한 이벤트나 동작이 발생했을 때 자동으로 호출되는 메서드로, 스페셜 메서드 혹은 매직 메서드라 불린다.

    매직메서드를 사용하여 객체의 동작을 커스터마이즈하고 특수한 기능을 추가할 수 있다.
    아래는 몇가지 대표적인 매직메서드들.

    1. __init__(self, ...): 객체가 생성될 때 자동으로 호출되는 생성자 메서드. 객체의 초기화를 담당.
    2. __str__(self): str() 함수를 사용할 때 호출되는 메서드로, 객체를 문자열로 표현하는 데 사용.
    3.__repr__(self): repr() 함수를 사용할 때 호출되는 메서드로, 객체를 공식적인 문자열 표현으로 반환하는 데 사용.
    4.__len__(self): len() 함수를 사용할 때 호출되는 메서드로, 객체의 길이를 반환하는 데 사용.
    5.__getitem__(self, key): 인덱스 연산자([])를 사용하여 요소에 접근할 때 호출되는 메서드. 객체에서 특정 요소를 가져올 수 있게 해준다.
    6.__setitem__(self, key, value): 인덱스 연산자([])를 사용하여 요소에 값을 할당할 때 호출되는 메서드. 객체에 특정 요소를 설정할 수 있게 해준다.
    7.__del__(self): 객체가 삭제될 때 자동으로 호출되는 소멸자 메서드. 객체가 제거되는 시점에 수행할 동작을 정의할 수 있다.

     

    'CS' 카테고리의 다른 글

    비동기 통신이란?  (0) 2023.05.31
    객체지향프로그래밍(2) - 객체 지향의 핵심 4가지  (0) 2023.05.30

    댓글