no image
[Python Flask] 가상환경 생성하고 진입하기
목차 Python 가상환경 가상 환경을 따로 생성하는 이유 venv를 통해 가상환경 생성하기 가상 환경에 진입하기 mac OS에서 가상환경 진입하기 플라스크 모듈 다운로드하기 Python 가상환경 Python 가상 환경은 자체 라이브러리 및 종속성 세트와 함께 특정 Python 설치가 포함된 독립된 디렉토리입니다. 이를 통해 서로 간섭하지 않고 각각 고유한 버전의 Python과 설치된 패키지가 있는 서로 다른 프로젝트에 대해 격리된 환경을 만들 수 있습니다. Python 가상 환경의 주요 특징 격리 가상 환경은 특정 프로젝트에 특정한 패키지 및 종속성을 설치할 수 있는 샌드박스 환경을 제공합니다. 이러한 격리를 통해 한 가상 환경에 설치된 패키지가 다른 가상 환경의 패키지와 충돌하지 않도록 하여 종속성을..
2023.05.12
[Python Flask] 플라스크란?
목차 플라스크(Flask) 플라스크 사용을 위한 툴 다운로드 플라스크(Flask) 플라스크는 파이썬으로 작성된 마이크로 웹 프레임워크입니다. 2010년에 Armin Ronacher가 오픈 소스 프로젝트로 만들었습니다. Flask는 웹 애플리케이션을 구축하는 데 필요한 핵심 기능을 제공하는 데 중점을 둔 단순하고 미니멀한 디자인으로 유명합니다. 특정 도구나 라이브러리를 강요하지 않는다는 점에서 '마이크로'라는 원칙을 따르며, 개발자가 원하는 구성 요소를 선택하고 통합할 수 있습니다. 특징 가볍고 쉽게 시작할 수 있습니다 Flask는 가볍고 코드베이스가 작도록 설계되었습니다. 간단하고 직관적인 API를 갖추고 있어 개발자가 웹 애플리케이션 구축을 빠르게 시작할 수 있습니다. 라우팅 및 URL 매핑 Flask..
2023.05.12
[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
반응형

목차

  1. Python 가상환경
  2. 가상 환경을 따로 생성하는 이유
  3. venv를 통해 가상환경 생성하기
  4. 가상 환경에 진입하기
    • mac OS에서 가상환경 진입하기
  5. 플라스크 모듈 다운로드하기

Python 가상환경

Python 가상 환경은 자체 라이브러리 및 종속성 세트와 함께 특정 Python 설치가 포함된 독립된 디렉토리입니다. 이를 통해 서로 간섭하지 않고 각각 고유한 버전의 Python과 설치된 패키지가 있는 서로 다른 프로젝트에 대해 격리된 환경을 만들 수 있습니다.

  • Python 가상 환경의 주요 특징
    1. 격리
      가상 환경은 특정 프로젝트에 특정한 패키지 및 종속성을 설치할 수 있는 샌드박스 환경을 제공합니다. 이러한 격리를 통해 한 가상 환경에 설치된 패키지가 다른 가상 환경의 패키지와 충돌하지 않도록 하여 종속성을 보다 효과적으로 관리할 수 있습니다.

    2. 패키지 관리
      가상 환경을 사용하면 프로젝트에 필요한 패키지와 라이브러리를 쉽게 관리할 수 있습니다. 글로벌 Python 설치 또는 다른 프로젝트에 영향을 주지 않고 패키지를 설치, 업그레이드 및 제거할 수 있습니다. 따라서 프로젝트별 종속성을 더 쉽게 유지 관리할 수 있습니다.

    3. 버전 관리
      가상 환경을 사용하면 특정 프로젝트에 사용할 Python 버전을 지정할 수 있습니다. 이 기능은 특정 Python 버전이 필요한 프로젝트에서 작업할 때 유용하며, 여러 개발 환경 간에 호환성과 일관성을 보장합니다.

    4. 이식성
      Python 가상 환경은 이식성이 뛰어나 한 머신에서 환경을 생성한 후 다른 머신에 쉽게 복제할 수 있습니다. 이는 다른 사람과 협업하거나 애플리케이션을 다른 서버 또는 호스팅 플랫폼에 배포할 때 특히 유용합니다.

    5. 활성화 및 비활성화
      가상 환경을 사용하려면 활성화해야 합니다. 활성화는 적절한 경로와 환경 변수를 설정하여 Python 인터프리터와 설치된 패키지가 해당 환경에 맞게 설정되도록 합니다. 프로젝트 작업이 끝나면 가상 환경을 비활성화하여 전역 Python 환경으로 돌아갈 수 있습니다.

    6. 도구
      Python은 가상 환경을 만들고 관리하기 위해 venv(Python 3용) 및 virtualenv(Python 2 및 3용)와 같은 기본 제공 도구를 제공합니다. 이러한 도구는 가상 환경을 설정하고 작업하는 과정을 간소화합니다.

가상 환경 사용은 프로젝트 종속성을 유지하고 재현성을 개선하며 개발자 간의 협업을 촉진하는 데 도움이 되므로 Python 개발의 모범 사례로 간주됩니다. 또한 프로젝트가 격리되고 이식 가능하며 독립적인 상태로 유지되므로 깔끔하고 관리하기 쉬운 개발 환경을 만들 수 있습니다.


가상 환경을 따로 생성하는 이유
  1. 종속성 관리
    프로젝트마다 종속성과 라이브러리 요구 사항이 다른 경우가 많습니다. 가상 환경을 사용하면 각 프로젝트마다 이러한 종속성을 개별적으로 관리할 수 있습니다. 이렇게 하면 다른 프로젝트나 글로벌 Python 환경과 충돌하지 않고 필요한 버전의 라이브러리 및 패키지를 설치할 수 있습니다.

  2. 격리 및 재현성
    가상 환경은 프로젝트에 제어되고 격리된 환경을 제공합니다. 프로젝트의 종속성을 가상 환경 내에 캡슐화하면 프로젝트가 독립적으로 유지되고 시스템 전체 Python 설치에 의존하지 않도록 할 수 있습니다. 이렇게 격리하면 다른 머신에서 프로젝트 환경을 더 쉽게 재현할 수 있어 호환성 문제를 최소화할 수 있습니다.

  3. 버전 관리
    가상 환경을 사용하면 특정 프로젝트의 Python 버전을 지정할 수 있습니다. 이는 특정 버전의 Python이 필요한 프로젝트를 작업할 때 특히 유용하며, 다양한 개발 환경과 배포 시나리오에서 프로젝트가 일관되게 실행되도록 보장합니다.

  4. 협업
    팀에서 작업할 때 각 팀원은 서로 다른 패키지 버전 또는 시스템 구성으로 각자의 개발 환경을 사용할 수 있습니다. 가상 환경을 사용하면 프로젝트의 가상 환경 구성을 공유하여 팀원들이 일관된 개발 환경을 가질 수 있습니다. 이를 통해 협업을 간소화하고 충돌을 줄이며 모든 사람이 동일한 종속성 집합으로 작업할 수 있습니다.

  5. 배포 및 프로덕션 환경
    가상 환경은 개발 종속성을 프로덕션 환경과 분리하는 데 도움이 됩니다. 배포 환경 전용 가상 환경을 만들어 프로덕션 환경이 충돌이나 호환성 문제 없이 애플리케이션을 실행하는 데 필요한 정확한 종속성을 갖도록 할 수 있습니다.

  6. 간편한 설정 및 정리
    가상 환경 생성은 간단한 프로세스이며 기본 제공 도구를 사용하여 빠르게 수행할 수 있습니다. 또한 프로젝트 또는 관련 가상 환경을 폐기하려는 경우 다른 프로젝트나 글로벌 Python 설치에 영향을 주지 않고 환경 디렉터리를 삭제하기만 하면 됩니다.

venv를 통해 가상환경 생성하기

1. 명령줄 인터페이스(예: 터미널 또는 명령 프롬프트)를 엽니다.
vscode를 사용한다면 터미널을 열어주면 됩니다. 저와 같은 경우 Python을 다룰 때 모두 아래 이미지에 보이는 디렉토리(폴더)에 다 넣어두기 때문에 해당 디렉토리에서 생성하겠습니다.


2. 가상 환경을 만들려는 디렉토리로 이동합니다.
명령 프롬포트에서 cd 명령어를 이용해서 이동가능하고 vscode를 사용한다면 디렉토리를 열 때 자동으로 선택됩니다.

3. 디렉토리를 생성하고 해당 디렉토리로 이동합니다.
위쪽 디렉토리 모양 버튼을 눌러 프로젝트 디렉토리안에 'venv' 디렉토리를 생성합니다. 자신이 원하는 경로에 생성하면 됩니다. 생성 후 cd 명령어를 이용해 해당 디렉토리로 이동합니다.


4. 명령어를 통해 가상환경을 생성해줍니다.

python -m venv myproject

해당 명령어를 입력하면 venvs 디렉토리 아래 myproject디렉토리가 생성되고 이 안에 다음과 같이 파일이 생성됩니다. 해당 명령어는 venv 모듈을 사용할 것인데 이름은 myprojeect로 하겠다는 뜻입니다.

이렇게 myproject라는 가상환경이 생성 되었습니다. 하지만 바로 사용은 불가능하고 가상 환경에 진입해주어야 합니다.


가상 환경에 진입하기


1. 가상환경에 진입하기 위해 가상환경 디렉토리 안에 있는 Scripts 디렉토리로 이동해줍니다.


2. 활성화 명령어를 입력해줍니다.

activate

 

3. 가상 환경 진입 완료 시 아래 사진처럼 앞에 가상 환경 이름이 같이 출력됩니다.

 

4. 가상 환경에서 빠져 나올 때는 deactivate를 입력해주면 됩니다.

 


플라스크 모듈 다운로드하기

플라스크를 사용하기 위해서는 플라스크 모듈을 다운로드 받아야 합니다.

 

1. 가상 환경 진입하기

 

2. 다운로드 명령어 입력하기

pip install flask


  • mac OS에서 가상환경 진입하기

venvs 디렉터리(예:/Users/pahkey/venvs)에서 다음의 명령을 수행하면 가상환경으로 진입할수 있습니다.

pahkey@mymac venvs % cd myproject/bin
pahkey@mymac bin % source activate
(myproject) pahkey@mymac bin %

현재 진입한 가상 환경에서 벗어나려면 deactivate라는 명령을 실행하면 됩니다.

(myproject) pahkey@mymac bin % deactivate
pahkey@mymac bin %

저는 이미 다운로드 받아져 있어서 다운로드가 되지 않고 버전 확인만 진행된 것 같습니다. 다음과 같이 업그래이드하라는 경고가 출력된다면 python... --upgrade 부분을 복사해 프롬포트에 붙여넣기해 입력해줍니다.

이렇게 정말로 플라스크를 사용할 준비가 되었습니다! 

반응형
반응형

목차

  1. 플라스크(Flask)
  2. 플라스크 사용을 위한 툴 다운로드

플라스크(Flask)

플라스크는 파이썬으로 작성된 마이크로 웹 프레임워크입니다. 2010년에 Armin Ronacher가 오픈 소스 프로젝트로 만들었습니다. Flask는 웹 애플리케이션을 구축하는 데 필요한 핵심 기능을 제공하는 데 중점을 둔 단순하고 미니멀한 디자인으로 유명합니다. 특정 도구나 라이브러리를 강요하지 않는다는 점에서 '마이크로'라는 원칙을 따르며, 개발자가 원하는 구성 요소를 선택하고 통합할 수 있습니다.

특징

  1. 가볍고 쉽게 시작할 수 있습니다
    Flask는 가볍고 코드베이스가 작도록 설계되었습니다. 간단하고 직관적인 API를 갖추고 있어 개발자가 웹 애플리케이션 구축을 빠르게 시작할 수 있습니다.

  2. 라우팅 및 URL 매핑
    Flask는 URL을 Python 코드의 함수나 메서드에 매핑할 수 있는 라우팅 메커니즘을 제공합니다. 이를 통해 다양한 URL과 HTTP 메서드(예: GET, POST)를 처리하고 요청에 따라 적절한 코드를 실행하는 데 도움이 됩니다.

  3. 템플릿 엔진
    플라스크는 진자2와 같은 템플릿 엔진 사용을 지원하여 프레젠테이션 로직과 애플리케이션 로직을 분리합니다. 템플릿 엔진은 HTML 템플릿 내에 Python 코드를 삽입할 수 있게 함으로써 HTML 페이지를 동적으로 생성할 수 있게 해줍니다.

  4. HTTP 요청 및 응답 처리
    플라스크는 HTTP 요청 및 응답 처리를 간소화합니다. 요청 데이터에 쉽게 액세스하고, 양식 제출, 파일 업로드, 쿠키 처리를 지원하며, 다양한 상태 코드, 헤더, 콘텐츠 유형이 포함된 HTTP 응답을 생성할 수 있습니다.

  5. 확장성
    플라스크는 개발자가 확장을 통해 기능을 추가할 수 있는 모듈식 설계를 갖추고 있습니다. 데이터베이스 통합, 사용자 인증, 캐싱, API 개발 도구 등과 같은 추가 기능을 제공하는 풍부한 Flask 확장 프로그램 에코시스템이 있습니다.

  6. 테스트 지원
    Flask는 웹 애플리케이션 테스트를 위한 기본 지원을 제공합니다. 여기에는 HTTP 요청을 시뮬레이션하고 응답을 검사할 수 있는 테스트 클라이언트가 포함되어 있어 애플리케이션에 대한 테스트 케이스를 더 쉽게 작성할 수 있습니다.

  7. 개발 서버 및 디버깅
    Flask에는 개발 서버가 내장되어 있어 개발 단계에서 애플리케이션을 실행하고 테스트할 수 있습니다. 또한 코드의 오류를 식별하고 수정하는 데 도움이 되는 편리한 디버거를 제공합니다.

플라스크는 단순성, 유연성, 방대한 문서로 인해 개발자들 사이에서 Python을 사용해 웹 애플리케이션과 API를 구축하는 데 널리 사용되고 있습니다. 개발자가 필요에 따라 애플리케이션을 사용자 정의하고 확장할 수 있는 동시에 탄탄한 기반을 제공합니다.


플라스크 사용을 위한 툴 다운로드

플라스크를 사용하기 위해 기반이 되는 파이썬과 좀 더 편하게 사용하기 위한 vscode를 다운로드 합니다. 이에 대한 내용은 아래 페이지에 작성되어 있습니다.

 

 

[Python] 파이썬 다운로드

다음은 파이썬 홈페이지 이다. Welcome to Python.org The official home of the Python Programming Language www.python.org

easyitwanner.tistory.com

 

[Python] 코드 제작을 더 쉽게 하기 위한 vscode 다운로드

다운로드 페이지 Visual Studio Code - Code Editing. Redefined Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications. Visual Studio Code is free and available on your favorite platform

easyitwanner.tistory.com

 

이렇게 다운로드를 마쳤다면 플라스크를 사용할 준비가 되었습니다. 분량이 애매해서 이번 포스팅은 여기서 마치고 다음 포스팅에서 가상환경에 대해 다루고 플라스크 설치까지 진행해보곘습니다.

반응형
반응형

목차

  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