[Python] python 언어의 개념 및 특징

한호성·2024년 1월 6일
0

Introduction

Python 과 Selenium을 활용해서 chorme web client를 조작해서, 매크로 프로그램을 완성하고 판매하였습니다 🙂.

개발을 Python 이란 언어를 통해 진행하였는데, 파이썬이라는 언어에 대해 구체적인 지식 없이, 코딩을 진행하였어서.. Python 언어의 특징 및 개념에 대해 알아보고자 합니다.


Index

  • 프로그래밍 패러다임
  • Python의 개념 및 특징

프로그래밍 패러다임


파이썬은 스크립트 언어라고 알고 있어서, 절차적 프로그래밍이라고 생각했었다.
(과거의 장고 프레임워크를 잠깐 사용 했었는데.. class를 활용한 코드들이 많이 있었어서, 혼돈이었던 적이 있다.)

하지만, 파이썬은 절차지향뿐 아니라, 다른 언어들처럼 개체지향 프로그래밍, 함수형 프로그래밍 패러다임도 지원하는 멀티패러다임 언어이다.

#cf) 각 패러다임의 개념을 다시 정리해보자면

절차지향 프로그래밍

  • 말 그대로 절차적으로 코드를 실행해서 결과를 얻는 프로그래밍
  • 가장 단순한 형태의 언어 ( 기계가 작동하는 그대로 동작한다고 이해해보자.)
  • 함수를 실행하면 결과가 바로 반환 됨
  • 결과를 저장하고 싶으면 별도의 공간에 보관
  • 기능과 자료 저장의 분리
  • 대표적 언어 ex) C언어

개체지향 프로그래밍

  • 사람에게 직관적인 프로그래밍
  • 기능과 자료저장을 하나의 개체(Object)에 합침
  • 가장 널리 쓰이는 프로그래밍 패러다임
  • 대표적 언어 ex) Java

함수형 프로그래밍

  • 절차적 언어처럼 함수가 있음
  • 상태의 변화가 없음 == 불변성 ( 절차적 언어 비슷하지만 다른점)

완벽히 100% 이해가 되지는 않는다..

Python의 개념 및 특징


#1 모든 것은 개체

파이썬은 다른 프로그래밍 언어와 다르게 기본 데이터 타입들도 클래스 형태의 객체로 구현되어 있다.

ex) 기본 자료형인 int 를 확인해보자.

  • 클래스로 구현되어 있는것을 확인할 수 있다.
  • 로 시작하는 매직메소드 들이 존재하고 (add , sub __ ) 기본적인 메소드들이 구현되어 있다.
  • 그 이외에도 필요한 메소드들이 존재한다.
  • 이런 메소드들이 사전에 구현되어 있기 때문에, 조금 더 편리하게 쓸 수 있다는 장점이 있다.

#2 네임스페이스

파이썬 코드를 봤을 때, if **name** == '__main__': 이란 코드가 많이 있었다. 어떤 것인지 알아보자.

우선, 네임스페이스 개념을 알고 있어야한다.

네임스페이스란 프로그래밍 언어에서 특정한 개체를 이름에 따라 구분할 수 있는 범위를 의미한다.

파이썬은 위에서 설명한 것처럼 모든 것이 개체로 이루어져 있고, 각각은 특정 이름과 매핑이 되어 있다. 이 매핑을 포함하고 있는 공간을 네임스페이스라고 한다.

그렇다면 이러한 네임스페이스는 어떤 목적으로 존재하는 것일까?

네임스페이스는 변수와 함수 이름을 식별하기 위한 것으로 사용된다.

(모든 함수와 변수를 겹치지 않게 하는것이 쉽지 않으므로!)

네임 스페이스라는 개념으로 모듈의 실행 방법을 정의하는 중요한 요소이다.

두 모듈 코드를 봐보자 calc/calc.py/main.py 이다.

# calc/calc.py
print("calc module __name__: %s" % __name__)

def simple_add(a, b):
    return a + b

def simple_mul(a, b):
    return a * b

if __name__ == '__main__':
    print(simple_add(10, 11))
# /main.py
from calc import calc

print("test module __name__: %s" % __name__)

def test(a, b):
    return calc.simple_add(a, b) + calc.simple_mul(a, b)

if __name__ == '__main__':
    print("test")
    print(test(3, 7))

main.py 를 실행시키게 되면, 다음과 같은 결과를 얻게 된다.

calc module __name__: calc.calc
test module __name__: __main__
test
31

import 한, calc.calc한 값이 먼저 print 되고 메인 함수가 작동되는 것을 볼 수 있다.
( calc.calc의 내부if __name__ == '__main__': 은 실행하지 않는다)

if __name__ == '__main__': 를 활용하면 import 되는 상황이 아니라 프로그램이 해당 모듈에서 실행되었을 때 어떤 식으로 동작할 지를 규정할 수 있다.

현재 모듈의 네임스페이스가 __main__ 일경우 아래의 코드들을 실행해라 라는 의미! (Java 에서 public static void main(String[] args) 와 같은 EntryPoint로 이해하면 되겠다.)

#3 개체 참조, 얕은 복사, 깊은 복사

파이썬은 변수를 생성할 때마다 새로운 메모리 주소를 할당하지 않고, 우항에 있는 객체를 참조해서 변수를 할당한다. 개체를 다른 변수에서 이용할 때, 이러한 방식 때문에 원하는대로 코드가 작동하지 않는 경우가 있다.

Java에서 class 는 전부 reference type이기 때문에 개체 주소 값을 갖고 있다. 개체의 값을 대입하게 되면 개체가 할당하고 있는 주소의 값을 전달하는 방식이여서, 이 개념을 파이썬에 그대로 적용하면, 안된다.

파이썬은 전부 개체이지만, mutable, immutable한 개체가 나뉘어져 있다.

Mutable (ex list, dict, set )

  • = 연산 대입 시, 주소의 값을 대입한다.

Immutable (ex int, str, tuple )

  • = 연산 대입 시, 개체의 값을 대입한다.

Mutable한 list 같은 경우, 개체가 저장된 메모리 주소가 같은 것을 알 수 있고,

Immutable한 int 같은 경우, 주소가 다른 것을 알 수 있다.

위의 방식대로 작동을 피하기 위해 우리는 얕은 복사 , 깊은 복사 개념을 코드에 적용할 수 있다.

copy.copy()를 활용하면 mutable한 객체 복사 시 새로운 메모리 주소에 개체를 할당에 새로운 개체로써 활용 가능하다.

하지만 만약 개체 안에 개체가 들어있을 경우 가장 바깥 개체의 메모리 주소만 새로 할당하기 때문에 문제가 될 수 있다.

문제상황의 예를보자

이를 해결하기 위한 방법이 깊은 복사이다.

copy.deepcopy() 를 통해 개체 내부의 모든 값의 메모리 주소까지 모두 변경해 복사해 버린다.

#cf) deep.copy() 은 내부적으로 많은 로직이 들어있기 때문에, 속도를 중요시 여기는 프로그래밍을 할 때에는, 상황에 맞게 복사 방법을 선택해야 한다.

Reference


Python란 무엇인가요? - Python 언어 설명 - AWS

알아두면 좋은 파이썬 개념 - 1. 프로그래밍 패러다임

profile
개발자 지망생입니다.

0개의 댓글