Python:Class&Object

aiden·2023년 6월 12일
0

Python

목록 보기
10/14
post-thumbnail

OOP

드디어 객체 지향 프로그래밍으로 넘어왔다.
객체 지향 프로그래밍(Object Oriented Programming)이란 모든 사물을 객체로 보고 특정 기능, 동작들을 개체 간의 상호작용으로 생각하는 것이다.

Object

객체는 상태(state), 동작으로 이루어진다. 객체의 상태는 객체의 속성, 동작은 객체가 가지는 기능, 작동이며 다음의 TV 객체 예시와 같이 생각할 수 있다.

객체의 상태를 필드 혹은 인스턴스 변수(instance variable)로 나타내며 객체의 동작은 메서드(mathod)로 나타낸다.

Class

클래스는 객체를 찍어내기 위한 틀이다. 클래스로부터 생성된 각 개체를 인스턴스라 한다. 클래스를 한 번 작성하면 하나의 틀을 가지고 원하는만큼 인스턴스를 생성할 수 있다.

Object in Python

파이썬에서는 모든 것이 객체로 이루어져 있다. 정수, 실수, 문자열, 리스트 등 type() 함수를 통해 자료형을 확인하면 <class 'int'>와 같은 자료형을 가지고 있다는 것을 알 수 있다. 또한, 우리는 insert(), remove()와 같이 객체에 포함된 메서드를 사용할 수 있다.
클래스에 의해 제공되는 메서드를 클래스의 공용 인터페이스라 하며, 사용자는 공용 인터페이스를 사용하여 작업을 하지만 내부의 구조는 몰라도 된다. 이와 같이 내부의 사항을 숨기는 것을 캡슐화(encapsulation)이라 한다.

Class 작성

클래스 정의문의 구조는 다음과 같다.

클래스 내에 클래스의 멤버인 인스턴스 변수와 메서드를 정의한다. 인스턴스 변수는 메서드 안에서 self.를 붙여 생성한다.

모든 메서드의 첫 번째 매개변수는 자기 자신을 가리키는 self 변수이다. self는 현재의 객체를 의미한다.

클래스의 이름은 보통 첫글자를 대문자로 한다.

객체 생성 시 obj = ClassName()과 같이 생성한다. 객체가 생성되고 객체의 참조값이 변수에 저장된다.

Constructor

생성자는 클래스로부터 객체를 생성할 때 인스턴스 변수를 초기화하기 위한 메서드이다. 생성자는 다음과 같은 구조를 가진다.

생성자는 클래스 당 하나만 가질 수 있으며 생성자 또한 함수이므로 매개변수를 가질 수 있다. 매개변수의 기본값을 설정하는 것 또한 가능하다.

Method 정의

메서드는 클래스 내의 함수이다. 메서드의 첫 번째 매개변수는 현재의 객체를 가리키는 self로 고정되어 있다.

TV를 추상화하여 간단한 속성과 동작들만을 가지고 Television 클래스를 정의하는 예시를 보자.

생성자에서 필드들을 정의하고 초기화한다.
다음과 같이 인스턴스 객체를 생성하고 메서드를 호출할 수 있다.

메서드의 첫 번째 매개변수로 고정된 self는 객체 자신을 참조하는 변수이다.

Information Hiding

정보 은닉이란 객체 지향의 기본이 되는 개념으로, 외부에서 클래스의 데이터를 함부로 접근하거나 변경하지 못하도록 하는 것이다. 필드나 메서드의 접근 범위를 private으로 설정하면 클래스 내부에서만 접근할 수 있고, 외부에서는 접근할 수 없다. private으로 바꾸려면 필드나 메서드 이름 앞에 __를 붙이면 된다.

모든 인스턴스 변수를 private으로 선언하고 각각 getter와 setter를 두는 것이 좋다.

Getter&Setter

접근 범위가 private으로 제한된 필드와 메서드는 클래스 내부에서만 접근할 수 있으며, 클래스 외부에서는 불가하다.
따라서 다른 메서드를 통해 접근해야 한다.
이 때, private 필드를 위해 설정자와 접근자 메서드를 만들어 이 메서드를 통해 값을 변경하거나 읽으면 된다.

객체로 함수 전달

함수 호출 시 숫자, 문자열과 같은 변경 불가능한 객체가 전달되면 변경되지 않았었다. 하지만 사용자가 정의한 객체 전달 시 참조값이 전달되어 원복 객체가 변경되므로 주의해야한다.

클래스 변수

클래스 변수는 해당 클래스로부터 생성되는 객체들이 공유하는, 클래스 당 하나만 생성되는 공통 변수이다. 인스턴스 변수(필드)와 같은 경우 클래스로부터 인스턴스가 생성될 때마다 각 인스턴스에 별도로 생성되는 변수이다.
하지만 클래스 변수의 경우 클래스를 정의한 시점에 생성되어 각 인스턴스들이 하나의 변수를 공유하게 된다.
클래스 변수를 정의하려면 다음과 같이 메서드 외부에 정의하면 된다.

특수 메서드

객체에 대하여 연산자와 관련된 특수 메소드가 존재한다.

예를 들어 다음과 같이 정의한 경우,

아래와 같이 두 객체를 연산자를 통해 비교할 수 있다.

현재 객체는 self, 다른 객체는 other로 나타낸다.

연산자 뿐만 아니라 len과 같은 내장함수들도 특수 메서드로 정의할 수 있다.

class Book:
	def __init__(self, pages):
		self.pages = pages
	def __len__(self):
		return self.pages
    
book = Book(100) 
print(len(book))
profile
파인애플 좋아하세요?

0개의 댓글