본문 바로가기
TIL & WIL

[TIL] 크래프톤 정글 1주차 파이썬의 특징과 객체 지향 언어의 특징에 관하여

by 적용1 2024. 3. 26.
728x90

크래프톤 정글의 알고리즘 커리큘럼에서는 파이썬을 사용하도록 한다.

 

평소에 알고리즘 문제를 풀 땐 C++만 사용했기 때문에 새롭게 파이썬에 적응할 필요가 있었고, 그 과정에서 파이썬의 특징에 관하여 공부했고 객체 지향 언어의 특징에 관해서 공부했다.

 

객체 참조와 가변성 / 불변성

#################잘못된 내용이 있어서 이후 수정하겠습니다###########################

먼저 파이썬은 C나 C++과는 다르게 객체 참조라는 특징을 가진다.

간단하게 말하면, C나 C++은 새롭게 변수를 선언하면 비어있던 메모리에 그 변수를 저장하지만, 파이썬은 이미 메모리에 만들어져있는 변수들을 참조한다는 것이다.

그래서 a=2를 하면 이미 int형 2로 만들어져 있는 객체를 참조하는 것이고 여기서 a += 1을 하면 a의 값을 바꾸거나 앞서 말한 int형 2 객체를 바꾸는 것이 아닌, 이미 만들어져 있는 int형 3을 참조하도록 바꾸는 것이다.

 

여기까지 이해했다면 다음 과정으로 넘어가야 한다.

여기서 가변성(mutable), 불변성(immutable)이라는 개념이 나오게 된다. 가변성, 불변성이란 단어의 뜻에서도 알 수 있듯이 바뀔 수 있는 속성과 바뀔 수 없다는 속성이다.

int형과 string형 같은 객체들은 불변성을 가지고 있고, list나 튜플(tuple) 같은 객체들은 가변성을 가지고 있다(이거에 대해선 밑에서 설명할 것이다).

 

가변성에 대해서는 객체 참조를 설명할 때의 예시로 설명할 수 있다. a가 int형 2라는 객체를 참조하고 있다가 +1 을 해주면 int형 3인 객체를 참조하도록 '바꾸게' 했었다. 이처럼 참조할 수 있는 객체를 바꾸게 할 수 있다는 것이 가변성이다.

 

리스트나 튜플 같은 경우에는 이미 생성되어있는 리스트 객체나 튜플 객체를 참조하는 것이 아닌, 새롭게 객체를 만든다고 생각하면 된다. 따라서, 아무리 리스트나 튜플을 바꾸려해도 그 주소값은 바뀌지 않는다고 생각하면 된다. 그래서 불변성이다.

 

리스트나 튜플의 요소는 가변성을 가지고 있다는 뜻이다.

예를 들어 list = [a, b, c] 를 선언했다고 하자.

list라는 객체 자체의 주소를 바꿀 수는 없지만 리스트 내의 요소 a, b, c가 참조하는 객체를 바꿀 수는 있다.

그래서 파이썬의 list는 C 종류와 다르게 list 내에 타입이 다른 객체들도 넣을 수 있는 것이다.

#################잘못된 내용이 있어서 이후 수정하겠습니다###########################

 

객체 지향 언어의 특징

파이썬은 대표적인 객체 지향 언어이다.

파이썬의 객체 참조라는 특징을 공부하다보니 자연스럽게 객체 지향 언어의 특징을 공부하게 되었다.

 

객체 지향 언어의 특징은 4가지가 있다.

1. 캡슐화

데이터와 알고리즘을 하나로 묶어 하나의 캡슐처럼 만드는 것, 이 때문에 외부에서 데이터와 코드의 형태를 알 수 없다.

ex) 파이썬에서 라이브러리를 임포트하여 함수를 쓸 수 있어도, 라이브러리 안의 데이터나 코드가 어떻게 되어있는지, 함수의 소스코드가 어떤지 확인할 수 없는 것이 캡슐화라고 이해하면 될 것 같다.

이 특징 때문에 캡슐화되지 않은 데이터와 코드는 사용하기 힘들다.

2. 상속

상위 클래스의 모든 것을 하위 클래스가 이어받는 특징

ex) 이전 0주차에 배운 SSR에서 Jinja2 템플릿을 사용할 때, html 파일 내에서 헤드에 스타일을 사용하게 되는데 그 스타일이 겹치는 페이지에서는 extend를 통해 따로 스타일 코드를 적지 않아도 같은 스타일을 사용할 수 있게 되었다.

extend의 역할이 상속과 비슷하다고 이해하면 될 것 같다.

3. 추상화

실존하는 객체의 여러 특성 중, 프로그램을 만드는 데 필요한(공통적인) 부분만 파악해서 추출하고 필요하지 않은 것은 제거하는 것

ex) 만약 상위 클래스에서 선언하지 않은 함수가 하위 클래스에서 모두 필요하다면, 굳이 하위 클래스에서 일일이 함수를 선언하지 않고, 상위 클래스에서 함수를 선언하여 하위 클래스에서 필요에 맞게 기능을 다르게 구현하는 것

4. 다형성(얘가 개인적으로 제일 어려웠음)

상속과 연관된 개념으로, 하나의 객체가 다른 여러 객체로 재구성되는 것

ex) 함수를 상속받았을 때, 부모 클래스에서의 함수는 그대로 놔두고 자식 클래스에서 입맛대로 바꿔서 사용한 특성이라고 이해했다.

└> 나중에 부모가 자식 클래스에서 커스템된 함수를 보고 끌어오는 기능도 있다고 한다.

 

마지막으로 이 글을 작성하는 바탕이 된 수기로 작성한 파일을 올려놓겠다.

728x90