객체(컴퓨터 과학)
클래스에서 정의한 것을 토대로 메모리에 할당된 것이다.
변수, 자료 구조, 함수, 메소드가 될 수 있다.
객체지향프로그래밍
컴퓨터 프로그래밍의 패러다임 중 하나이다. 명령어의 목록으로 보는 시각에서 벗어나
객체들의 모임으로 파악하고자 하는 것이다.
각각의 객체는 메세지를 주고받고, 데이터를 처리 할 수 있다.
파이썬은 모두 객체로 이루어져있다.
메서드는 그 중 하나의 요소이다.
메서드는 어떤 타입이 있고 대상이 정보를 가지고 있고, 동작할 수 있도록 한다.
[3, 2, 1].sort()
# 리스트.정렬()
# 리스트를 정렬하도록 한다. (행)
객체는 특정 타입(클래스)의 인스턴스(사례, 예시)이다.
(타입 == 종류, 값 == 실제 사례)
다시 말해, 내가 만든 문자열은 하나의 타입(종류), 클래스(str)인 것이다.
객체의 특징
- 타입: 어떤 연산자와 조작(method)이 가능한가?
- 1 + 3 == 4, [1, 2] + [3, 4] == [1, 2, 3, 4]
- 1과 3을 더하면 4이지만, 리스트 형태로 더하면 데이터가 추가된다.
- 즉, 연산자가 다르다.
- 'a'.upper()와 [1, 2, 3].append(3)은 메서드가 다른 것이다.
- 동작하는 행위가 다르다.
- 속성(attribute): 어떤 상태(데이터)를 가지는가?
- 조작법(method): 어떤 행위(함수)를 할 수 있는가?
객체를 바탕으로 프로그래밍을 한다는 것은 객체들의 상호작용로 코드를 구성하는 것이다.
객체지향 프로그래밍이란?
객체지향프로그래밍 이전에 절차지향 프로그래밍이 있다.
절차지향 프로그래밍은 함수를 통해 결과를 저장하며 출력하는 것이다.
객체지향은 메서드를 통해 객체 자체로 조작이 가능하다.
예시
class Person:
def __init__(self, name, gender): #__init__:생성자
self.name = name
self.gender = gender
def greeting_message(self):
return f'안녕하세요, {self.name}입니다.'
jimin = Person('지민', '남')
print(jimin.greeting_message())
# 안녕하세요, 지민입니다.
jieun = Preson('지은','여')
print(jieun.greeting_message())
# 안녕하세요, 지은입니다.
클래스 == Person, str, list...
인스턴스 == IU, '123'...
인스턴스는 값이다.
각 인스턴스의 속성들을 메소드를 통해서 활용한다.
메서드는 클래스 내부에 정의된 함수이다.
다시 말해,
jieun.name == 속성(변수)
jieun.greeting() == 메서드(함수)
(소괄호()는 작동 버튼, name은 저장된 값을 출력하는 것이므로)
OPP 기초
기본 문법
# 클래스 정의
class MyClass:
pass
# 인스턴스 생성
my_instance = MyClass()
# 메서드 호출
my_instance.my_method()
# 속성
My_instace.my_attribute
Camel Case: 클래스 사용시
snake_case: 변수/ 상수 사용시
이를 통해 클래스, 함수, 변수를 쉽게 구별할 수 있다.
- 클래스: 객체들의 분류(class)
- 클래스의 타입은 type이다.
- 인스턴스: 하나하나의 실체
- 인스턴스의 타입은 클래스이다.
- 속성: 특정 데이터 타입/클래스의 객체들이 가지게 될 상태/데이터를 의미(변수)
- 메서드: 특정 데이터 타입/클래스의 객체에 공통적으로 적용 가능한 행위
- 클래스 내부에 정의된 함수
객체 비교하기
- ==
- 동등한(equal)
- 변수가 참조하는 객체가 동등한(내용이 같은) 경우 True
- 두 객체가 같아 보이지만 동등한 대상이 아닐 수 있음
- is
- 동일한(identical)
- 두 변수가 동일한 객체를 가르키는 경우 True
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b, a is b)
>>> True False # 값은 같지만 주소는 다르다.
a = [1, 2, 3]
b = a # 주소가 같아졌다.
print(a == b, a is b)
>>> True True
a = [1, 2, 3]
b = a
b[0] = 'hi'
print(a)
print(b)
>>> ['hi', 2, 3]
>>> ['hi', 2, 3]
# 번수의 주소값이 같아졌기 때문에 같은 값을 출력하는 것이다.
c = [3, 4, 5]
d = list(c)
d[0] = 'hi'
print(c)
print(d)
>>> [3, 4, 5]
>>> ['hi'. 4, 5]
# 리스트로 저장해서 c의 원래의 데이터 값을 출력할 수 있게된다.
인스턴스
인스턴스 변수
- 인스턴스가 개인적으로 가지고 있는 속성
- 고유한 변수
- self. 으로 정의한다.
- 생성 후 .으로 접근 및 할당한다.
class Person:
def __init__(self, name):
self.name = name # 인스턴스 변수 정의
John = Person('John')
print(John.name) # 인스턴스 변수 접근 및 할당
#John
John.name = 'John Kim' # 인스턴스 변수 접근 및 할당
print(John.name)
#John Kim
인스턴스 메서드
- 인스턴스 조작을 위한 메서드이다.
- 호출 시, 첫번째 인자로 인스턴스 자기자신(self)을 전달한다.
- self란, 인스턴스 자기 자신이다.
- 인스턴스 메소드는 호출 시 첫번째 인자로 자신이 전달되게 설계했다.
- 매개변수 이름으로 self를 첫번째 인자로 정의한다.
생성자 메서드
인스턴스 객체가 생성될 때 자동으로 호출되는 메서드이다.
class Person:
#생성
def __init__(self):
print('응애')
# Person 클래스의 인스턴스인 iu를 생성한다.
iu = Person()
jimin = Person()
>>> 응애
>>> 응애
생성자는 인스턴스를 만들때마다 행위를 할 수 있도록 구성되어 있다.
인스턴스가 생성될 때 어떠한 작업을 하게 한다.
사용자에게 정보를 받아 변수나 값 세팅을 해주는 것에 사용된다.
class Person:
def __init__(self, name):
self.name = name # 인스턴스 변수 정의
John = Person('John')
print(John.name) # 인스턴스 변수 접근 및 할당
#John
John.name = 'John Kim' # 인스턴스 변수 접근 및 할당
print(John.name)
#John Kim
즉, def greeting(self, ...) 이 있을 때,
첫 번째 인자(self)는 항!상! 인스턴스를 쓸 수 있도록 넘겨준다.
그래서 인스턴스의 이름을 활용할 수 있고, 인스턴스 변수를 정의할 수 있는 것이다.
def ~ self.name 은 함수를 정의한 것이고,
John.name, iu.greeting()(위 예시)는 함수를 호출한 것이다.
'Python' 카테고리의 다른 글
Python 이론 복습 (indexing, container, list, map, method) (0) | 2022.07.31 |
---|---|
객체지향 프로그래밍 2 (0) | 2022.07.20 |
실습 실수 및 에러 모음.zip (0) | 2022.07.17 |
프로젝트 문제 정리 (04-06) (0) | 2022.07.16 |
프로젝트 정리 - JSON, 모듈, 파일 읽고 쓰기 (00-03) (1) | 2022.07.15 |