-
Notifications
You must be signed in to change notification settings - Fork 1
2.09. 내용정리: 9일차
흔한 찐따 edited this page Mar 15, 2022
·
11 revisions
객체지향이란, 하나의 프로그래밍 패러다임으로써 객체(object)를 중심으로 사고하면서 프로그래밍을 하는 것을 의미한다.
-
객체(Object): 속성(특성 및 특징)과 행동(행위)을 가지는 주체를 의미한다.
- 객체의 속성(특성과 특징; attribute)은 객체가 가지는 데이터(변수)를 의미하며, 객체에 정의된 변수를 멤버 변수(member variable) 라고 한다.
- 일반적으로
Python,C++에서는 멤버 변수,JAVA에서는 필드(field; 혹은 멤버 필드) 라고 표현한다. - 객체의 속성을 의미하는 어트리뷰트(attribute) 라는 표현도 자주 쓰인다.
- 일반적으로
- 객체의 행동은 함수를 의미하며, 객체에 정의된 함수를 메서드(method) 라고 한다.
- 일반적으로
C++에서는 멤버함수(member function),Python,JAVA에서는 메서드 라고 한다.
- 일반적으로
- 객체의 속성(특성과 특징; attribute)은 객체가 가지는 데이터(변수)를 의미하며, 객체에 정의된 변수를 멤버 변수(member variable) 라고 한다.
-
클래스(Class): 객체를 프로그래밍 언어로 구현한 것을 의미한다.
- 클래스에 정의된 변수를 클래스 변수(class variable) 혹은 클래스 전역 변수라고 한다.
-
인스턴스(Instance): 정의된 클래스를 선언하여 메모리에 생성된 객체를 의미한다.
- 인스턴스화(Instantiate): 새로운 객체를 생성한다는 의미로써, 메모리에 새로운 객체를 생성시킨다는 것읠 의미한다.
- 인스턴스 변수(instance variable): 인스턴스화를 통해 생성된 객체가 가지고 있는 멤버 변수를 의미하며, 인스턴스화를 통해서만 사용이 가능하다.
- 생성자(Constructor): 객체가 생성될 때(인스턴스화) 호출되는 함수(메서드)이며, 주로 객체의 초기화 작업을 담당한다.
-
추상화(Abstraction): 어떤 종류의 대상들에 대해 그것이 가져야 할 핵심적인 특징들을 가지는 모델을 만드는 것이다.
- 즉, 객체가 가진 수많은 특징과 행동들 중에서 프로그래밍에 필요한 핵심적인 요소들만을 모델로 구현하는 것을 의미한다.
-
상속(Inheritance): 상위 객체(부모 객체라고도 함)로부터 하위 객체(자식 객체라고도 함)가 특성 및 특징과 행동을 물려받는 것을 의미한다.
- 오버라이딩(Overriding): 상위 객체가 가지고 있는 메서드를 하위 객체에서 재정의하여 사용하는 것을 의미한다.
-
캡슐화(Encapsulation): 객체가 가진 특성 및 특징을 캡슐처럼 감싸 객체가 가진 데이터를 보호하는 것을 의미하며,
C++과JAVA와 같은 객체지향 프로그래밍 언어에서는 아래와 같은 키워드로 접근 단계를 나눈다.- private: 객체 내부에서만 접근 가능한 데이터
- protected: 다른 객체에서는 접근 불가능하지만, 상속을 받은 하위 객체는 접근 가능한 데이터
- public: 객체 외부에서도 접근 가능한 데이터
-
다형성(Polymorphism): 하나의 객체가 여러 가지 형태를 취해 상황에 따라 다른 방식으로 해석이 가능한 것을 의미한다.
-
오버로딩(Overloading): 같은 이름의 여러 메서드가 다른 매개 변수를 갖도록 하는 것을 의미한다.
- 다른 객체지향 프로그래밍 언어에서는 지원하는 기술이지만, 파이썬에서는 메서드 오버로딩은 불가능하다고 한다.
- 단, 파이썬에서는 연산자 오버로딩(Operator Overloading; 인스턴스 객체끼리 서로 연산을 할 수 있게끔 기존에 있는 연산자의 기능을 바꾸어 중복으로 정의하는 것)은 가능하다고 한다.
-
오버로딩(Overloading): 같은 이름의 여러 메서드가 다른 매개 변수를 갖도록 하는 것을 의미한다.
파이썬 공식 문서의 용어집의 객체(object) 항목 에서는 다음과 같이 설명하고 있다.
상태 (어트리뷰트나 값) 를 갖고 동작 (메서드) 이 정의된 모든 데이터. 또한, 모든 뉴스타일 클래스 의 최종적인 베이스 클래스이다.
이를 요약하자면 다음과 같다.
- 객체란, 속성과 행위를 갖는 주체이다.
- 파이썬에서의 모든 타입(type)은 객체이다.
- 파이썬에서 모든 타입의 상위(부모) 클래스는
object클래스이다.
파이썬 공식 문서의 용어집의 클래스(class) 항목 에서는 다음과 같이 설명하고 있다.
사용자 정의 객체들을 만들기 위한 주형이다. 클래스 정의는 보통 클래스의 인스턴스를 대상으로 연산하는 메서드 정의들을 포함한다.
이를 요약하자면 다음과 같다.
- 클래스란, 객체의 구조(속성과 행위)을 프로그래밍 언어로 정의한 것이다.
- 객체의 클래스는 초기화를 통해 제어한다.
- 클래스를 작성하기 위해서는
class키워드 사용하여 새로운 클래스를 작성한다. - 또한, 파이썬 명명 규칙 (PEP8) 에 의해 클래스명은 파스칼 표기법으로, 변수와 함수(메서드)는 스네이크 표기법으로 정의한다.
- 클래스를 정의할 때는
class키워드를 사용한다. - PEP8에 의해 암묵적인 규칙으로 클래스 명칭은 파스칼 표기법으로 정의한다.
class MyClass:
pass- 생성자란, 객체가 생성될 때 호출되는 함수이다.
- 주로 객체의 초기화 작업을 담당한다.
- 파이썬에서 생성자는
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) 란, 클래스에 정의된 함수를 의미한다.
- 생성자 역시 메서드이다.
- 접근 연산자
.를 통해 메서드를 호출할 수 있다. - 메서드의 첫번째 매개변수는 항상
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는 새롭게 생성된 객체, 즉 인스턴스화된 객체를 의미한다.
여러 참고서에서는 클래스를 붕어빵을 만드는 틀, 객체는 붕어빵으로 비유해서 설명하였다.
# 새로운 클래스 '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)인스턴스란, 클래스로 만든 객체를 의미하며, 클래스를 객체로 만드는 것을 인스턴스화 라고 한다.
- 예를 들어,
a = Cookie()이렇게 만든a는 객체이다. - 그리고 객체
a는Cookie의 인스턴스이다. - 즉, 인스턴스라는 말은 특정 객체(
a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다. - 따라서
'a'는 인스턴스보다는'a'는 객체라는 표현이 어울리며,'a'는 'Cookie'의 객체보다는'a'는 'Cookie'의 인스턴스라고 표현한다.