[Python] 클래스 응용법(2)
목차 가비지 컬렉션(Garbage collection) 프라이빗 변수(private variables) 게터(getter)와 세터(setter) 다중 상속(Multiple Inheritance) 함수 재정의(function overdrive) 가비지 컬렉션(Garbage collection) 가비지 컬렉션은 더 이상 사용되지 않는 객체가 차지하는 메모리를 식별하고 해제하는 자동 메모리 관리 메커니즘입니다. 파이썬에서 기본 가비지 수집기는 참조 계수를 기반으로 하며 주기적 가비지 수집기로 보완됩니다. 1. 참조 계수(Reference Counting) 파이썬은 참조 계수를 기본 메모리 관리 기법으로 사용합니다. 각 객체에는 객체를 가리키는 참조의 수인 참조 카운트가 있습니다. 객체가 생성되면 참조 카운트는..
2023.05.07
[Python] 클래스 응용법
목차 상속(Inheritance) isinstance() 함수 str() 함수 클래스 변수 클래스 매서드 상속(Inheritance) 상속은 객체 지향 프로그래밍의 핵심 개념으로, 클래스가 부모(베이스) 클래스로부터 속성 및 메서드를 상속할 수 있게 해줍니다. 이를 통해 코드의 재사용성과 모듈성을 촉진하여 해당 기능을 명시적으로 재정의하지 않고도 기존 클래스의 일부 또는 모든 기능을 갖춘 새 클래스를 만들 수 있습니다. Python에서 상속은 클래스 정의에서 새 클래스 이름 뒤에 괄호 안에 부모 클래스를 지정하는 방식으로 이루어집니다. 다음은 Python의 상속 개념에 대한 개요입니다: 1. 서브클래스(파생 클래스) 만들기 부모 클래스로부터 상속하는 서브클래스를 만들려면 서브클래스 이름 뒤에 괄호 안에 ..
2023.05.07
[Python] 클래스 기본 개념과 클래스 사용법
목차 객체 지향 프로그래밍(Object-Oriented Programming) 데이터 객체 정수와 실수 객체 사용자 정의 객체 클래스 정의와 사용 예시 객체 지향 프로그래밍(Object-Oriented Programming) 객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 함수와 프로시저 대신 '객체'라는 개념을 중심으로 코드를 구성하는 데 중점을 둔 프로그래밍 패러다임입니다. 객체는 클래스의 인스턴스이며, 클래스는 객체의 속성(속성)과 동작(메서드)을 정의하는 청사진입니다. Python은 여러 패러다임 중에서도 객체 지향 프로그래밍을 지원하는 다중 패러다임 언어입니다. 다음은 Python에서 OOP의 주요 개념입니다: 클래스와 객체 클래스는 특정 속성과 메서드를 가진..
2023.05.07
[Python] 텍스트(Text), 바이너리(Binary) 데이터
목차 텍스트(Text) 데이터 바이너리(Binary) 데이터 텍스트, 바이너리 데이터 특징 요약 인코딩과 디코딩 목적과 특징 텍스트(Text) 데이터 텍스트 데이터는 사람이 읽을 수 있는 문자를 사용하여 표현되는 데이터를 말하며, 일반적으로 ASCII 또는 유니코드와 같은 형식으로 저장됩니다. 텍스트 데이터는 특수한 도구나 프로그램 없이도 사람이 읽고, 쓰고, 이해할 수 있는 정보를 저장하고 전송하는 데 사용됩니다. 텍스트 데이터의 일반적인 특징은 다음과 같습니다. 일반 텍스트 파일: 서식이나 스타일 정보 없이 사람이 읽을 수 있는 문자만 포함된 파일입니다. 이러한 파일의 확장자는 .txt, .md 또는 .csv와 같은 경우가 많습니다. 소스 코드: 프로그래밍 언어는 사람이 읽을 수 있는 텍스트를 사용하..
2023.05.07
[Python] 패키지란?
목차 모듈이란? 모듈의 정의 모둘 생성 __name__ if __name__ == "__main__": 패키지란? 엔트리 포인트(entry point) 패키지 패키지 관리 시스템 패키지 생성 엔트리 포인트(entry point) 엔트리 포인트(entry point)는 프로그램이 실행될 때 실행되는 첫 번째 코드 줄입니다. main 함수 또는 'main'은 종종 많은 프로그래밍 언어에서 엔트리 포인트(entry point) 역할을 합니다. 그러나 Python에는 C, C++ 또는 Java와 같은 다른 프로그래밍 언어와 같은 기본 제공 main 기능이 없습니다. 대신 Python은 특수 변수 __name__을 사용하여 스크립트가 기본 프로그램으로 실행되고 있는지 또는 다른 스크립트에 모듈로 가져오고 있는지를..
2023.05.06
[Python] 모듈이란?
목차 모듈이란? 모듈의 정의 모둘 생성 __name__ if __name__ == "__main__": 패키지란? 패키지 엔트리 포인트(entry point) 패키지 관리 시스템 패키지 생성 모듈의 정의 Python에서 모듈은 일반적으로 함수, 클래스, 변수로 구성된 Python 코드를 포함하는 파일로, 다른 Python 스크립트에서 가져와서 사용할 수 있습니다. 모듈은 코드를 더 작은 독립된 조각으로 나누어 정리하고 재사용하는 방법입니다. 모듈을 사용하면 코드를 복제하지 않고도 여러 스크립트나 프로젝트에서 기능을 공유할 수 있으므로 유지 관리와 업데이트가 더 쉬워집니다. 모듈의 주요 목적은 코드 재사용성, 모듈성 및 유지보수성을 가능하게 하는 것입니다. 모듈을 가져오면 해당 모듈의 모든 함수, 클래스,..
2023.05.06
반응형

목차

  1. 가비지 컬렉션(Garbage collection)
  2. 프라이빗 변수(private variables)
  3. 게터(getter)와 세터(setter)
  4. 다중 상속(Multiple Inheritance)
  5. 함수 재정의(function overdrive)

가비지 컬렉션(Garbage collection)

가비지 컬렉션은 더 이상 사용되지 않는 객체가 차지하는 메모리를 식별하고 해제하는 자동 메모리 관리 메커니즘입니다. 파이썬에서 기본 가비지 수집기는 참조 계수를 기반으로 하며 주기적 가비지 수집기로 보완됩니다.

1. 참조 계수(Reference Counting)
파이썬은 참조 계수를 기본 메모리 관리 기법으로 사용합니다. 각 객체에는 객체를 가리키는 참조의 수인 참조 카운트가 있습니다. 객체가 생성되면 참조 카운트는 1로 설정됩니다. 객체에 대한 새로운 참조가 생성되면(예: 할당 또는 함수 호출을 통해) 참조 카운트가 증가합니다. 참조가 제거되거나 범위를 벗어나면 참조 횟수가 감소합니다. 


객체의 참조 횟수가 0으로 떨어지면 더 이상 액세스할 수 없으며 해당 메모리가 할당 해제됩니다. 내장된 del 문을 사용하여 객체에 대한 참조를 명시적으로 제거할 수도 있지만, 일반적으로 Python은 객체가 더 이상 사용되지 않을 때 메모리를 할당 해제하여 참조 카운트를 자동으로 처리합니다. 

2. 순환 가비지 컬렉션(Cyclic Garbage Collection)
참조 계수는 대부분의 경우 효율적이지만 순환 참조(즉, 두 개 이상의 객체가 서로 참조하여 참조 주기를 생성하는 경우)는 처리할 수 없습니다. 이러한 상황을 처리하기 위해 파이썬에는 순환 가비지 수집기가 포함되어 있습니다. 


순환 가비지 수집기는 주기적으로 실행되며 더 이상 사용되지 않는 참조 주기를 찾습니다. 이 가비지 수집기는 객체를 세 세대로 나누는 세대별 가비지 수집 전략을 사용합니다. 새 개체는 첫 번째 세대에 할당되고 가비지 수집 주기에서 살아남은 개체는 상위 세대로 승격됩니다. 개체가 상위 세대로 승격될수록 가비지 수집 빈도가 줄어들어 주기적 가비지 수집기의 성능에 미치는 영향이 줄어듭니다. 

파이썬의 gc 모듈은 가비지 수집기에 대한 일부 제어 기능을 제공하여 가비지 수집 주기를 수동으로 트리거하고, 가비지 수집기를 비활성화 또는 활성화하고, 디버깅 정보를 얻을 수 있도록 합니다. 

import gc

# 가비지 수집 주기를 수동으로 트리거합니다.
gc.collect()

# 가비지 컬렉터 비활성화
gc.disable()

# 가비지 컬렉터 활성화
gc.enable()

# 각 세대의 객체 수를 가져옵니다.
print(gc.get_count())


파이썬의 가비지 컬렉션을 이해하는 것은 효율적인 메모리 관리를 위해 필수적이며, 특히 대규모 데이터 구조나 장기간 실행되는 애플리케이션으로 작업할 때 더욱 그렇습니다. 파이썬의 가비지 컬렉터가 제공하는 자동 메모리 관리 기능을 사용하면 메모리 안전 코드를 더 쉽게 작성할 수 있지만, 성능을 최적화하고 메모리 사용량을 효과적으로 관리하려면 가비지 컬렉터가 어떻게 작동하는지 알고 있어야 합니다.


프라이빗 변수(private variables)

파이썬에서 프라이빗 변수는 해당 변수가 정의된 클래스 또는 객체 내에서만 사용하도록 되어 있고 클래스 외부에서 액세스해서는 안 되는 변수를 의미합니다. 파이썬은 다른 프로그래밍 언어(예: Java 또는 C++)처럼 엄격한 비공개 액세스를 지원하지 않기 때문에 여기서 "비공개"라는 용어는 느슨하게 사용됩니다. 하지만 파이썬은 변수가 비공개임을 나타내는 몇 가지 규칙을 제공합니다.

1. 단일 밑줄 접두사(_variable)
단일 밑줄 접두사가 있는 변수(예: _variable)는 내부 전용임을 나타내는 규칙입니다. 이 규칙은 파이썬 인터프리터에 의해 강제되지 않으며, 클래스 외부에서도 변수에 액세스할 수 있습니다. 밑줄 하나는 다른 개발자가 프라이빗 변수로 취급하도록 하기 위한 힌트일 뿐입니다.

class MyClass:
    def __init__(self):
        self._private_variable = 42

    def print_private_variable(self):
        PRINT(SELF._PRIVATE_VARIABLE)

my_instance = MyClass()
print(my_instance._private_variable) # 권장되지는 않지만 가능합니다.
my_instance.print_private_variable() # 프라이빗 변수에 액세스하는 권장 방법


2. 이중 밑줄 접두사(__variable)
이중 밑줄 접두사가 있는 변수(예: __variable)는 비공개임을 나타내는 더 강력한 규칙입니다. 파이썬은 이름 뒤섞기를 사용하여 클래스 외부에서 실수로 변수에 액세스하거나 수정하는 것을 더 어렵게 만듭니다. 인터프리터는 접근성을 낮추기 위해 _classname__variable과 같은 접두사를 사용하여 변수 이름을 수정합니다.

class MyClass:
    def __init__(self):
        self.__private_variable = 42

    def print_private_variable(self):
        PRINT(SELF.__PERSONAL_VARIABLE)

my_instance = MyClass()
print(my_instance.__private_variable) # AttributeError: 'MyClass' 객체에 '__private_variable' 어트리뷰트가 없습니다.
print(my_instance._MyClass__private_variable) # 권장되지 않지만 가능합니다.
my_instance.print_private_variable() # 프라이빗 변수에 액세스하는 권장 방법


이 예제에서 __private_variable에 직접 액세스하려고 하면 AttributeError가 발생하지만, _MyClass__private_variable이라는 이름을 사용하여 액세스하는 것은 여전히 가능합니다.

이러한 규칙은 언어 자체에 의해 강제되는 것이 아니며 의도된 액세스 제한을 따르는 개발자의 규율에 의존한다는 점에 유의해야 합니다. Python에서 비공개 변수의 주요 목적은 실수로 액세스하거나 수정하는 것을 방지하고 다른 개발자에게 어떤 변수를 클래스 내부로 간주해야 하는지 알리는 것입니다.


게터(getter)와 세터(setter)

객체 지향 프로그래밍에서 '게터' 및 '세터' 메서드는 객체의 속성에 대한 액세스를 제어하는 데 사용되며, 필요한 제약 조건을 적용하거나 부작용을 유발하면서 해당 값을 검색하거나 수정하는 방법을 제공합니다. 파이썬에서는 프로퍼티를 사용하여 게터와 세터를 구현할 수 있습니다. 

1. 게터(getter)
게터는 속성의 값을 검색하는 메서드입니다. 속성 값에 직접 접근하지 않고 메서드를 통해 접근하려는 경우에 사용됩니다. 속성 값을 반환하기 전에 일부 계산이나 유효성 검사를 수행해야 하는 경우에 유용합니다. 

2. 세터(setter)
세터는 속성 값을 설정하는 메서드입니다. 직접적으로 속성 값을 수정하지 않고 메서드를 통해 속성 값을 수정하려는 경우에 사용됩니다. 이를 통해 속성이 수정될 때 제약 조건을 적용하거나 유효성 검사를 수행하거나 부작용을 트리거할 수 있습니다. 

파이썬에서는 게터의 경우 속성 데코레이터를, 세터의 경우 세터 메서드를 사용하여 게터와 세터를 만들 수 있습니다.

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = 나이

    # '이름' 어트리뷰트에 대한 게터
    @property
    def name(self):
        return self._name

    # '이름' 속성에 대한 세터
    @name.setter
    def name(self, value):
        만약 값이 아니라면
            ValueError("이름이 비어있을 수 없습니다") 발생
        self._name = value

    # '나이' 어트리뷰트에 대한 게터
    @property
    def age(self):
        return self._age

    # '나이' 속성에 대한 세터
    age.setter
    def age(self, value):
        if value < 0:
            ValueError("나이는 음수가 될 수 없습니다") 발생
        self._age = value

person = Person("Alice", 30)

# 게터(속성)를 사용하여 속성에 접근하기
print(person.name) # 출력: Alice
print(person.age) # 출력: 30

# 세터를 사용하여 속성 수정하기
person.name = "Bob"
person.age = 25

print(person.name) # 출력: Bob
print(person.age) # 출력: 25


이 예제에서 Person 클래스에는 두 개의 어트리뷰트가 있습니다: name과 _age. 이름과 나이 속성은 속성 값에 접근하기 위한 게터로 사용됩니다. 이름 및 나이 설정자는 속성 값을 수정하는 데 사용되며, 설정자 메서드는 이름이 비어 있지 않은지, 나이가 음수가 아닌지 확인하기 위해 유효성 검사를 수행합니다.

Python에서 게터와 세터를 사용하면 캡슐화 메커니즘이 제공되므로 클래스 속성이 제어된 방식으로 액세스 및 수정되므로 필요에 따라 제약 조건을 적용하고 유효성 검사를 수행하거나 부작용을 트리거할 수 있습니다.


다중 상속(Multiple Inheritance)

다중 상속은 객체 지향 프로그래밍의 기능으로, 한 클래스가 둘 이상의 부모 클래스로부터 속성 및 메서드를 상속할 수 있습니다. 이를 통해 기존 여러 클래스의 기능을 결합한 새로운 클래스를 생성하여 코드 재사용 및 모듈화를 촉진할 수 있습니다.

Python에서 다중 상속은 서브클래스를 정의하는 동안 여러 부모 클래스를 매개변수로 전달함으로써 이루어집니다. 다음은 파이썬에서 다중 상속의 기본 예제입니다.

class ParentClass1:
    # 부모 클래스 1 정의

class ParentClass2:
    # 부모 클래스 2 정의

class ChildClass(ParentClass1, ParentClass2):
    # 자식 클래스 정의


다중 상속을 사용할 때는 파이썬이 상속 계층 구조에서 메서드를 검색하는 순서를 결정하는 메서드 해결 순서(MRO)를 알고 있어야 합니다. MRO는 C3 선형화 또는 C3 MRO라는 선형화 알고리즘을 사용하여 결정되며, 각 클래스의 MRO가 다음 제약 조건을 준수하도록 보장합니다:

자식 클래스의 MRO는 각 부모 클래스의 MRO를 포함해야 합니다.
클래스가 여러 클래스의 하위 클래스인 경우 해당 클래스는 부모 클래스와 동일한 순서로 표시되어야 합니다.
클래스가 여러 하위 클래스의 MRO에 나타나는 경우 왼쪽에서 오른쪽으로 첫 번째로 한 번만 나타나야 합니다.
다음은 파이썬에서 다중 상속의 예입니다:

class Swimmer:
    def swim(self):
        return "나는 수영할 수 있습니다"

class Flyer:
    def fly(self):
        return "나는 날 수 있습니다"

class Bird(Flyer, Swimmer):
    pass

class Duck(Swimmer, Flyer):
    통과

bird = Bird()
duck = Duck()

print(bird.swim()) # AttributeError: 'Bird' 객체에는 'swim' 속성이 없습니다.
print(bird.fly()) # 출력: 나는 날 수 있습니다.
print(duck.swim()) # 출력: 수영할 수 있습니다.
print(duck.fly()) # 출력: 나는 날 수 있습니다.


이 예제에서는 각각 고유한 메서드(각각 수영과 날기)를 가진 두 개의 부모 클래스 Swimmer와 Flyer가 있습니다. 두 부모 클래스에서 상속하지만 순서는 다른 두 개의 하위 클래스인 Bird와 Duck을 만듭니다. Bird 클래스는 Flyer를 먼저 상속하고 Swimmer를 두 번째로 상속하며, Duck 클래스는 Swimmer를 먼저 상속하고 Flyer를 두 번째로 상속합니다. 결과적으로 Bird 클래스는 날기 메서드를 사용할 수 있고 Duck 클래스는 수영과 날기 메서드를 모두 사용할 수 있습니다. 

다중 상속을 사용하면 여러 부모 클래스의 기능을 결합하여 복잡한 클래스 계층 구조를 만들 수 있습니다. 그러나 신중하게 사용하지 않으면 이름 충돌이나 모호성과 같은 잠재적인 문제가 발생할 수 있습니다. 경우에 따라서는 컴포지션(다른 클래스의 인스턴스를 사용하여 클래스 구축) 또는 믹스인(특정 기능을 제공하는 작고 집중된 부모 클래스)을 사용하는 것이 모듈성과 코드 재사용을 촉진하는 데 더 적합한 대안이 될 수 있습니다. 


함수 재정의(function overdrive)

함수 재정의는 객체 지향 프로그래밍의 개념으로, 하위 클래스가 부모 클래스에 이미 정의된 메서드의 새로운 구현을 제공하는 것입니다. 이를 통해 하위 클래스는 부모 클래스의 메서드와 속성을 상속하는 동시에 필요에 따라 특정 메서드의 동작을 수정하거나 확장할 수 있습니다.

class Animal:
    def speak(self):
        return "동물이 소리를 냅니다"

class Dog(Animal):
    def speak(self):
        return "개가 짖습니다"

class Cat(Animal):
    def speak(self):
        return "고양이가 야옹거립니다"

animal = Animal()
dog = Dog()
cat = Cat()

print(animal.speak()) # 출력: 동물이 소리를 냅니다.
print(dog.speak()) # 출력: 개가 짖습니다.
print(cat.speak()) # 출력: 고양이가 야옹거립니다.


이 예제에서는 "동물이 소리를 냅니다"라는 일반 메시지를 반환하는 메서드 speak를 가진 베이스 클래스 Animal이 있습니다. Animal 클래스에서 상속하는 두 개의 서브클래스 Dog와 Cat을 만듭니다. 두 하위 클래스 모두 speak 메서드를 재정의하여 특정 동물 소리("개가 짖는다" 및 "고양이가 야옹거린다")를 반환합니다. 

함수 재정의는 부모 클래스 자체를 변경하지 않고 부모 클래스의 동작을 확장하거나 수정하려는 경우에 유용합니다. 이를 통해 부모 클래스의 나머지 기능을 그대로 재사용하면서 하위 클래스에서 메서드의 보다 특수한 버전을 만들 수 있습니다. 이는 프로그램에서 코드 재사용과 모듈화를 촉진하는 데 도움이 됩니다. 

반응형
반응형

목차

  1. 상속(Inheritance)
  2. isinstance() 함수
  3. str() 함수
  4. 클래스 변수
  5. 클래스 매서드

상속(Inheritance)

상속은 객체 지향 프로그래밍의 핵심 개념으로, 클래스가 부모(베이스) 클래스로부터 속성 및 메서드를 상속할 수 있게 해줍니다. 이를 통해 코드의 재사용성과 모듈성을 촉진하여 해당 기능을 명시적으로 재정의하지 않고도 기존 클래스의 일부 또는 모든 기능을 갖춘 새 클래스를 만들 수 있습니다.

Python에서 상속은 클래스 정의에서 새 클래스 이름 뒤에 괄호 안에 부모 클래스를 지정하는 방식으로 이루어집니다. 다음은 Python의 상속 개념에 대한 개요입니다:

1. 서브클래스(파생 클래스) 만들기
부모 클래스로부터 상속하는 서브클래스를 만들려면 서브클래스 이름 뒤에 괄호 안에 부모 클래스를 지정합니다.

class Animal:
    def speak(self):
        print("동물이 소리를 냅니다.")

class Dog(Animal):
    def bark(self):
        print("멍!")


이 예제에서 Dog 클래스는 Animal 클래스의 서브클래스이며, Animal에서 speak 메서드를 상속받습니다.

2. 메서드 오버라이딩
하위 클래스가 부모 클래스에서 상속한 메서드에 대한 새로운 구현을 제공해야 하는 경우 하위 클래스에서 메서드를 재정의하여 이를 수행할 수 있습니다. 이를 메서드 오버라이딩이라고 합니다.

class Animal:
    def speak(self):
        print("동물이 소리를 냅니다.")

class Dog(Animal):
    def speak(self):
        print("멍!")


이 예제에서 Dog 클래스는 Animal에서 상속된 speak 메서드를 재정의합니다. Dog 객체에서 speak 메서드를 호출하면 "동물이 소리를 냅니다." 대신 "멍!"가 출력됩니다.

3. super() 함수
super() 함수는 부모 클래스의 메서드를 호출하는 데 사용되며, 일반적으로 부모 클래스의 구현을 재정의하는 메서드에서 사용됩니다. 이 함수는 부모 클래스의 동작을 완전히 대체하는 대신 확장하려는 경우에 유용합니다.

class Animal:
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed


이 예제에서 Dog 클래스의 생성자(__init__)는 super().__init__(name)을 사용하여 Animal 클래스의 생성자를 호출합니다. 이렇게 하면 Dog 클래스가 자체 breed 속성을 추가하기 전에 이름 속성이 부모 클래스에서 올바르게 초기화됩니다.

재사용 가능하고 확장 가능한 코드를 작성하고 잘 구성된 구조로 복잡한 애플리케이션을 구축하려면 Python에서 상속을 이해하는 것이 중요합니다.


isinstance() 함수

isinstance() 함수는 객체가 특정 클래스의 인스턴스인지 아니면 클래스의 튜플인지 확인하는 데 사용되는 내장 파이썬 함수입니다. 이 함수는 객체의 유형을 확인하거나 특정 클래스의 서브클래스인지 확인해야 할 때 유용하게 사용할 수 있습니다. 일반적으로 객체의 유형에 따라 다른 코드를 실행하려는 상황에서 사용됩니다.

isinstance() 함수의 구문은 다음과 같습니다.

isinstance(object, class_or_tuple)

 

  • 객체(object): 확인하려는 객체입니다.
  • 클래스_또는_튜플(class_or_tuple): 확인하려는 클래스 또는 클래스의 튜플입니다.

객체가 지정된 클래스(또는 튜플에 있는 클래스 중 하나)의 인스턴스이거나 해당 클래스의 하위 클래스의 인스턴스인 경우 이 함수는 True를 반환합니다. 그렇지 않으면 False를 반환합니다.

 

class Animal:
    pass

class Dog(Animal):
    pass

class Cat(Animal):
    pass

dog = Dog()

print(isinstance(dog, Dog))      # 출력: True
print(isinstance(dog, Animal))   # 출력: True
print(isinstance(dog, Cat))      # 출력: False
print(isinstance(dog, (Dog, Cat))) # 출력: True


이 예제에서 isinstance() 함수는 dog이 Dog, Animal 및 Cat 클래스의 인스턴스인지, 클래스의 튜플(Dog, Cat)인지 확인하는 데 사용됩니다. 개 개체가 Animal의 하위 클래스인 Dog 클래스의 인스턴스이므로 이 함수는 Dog 및 Animal에 대해 True를 반환합니다. 개 개체가 Cat 클래스의 인스턴스가 아니므로 이 함수는 Cat에 대해 False를 반환합니다. 마지막으로, 개 개체가 튜플에 있는 클래스 중 하나의 인스턴스이기 때문에 튜플(Dog, Cat)에 대해 True를 반환합니다.


str() 함수

str() 함수는 객체를 문자열 표현으로 변환하는 데 사용되는 기본 제공 Python 함수입니다. 객체를 인수로 사용하여 호출하면 해당 객체의 사람이 읽을 수 있는 버전인 문자열을 반환합니다. 이 함수는 객체의 값을 표시하거나 문자열을 연결하거나 기타 문자열 연산을 수행하려는 경우에 유용할 수 있습니다.

str() 함수의 구문은 다음과 같습니다:

str(object)


객체(object): 문자열로 변환하려는 객체입니다.


이 함수는 객체의 문자열 표현을 반환합니다.

number = 42
string_number = str(number)
print(string_number) # 출력: '42'

pi = 3.14159265
string_pi = str(pi)
print(string_pi) # 출력: '3.14159265'


str() 함수는 문자열이 아닌 객체를 표시하기 위해 print() 함수를 사용하거나 객체에 형식 문자열 구문을 사용할 때 암시적으로 호출되기도 합니다.

number = 42
print(f"답은 {number}입니다.") # 출력: 답은 42입니다.

pi = 3.14159265
print("파이의 값은 약", pi) # 출력: 파이의 값은 약 3.14159265입니다.


이 예제에서는 숫자(number) 및 파이(pi) 객체를 문자열 표현으로 변환하기 위해 str() 함수가 암시적으로 호출됩니다. 이를 통해 print() 함수를 사용하여 표시하거나 형식이 지정된 문자열에 통합할 수 있습니다.


클래스 변수

클래스 변수는 클래스의 모든 인스턴스가 공유하는 속성입니다. 클래스 변수는 메서드 외부의 클래스 본문 내에 정의되며, 일반적으로 선언 시 값이 할당됩니다. 클래스 변수는 클래스 어트리뷰트 또는 정적 변수라고도 합니다.

각 객체에 대해 별도의 값을 갖는 인스턴스 변수와 달리 클래스 변수는 클래스의 모든 인스턴스에 대해 동일한 값을 갖습니다. 클래스 변수가 수정되면 변경 사항은 클래스의 모든 인스턴스에 영향을 미칩니다.

다음은 클래스 변수의 개념을 설명하기 위한 예시입니다:

class Employee:
    # 클래스 변수
    회사 = "예시 Inc"

    def __init__(self, name, position):
        # 인스턴스 변수
        self.name = name
        self.position = position

employee1 = Employee("Alice", "소프트웨어 엔지니어")
employee2 = Employee("Bob", "제품 관리자")

print(employee1.company) # 출력: 예시 Inc.
print(employee2.company) # 출력: 예시 Inc.


이 예제에서 company는 클래스 변수이고 name과 position은 인스턴스 변수입니다. 회사 변수는 Employee 클래스의 모든 인스턴스가 공유하므로 employee1과 employee2 모두 회사 값이 동일합니다.

클래스 변수의 값을 수정하려면 클래스 이름 뒤에 변수 이름을 사용하면 됩니다:

Employee.company = "새 예시 Inc."

print(employee1.company) # 출력: 새 예시 Inc.
print(employee2.company) # 출력: 새 예시 Inc.


이 경우 클래스 변수 company를 업데이트하면 새 값이 모든 인스턴스 간에 공유되므로 Employee 클래스의 모든 인스턴스에 영향을 미칩니다.

클래스 변수를 이해하면 클래스의 모든 인스턴스에서 일관성이 있어야 하는 데이터를 저장할 수 있으므로 파이썬에서 클래스를 설계하는 데 필수적입니다.


클레스 메서드

클래스 메서드 또는 정적 메서드라고도 하는 클래스 함수는 클래스의 인스턴스가 아닌 클래스에 속하는 함수입니다. 이러한 메서드는 인스턴스의 상태에 의존하지 않으므로 인스턴스 변수나 메서드에 액세스할 수 없습니다. 대신 클래스 메서드는 클래스 변수와 함께 작동하거나 인스턴스의 상태와 독립적인 작업을 수행합니다.

파이썬에는 클래스 메서드와 정적 메서드라는 두 가지 유형의 클래스 함수가 있습니다. 둘 다 클래스 내에 정의되지만 동작과 사용 사례가 다릅니다:

1. 클래스 메서드
클래스 메서드는 클래스 자체를 첫 번째 인수로 받는 함수로, 보통 cls라는 이름을 가집니다. 클래스 메서드를 정의하려면 메서드 정의 위에 @classmethod 데코레이터를 사용합니다. 클래스 메서드는 클래스 변수에 액세스하고 수정할 수 있으며, 일반적으로 특정 인스턴스가 필요하지 않은 연산에 사용됩니다.

MyClass 클래스:
    class_var = 0

    @classmethod
    def increment_class_var(cls):
        cls.class_var += 1

MyClass.increment_class_var()
print(MyClass.class_var) # 출력: 1


이 예제에서 increment_class_var() 클래스 메서드는 클래스 cls를 첫 번째 인수로 받고 클래스 변수 class_var를 1씩 증가시킵니다.

2. 정적(Static) 메서드
정적 메서드는 클래스나 인스턴스를 첫 번째 인자로 받지 않는 함수입니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 클래스 내에서 정의됩니다. 정적 메서드는 클래스 또는 인스턴스 변수에 직접 액세스하거나 수정할 수 없습니다. 정적 메서드는 인스턴스나 클래스의 상태에 의존하지 않는 유틸리티 함수나 기타 연산에 사용됩니다.

MyClass 클래스:
    @staticmethod
    def utility_function(arg1, arg2):
        return arg1 * arg2

result = MyClass.utility_function(2, 3)
print(result) # 출력: 6


이 예제에서 유틸리티_함수() 정적 메서드는 두 개의 인자 arg1과 arg2를 받아 그 곱을 반환합니다. 이 메서드는 호출할 MyClass의 인스턴스가 필요하지 않으며 인스턴스나 클래스 변수에 액세스하지 않습니다.

클래스 함수를 이해하면 특정 인스턴스나 클래스 상태에 의존하지 않는 메서드를 만들 수 있으므로 파이썬에서 깔끔하고 효율적인 코드를 작성하는 데 중요합니다. 이를 통해 코드를 더 잘 정리하고 유지 관리성을 개선할 수 있습니다.


반응형
반응형

목차

  1. 객체 지향 프로그래밍(Object-Oriented Programming)
  2. 데이터 객체
  3. 정수와 실수 객체
  4. 사용자 정의 객체
  5. 클래스 정의와 사용 예시

객체 지향 프로그래밍(Object-Oriented Programming)

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 함수와 프로시저 대신 '객체'라는 개념을 중심으로 코드를 구성하는 데 중점을 둔 프로그래밍 패러다임입니다. 객체는 클래스의 인스턴스이며, 클래스는 객체의 속성(속성)과 동작(메서드)을 정의하는 청사진입니다. Python은 여러 패러다임 중에서도 객체 지향 프로그래밍을 지원하는 다중 패러다임 언어입니다.

다음은 Python에서 OOP의 주요 개념입니다:

  1. 클래스와 객체
    클래스는 특정 속성과 메서드를 가진 객체를 생성하기 위한 청사진입니다. 객체는 클래스의 인스턴스이며, 각 객체는 고유한 상태(속성)와 동작(메서드)을 가질 수 있습니다. Python에서는 'class' 키워드를 사용하여 클래스를 정의합니다.

  2. 상속
    상속은 클래스가 부모 클래스로부터 속성 및 메서드를 상속하는 기능입니다. 이를 통해 부모 클래스의 일부 또는 모든 기능을 가진 새 클래스를 생성하여 코드의 재사용성과 모듈성을 높일 수 있습니다. Python에서는 클래스 이름 뒤에 괄호 안에 부모 클래스를 지정하여 클래스로부터 상속할 수 있습니다.

  3. 캡슐화
    캡슐화는 데이터(속성)와 데이터를 조작하는 연산(메서드)을 단일 단위인 클래스 안에 묶는 개념입니다. 이를 통해 객체의 내부 상태에 대한 액세스를 제한하여 외부 간섭으로부터 객체를 보호할 수 있습니다. 파이썬에서는 이중 밑줄 접두사(예: __private_attribute)로 표시되는 비공개 속성 및 메서드를 사용하여 캡슐화를 구현할 수 있습니다.

  4. 다형성
    다형성은 서로 다른 객체가 특정 유형에 적합한 방식으로 동일한 메서드 호출에 응답할 수 있는 기능을 말합니다. 이를 통해 단일 인터페이스를 사용하여 다양한 유형의 객체를 표현할 수 있으므로 코드의 유연성과 확장성이 향상됩니다. 파이썬에서 다형성은 종종 메서드 재정의(메서드 재정의는 하위 클래스가 부모 클래스에서 상속된 메서드에 대한 새로운 구현을 제공하는 것)를 통해 달성됩니다.

다음은 Python에서 간단한 클래스 정의의 예입니다:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        print(f"{self.name} 가 짖습니다!")

dog1 = Dog("Fido", 3)
dog2 = Dog("Buddy", 5)

dog1.bark() # 출력: Fido가 짖습니다!
dog2.bark() # 출력: Buddy가 짖습니다!


이 예제에서 Dog는 __init__ 메서드(생성자)와 bark 메서드가 있는 클래스입니다. dog1과 dog2는 각각 고유한 이름과 나이 속성을 가진 Dog 클래스의 인스턴스입니다.


데이터 객체

데이터 객체는 프로그래밍 환경 내에서 실제 엔티티, 개념 또는 구조의 표현입니다. 프로그램에서 데이터를 저장, 처리 또는 관리하는 모든 데이터 구조를 설명하는 데 사용할 수 있는 일반적인 용어입니다. 데이터 객체는 클래스 또는 기본 제공 데이터 유형에서 생성되며, 이와 관련된 속성(속성) 및 메서드(함수)가 있습니다.

프로그래밍 언어에서 데이터 개체는 기본 제공 데이터 유형, 사용자 지정 데이터 유형 또는 클래스의 인스턴스일 수 있습니다. Python에서 기본 제공 데이터 객체의 몇 가지 예로는 문자열, 목록, 사전, 튜플이 있습니다. 이러한 데이터 객체에는 프로그래머가 효과적으로 작업하는 데 도움이 되는 고유한 속성 및 메서드 세트가 있습니다.

다음은 Python의 몇 가지 일반적인 기본 제공 데이터 객체에 대한 간략한 설명입니다:

1. 문자열
문자열은 문자의 시퀀스입니다. 문자열은 불변 데이터 객체이므로 일단 생성되면 내용을 변경할 수 없습니다. 문자열에는 lower(), upper(), replace()와 같은 조작을 위한 몇 가지 기본 제공 메서드가 있습니다.

 

text = "안녕하세요, 세상!"
print(text.lower()) # 출력: 안녕하세요, 세상!


2. 리스트
리스트는 서로 다른 데이터 유형일 수 있는 항목의 정렬된 컬렉션입니다. 리스트는 변경 가능하므로 항목을 추가, 제거 또는 수정할 수 있습니다. 몇 가지 일반적인 목록 메서드에는 append(), remove(), pop()이 있습니다.

numbers = [1, 2, 3, 4, 5]
numbers.append(6)
print(numbers) # 출력: [1, 2, 3, 4, 5, 6]


3. 딕셔너리
딕셔너리는 키-값 쌍의 정렬되지 않은 컬렉션입니다. 키는 고유하며 각 키는 특정 값에 매핑됩니다. 딕셔너리는 가변적이며 keys(), values(), update() 등의 메서드가 있습니다.

student = {'name': 'John', 'age': 25, 'grade': 'A'}
print(student['name']) # 출력: John


4. 튜플
튜플은 정렬된 불변의 항목 컬렉션입니다. 목록과 비슷하지만 일단 튜플이 생성되면 요소를 추가, 제거 또는 수정할 수 없습니다. 튜플은 항목의 불변 순서가 필요할 때 유용합니다.

coordinates = (12.5, 45.6)
print(coordinates[0]) # 출력: 12.5


이러한 기본 제공 데이터 객체는 파이썬 프로그래밍의 기본이며, 이를 이해하면 프로그램에서 데이터를 효과적으로 작업하는 데 도움이 됩니다.


정수와 실수 객체

1. 정수 객체(Integer Objects)

  • 파이썬에서 정수는 양수, 음수 및 0 값(예: -3, 0, 25)을 포함한 정수를 표현하는 데 사용됩니다.
  • 파이썬에서 정수는 시스템 아키텍처에 의해 범위가 결정되는 다른 프로그래밍 언어와 달리 사용 가능한 메모리에 의해서만 제한되어 임의로 커질 수 있습니다.
a = 10
b = -5
c = 0
sum_ab = a + b # 덧셈을 실행하며 결과는 5입니다.
product_ab = a * b # 곱셈을 실행하며, 결과는 -50입니다.


2. 실수 객체(Float Objects)

  • 파이썬의 실수는 분수 성분이나 소수점(예: 2.5, -0.1, 3.0)이 포함된 실수를 표현하는 데 사용됩니다.
  • 파이썬 부동 소수점은 정밀도, 범위 및 내부 표현을 정의하는 IEEE 754 부동 소수점 표준을 따릅니다.
  • 정밀도가 제한되어 있기 때문에 부동 소수점 숫자는 산술 연산을 실행할 때 작은 반올림 오류가 발생할 수 있습니다.
x = 3.14
y = -0.75
z = 1.0
sum_xy = x + y # 덧셈 실행, 결과 2.39
product_xy = x * y # 곱셈을 실행하며, 결과는 -2.355입니다.


정리하면, 파이썬은 정수와 소수점이 있는 실수를 각각 나타내는 정수 객체와 실수 객체를 모두 기본으로 지원합니다. 이러한 숫자 유형은 다양한 산술 연산에 사용할 수 있으며 애플리케이션의 요구 사항에 따라 다양한 사용 사례에 적합합니다.


사용자 정의 객체

사용자 정의 객체라고도 하는 사용자 정의 객체는 Python과 같은 프로그래밍 언어에서 직접 생성하는 클래스의 인스턴스입니다. 사용자 정의 객체는 자신만의 데이터 구조를 만들고 속성(속성)과 동작(메서드)을 정의할 수 있는 방법을 제공하여 코드를 보다 체계적이고 모듈화하며 유지 관리하기 쉽게 만들어 줍니다. 사용자 지정 객체는 객체 지향 프로그래밍의 원칙에 따라 단일 엔티티 내에 데이터와 기능을 캡슐화하는 수단을 제공합니다.

다음은 사용자 지정 객체의 몇 가지 예시입니다.

1. 클래스(Classes): 사용자 지정 개체를 만들려면 개체의 청사진인 클래스를 정의해야 합니다. 클래스는 객체가 가질 속성(데이터 멤버)과 메서드(함수)를 지정합니다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        print(f"제 이름은 {self.name}이고 {self.age}세입니다.")


2. 인스턴스화(Instantiation): 클래스를 정의한 후에는 클래스를 함수처럼 호출하여 클래스의 인스턴스(객체)를 만들 수 있습니다. 각 객체는 고유한 속성 및 메서드 집합을 가진 별도의 인스턴스입니다.

person1 = Person("Alice", 30)
person2 = Person("Bob", 25)


3. 어트리뷰트(Attributes): 어트리뷰트는 객체와 연관된 변수로, 해당 인스턴스에 특정한 데이터를 저장하는 데 사용됩니다. 위의 예에서 Person 클래스에는 name과 age라는 두 가지 속성이 있습니다.

4. 메서드(Methods): 메서드는 일반적으로 객체의 속성에 대한 작업을 수행하거나 다른 객체와 상호 작용하는 클래스 내에 정의된 함수입니다. 위의 예에서 소개(introduce) 메서드는 사람의 이름과 나이를 인쇄하는 간단한 함수입니다.

5. 생성자(Constructors): 생성자는 객체가 인스턴스화될 때 호출되는 특수 메서드입니다. 파이썬에서 생성자의 이름은 '__init__'입니다. 이 함수는 주어진 인수를 사용하여 객체의 속성을 초기화합니다.

6. 상속(Inheritance): 사용자 지정 객체는 다른 클래스의 속성 및 메서드를 상속할 수 있으므로 코드를 재사용하고 코드 구조를 보다 체계적으로 구성할 수 있습니다.


클래스 정의와 사용 예시

파이썬에서 클래스는 클래스의 인스턴스인 객체를 생성하기 위한 청사진입니다. 클래스는 클래스의 객체가 가져야 하는 속성(속성)과 메서드(함수)를 정의합니다. Python은 객체 지향 프로그래밍 언어이며, 클래스는 코드를 구성하고 프로그래밍 환경 내에서 실제 엔티티, 개념 또는 구조를 표현하는 데 기본이 됩니다.

다음은 Python의 클래스와 관련된 주요 개념입니다.

1. 클래스 정의하기
'class' 키워드 뒤에 클래스 이름을 사용하여 클래스를 정의합니다. 클래스 이름은 일반적으로 대문자로 시작합니다.

class MyClass:
    pass


2. 어트리뷰트와 메서드
어트리뷰트는 객체에 속하는 속성이고 메서드는 객체에 대해 작업을 실행하거나 객체의 속성을 조작하는 함수입니다. 파이썬에서는 클래스 본문 내에서 어트리뷰트와 메서드를 정의합니다.

class Dog:
    # 클래스 어트리뷰트
    species = "Canis lupus familiaris"

    # 인스턴스 메서드
    def __init__(self, name, age):
        self.name = name # 인스턴스 어트리뷰트
        self.age = age # 인스턴스 속성

    # 인스턴스 메서드
    def bark(self):
        print(f"{self.name} barks!")


3. 생성자
생성자는 객체가 생성될 때 객체의 속성을 초기화하는 __init__라는 특수 메서드입니다. Python에서는 def 키워드 뒤에 __init__를 사용하여 생성자를 정의합니다. 이 메서드는 클래스에서 객체가 생성될 때 자동으로 호출됩니다.

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = 나이


4. 객체(인스턴스) 생성하기
클래스에서 객체를 생성하려면 클래스를 함수처럼 호출하고 생성자에 필요한 인수를 제공하면 됩니다.

dog1 = Dog("Fido", 3)
dog2 = Dog("Buddy", 5)


5. 어트리뷰트 및 메서드 접근하기
객체의 어트리뷰트에 액세스하거나 메서드를 호출하려면 객체 이름과 함께 점 표기법을 사용합니다.

print(dog1.name) # 출력: Fido
dog2.bark() # 출력: Buddy barks!


파이썬에서 클래스를 이해하는 것은 코드를 구성하고 객체로 효과적으로 작업하는 데 필수적입니다. 클래스를 사용하면 재사용 가능한 모듈식 코드를 작성할 수 있어 유지 관리와 확장이 더 쉬워집니다.


반응형

'Python > Python 기본' 카테고리의 다른 글

[Python] 클래스 응용법(2)  (0) 2023.05.07
[Python] 클래스 응용법  (0) 2023.05.07
[Python] 텍스트(Text), 바이너리(Binary) 데이터  (0) 2023.05.07
[Python] 패키지란?  (0) 2023.05.06
[Python] 모듈이란?  (0) 2023.05.06
반응형

목차

  1. 텍스트(Text) 데이터
  2. 바이너리(Binary) 데이터
  3. 텍스트, 바이너리 데이터 특징 요약
  4. 인코딩과 디코딩 목적과 특징

텍스트(Text) 데이터

텍스트 데이터는 사람이 읽을 수 있는 문자를 사용하여 표현되는 데이터를 말하며, 일반적으로 ASCII 또는 유니코드와 같은 형식으로 저장됩니다. 텍스트 데이터는 특수한 도구나 프로그램 없이도 사람이 읽고, 쓰고, 이해할 수 있는 정보를 저장하고 전송하는 데 사용됩니다.

텍스트 데이터의 일반적인 특징은 다음과 같습니다.

  1. 일반 텍스트 파일: 서식이나 스타일 정보 없이 사람이 읽을 수 있는 문자만 포함된 파일입니다. 이러한 파일의 확장자는 .txt, .md 또는 .csv와 같은 경우가 많습니다.
  2. 소스 코드: 프로그래밍 언어는 사람이 읽을 수 있는 텍스트를 사용하여 작성되며, 나중에 컴퓨터가 컴파일하거나 해석하여 지침을 실행합니다.
  3. HTML 및 XML: 텍스트 기반 구문을 사용하여 문서 또는 데이터 파일의 콘텐츠를 구조화하고 설명하는 마크업 언어입니다.
  4. JSON 및 YAML: 데이터 직렬화 및 저장에 사용되는 텍스트 기반 데이터 형식으로, 바이너리 형식보다 사람이 더 쉽게 읽을 수 있습니다.

Python과 같은 프로그래밍 언어로 텍스트 데이터로 작업할 때 내장 함수나 라이브러리를 사용하여 텍스트를 읽고, 쓰고, 조작할 수 있습니다. 예를 들어, 'r'(읽기) 또는 'w'(쓰기) 모드와 함께 open() 함수를 사용하여 텍스트 파일을 읽거나 쓸 수 있습니다.

# 파일에서 텍스트 데이터 읽기
with open('example.txt', 'r') as file:
    text_data = file.read()

# 파일에 텍스트 데이터 쓰기
with open('output.txt', 'w') as file:
    file.write(text_data)


텍스트 데이터를 처리하거나 조작하려면 프로그래밍 언어에서 사용할 수 있는 문자열 조작 메서드를 사용하거나 정규식 일치, 텍스트 구문 분석 또는 자연어 처리와 같은 작업을 위한 특수 라이브러리(예: 정규식 일치의 경우 re, HTML 구문 분석의 경우 BeautifulSoup, Python의 자연어 처리의 경우 nltk)를 사용할 수 있습니다.

요약하자면, 텍스트 데이터는 사람이 읽을 수 있는 문자를 사용하여 정보를 표현한 것으로, 사람이 쉽게 읽고 이해할 수 있는 정보를 저장하고 전송하는 데 적합합니다. 텍스트 데이터로 작업할 때는 기본 제공 함수, 라이브러리 또는 모듈을 사용하여 특정 필요에 따라 데이터를 읽고, 쓰고, 처리할 수 있습니다.


바이너리(Binary) 데이터

바이너리 데이터는 0과 1(비트)의 시퀀스로 구성된 이진 형식으로 표현된 데이터를 말합니다. 사람이 읽을 수 있는 텍스트 데이터와 달리 바이너리 데이터는 컴퓨터가 내부적으로 데이터를 저장하고 처리하는 방식에 더 가까운 보다 간결하고 낮은 수준의 표현이기 때문에 컴퓨터에서 정보를 효율적으로 저장하고 처리하는 데 자주 사용됩니다.

바이너리 데이터의 몇 가지 일반적인 특징은 다음과 같습니다.

  1. 실행 파일: 컴퓨터 프로세서에서 실행할 수 있는 기계 코드 명령어가 포함된 바이너리 파일입니다.
    이미지, 오디오 및 비디오 파일: JPEG 이미지, MP3 오디오 파일, MP4 동영상 파일과 같은 파일은 공간을 절약하고 효율적인 처리를 위해 바이너리 형식으로 저장됩니다.
  2. 직렬화된 데이터: 객체, 목록, 사전과 같은 복잡한 데이터 구조가 저장 또는 전송을 위해 바이너리 형식으로 변환(직렬화)되면 결과 데이터는 바이너리가 됩니다.
  3. 바이너리 데이터 파일: 일부 애플리케이션은 파일 크기를 최소화하고 데이터 액세스 속도를 최적화하기 위해 데이터를 바이너리 형식으로 직접 저장할 수 있습니다.

Python과 같은 프로그래밍 언어에서 바이너리 데이터로 작업할 때는 일반적으로 바이너리 데이터를 처리하도록 설계된 특정 함수나 라이브러리를 사용합니다. 예를 들어, 'rb'(바이너리 읽기) 또는 'wb'(바이너리 쓰기) 모드와 함께 open() 함수를 사용하여 바이너리 파일을 읽거나 쓸 수 있습니다:

# 파일에서 바이너리 데이터 읽기
with open('example.bin', 'rb') as file:
    binary_data = file.read()

# 파일에 바이너리 데이터 쓰기
with open('output.bin', 'wb') as file:
    file.write(binary_data)


또한 Python에서 직렬화를 위한 피클이나 이미지, 오디오 또는 비디오 처리를 위한 특수 라이브러리(예: 이미지용 PIL, 과학 데이터용 numpy)와 같이 작업 중인 특정 바이너리 형식을 처리할 수 있는 라이브러리 또는 모듈을 사용해야 할 수도 있습니다.

요약하자면, 바이너리 데이터는 컴퓨터에서 효율적으로 저장하고 처리할 수 있도록 0과 1의 시퀀스를 사용하여 정보를 표현한 것입니다. 실행 파일, 멀티미디어 파일, 직렬화된 데이터, 애플리케이션별 바이너리 데이터 파일 등 다양한 유형의 데이터에 일반적으로 사용됩니다. 바이너리 데이터로 작업할 때는 데이터를 올바르게 읽고, 쓰고, 처리하기 위해 적절한 함수, 라이브러리 또는 모듈을 사용해야 합니다.텍스트 데이터와 바이너리 데이터는 모두 디지털 형식의 데이터이지만, 서로 다른 특징이 있습니다. 각 데이터 유형의 특징은 다음과 같습니다.


텍스트, 바이너리 데이터 특징 요약

I. 텍스트 데이터

  1. 사람이 읽을 수 있습니다.
    텍스트 데이터는 특별한 도구나 프로그램 없이도 사람이 쉽게 이해할 수 있는 문자 시퀀스로 구성됩니다.

  2. 인코딩
    텍스트 데이터는 일반적으로 문자를 이진 데이터(바이트 시퀀스)로 표현하기 위해 ASCII, UTF-8 또는 UTF-16과 같은 문자 인코딩 스키마를 사용하여 저장 및 전송됩니다.

  3. 표준 텍스트 조작
    텍스트 데이터는 대부분의 프로그래밍 언어에서 사용할 수 있는 내장 문자열 조작 함수 및 라이브러리를 사용하여 처리할 수 있습니다.

  4. 저장 효율성이 떨어짐
    텍스트 데이터는 일반적으로 이진 데이터보다 저장 효율이 떨어지며, 특히 큰 숫자 값이나 복잡한 데이터 구조를 나타낼 때 더욱 그렇습니다.

  5. 이식성
    텍스트 데이터는 텍스트 편집기를 사용하여 쉽게 열고 편집하거나 다양한 프로그래밍 언어로 처리할 수 있기 때문에 여러 시스템 간에 이식성이 더 뛰어납니다.

  6. 예시
    텍스트 파일(.txt), 소스 코드, 마크업 언어(HTML, XML), 사람이 읽을 수 있는 데이터 직렬화 형식(JSON, YAML).

II. 바이너리 데이터

  1. 기계가 읽을 수 있습니다.
    바이너리 데이터는 특수 도구나 프로그램 없이 사람이 쉽게 이해할 수 없는 바이트 시퀀스로 구성됩니다.

  2. 직접 표현
    바이너리 데이터는 컴퓨터가 정보를 저장하고 처리하는 기본 형식이므로 문자 인코딩 변환이 필요하지 않습니다.

  3. 특정 조작이 필요
    바이너리 데이터를 처리하려면 일반적으로 원시 바이트 시퀀스 또는 비트 수준 연산을 처리해야 하므로 특수 함수나 라이브러리가 필요합니다.

  4. 효율적인 저장
    바이너리 데이터는 일반적으로 텍스트 데이터보다 저장에 더 효율적이며, 특히 큰 숫자 값이나 복잡한 데이터 구조를 나타낼 때 더욱 그렇습니다.

  5. 이식성이 떨어짐
    이진 데이터는 엔디안이나 보편적으로 지원되지 않는 특정 파일 형식과 같은 문제가 발생할 수 있으므로 여러 시스템 간에 이식성이 떨어집니다.

  6. 예시
    실행 파일, 이미지(JPEG, PNG), 오디오 파일(MP3, WAV), 동영상 파일(MP4, AVI), 바이너리 데이터 직렬화 형식(프로토콜 버퍼, MessagePack).

인코딩과 디코딩 목적과 특징

I. 인코딩

  1. 인코딩 목적
    인코딩은 데이터를 다른 형식이나 표현으로 변환하여 저장, 전송 또는 처리와 같은 특정 목적에 더 적합하도록 만드는 프로세스입니다.

  2. 무손실 인코딩과 손실 인코딩
    인코딩은 무손실(모든 원본 정보 유지) 또는 손실(압축 개선 또는 단순성을 대가로 일부 정보 손실)일 수 있습니다.

  3. 인코딩을 통한 압축
    일부 인코딩 체계는 데이터 크기를 줄여 저장 및 전송 효율성을 높이는 것을 목표로 합니다.

  4. 인코딩 체계의 오류 감지 및 수정
    특정 인코딩 체계는 전송 또는 저장 중에 데이터 신뢰성과 무결성을 향상시키기 위해 오류 감지 또는 수정 메커니즘을 통합합니다.

  5. 문자 인코딩
    문자 인코딩에는 특정 문자 인코딩 체계(예: ASCII, UTF-8, UTF-16)를 기반으로 텍스트(문자 시퀀스)를 이진 데이터(바이트 시퀀스)로 변환하는 작업이 포함됩니다.

  6. 멀티미디어 인코딩
    멀티미디어 응용 프로그램에서 인코딩은 원시 멀티미디어 데이터를 압축 또는 표준화된 형식(예: 이미지용 JPEG, 오디오용 MP3, 비디오용 H.264)으로 변환하여 효율적인 저장 및 전송을 용이하게 합니다.

  7. 암호화 인코딩
    암호화에서 인코딩(암호화)은 암호화 알고리즘과 비밀 키를 사용하여 데이터(평문)를 읽을 수 없는 형식(암호문)으로 변환하여 데이터의 기밀성을 보호합니다.

II. 디코딩

  1. 디코딩의 목적
    디코딩은 인코딩된 데이터를 원래 형식으로 다시 변환하여 추가 사용 또는 해석을 허용하는 프로세스입니다.

  2. 무손실 대 손실 디코딩
    디코딩은 무손실(원래 데이터를 완전히 복구) 또는 손실(손실 인코딩이 사용된 경우 원본 데이터의 근사값 검색)일 수 있습니다.

  3. 디코딩을 통한 압축 해제
    디코딩은 압축 과정을 반대로 하여 압축된 표현에서 원본 데이터를 재구성합니다.

  4. 디코딩 프로세스의 오류 감지 및 수정
    오류 감지 또는 수정 메커니즘을 활용하는 디코딩 프로세스는 오류를 식별하고 수정하여 데이터의 신뢰성과 무결성을 향상시킬 수 있습니다.

  5. 문자 디코딩
    문자 디코딩에는 동일한 문자 인코딩 체계를 사용하여 이진 데이터(바이트 시퀀스)를 다시 텍스트(문자 시퀀스)로 변환하는 작업이 포함됩니다.

  6. 멀티미디어 디코딩
    멀티미디어 디코딩 프로세스는 재생 또는 추가 처리를 위해 압축되거나 표준화된 멀티미디어 형식(예: JPEG, MP3, H.264)을 원시 멀티미디어 데이터로 다시 변환합니다.

  7. 암호화 해독
    암호화에서 해독(암호 해독)은 적절한 암호 해독 알고리즘과 비밀 키를 사용하여 암호문을 일반 텍스트로 다시 변환하여 데이터를 읽고 사용할 수 있도록 하는 것입니다.
반응형

'Python > Python 기본' 카테고리의 다른 글

[Python] 클래스 응용법  (0) 2023.05.07
[Python] 클래스 기본 개념과 클래스 사용법  (0) 2023.05.07
[Python] 패키지란?  (0) 2023.05.06
[Python] 모듈이란?  (0) 2023.05.06
[Python] 2. 외부 모듈 세부 사항  (0) 2023.05.06
반응형

목차

  • 모듈이란?
    1. 모듈의 정의
    2. 모둘 생성
    3. __name__
    4. if __name__ == "__main__":
  • 패키지란?
    1. 엔트리 포인트(entry point)
    2. 패키지
    3. 패키지 관리 시스템
    4. 패키지 생성

엔트리 포인트(entry point)

엔트리 포인트(entry point)는 프로그램이 실행될 때 실행되는 첫 번째 코드 줄입니다. main 함수 또는 'main'은 종종 많은 프로그래밍 언어에서 엔트리 포인트(entry point) 역할을 합니다. 그러나 Python에는 C, C++ 또는 Java와 같은 다른 프로그래밍 언어와 같은 기본 제공 main 기능이 없습니다.

대신 Python은 특수 변수 __name__을 사용하여 스크립트가 기본 프로그램으로 실행되고 있는지 또는 다른 스크립트에 모듈로 가져오고 있는지를 결정합니다. Python 스크립트가 실행될 때 스크립트가 기본 프로그램으로 실행되는 경우 인터프리터는 __name__ 변수를 "__main__"으로 설정합니다. 이 경우 스크립트의 엔트리 포인트(entry point)는 if __name__ == "__main__": 블록 다음 코드의 첫 번째 줄입니다.

Python 스크립트의 일반적인 패턴은 프로그램의 기본 논리를 포함하는 main() 함수를 정의한 다음 if __name__ == "__main__": 블록을 사용하여 스크립트가 실행될 때 해당 함수를 호출하는 것입니다. 메인 프로그램으로. 예를 들면 다음과 같습니다.

def main():
    print("This is the main function of the script.")

def another_function():
    print("This is another function.")

if __name__ == "__main__":
    main()


이 예제에서 main() 함수는 메인 프로그램으로 실행될 때 스크립트의 엔트리 포인트(entry point) 역할을 합니다. 스크립트를 모듈로 가져오면 main() 함수가 자동으로 실행되지 않지만 필요한 경우 명시적으로 호출할 수 있습니다.

이러한 방식으로 코드를 구성하면 모듈로 가져올 때 실행되는 코드와 프로그램의 기본 논리를 분리하여 스크립트를 더 모듈화하고 이해하기 쉽게 만들 수 있습니다.


패키지

패키지(package)는 파이썬의 모듈을 구조화하고 조직화하는 데 사용되는 방법입니다. 패키지는 여러 모듈을 하나의 디렉토리에 그룹화하여 관리할 수 있게 합니다. 이를 통해 복잡한 프로젝트를 더 간결하게 관리하고, 다른 프로젝트에서 패키지를 재사용하기 쉽게 만듭니다.

패키지를 생성하는 방법은 다음과 같습니다.

1. 패키지 디렉토리 생성
먼저 패키지를 포함할 디렉토리를 생성합니다. 예를 들어, my_package라는 이름의 디렉토리를 생성할 수 있습니다.

2. __init__.py 파일 생성
패키지 디렉토리에 __init__.py 파일을 생성합니다. 이 파일은 패키지가 로드될 때 초기화 코드를 실행할 수 있도록 합니다. 또한 이 파일이 있어야 파이썬이 해당 디렉토리를 패키지로 인식합니다. 이 파일은 비워 둘 수도 있습니다.

3. 패키지에 모듈 추가
패키지 디렉토리에 모듈 파일(.py 파일)을 추가합니다. 예를 들어, my_package 디렉토리에 module1.py, module2.py와 같은 모듈을 추가할 수 있습니다.

4. 패키지 구조 예시

my_package/
    __init__.py
    module1.py
    module2.py


5. 패키지를 사용하는 방법

# 다른 파이썬 코드에서 패키지 사용
import my_package.module1
import my_package.module2

# 또는
from my_package import module1, module2

# 모듈 내 함수 사용 예시
result = my_package.module1.some_function()


패키지를 사용하면 여러 모듈을 하나의 디렉토리로 묶어 관리할 수 있으며, 관련된 기능을 한 곳에서 관리할 수 있어 프로젝트 구조를 더욱 체계적으로 만들 수 있습니다.


패키지 관리 시스템

Python은 pip(Pip Installs Packages)라는 패키지 관리 시스템을 사용하여 타사 패키지 또는 라이브러리를 설치하고 관리합니다. pip는 Python의 기본 패키지 관리자이며 Python 3.4부터 Python 설치와 함께 번들로 제공됩니다.

pip를 사용하면 무엇보다도 패키지를 검색하고 패키지를 설치, 제거 및 업데이트할 수 있습니다. Python Package Index(PyPI)를 기본 리포지토리로 사용하여 패키지를 찾고 다운로드합니다. PyPI는 커뮤니티에서 기여한 방대한 Python 패키지 모음이며 대부분의 Python 패키지에 대한 중앙 리포지토리 역할을 합니다.

다음은 pip와 함께 사용할 수 있는 몇 가지 기본 명령입니다.

1. 패키지 설치

pip install package_name


2. 패키지 제거

pip uninstall package_name


3. 패키지 업그레이드

pip install --upgrade package_name


4. 설치된 패키지 나열

pip list


5. 패키지 검색

pip search package_name


6. 패키지 정보 표시

pip show package_name


pip를 사용하려면 시스템에 Python이 설치되어 있어야 하며 명령 프롬프트, 터미널 또는 셸에서 pip를 사용할 수 있어야 합니다. 시스템 전체에 패키지를 설치하려면 관리자 또는 루트 권한이 필요할 수 있습니다. 또는 가상 환경을 사용하여 시스템 Python 설치에 영향을 주지 않고 특정 프로젝트에 대한 패키지를 설치할 수 있습니다.


패키지 생성

Python 패키지를 만드는 것은 코드를 정리하고 공유할 수 있는 좋은 방법입니다. 다음은 간단한 패키지를 만드는 단계별 가이드입니다.

1. 패키지 이름을 선택하고 디렉토리 구조를 만듭니다.
패키지를 설명할 수 있는 고유한 이름을 선택합니다. 이 예에서는 my_package를 사용하겠습니다. 같은 이름의 디렉터리를 만든 다음 그 안에 my_package라는 하위 디렉터리를 만듭니다.

my_package/
    my_package/


2. __init__.py 파일을 추가합니다.
__init__.py 파일은 디렉터리를 파이썬 패키지로 표시하여 인터프리터가 이를 모듈로 취급할 수 있도록 하는 데 사용됩니다. my_package 하위 디렉토리에 빈 __init__.py 파일을 추가합니다.

my_package/
    my_package/
        __init__.py


3. 코드를 추가합니다.
이제 Python 코드 파일(모듈)을 my_package 하위 디렉터리에 추가합니다. 이 예제에서는 say_hello 함수가 있는 간단한 hello.py 모듈을 추가하겠습니다.


hello.py:

def say_hello(name):
    print(f"안녕하세요, {이름}!")


이제 패키지 구조가 다음과 같이 보일 것입니다.

my_package/
    my_package/
        __init__.py
        hello.py


4. (선택 사항) README.md 파일을 추가합니다.
패키지 루트 디렉터리에 README.md 파일을 포함하는 것이 좋습니다. 이 파일에는 패키지에 대한 설명, 목적, 사용 방법이 포함되어야 합니다.

5. (선택 사항) LICENSE 파일을 추가합니다.
패키지 루트 디렉터리에 LICENSE 파일을 포함시켜 코드를 사용, 수정 및 배포할 수 있는 조건을 지정해야합니다.

6. (선택 사항) setup.py 파일을 추가합니다.
패키지를 배포하려는 경우(예: PyPI에 업로드) 패키지 루트 디렉터리에 setup.py 파일을 생성해야합니다. 이 파일은 패키지에 대한 메타데이터와 설치 지침을 제공합니다.

기본 setup.py 파일은 다음과 같습니다.

from setuptools import setup, find_packages

setup(
    name="my_package",
    version="0.1.0",
    packages=find_packages(),
    install_requires=[],
)


이 과정을 통해 간단한 Python 패키지를 만들었습니다. 이제 패키지 루트 디렉터리를 PYTHONPATH에 추가하거나 pip로 설치하여 다른 Python 프로젝트에서 이 패키지를 사용할 수 있습니다. 배포 가능한 패키지를 만들려면 setuptools를 사용하여 소스 배포 또는 휠 배포를 생성한 다음 다른 사람이 pip를 사용하여 설치할 수 있습니다. 이렇게 하려면 터미널에서 다음 명령을 실행합니다.

# 설치도구 및 휠 설치(아직 설치되지 않은 경우)
pip install setuptools wheel

# 패키지 배포를 생성합니다(.tar.gz 및 .whl 파일 생성).
python setup.py sdist bdist_wheel


이제 프로젝트에서 사용하거나 다른 사람들과 공유하거나 PyPI와 같은 패키지 리포지토리를 통해 배포할 수 있는 Python 패키지가 생겼습니다. 패키지를 더욱 유용하고 유지 관리하기 쉽게 만들려면 깔끔하고 잘 문서화되고 테스트된 코드를 작성하기 위한 모범 사례를 따르는 것을 잊지 말아야합니다.

반응형
반응형

목차

  • 모듈이란?
    1. 모듈의 정의
    2. 모둘 생성
    3. __name__
    4. if __name__ == "__main__":
  • 패키지란?
    1. 패키지
    2. 엔트리 포인트(entry point)
    3. 패키지 관리 시스템
    4. 패키지 생성

모듈의 정의

Python에서 모듈은 일반적으로 함수, 클래스, 변수로 구성된 Python 코드를 포함하는 파일로, 다른 Python 스크립트에서 가져와서 사용할 수 있습니다. 모듈은 코드를 더 작은 독립된 조각으로 나누어 정리하고 재사용하는 방법입니다. 모듈을 사용하면 코드를 복제하지 않고도 여러 스크립트나 프로젝트에서 기능을 공유할 수 있으므로 유지 관리와 업데이트가 더 쉬워집니다.

모듈의 주요 목적은 코드 재사용성, 모듈성 및 유지보수성을 가능하게 하는 것입니다. 모듈을 가져오면 해당 모듈의 모든 함수, 클래스, 변수에 액세스할 수 있으므로 자체 스크립트에서 사용할 수 있습니다.

모듈은 파일명으로 식별되며 Python 모듈의 파일 확장자는 .py입니다. 스크립트에서 모듈을 사용하려면 파일 확장자 없이 모듈 이름 뒤에 import 문을 사용해야 합니다. 예를 들어 example_module.py라는 이름의 모듈이 있는 경우 다음과 같이 스크립트로 가져올 수 있습니다:

import example_module


모듈을 가져온 후에는 모듈 이름 앞에 점 하나를 붙여서 모듈의 함수, 클래스, 변수를 사용할 수 있습니다. 예를 들어

result = example_module.some_function()


모듈에서 특정 함수나 클래스를 가져오려면 from 키워드를 사용하거나, 편의를 위해 모듈이나 그 멤버에 별칭을 지정하려면 as 키워드를 사용할 수도 있습니다.


모둘 생성

Python에서 모듈은 간단하게 만들 수 있습니다. 모듈은 기본적으로 파이썬 코드가 저장된 .py 파일입니다. 이 파일에 함수, 클래스, 변수 등을 정의하면 다른 파이썬 코드에서 이 모듈을 사용할 수 있습니다. 다음은 모듈을 만드는 방법과 예시입니다.

1. 모듈 파일 생성
먼저 새로운 .py 파일을 만들어 봅시다. 예를 들어, mymodule.py라는 이름으로 파일을 생성할 수 있습니다.

2. 모듈에 코드 추가
mymodule.py 파일에 함수, 클래스, 변수 등을 정의합니다.

예시:

# mymodule.py

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

def subtract(a, b):
    return a - b

pi = 3.141592


위의 예시에서는 두 개의 함수(add, subtract)와 하나의 변수(pi)를 정의했습니다.

3. 다른 파이썬 코드에서 모듈 사용
이제 다른 파이썬 코드에서 mymodule.py를 사용할 수 있습니다. import 문을 사용하여 모듈을 불러올 수 있습니다.
예시:

# main.py

import mymodule

result1 = mymodule.add(1, 2)
print(result1)  # 출력: 3

result2 = mymodule.subtract(5, 3)
print(result2)  # 출력: 2

print(mymodule.pi)  # 출력: 3.141592


위의 예시에서는 main.py 파일에서 mymodule을 import하여 정의된 함수와 변수를 사용했습니다.

모듈을 만들고 사용하는 방법은 이처럼 간단하며, 코드를 재사용하고 조직화하는 데 도움이 됩니다. 다양한 기능을 모듈별로 분리하여 관리하면 유지 보수성도 향상됩니다.


__name__

Python에서 특수 변수 __name__은 Python 스크립트가 기본 프로그램으로 실행되는지 또는 다른 스크립트에 모듈로 가져오는지 결정하는 데 사용됩니다. Python 스크립트가 실행될 때 스크립트가 기본 프로그램으로 실행되는 경우 인터프리터는 __name__ 변수를 "__main__"으로 설정합니다. 스크립트를 다른 스크립트에 모듈로 가져오는 경우 __name__ 변수는 스크립트 이름으로 설정됩니다(.py 확장자 없음).

이는 스크립트가 모듈로 가져올 때가 아니라 기본 프로그램으로 실행될 때만 실행되어야 하는 일부 코드를 스크립트에 포함하려는 경우에 유용합니다. 예를 들면 다음과 같습니다.

def my_function():
    print("This is my function.")

if __name__ == "__main__":
    print("This script is being run as the main program.")
    my_function()
else:
    print("This script is being imported as a module.")


이 예에서 if __name__ == "__main__": 블록 내부의 print 문과 my_function()에 대한 호출은 스크립트가 기본 프로그램으로 실행될 때만 실행됩니다. 스크립트를 모듈로 가져오면 print 문과 함수 호출을 건너뛰고 else 블록만 실행합니다.


if __name__ == "__main__"

if __name__ == "__main__":은 스크립트가 기본 프로그램으로 실행되는지 또는 다른 스크립트에 모듈로 가져오는지 결정하는 데 사용되는 일반적인 Python 관용구입니다. 이렇게 하면 스크립트를 모듈로 가져올 때 실행되는 코드에서 프로그램의 기본 논리를 분리할 수 있습니다.

Python 스크립트가 실행될 때 스크립트가 기본 프로그램으로 실행되는 경우 인터프리터는 __name__ 변수를 "__main__"으로 설정합니다. 스크립트를 다른 스크립트에 모듈로 가져오는 경우 __name__은 스크립트 이름(파일 확장자 없음)으로 설정됩니다.

if __name__ == "__main__":을 사용하는 방법은 다음과 같습니다.

1. main() 함수 또는 프로그램의 기본 논리를 캡슐화하는 유사한 함수를 정의합니다.

def main():
    print("This is the main function of the script.")


2. 스크립트의 일부인 다른 함수나 클래스를 작성합니다.

def another_function():
    print("This is another function.")


3. 스크립트 끝에 if __name__ == "__main__": 블록을 추가하고 main() 함수 또는 1단계에서 정의한 함수를 호출합니다.

if __name__ == "__main__":
    main()


스크립트를 메인 프로그램으로 실행하면 main() 함수가 실행되고 "This is the main function of the script"라는 출력이 표시됩니다. 스크립트를 모듈로 다른 스크립트로 가져오면 main() 함수가 자동으로 실행되지 않지만 필요한 경우 여전히 명시적으로 호출할 수 있습니다.

if __name__ == "__main__":을 사용하면 스크립트의 기본 논리가 기본 프로그램으로 실행될 때만 실행되도록 할 수 있습니다. 이렇게 하면 코드를 보다 효과적으로 구성하고 모듈식으로 만들 수 있습니다. 이해하기 쉽습니다.


반응형