오늘은 클래스와 인스턴스에 대해 공부해보았다.
지난시간에는 이진탐색트리의 개념과 코드에 대해 포스팅했는데,
이 때 몇가지 궁금한 사항들이 있어, 해결하는 과정에서 클래스와 인스턴스에 대해 다시금 공부해보았다.
< 지난 포스팅 >
https://jayindustry.tistory.com/47
[코딩테스트] 이진탐색트리와 코드, 트리 개념
오늘은 이진탐색트리와 트리의 개념을 살펴보고, 이진탐색트리의 코드를 자세히 뜯어보도록 하겠다. 이전 포스팅 중에서 트리알고리즘과 이진탐색에 대해 다룬 포스트들이 있다. < Tree 알고리
jayindustry.tistory.com
이진탐색트리에서 작성한 코드를 다시 가져와 공부해보겠다.


이진 탐색 트리(binary search tree, BST)는 각각의 노드에 키 값이 저장되어 있다.
저장된 키 값을 기준으로, 왼쪽 서브트리에는 해당 노드의 키 값보다 작은 키 값들을,
오른쪽 서브트리에는 해당 노드의 키 값보다 큰 키 값들을 가진 노드들로 이루어져 있다.
해당 코드를 실행할 때,

이렇게 head를 Node(1)의 변수로 저장해주면 head는 Node의 모든 메서드를 사용할 수 있다.
그리고 그 head를 binarysearchtree클래스의 인자로 넣어줬기 때문에,
self.current_node_pointer = self.head
-> self.current_node_pointer는 여기서 Node클래쓰를 참조하는 객체자체가 된다.
1. 위 코드에서 value < self.current_node_pointer.value:에서 왜 .value를 붙이는걸까?
while True:
if value < self.current_node_pointer.value:
# self.current_node_pointer.value: self.current_node_pointer가 참조하는
# 노드의 value 속성값을 나타냅니다. 여기서 value는 Node 클래스의 인스턴스 변수로,
# 노드에 저장된 주요 값을 의미
# self.current_node_pointer는 Node클래쓰의 객체자체를 의미
위의 코드에서, self.current_node_pointer는 현재 탐색 중인 노드를 가리키는 포인터이다.
즉, Node 클래스의 인스턴스(객체) 자체를 가리킵니다. 이 포인터를 통해 노드의 속성이나 메서드에 접근할 수 있다.
self.current_node_pointer.value는 현재 탐색 중인 노드의 키 값을 의미한다.
value는 삽입하거나 탐색하려는 값을 의미한다.
value < self.current_node_pointer.value: 구문에서 .value를 사용하는 이유는 다음과 같다.
이 구문은 "삽입하거나 탐색하려는 값이 현재 노드의 키 값보다 작은가?"를 판별하는 조건문이다.
이러한 판별을 위해서는 현재 노드의 키 값을 알아야 하므로, .value를 사용해서 해당 노드의 키 값을 가져와서 비교한다.
(.value메서드를 사용할 수 있는 이유는 위에서 설명하였으므로 생략한다.)
그리고 self.current_node_pointer는 Node 객체를 참조하는 포인터입니다. value(숫자)와는 서로 다른 유형의 데이터이므로 직접적으로 비교할 수 없다. 따라서 우리는 노드 내부의 value 속성값과 비교하기 위해 노드 내부값인 self.current_node_pointer.value를 사용해야 한다.
2. 그렇다면 노드의 키 값이란?
노드의 키 값(key value)은 이진 탐색 트리와 같은 자료 구조에서 각 노드에 저장된 주요 값을 의미한다.
이 값은 트리의 정렬이나 탐색 연산에 사용된다.
예를 들어, 위에서 주어진 코드에서 Node 클래스는 키 값으로 value를 가지며, self.value로 저장된다.
이 키 값은 트리에 노드를 삽입하거나 탐색할 때 기준으로 사용된다.
즉, "노드의 키 값"은 그 노드에 저장된 주요 데이터나 정보를 의미하며, 이 값을 기준으로 트리의 구조와 연산이 정의된다.
3. 그럼 위 코드에서 self.current_node_pointer는 왜 항상 self.를 붙여줘야할까?
그냥 current_node_pointer로 사용하면안되나?
self는 파이썬의 인스턴스 메서드에서 사용되는 첫 번째 인자로, 현재 객체의 인스턴스를 참조한다.
인스턴스 변수를 정의하거나 참조할 때 self를 사용하여 해당 인스턴스에 속하는 변수임을 명시해야 합니다.
만약 self.current_node_pointer 대신 current_node_pointer만 사용한다면,
그것은 그 메서드의 지역 변수로 간주되며, 메서드가 종료될 때 사라진다.
이 경우 다른 메서드에서 그 값을 참조하거나 변경할 수 없다.
즉, 메서드 간의 데이터 공유가 어려워집니다.
만약 insert 메서드와 search 메서드 모두에서 current_node_pointer를 사용하고 싶은데,
각 메서드에서의 current_node_pointer는 서로 다른 지역 변수로 동작하게 되어,
한 메서드에서 설정한 이 변수값은 다른 메서드에서 참조할 수 없다.
클래스의 인스턴스 변수와 메서드의 지역 변수를 구분하지 않으면, 예상치 않은 오류발생 확률이 높다.
따라서, self.를 붙여서 사용함으로써 해당 변수가 인스턴스에 속한 변수임을 명시적으로 나타내는 것이 중요하며,
이를 통해 여러 메서드 간에 변수를 공유하고 관리하는 것이 가능하다.
4. 인스턴스(객체)의 개념을 상세히 알아보자.
객체(object)
사람, 자동차, 강아지처럼 실제로 존재하는 사물을 말한다.
이것은 자기 자신의 속성을 가지고 있으며 다른것과 식별이 가능해야한다.
쉽게 말해, 우리 주변에서 볼 수 있는 모든 것들을 프로그래밍으로 표현한 것이다.
데이터와 해당 데이터에 관련된 함수(methods)를 포함하는 하나의 단위라고도 표현할 수 있다.
예를들어, 자동차, 휴대폰,사람 등이 될 수 있다.
휴대폰의 속성은 색깔, 브랜드 등이 되고, 메서드(행동)는 전화받기, 문자하기 등이 될 수 있다.
이러한 속성은 __init__메서드에서 속성들의 초기상태를 설정할 수 있고,
행동(메서드)는 각 함수로 표현할 수 있다.
인스턴스(instance)
클래스는 객체를 만들기 위한 설계도나 틀과 같다.
클래스를 통해 생성된 실제 객체를 그 클래스의 '인스턴스(instance)'라고 부른다.
예를 들어, '자동차'라는 클래스가 있다면, '현대 소나타', '기아 스팅어' 등은 그 클래스의 인스턴스들이 될 수 있다.
속성(attributes)
객체의 상태나 특성을 나타내는 변수.
예를 들어, 자동차 객체는 색상, 브랜드, 배기량 등의 속성을 가질 수 있다.
메서드(methods)
객체가 수행할 수 있는 행동이나 기능을 나타내는 함수.
예를 들면, 자동차 객체는 주행, 정지, 가속 등의 메서드를 가질 수 있다.
생성자(constructor)
__init__()
객체가 생성될 때 자동으로 호출되는 특별한 메서드.
객체의 초기 상태를 설정하는 데 주로 사용된다.
[ 예시 ]
사용 시, 클래스 이름 뒤에 괄호를 붙여 객체(인스턴스)를 생성한다.
생성된 객체를 통해 그 객체의 속성이나 메서드에 접근할 수 있습니다.
class Car:
def __init__(self, color, brand):
self.color = color
self.brand = brand
def drive(self):
print(f"{self.brand} 주행 중!")
sonata = Car("파란색", "현대 소나타") : sonata라는 인스턴스 객체를 생성하여 Car클래스의 속성, 메서드에 접근가능
print(sonata.color) : 파란색 출력
sonata.drive() : 현대 소나타 주행 중! 출력
위 예제에서 Car는 클래스,
sonata는 Car 클래스의 인스턴스(객체),
color와 brand는 객체의 속성,
drive는 메서드이다.
'Python&Dev > Python' 카테고리의 다른 글
| [코딩] 백준 코딩테스트 - 1000, 1330 (0) | 2024.01.27 |
|---|---|
| Flask 프레임워크에 대해 (0) | 2023.12.06 |
| Mapping(함수 매핑)_Part 2 (0) | 2023.09.01 |
| Mapping(함수 매핑)_Part 1 (0) | 2023.08.31 |
| 컴프리헨션과 슬라이싱(Comprehension, slicing) (0) | 2023.08.25 |