Skip to content

2.09. 내용정리: 9일차

흔한 찐따 edited this page Mar 15, 2022 · 11 revisions

객체지향 프로그래밍 (OOP; Object Oriented Programming)

객체지향이란, 하나의 프로그래밍 패러다임으로써 객체(object)를 중심으로 사고하면서 프로그래밍을 하는 것을 의미한다.

용어와 특징

  • 객체(Object): 속성(특성 및 특징)과 행동을 가지는 주체를 의미한다.
    • 객체의 속성(특성과 특징; attribute)은 객체가 가지는 데이터(변수)를 의미하며, 객체에 정의된 변수를 멤버 변수(member variable) 라고 한다.
      • 일반적으로 Python , C++ 에서는 멤버변수, JAVA 에서는 필드(field; 혹은 멤버 필드) 라고 표현한다.
      • 객체의 속성을 의미하는 어트리뷰트(attribute) 라는 표현도 자주 쓰인다.
    • 객체의 행동은 함수를 의미하며, 객체에 정의된 함수를 메서드(method) 라고 한다.
      • 일반적으로 C++ 에서는 멤버함수(member function), Python , JAVA 에서는 메서드 라고 한다.
  • 클래스(Class): 객체를 프로그래밍 언어로 구현한 것을 의미한다.
    • 클래스에 정의된 변수를 클래스 변수(class variable) 혹은 클래스 전역 변수라고 한다.
  • 인스턴스(Instance): 정의된 클래스를 선언하여 메모리에 생성된 객체를 의미한다.
    • 인스턴스화(Instantiate): 새로운 객체를 생성한다는 의미로써, 메모리에 새로운 객체를 생성시킨다는 것읠 의미한다.
    • 인스턴스 변수(instance variable): 인스턴스화를 통해 생성된 객체가 가지고 있는 멤버 변수를 의미하며, 인스턴스화를 통해서만 사용이 가능하다.
  • 생성자(Constructor): 객체가 생성될 때(인스턴스화) 호출되는 함수(메서드)이며, 주로 객체의 초기화 작업을 담당한다.

객체지향의 특징

  • 추상화(Abstraction): 어떤 종류의 대상들에 대해 그것이 가져야 할 핵심적인 특징들을 가지는 모델을 만드는 것이다.
    • 즉, 객체가 가진 수많은 특징과 행동들 중에서 프로그래밍에 필요한 핵심적인 요소들만을 모델로 구현하는 것을 의미한다.
  • 상속(Inheritance): 상위 객체(부모 객체라고도 함)로부터 하위 객체(자식 객체라고도 함)가 특성 및 특징과 행동을 물려받는 것을 의미한다.
  • 캡슐화(Encapsulation): 객체가 가진 특성 및 특징을 캡슐처럼 감싸 객체가 가진 데이터를 보호하는 것을 의미하며, C++JAVA 와 같은 객체지향 프로그래밍 언어에서는 아래와 같은 키워드로 접근 단계를 나눈다.
    • private: 객체 내부에서만 접근 가능한 데이터
    • protected: 다른 객체에서는 접근 불가능하지만, 상속을 받은 하위 객체는 접근 가능한 데이터
    • public: 객체 외부에서도 접근 가능한 데이터
  • 다형성(Polymorphism): 하나의 객체가 여러 가지 형태를 취해 상황에 따라 다른 방식으로 해석이 가능한 것을 의미한다.

객체 (Object)

파이썬 공식 문저의 용어집객체(object) 항목 에서는 다음과 같이 설명하고 있다.

상태 (어트리뷰트나 값) 를 갖고 동작 (메서드) 이 정의된 모든 데이터. 또한, 모든 뉴스타일 클래스 의 최종적인 베이스 클래스이다.

이를 요약하자면 다음과 같다.

  • 객체란, 속성과 행동을 갖는 주체이다.
  • 파이썬에서의 모든 타입(type)은 객체이다.
  • 파이썬에서 모든 타입의 상위(부모) 클래스는 object 클래스이다.

클래스 (Class)

파이썬 공식 문저의 용어집클래스(class) 항목 에서는 다음과 같이 설명하고 있다.

사용자 정의 객체들을 만들기 위한 주형이다. 클래스 정의는 보통 클래스의 인스턴스를 대상으로 연산하는 메서드 정의들을 포함한다.

이를 요약하자면 다음과 같다.

  • 클래스란, 객체의 구조와 행동을 프로그래밍 언어로 정의한 것이다.
  • 객체의 클래스는 초기화를 통해 제어한다.
  • 클래스를 작성하기 위해서는 class 키워드 사용하여 새로운 클래스를 작성한다.
  • 또한, 파이썬 명명 규칙 (PEP8) 에 의해 클래스명은 파스칼 표기법으로, 변수와 함수(메서드)는 스네이크 표기법으로 정의한다.

클래스 정의하기

  • 클래스를 정의할 때는 class 키워드를 사용한다.
  • PEP8에 의해 암묵적인 규칙으로 클래스 명칭은 파스칼 표기법으로 정의한다.
class MyClass:
    pass

생성자 (Constructor)

  • 생성자란, 객체가 생성될 때 호출되는 함수이다.
  • 주로 객체의 초기화 작업을 담당한다.
  • 파이썬에서 생성자는 def __init__(self, ...): 와 같이 정의한다.
class MyClass:
    def __init__(self):
        print('생성자 호출')

정의한 클래스 사용하기

정의한 클래스를 사용하기 위해서는 객체를 생성(인스턴스화) 한 후에 사용한다.

class MyClass:
    def __init__(self):
        print('생성자 호출')

my_class = MyClass()
print(type(my_class))

클래스 전역변수 정의

클래스 전역변수 란, 말 그대로 전역에서 사용한 변수로, 클래스 외부에서도 사용이 가능한 변수를 의미한다.

class MyClass:
    a = 10

클래스에 선언된 변수와 매서드는 접근 연산자 . 을 사용하여 데이터에 접근할 수 있다.

class MyClass:
    a = 10

a = MyClass.a
print(a)

클래스 멤버변수 정의

멤버변수 (혹은 인스턴스 변수) 란, 클래스 내부에서만 사용이 가능한 변수이며, 외부에서 접근하고자 하는 경우에는 클래스를 인스턴스 시킨 후 접근 연산자 . 를 통해 접근이 가능하다.

class MyClass:
    def __init__(self):
        # 생성자에 클래스 멤버변수 'a' 정의
        self.a = 10

마찬가지로, 인스턴스화를 한 후에 접근 연산자 . 을 사용하여 데이터에 접근할 수 있다.

class MyClass:
    def __init__(self):
        # 생성자에 클래스 매개변수 'a' 정의
        self.a = 10

# 객체생성 (인스턴스화)
my_class = MyClass()
a = my_class.a
print(a)

메서드 (Method)

  • 메서드(method) 란, 클래스에 정의된 함수를 의미한다.
  • 생성자 역시 메서드이다.
  • 접근 연산자 . 를 통해 메서드를 호출할 수 있다.
  • 메서드의 첫번째 매개변수는 항상 self 를 받는다.
    • 파이썬의 암묵적인 명명 규칙에 의해 self 라는 변수명으로 통일하여 사용한다.
    • 따라서 self 말고 다른 매개변수 명을 지어도 상관은 없다.

메서드 정의

class MyClass:
    def __init__(self):
        self.a = 10

    def my_method(self):
        self.a = 20

my_class = MyClass()
print(my_class.a)
# 메소드를 호출할때 역시 '.' 연산자를 통해서 호출한다.
my_class.my_method()
print(my_class.a)

메서드의 매개 변수 self 의 의미

  • self 는 새롭게 생성된 객체, 즉 인스턴스화된 객체를 의미한다.

여러 참고서에서는 클래스를 붕어빵을 만드는 틀, 객체는 붕어빵으로 비유해서 설명하였다.

# 새로운 클래스 'MyClass' 정의
class MyClass:
    # 클래스 변수 'a'
    a = 1

    def __init__(self):
        # 인스턴스 변수 'a'
        self.a = 10

# 클래스 변수 'a'를 의미한다.
print(MyClass.a)

# 새로운 객체 'my_class' 인스턴스화
my_class = MyClass()
# 새롭게 생성된 객체 'my_class'의 변수 'a'를 의미한다.
print(my_class.a)

# 새로운 객체 'my_class2' 인스턴스화
my_class2 = MyClass()
# 새롭게 생성된 객체 'my_class'의 변수 'a'의 값을 '20'으로 변경
my_class2.a = 20

# '10'이 출력된다.
print(my_class.a)
# '20'이 출력된다.
print(my_class2.a)

인스턴스 (Instance)

인스턴스란, 클래스로 만든 객체를 의미하며, 클래스를 객체로 만드는 것을 인스턴스화 라고 한다.

객체와 인스턴스의 차이

  • 예를 들어, a = Cookie() 이렇게 만든 a 는 객체이다.
  • 그리고 객체 aCookie 의 인스턴스이다.
  • 즉, 인스턴스라는 말은 특정 객체( a )가 어떤 클래스( Cookie )의 객체인지를 관계 위주로 설명할 때 사용한다.
  • 따라서 'a'는 인스턴스 보다는 'a'는 객체 라는 표현이 어울리며, 'a'는 'Cookie'의 객체 보다는 'a'는 'Cookie'의 인스턴스 라고 표현한다.

흔한 찐따

안녕하세요, 흔한 찐따 입니다.

Clone this wiki locally