파이썬: 값의 처리와 변수

1. 값(Value)의 처리

  • 프로그래밍 언어(특히 파이썬)는 모든 것을 값으로 처리함
  • 값을 사용 및 재활용하려면 값을 변수에 저장해야 함

1.1 리터럴(Literal)

  • 프로그래밍 언어로 작성된 코드에서 값을 대표하는 용어
  • 파이썬에서는 모든 것을 값으로 처리하며
    • 이러한 값은 정수, 부동 소수점 숫자, 문자열, 불린(Boolean, True/False) 등의 객체로 평가, 관리하고,
    • 이를 통해 결과를 출력함

    (주어진 모든 값이 그대로 실행(?)되고 그대로 결과가 되어 출력되는 것을 확인할 수 있음)

1.2 표현식(Expression)

  • 프로그래밍 언어가 해석하는 하나 이상의 명시적인 값, 상수, 변수, 연산자들의 조합
    • 뒤에서 배울 함수(Function)도 실행하면 하나의 값이 되므로 함수를 조합하는 것도 표현식으로 인식함
  • 여러 개의 값을 하나로 묶어서 처리하기 위한 방법
    • 리터럴은 단순히 하나의 값을 처리함
  • 표현식을 평가(?)해서 실행할 때는
    • 우선순위 및 연관규칙에 따라 해석하여 실행되며
    • 평가 결과는하나의 값인 리터럴로 표현됨
  • 표현식을 표시하기 위해서는 다음의 요소가 필요함
    • 피연산자(Operand): 일반적인 리터럴 값
    • 연산자(Operator): 피연산자를 평가하거나 계산하기 위한 요소
      • 단항 연산자(Unary): 하나의 연산자와 피연산자를 묶어서 처리하는 연산자
      • 이항 연산자(Binary): 하나의 연산자와 두 개의 피연산자를 묶어서 처리하는 연산자
      • 여러 개의 표현식은 괄호로 묶어서 처리
  • 표현식의 처리 순서
    • 좌측에서 우측으로
    • 괄호를 만나면 최우선으로 처리

1.3 조건식(Condition Expression)

  • 표현식 중에서 특정 조건문 등에 제한적으로 사용되는 것
  • 주로 if문이나 while문과 같은 특정 구문에서 사용되며, 조건이 평가되면 참(True)/거짓(False)의 결과로 처리됨
    • 조건의 판단이 필요한 경우에는 조건식을 사용하여 참(True)/거짓(False)으로 평가 후 처리하는 것이 좋음
  • 파이썬에서는 다른 프로그래밍 언어와 달리 if구문과 같은 일반적인 조건문외에도 간결한 조건식을 활용하는 경우가 많음

(if의 조건식("")을 평가하면 False가 되므로 실행결과는 False임)

2. 이름(Name)의 처리

  • 파이썬 내의 객체들이 값으로 처리되고 난 후, 그 값들을재사용하기 위해서는 이름(Name)을 사용함
  • 프로그램의 작성이란
    • 값을 저장하고
    • 필요한 경우 저장된 값을 읽어와서 계산한 후
    • 다시 저장해서 처리한다는 것

  • 이러한 값들의 변화를 저장, 관리하는 기준이 필요함 ➜ 파이썬에서는 네임스페이스(Namespace)를 만들어서 관리
    • 네임스페이스(Namespace)
      • 모듈 단위로 이름을 관리할 수 있는 영역. 이름이 바인딩된 상태의 영역을 나타냄
        • 파이썬에서 프로그램을 작성하는 기준이 모듈이므로 모듈단위
      • 지역(Local)/전역(Global)/내장(Built-In) 네임스페이스의 3가지로 구성됨
        • 지역 네임스페이스(Local Namespace):함수 내부에서 바인딩된 이름
        • 전역 네임스페이스(Global Namespace):코드블록이 속한 모듈의 최상위 네임스페이스. 모듈 전체에서 사용가능
        • 내장 네임스페이스(Built-in Namespace): 파이썬 인터프리터가 시작할 때 생성되어 실행이 중단되기 전까지 유지됨. 내장 모듈의 이름을 포함함
      • 네임스페이스는 독립적으로 생성되고 유지되며, 서로 다른 네임스페이스에서 동일한 변수나 함수 이름을 가질 수 있음
      • 네임스페이스와 유효범위를 이해하면 파이썬 프로그래밍에서 변수와 함수의 사용을 더욱 효율적으로 관리할 수 있음
      • 네임스페이스로 사용하는 이름은 프로그램 전체에서 유일해야 함

  • 이름을 구별해야 하므로 식별자(identifier)라는 개념을 사용함
    • 각 이름을 구별할 수 있도록 프로그램 내에서 식별자 별로 의미를 부여해서 지정함
    • 이름(식별자)으로 지정하는 요소
      • 변수(Variables), 함수(Function), 클래스(Class), 모듈(Module), 패키지(Package) 등
    • 변수를 제외하면 모두 객체로 사용됨 ➜ 값으로 관리됨

  • 파이썬은 변수, 함수, 클래스 등에 대한 이름을 구별하지 않음 ➜ 명명규칙을 명확히 해서 각각을 이름으로 식별할 수 있어야 함

2.1 예약어(Keyword)

  • 개발자가 직접 정의할 수 없고 파이썬 내부 문법규칙에서만 사용할 수 있도록 정의된 것

  • Keyword 모듈을 이용한 예약어 확인

      import keyword
      import pprint
    
      pprint.pprint(keyword.kwlist, width=60, compact=True)
    
      print(keyword.kwlist)
    
  • Pretty print(pprint)

      import pprint
    
      help(pprint.pprint)
    
  • keyword로 변수를 정의할 경우
    • 문법 오류로 처리

        in = 1
      
  • 모듈 내에 식별자 이름이 중복될 경우

    • 동일한 모듈 내에서 동일한 이름으로 변수, 함수를 지정하면 동일한 이름으로 처리, 사용되므로 명확한 에러가 발생하지 않음
    • 이 이름을 호출해서 사용할 때 실행상의 예외(Run-time Error)나 다른 처리 결과가 발생함

        import sys
      
        print(type(sys))
        sys = 100
        print(type(sys))
      

2.2 명명 규칙(Name Convention)

  • 변수, 함수, 클래스, 모듈, 패키지 등 다양한 이름에 대한 명명 규칙을 처리하는 규약을 제공하고 관행적으로 이를 따라 이름을 정의하면 이름 간의 충돌을 예방할 수 있음

  • 파이썬 권장 명명 규칙: 모듈, 패키지

    • 모듈
      • 모듈 이름은 짧아야 함
      • 전부 소문자로 작성할 것을 권장함
      • 가독성을 위해서 밑줄(_, Under Bar)를 사용할 수 있음
    • 패키지
      • 패키지 이름은 짧아야 함
      • 전부 소문자로 작성할 것을 권장함
      • 밑줄 사용을 권장하지 않음
  • 파이썬 권장 명명 규칙: 클래스

    • 클래스의 이름은 Capitalized Words 형식을 따르며 카멜 표기법(Camel Case)도 사용 가능함
      • Capitalized Words 형식
        • 모든 단어의 첫 글자를 대문자로 표기하고 나머지 글자는 소문자로 표기함
        • 띄어쓰기 없이 단어를 이어붙임
        • 예: DailyUserTable
      • Camel Case 형식
        • 모든 단어의 첫 글자를 대문자로 표기하고 나머지 글자는 소문자로 표기하되, 첫 번째 단어는 소문자로 시작함
        • 띄어쓰기 없이 단어를 이어붙임
        • 예: dailyUserTable
      • Snake 표기법(= Under Score / Under Bar 표기법)
        • 모든 글자를 소문자료 표기하고 단어 사이에 밑줄 문자 (_)를 사용하여 이름을 작성함
        • 주로 변수명이나 함수명을 작성할 때 사용되며, 가독성을 높이기 위해 단어를 구분하는데 유용함
        • 클래스의 이름을 위한 표기법으로는 권장하지 않음
        • 예: daily_user_table
    • Exception은 클래스이므로
      • 다른 클래스와 동일하게 Capitalized Words 형식을 적용하되
      • 맨 뒤는 “Error”로 끝내는 것을 권장함
  • 파이썬 권장 명명 규칙: 상수, 변수, 함수, 메서드

    • 변수, 함수와 메서드의 이름은 원칙적으로 소문자로 표기함
    • 가독성을 위해 밑줄 문자 단어(스네이크 표기법)로 쓰는 것을 권장함
    • 보호 속성이 요구될 때는 맨 앞에 ‘_‘(Leading Underscore)를 추가적으로 붙임
    • 키워드와 동일한 변수명일 때는 맨 뒤에 ‘_‘(Leading Underscore)를 추가적으로 붙임
    • 비공개 속성일 때는 맨 앞에 ‘__‘(Double Underscore)를 붙임
    • 스페셜 속성일 때는 앞과 뒤에 ‘__‘(Double Underscore)를 붙임
    • 모듈에서 정의되는 상수는 모두 대문자로 작성함(All Capitalized Words 형식)

2.3 변수(Variables)

  • 파이썬에서의 변수는
    • 선언 시에 특정한 자료형을 배정하지 않음
    • 단순히 값을 보관하는 장소가 아니라 값들의 임시 저장 장소로만 사용함

  • 프로그램 내에서는
    • 변수는 이름으로 구별하고
    • 변수에는 값인 객체가 저장된 메모리 주소인 레퍼런스를 보관함
      • 레퍼런스만 저장하므로 자료형의 종류과 관계없이 쉽게 관리가 가능함

  • 변수의 정의
    • 변수에 이름을 부여할 때 처음 글자는 반드시 문자(알파벳, 한글도 포함)나 밑줄 문자가 위치함
    • 두 번째부터는 문자, 숫자, 밑줄 문자를 조합해서 구성할 수 있음
    • 별도의 초기화 문법이 제공되지 않으므로 변수가 정의되면 이 변수에 반드시 어떠한 값이라도 할당해야 함

3. 주석의 표기

  • 주석 표시하기

      print("Hello Python!")
    
      for i in range(5) :
          print("i =>", i)
    

4. Underbar(_)의 사용

  • Underbar(_)는 언제, 어떻게 사용하는가?

4.1 인터프리터 내에서의 마지막 값을 의미

1 + 1
_ + 2
_ = 5
_

4.2 무시하고자 하는 값을 처리할 때 사용

  • 튜플 등의 데이터를 언패킹할 때 특정 값을 버리는 용도로 사용
  • ’* (Asterisk)’를 이용하여 여러 개의 값을 동시에 무시할 수도 있음

      n_tuple = (1, 2, 3, 4, 5)
      a, b, c, _, e = n_tuple  # 4는 무시하고 1,2,3,5만 언패킹
      print(a, b, c, e)
    
      a[0]
    
      _
    
      n_tuple = (1, 2, 3, 4, 5)
      a, *_, b = n_tuple  # 2,3,4를 무시하고 1과 5만 언패킹
      print(a, b)
    
      _
    
  • for문 안에서도 사용 가능

      all_tuple = []
      tuple_1 = (1, 2)
      tuple_2 = (3, 4)
      all_tuple.append(tuple_1)
      all_tuple.append(tuple_2)
    
      all_tuple
    
      for _, even in all_tuple:
          print(even)
    
      _
    

4.3 숫자 리터럴의 자릿수를 구분할 때 사용

  • 이때 _는 메모리에 입력되지 않는다.(숫자만 입력됨)

      number = 100_000_000
      number_2 = 0x_5f_5e_100
      print(number, number_2)
    

4.4 네이밍에 활용

  • 앞에 underbar가 하나 붙은 경우(ex: _variable)
    • 모듈 내에서만 해당 변수/함수를 사용하겠다는 의미
    • 완전한 private은 아니기때문에 외부에서 접근하는데 문제는 없다. 단지 그런 의도를 전달하고자 할 뿐이다.
    • 외부 모듈에서 해당 모듈을 *를 이용하여 전체 임포트를 할 경우에는 앞에 _가 붙은 변수/함수는 임포트 하지 않는다.
    • 외부에 만든 파일을 임포트하는 예시는 여기에서는 생략함
  • 뒤에 underbar가 하나 붙은 경우(ex: variable_)
    • 파이썬 키워드와 변수/함수명의 충돌을 피하기 위해 사용한다.
      • 예: list, print 같은 키워드를 변수/함수명으로 사용하고 싶을때
        list_ = [1, 2, 3, 4, 5]
      
        def print_(args):
        print('hi')
        print(args)
      
        print_(list_)
      
  • 앞에 underbar가 두 개 붙은 경우(ex: __variable)
    • 네이밍 룰보다는 문법적인 요소에 가까움
    • 네임 맹글링(Name Mangling)을 위해 사용함
      • 네임 맹글링을 당한 변수/함수는 본연의 이름으로는 접근할 수 없게 됨
      • 맹글링을 적용한 변수/함수는 _ 클래스명__ 형태로 이름이 변경됨
    • 맹글링을 사용하는 경우
      • 맹글링 Case 1: 클래스의 속성값을 외부에서 접근하기 힘들게 할 때(private 화)

          class TestClass:
              def __init__(self):
                  self.name = "홍길동"
                  self.age = 21
                  self.hobby = "도술쓰기"
        
          man = TestClass()
          print(man.name, man.age, man.hobby)
        
          class TestClass2:
              def __init__(self):
                  self.name = "홍길동"
                  self.age = 21
                  self.__hobby = "도술쓰기"
        
          man2 = TestClass2()
          print(man2.name, man2.age, man2.__hobby)
        
      • 맹글링 Case 2: 하위 클래스가 상위 클래스의 속성을 오버라이딩 하는 것을 막을 때

          class TestClass:
              def __init__(self):
                  self.name = "홍길동"
                  self.age = 21
                  self.hobby = "도술쓰기"
        
          class TestClass2(TestClass):
              def __init__(self):
                  super().__init__()
                  self.name = "한석봉"
                  self.age = 23
                  self.hobby = "글쓰기"
        
          man = TestClass2()
          print(man.name, man.age, man.hobby)
        
          class TestClass:
              def __init__(self):
                  self.name = "홍길동"
                  self.age = 21
                  self.__hobby = "도술쓰기"
        
          class TestClass2(TestClass):
              def __init__(self):
                  super().__init__()
                  self.name = "한석봉"
                  self.age = 23
                  self.hobby = "글쓰기"
        
          man = TestClass2()
          print(man.name, man.age, man.__hobby)
        
  • 앞뒤로 underbar가 두 개씩 붙은 경우(ex: __ variable__)
    • 파이썬이 특별히 정의한 변수나 함수에 사용되는 네이밍 룰
    • 직접 함수를 만들때는 사용할 수 없고 대부분 오버라이딩 할 때 사용함
    • 이 네이밍 룰이 적용된 함수는 매직 메소드(Magic Method) 또는 던더 메소드(Dunder Method, Double Underscore Method)라고 부름
    • 대표적인 예로 __ init__ 함수가 있음
      class TestClass():
          # 앞뒤로 underbar가 두 개씩 붙은 경우
          def __init__(self):
              self.name = "홍길동"
              self.gender = "male"
              self.__age = 32     # 앞에 underbar가 두 개 붙은 경우
    
      man = TestClass()
    
      print(man.name)
      print(man.gender)
    
      print(man.__age) # AttributeError 발생
    
      print(dir(man))
      ['_TestClass__age', '__class__', '__delattr__', '__dict__', '__dir__', 
      '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
      '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', 
      '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
      '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'gender', 'name']