반응형
반응형
반응형

SELinux - httpd 가 WAS port 로 연결 실패 - (13)Permission denied: proxy: HTTP: attempt to connect to 127.0.0.1:8080 (localhost) failed

 

semanage 로 해당 포트가 binding 된 context 가 있나 확인

~# semanage port -l |grep 8081 
transproxy_port_t              tcp      8081

 

관련 SELinux context 는 http_port_t 이므로 허용 가능한 port 를 확인

~# semanage port -l |grep http_port_t
http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443

httpd_port_t 에 10080 포트를 추가

~# semanage port -a -p tcp -t http_port_t 10080

httpd_port_t 로 8081 수정

~# semanage port -m -p tcp -t http_port_t  8081


반응형

'리눅스' 카테고리의 다른 글

CentOS7 MariaDB 설치 (2023년10월)  (1) 2023.10.10
우분투 젠킨스 설치.  (0) 2023.06.14
리눅스 계정 timeout  (0) 2023.02.24
젠킨스 포트 변경  (0) 2023.02.24
아파치 포비든 Forbbiden 403 오류  (0) 2022.11.11
리눅스 (CentOs7) 젠킨스 설치. (2022.11.07)  (0) 2022.11.07
docker 기본 명령어  (0) 2022.10.26
MariaDB 2개 설치 - CentOS7 ( 2021년 )  (2) 2022.01.14
반응형

8. 객체지향 프로그래밍

객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍을 더 직관적이고 체계적으로 만들어주는 패러다임입니다. 파이썬은 객체지향 프로그래밍을 지원하는 언어입니다.

클래스와 객체

  • 클래스(Class): 객체를 만들기 위한 템플릿입니다. 클래스는 객체의 기본 형태와 행동을 정의합니다.
  • 객체(Object): 클래스에 정의된 속성(변수)과 행동(메서드)을 실제로 가지고 있는 실체입니다. 클래스로부터 생성됩니다.
class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):
        print(f"{self.name} says woof!")

# 객체 생성
my_dog = Dog("Buddy")
my_dog.bark()  # 출력: Buddy says woof!

상속

상속(Inheritance)은 한 클래스가 다른 클래스의 속성과 메서드를 물려받는 기능입니다. 코드 재사용을 촉진하고, 복잡성을 줄여줍니다.

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

class Dog(Animal):
    def bark(self):
        print(f"{self.name} says woof!")

# Dog 클래스는 Animal 클래스의 모든 속성과 메서드를 상속받음
my_dog = Dog("Buddy")
my_dog.bark()  # Buddy says woof!

다형성

다형성(Polymorphism)은 동일한 인터페이스나 메서드 호출이 다양한 방식으로 응답할 수 있는 능력을 의미합니다. 다형성은 코드의 유연성과 재사용성을 높여줍니다.

class Cat:
    def speak(self):
        print("Meow")

class Dog:
    def speak(self):
        print("Woof")

def animal_sound(animal):
    animal.speak()

# 다양한 형태의 객체에 대해 동일한 인터페이스(speak) 사용
animal_sound(Cat())  # Meow
animal_sound(Dog())  # Woof

캡슐화

캡슐화(Encapsulation)는 객체의 세부 구현 내용을 외부로부터 숨기고, 외부에서는 객체의 메서드만을 통해 상호 작용하게 하는 것입니다. 이를 통해 객체의 보호 및 데이터 숨김을 실현합니다.

class Computer:
    def __init__(self):
        self.__max_price = 900  # private 변수

    def sell(self):
        print(f"Selling Price: {self.__max_price}")

    def set_max_price(self, price):
        if price > self.__max_price:
            self.__max_price = price

c = Computer()
c.sell()  # Selling Price: 900

# __max_price는 외부에서 직접 접근할 수 없음
# c.__max_price = 1000  # 이 코드는 에러를 발생시킴

c.set_max_price(1000)
c.sell()  # Selling Price: 1000

객체지향 프로그래밍은 소프트웨어 설계를 더 자연스럽고 직관적으로 만들어줍니다. 클래스와 객체를 통해 현실 세계의 개념을 코드에 잘 반영할 수 있으며, 상속, 다형성, 캡슐화를 통해 코드를 재사용하고 유지보수하기 쉬워집니다.

반응형

'파이썬(Phython)' 카테고리의 다른 글

python 7. 파일 입출력  (0) 2023.11.15
Python 6. 에러와 예외 처리  (0) 2023.11.14
python 5. 함수와 모듈  (0) 2023.11.07
python 4. 자료형과 자료구조  (0) 2023.11.06
파이썬 python 3. 조건문과 반복문  (0) 2023.11.02
파이썬 python 2. 기본 문법  (0) 2023.11.01
1. 파이썬 소개  (0) 2023.10.31
파이썬(Python) 기초 강의  (0) 2023.10.31
반응형

1. 브로큰 액세스 컨트롤

2017년 5위에서 2021년에 목록의 상단으로 올라온 브로큰 액세스 컨트롤은 지속적이고 중대한 위협으로 남아 있습니다. 액세스 컨트롤은 사용자가 사용할 수 있는 리소스와 기능을 제한하며, 시스템이 적절한 제한을 시행하지 못할 때 사용되는 용어입니다.

이는 잘못된 구성, IDOR(안전하지 않은 직접 객체 참조) 등 여러 가지 이유로 발생할 수 있습니다. IDOR은 애플리케이션이 파일이나 데이터베이스 레코드 같은 리소스에 대한 직접 참조를 노출하는 경우입니다. 또한, 세션 관리의 취약점으로 인해 공격자가 사용자의 세션을 가로채는 것과 같은 문제가 발생할 수 있습니다.

개발자와 시스템 관리자는 여기서 최소 권한 원칙을 따라야 합니다. 이는 사용자에게 그들의 업무 수행에 필요한 최소한의 권한만 부여하고 그 이상은 부여하지 않는 것을 의미합니다.

모든 사용자 입력은 악의적인 데이터를 주입하는 공격자를 방지하기 위해 검증되고 정화되어야 하며, API에 액세스 컨트롤이 적용되고 모든 요청에 대한 권한이 확인되어야 합니다.

정기적인 보안 감사와 코드 리뷰는 액세스 컨트롤 문제를 식별하고 해결하는 데 필수적이며, 무단 접근을 제한하기 위해 다중 인증이 강제되어야 합니다.

2. 암호화 실패

이 문제는 이전에 '민감한 데이터 노출'이라고 불리며 3위에 올랐었지만, 이전 이름이 원인보다 증상을 묘사했기 때문에 이름이 변경되었습니다. 암호화는 신용카드 번호와 개인 식별 정보(PII) 같은 매우 민감한 데이터를 전송 중에 보호하는 데 사용되지만, 약한 암호화 알고리즘이나 짧은 암호화 키와 같은 요인들로 인해 실패할 수 있습니다. 이는 공격자가 민감한 데이터를 더 쉽게 해독할 수 있게 만듭니다.

암호화 실패의 다른 예로는 불안전한 비밀번호 저장, 충분하지 않은 전송 계층 보안(중간자 공격으로 이어질 수 있음), 약한 SSL/TLS 프로토콜, 그리고 웹 애플리케이션을 공격에 노출시킬 수 있는 불안전한 암호 스위트가 있습니다.

정기적인 보안 테스트(코드 리뷰 및 취약점 평가 포함)를 실시하여 암호화 취약점을 식별하고 해결하며, 또한 안전한 암호화 라이브러리 사용도 고려하세요.

3. 인젝션

인젝션은 2017년에 1위를 차지했고, 크로스 사이트 스크립팅은 7위였습니다. 이제 이들은 OWASP 2023의 현재 3위를 차지하는 하나의 우산 용어 아래 통합되었습니다.

인젝션 공격은 입력 유효성 검사의 취약점과 불충분한 데이터 처리를 이용합니다. 공격자들은 SQL 쿼리, 코드 스니펫, 명령어 등의 데이터를 웹 애플리케이션 폼이나 URL에 삽입합니다. 이를 통해 적들이 민감한 데이터에 접근하고 애플리케이션의 동작을 조작할 수 있습니다.

인젝션의 예시는 다음과 같습니다:

-       SQL 인젝션: 데이터베이스 공격을 위한 것입니다.

-       크로스 사이트 스크립팅(XSS): 주로 자바스크립트 기반의 브라우저 공격으로, 감염된 웹 페이지를 통해 실행되며 세션 탈취, 쿠키 도난 또는 사용자에 대한 기타 공격으로 이어질 수 있습니다.

-       커맨드 인젝션: 공격자가 애플리케이션이 실행하는 시스템 명령어에 악의적인 명령어를 삽입하여 서버를 제어하거나 허가되지 않은 작업을 수행할 수 있습니다.

-       LDAP 인젝션: 공격자가 인증 및 권한 부여에 사용되는 LDAP 쿼리를 조작하여 접근 권한을 얻습니다.

-       XML 인젝션: 공격자가 XML 데이터에 악의적인 내용을 삽입하여 애플리케이션의 파싱 과정을 방해하거나 접근 권한을 얻습니다.

-       서버 측 템플릿 인젝션(SSTI): 공격자가 서버 측 템플릿에 악의적인 코드를 삽입하여 서버에서 코드를 실행합니다.

4. 불안전한 디자인

이 OWASP 2023 범주는 2021년에 새로 생겼으며, 해커들이 이용할 수 있는 잘못된 애플리케이션 설계와 아키텍처의 결함을 다룹니다. 불안전한 디자인 취약점은 팀이 보안 모범 사례를 준수하지 않고 애플리케이션을 만드는 코드 설계 단계에서 잠재적 위협을 충분히 예측하고 평가하지 못할 때 발생합니다.

불안전한 디자인의 예는 지나치게 상세한 오류 메시지를 생성하는 앱입니다. 오류 상황에 대해 너무 자세한 정보를 제공하고 애플리케이션 환경이나 기타 관련 데이터에 대한 진단적 힌트를 제공한다면, 공격자에게 유용한 정보를 제공할 수 있습니다. 이 정보를 사용하여 경로 탐색이나 SQL 인젝션과 같은 다른 공격을 시작할 수 있습니다.

일관된 위협 모델링을 사용하여 알려진 공격 방법을 차단함으로써 디자인 취약점을 완화하는 것이 중요합니다.

5. 보안 미설정

이 범주는 이제 2017년의 XML 외부 엔티티(XXE) 범주를 포함합니다. 보안 미설정은 다양한 잠재적 취약점을 포함하지만, 가장 흔한 것들은 다음과 같습니다:

·       패치되지 않은 취약점

·       기본 설정

·       사용되지 않는 페이지

·       보호되지 않은 파일 및 디렉토리

·       불필요한 서비스

·       취약한 XML 파일 사용

웹마스터들이 자주 저지르는 실수 중 하나는 CMS(콘텐츠 관리 시스템) 기본 설정을 변경하지 않는 것입니다. CMS 애플리케이션은 사용자 친화적이지만, 최종 사용자에게 보안 위험을 초래할 수 있습니다. 많은 공격은 전적으로 자동화되어 있으며 기본 설정을 이용한 공격에 의존하므로, CMS 설치 시 이러한 설정을 변경하는 것이 잠재적 공격을 상당 부분 완화하는 데 중요합니다.

댓글 관리, 사용자 접근 제어, 사용자 정보 가시성 및 기본 파일 권한 설정을 조정하여 보안을 강화할 수 있습니다.

6. 취약하고 구식인 구성요소

가장 단순한 웹사이트조차 프레임워크, 라이브러리, 확장 프로그램, 플러그인 등 많은 의존성을 가지고 있으며, 이 모든 것은 최신 상태로 유지되어야 합니다. 공격자들은 취약한 구성요소를 가진 웹사이트를 찾아 멀웨어를 퍼뜨리거나 피싱 공격을 시작하는 등의 이용을 시도하므로, 어떤 이유로든 업데이트를 설치하지 않는 것은 좋지 않은 생각입니다.

어떤 소프트웨어의 최신 버전은 최신 보안 업데이트를 포함할 것이지만, 웹사이트가 많은 의존성에 의존하는 경우 이는 쉽게 말할 수 있지만 행하기 어렵습니다. 이를 해결하기 위한 첫 번째 단계는 환경에 연결된 모든 구성요소를 나열하고 각각의 동작을 최신 상태로 유지하는 목록을 생성하는 것입니다. Reflectiz와 같은 도구가 자동으로 이를 수행할 수 있습니다.

7. 식별 및 인증 실패

인증 및 신원 관리 실패는 애플리케이션을 악의적인 행위자가 정당한 사용자로 위장하는 위험에 노출시킵니다. 유효 기간 없이 구성된 세션 ID는 계속 실행될 수 있습니다. 약한 비밀번호는 추측에 취약할 수 있으며, 로그인 시도에 대한 제한이 없으면 자동화된 공격이 성공할 때까지 계속됩니다.

이러한 문제를 해결하기 위해 애플리케이션 내에서 다중 인증 요소(MFA)를 구현합니다. 또한, 개발자들은 권장되는 비밀번호 길이, 복잡성 및 회전 정책을 준수해야 할 필요성을 인식해야 합니다.

8. 소프트웨어 및 데이터 무결성 실패

이것들은 설계 결함의 일종입니다. 현대 아키텍처의 복잡성으로 인해 개발자들은 종종 다양한 출처에서 플러그인과 라이브러리를 파이프라인에 추가하고 그들의 무결성을 확인하지 않습니다. 이들 중 하나라도 실패하면 애플리케이션이 무단 정보 공개, 시스템 손상 또는 악의적 코드 삽입에 취약해질 수 있습니다. 이것이 제3자 및 오픈 소스 플러그인과 라이브러리의 활성 목록을 유지하고 지속적인 위협 모니터링을 수행하는 것이 중요한 이유입니다.

9. 보안 로깅 및 모니터링 실패

불량한 로깅 및 모니터링 기능은 사고가 누락되고 경고가 생성되지 않으며, 상당한 피해를 입힐 만큼 충분히 오랫동안 눈에 띄지 않을 수 있습니다.

로그인 시도 및 실패는 로그되어야 하며, 서버 장애 시를 대비하여 로그의 백업이 필요합니다. 로그는 모니터링 시스템이 의심스

러운 활동을 감지하거나 적시에 경고를 발생시킬 수 있도록 정확해야 하며, 또한 변조로부터 보호되어야 합니다.

취약점을 완화하기 위해 모든 로그인 시도(실패 포함)를 기록하고, 로그의 사본을 유지하며, 반탐퍼 메커니즘을 사용하고, 정기적으로 모니터링 시스템을 테스트하세요.

10. 서버 측 요청 위조(SSRF)

이 취약점은 공격자가 서버를 통해 다른 내부 또는 외부 리소스에 대한 무단 요청을 할 수 있게 합니다. SSRF 공격에서 공격자는 입력 필드나 애플리케이션의 파라미터를 조작하여 서버가 임의의 URL로 요청을 보내게 할 수 있으며, 이는 종종 사용자가 알지 못하는 상태에서 발생합니다.

공격자는 이 취약점을 악용하여 민감한 데이터에 접근하거나 내부 리소스와 상호 작용하거나 서버를 대신하여 행동을 수행할 수 있으며, 이는 애플리케이션이나 그 인프라의 완전한 손상으로 이어질 수 있습니다.

SSRF 취약점을 완화하기 위해 개발자들은 다음과 같은 모범 사례를 따라야 합니다:

입력 검증: 요청에 악의적인 URL이나 IP 주소가 사용되는 것을 방지하기 위해 사용자 제공 입력을 적절히 검증하고 정화합니다.

화이트리스팅: 허용된 URL 또는 IP 범위에 대한 화이트리스팅을 구현하여 서버가 알려진 안전한 리소스로 요청을 제한합니다.

방화벽 규칙: 서버로부터 특정 리소스와 프로토콜로의 나가는 요청을 제한하기 위해 방화벽 및 네트워크 설정을 구성합니다.

안전한 API 사용: 애플리케이션이 외부 리소스에 요청을 해야 하는 경우, 안전한 API 또는 공개 접근을 위해 의도된 특정 엔드포인트를 사용합니다.

최소 권한: SSRF 공격이 발생할 경우 잠재적 피해를 제한하기 위해 서버가 외부 리소스에 접근할 수 있는 최소 권한을 갖도록 합니다.

반응형
반응형

2023년 OWASP Top 10 API 보안 위험 목록은 API 보안에 있어 가장 중요한 위험들을 강조합니다. 각 항목의 설명은 다음과 같습니다:

  1. API1:2023 - 부적절한 객체 수준 권한 부여 (Broken Object Level Authorization):

    • API는 객체 식별자를 다루는 엔드포인트를 노출하는 경향이 있으며, 이로 인해 객체 수준 접근 제어 문제가 발생합니다. 사용자로부터 ID를 사용하여 데이터 소스에 접근하는 모든 함수에서 객체 수준 권한 부여 검사를 고려해야 합니다.
  2. API2:2023 - 부적절한 인증 (Broken Authentication):

    • 인증 메커니즘은 종종 잘못 구현되어, 공격자가 인증 토큰을 탈취하거나 다른 사용자의 신원을 일시적 또는 영구적으로 가정하는 구현상의 결함을 악용할 수 있습니다. 시스템이 클라이언트/사용자를 식별하는 능력을 손상시키면 API 보안 전반에 영향을 줍니다.
  3. API3:2023 - 부적절한 객체 속성 수준 권한 부여 (Broken Object Property Level Authorization):

    • 이 카테고리는 API3:2019 과도한 데이터 노출과 API6:2019 대량 할당을 결합하며, 객체 속성 수준에서 부적절하거나 부재하는 권한 검증이 근본 원인입니다. 이로 인해 무단 당사자에 의한 정보 노출 또는 조작이 발생할 수 있습니다.
  4. API4:2023 - 무제한 자원 소비 (Unrestricted Resource Consumption):

    • API 요청을 처리하기 위해서는 네트워크 대역폭, CPU, 메모리 및 저장소와 같은 자원이 필요합니다. 이메일/SMS/전화 통화 또는 생체 인증 검증과 같은 다른 자원은 서비스 제공업체를 통해 API 통합을 통해 사용 가능하며 요청당 비용이 청구됩니다. 성공적인 공격은 서비스 거부 또는 운영 비용 증가로 이어질 수 있습니다.
  5. API5:2023 - 부적절한 기능 수준 권한 부여 (Broken Function Level Authorization):

    • 다양한 계층, 그룹 및 역할을 가진 복잡한 접근 제어 정책과 관리적 기능과 일반 기능 간 명확하지 않은 구분은 권한 부여 결함으로 이어질 수 있습니다. 이러한 문제를 악용함으로써 공격자는 다른 사용자의 자원 및/또는 관리 기능에 접근할 수 있습니다.
  6. API6:2023 - 민감한 비즈니스 흐름에 대한 무제한 접근 (Unrestricted Access to Sensitive Business Flows):

    • 이 위험에 취약한 API는 티켓 구매 또는 댓글 게시와 같은 비즈니스 흐름을 노출하지만, 자동화된 방식으로 과도하게 사용될 경우 비즈니스에 해를 끼칠 수 있는 기능에 대한 보상을 고려하지 않습니다. 이는 반드시 구현 버그에서 나오는 것은 아닙니다.
  7. API7:2023 - 서버 측 요청 위조 (Server Side Request Forgery):

    • 사용자 제공 URI를 검증하지 않고 API가 원격 리소스를 가져올 때 서버 측 요청 위조(SSRF) 결함이 발생할 수 있습니다. 이를 통해 공격자는 애플리케이션을 속여 방화벽이나 VPN으로 보호되는 예기치 않은 목적지로 조작된 요청을 보낼 수 있습니다.
  8. API8:2023 - 보안 설정 오류 (Security Misconfiguration):

    • API와 이를 지원하는 시스템은 일반적으로 복잡한 구성을 포함하며, 이는 API를 더 맞춤화할 수 있게 합니다. 소프트웨어 및 DevOps 엔지니어는 이러한 구성을 놓치거나 구성과 관련된 보안 모범 사례를 따르지 않을 수 있으며, 이는 다양한 유형의 공격에 문을 열 수 있습니다.
  9. API9:2023 - 부적절한 재고 관리 (Improper Inventory Management):

    • API는 전통적인 웹 애플리케이션보다 더 많은 엔드포인트를 노출하는 경향이 있어, 적절하고 최신의 문서 작성이 매우 중요합니다. 호스트 및 배포된 API 버전의 적절한 재고도 중요하며, 이는 폐기된 API 버전 및 노출된 디버그 엔드포인트와 같은 문제를 완화하는 데 도움이 됩니다.
  10. API10:2023 - API의 안전하지 않은 사용 (Unsafe Consumption of APIs):

    • 개발자는 사용자 입력보다 제3자 API에서 받은 데이터를 더 신뢰하는 경향이 있으며, 따라서 보안 표준을 약화시키는 경향이 있습니다. API를 손상시키기 위해 공격자는 대상 API를 직접 공격하기보다는 통합된 제3자 서비스를 공격합니다.
반응형

'기타' 카테고리의 다른 글

OWASP 2023 Top 10  (0) 2023.11.17
slack 채널에 webhook 추가하기  (0) 2023.03.14
IE 교차 사이트 스크립팅  (0) 2021.07.01
PDF 비밀번호 제거  (0) 2021.06.07
2021.03.19 기준 은행 공통 코드  (0) 2021.05.03
투명도 16진수  (0) 2021.01.09
Firebase Hosting 시작하기.  (0) 2020.08.10
이더리움 기반 ERC-20 토큰 만들기(2부) :: 2020.07  (3) 2020.07.23
반응형

7. 파일 입출력

파이썬에서 파일 입출력은 데이터를 파일로부터 읽거나 파일에 쓰는 과정을 의미합니다. 이 기능은 데이터를 저장하고 불러오는 데 필수적입니다.

파일 읽기

파일을 읽기 위해서는 open() 함수를 사용해 파일을 열고, read() 또는 readlines() 메소드를 사용하여 내용을 읽습니다.

# 파일 전체 내용을 한 번에 읽기
file = open("example.txt", "r")
content = file.read()
print(content)
file.close()

# 파일 내용을 라인별로 읽기
file = open("example.txt", "r")
for line in file:
    print(line, end='')
file.close()

파일 쓰기

파일에 쓰기 위해서는 open() 함수를 쓰기 모드(w 또는 a)로 사용합니다. w는 파일을 새로 쓸 때, a는 파일 끝에 추가할 때 사용합니다.

# 새 파일 생성 또는 기존 파일 덮어쓰기
file = open("example.txt", "w")
file.write("Hello, World!")
file.close()

# 파일 끝에 내용 추가
file = open("example.txt", "a")
file.write("\nGoodbye, World!")
file.close()

with 구문

파이썬의 with 구문을 사용하면 파일을 자동으로 닫아주므로, 파일을 닫는 것을 잊을 걱정이 없어집니다. 이 방법이 더 권장됩니다.

# 읽기
with open("example.txt", "r") as file:
    content = file.read()
    print(content)

# 쓰기
with open("example.txt", "w") as file:
    file.write("Hello, Python!")

경로와 디렉토리

파일을 열 때, 경로를 지정하여 다른 디렉토리에 있는 파일을 읽거나 쓸 수 있습니다. 상대 경로 또는 절대 경로를 사용할 수 있습니다.

# 상대 경로
with open("folder/example.txt", "r") as file:
    print(file.read())

# 절대 경로
with open("/Users/username/folder/example.txt", "r") as file:
    print(file.read())

파일 입출력을 할 때는 항상 에러가 발생할 수 있다는 점을 염두에 두고, 적절한 예외 처리를 해주는 것이 좋습니다. 예를 들어, 파일이 존재하지 않거나, 읽기 권한이 없는 경우 등에 대비하여 try-except 블록을 사용할 수 있습니다.

반응형
반응형

6. 에러와 예외 처리

프로그래밍에서 오류는 불가피한 부분입니다. 파이썬은 다양한 종류의 에러와 이를 처리하기 위한 명확한 방법을 제공합니다.

에러 종류

파이썬에서 발생할 수 있는 몇 가지 일반적인 에러들입니다:

  • SyntaxError: 코드의 구문이 잘못되었을 때 발생합니다. 예를 들어, 괄호나 따옴표의 짝이 맞지 않는 경우입니다.
  • NameError: 정의되지 않은 변수를 호출할 때 발생합니다.
  • TypeError: 잘못된 데이터 타입을 사용했을 때 발생합니다. 예를 들어, 숫자와 문자열을 함께 더하는 경우입니다.
  • IndexError: 리스트의 범위를 넘어선 인덱싱을 할 때 발생합니다.
  • KeyError: 딕셔너리에서 존재하지 않는 키를 사용할 때 발생합니다.
  • ValueError: 올바른 값이지만, 올바르지 않은 값이 사용되었을 때 발생합니다. 예를 들어, 정수가 아닌 문자열을 정수로 변환하려 할 때입니다.

예외 처리

예외 처리는 프로그램에서 예외적인 상황(에러)이 발생했을 때, 프로그램을 중단하지 않고 적절히 대응하게 해줍니다.

try, except 구문

tryexcept 블록을 사용하여 예외 처리를 할 수 있습니다. try 블록 안에는 에러가 발생할 수 있는 코드를 넣고, except 블록 안에는 에러가 발생했을 때 실행할 코드를 넣습니다.

try:
    # 에러가 발생할 수 있는 코드
    number = int(input("Enter a number: "))
except ValueError:
    # ValueError가 발생했을 때 실행할 코드
    print("That's not a number!")

finally와 assert

  • finally: finally 블록은 에러 발생 여부와 상관없이 try 블록 이후에 항상 실행됩니다. 주로 사용한 리소스를 정리하는 데 사용됩니다.

    try:
        file = open("example.txt")
        # 파일 처리 코드
    finally:
        file.close()  # 파일을 반드시 닫아줍니다.
  • assert: assert 문은 특정 조건이 참인지 확인하고, 거짓이면 AssertionError를 발생시킵니다. 주로 디버깅 목적으로 사용됩니다.

    x = 1
    assert x > 0, "x is not positive"  # 조건이 참이므로 AssertionError가 발생하지 않습니다.

에러와 예외 처리는 프로그램의 안정성과 견고함을 높이는 데 필수적입니다. 적절한 예외 처리를 통해 예상치 못한 상황에서도 프로그램이 적절하게 반응하도록 만들 수 있습니다.

반응형

'파이썬(Phython)' 카테고리의 다른 글

pyhton 8. 객체지향 프로그래밍  (1) 2023.11.20
python 7. 파일 입출력  (0) 2023.11.15
python 5. 함수와 모듈  (0) 2023.11.07
python 4. 자료형과 자료구조  (0) 2023.11.06
파이썬 python 3. 조건문과 반복문  (0) 2023.11.02
파이썬 python 2. 기본 문법  (0) 2023.11.01
1. 파이썬 소개  (0) 2023.10.31
파이썬(Python) 기초 강의  (0) 2023.10.31
반응형

5. 함수와 모듈

함수 정의와 호출

함수는 특정 작업을 수행하는 코드의 블록입니다. def 키워드로 정의하고, 이름을 지어준 다음에 괄호 안에 인자를 넣을 수 있어요. 인자는 함수가 작업을 수행하는 데 필요한 정보를 제공합니다.

def greet(name):
    return f"Hello, {name}!"

print(greet("Alice"))  # 'Hello, Alice!' 출력

이렇게 정의된 함수는 이름을 사용하여 어디서든 호출할 수 있습니다.

인자와 반환 값

함수는 인자를 받아서 처리하고, return을 사용하여 결과를 반환할 수 있습니다. 인자가 없거나 반환 값이 없는 함수도 가능합니다.

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

result = add(5, 3)
print(result)  # 8 출력

모듈과 패키지

모듈은 파이썬 코드가 들어 있는 파일입니다. 모듈 내의 함수나 변수, 클래스 등을 다른 파이썬 파일에서 사용할 수 있게 해줍니다.

# mymodule.py
def say_hello(name):
    print(f"Hello, {name}")

# 다른 파일에서 mymodule을 가져와서 사용
import mymodule
mymodule.say_hello("Bob")  # 'Hello, Bob' 출력

패키지는 모듈의 집합입니다. 관련된 모듈들을 한 폴더에 담아 구성할 수 있으며, 대규모 프로젝트의 코드를 구조화하는 데 도움을 줍니다.

람다 함수

람다 함수는 간단한 함수를 한 줄로 작성할 수 있는 방법입니다. lambda 키워드를 사용하며, 이름을 지정하지 않고도 함수처럼 사용할 수 있어 익명 함수라고도 합니다.

add = lambda x, y: x + y
print(add(5, 3))  # 8 출력

람다 함수는 짧고 간결하게 함수를 표현할 때 유용하며, 종종 다른 함수의 인자로 사용됩니다(예: sorted(), map(), filter() 등).

함수와 모듈은 코드를 재사용하고, 관리하기 쉽게 만드는 파이썬 프로그래밍의 핵심 요소입니다. 함수를 사용하면 코드를 모듈화하여 더 읽기 쉽고 유지 관리가 쉬운 프로그램을 작성할 수 있고, 모듈과 패키지를 사용하면 코드를 잘 구조화하고 여러 프로젝트에서 재사용할 수 있습니다.

반응형
반응형

4. 자료형과 자료구조

리스트 (List)

리스트는 여러 값들을 한데 모아서 저장할 때 사용합니다. 대괄호 [] 안에 값들을 쉼표로 구분해서 넣어 만들 수 있어요.

colors = ["red", "green", "blue"]
colors.append("yellow")  # 'yellow' 추가
print(colors)  # ['red', 'green', 'blue', 'yellow']
print(colors[0])  # 'red' 출력, 인덱스는 0부터 시작해요.

리스트는 수정 가능(mutable)해서, 요소를 변경하거나 추가, 제거하는 것이 자유로워요.

튜플 (Tuple)

튜플은 리스트와 비슷하지만, 한 번 생성하면 수정할 수 없는(immutable) 특징을 가지고 있어요. 소괄호 ()를 사용하거나, 괄호 없이 값을 나열해서 만들 수 있죠.

dimensions = (200, 50)
# dimensions[0] = 250  # 이건 에러를 일으켜요, 튜플은 변경할 수 없으니까요.

튜플은 프로그램에서 변경되지 않을 값들을 저장할 때 유용합니다.

딕셔너리 (Dictionary)

딕셔너리는 키(key)와 값(value)의 쌍으로 데이터를 저장합니다. 중괄호 {} 안에 콜론으로 키와 값의 쌍을 구분하여 넣어요.

person = {"name": "Alice", "age": 25}
person["email"] = "alice@example.com"  # 새로운 키와 값 추가
print(person)  # {'name': 'Alice', 'age': 25, 'email': 'alice@example.com'}

딕셔너리는 데이터에 빠르게 접근하고 싶을 때 아주 좋습니다.

집합 (Set)

집합은 중복을 허용하지 않고, 순서가 없는 컬렉션입니다. 중괄호 {}를 사용하거나 set() 함수로 만들 수 있어요.

fruits = {"apple", "banana", "cherry"}
fruits.add("orange")  # 'orange' 추가
print(fruits)  # 순서는 보장되지 않아요.

집합은 주로 중복을 제거하거나, 다른 컬렉션 간의 수학적 연산(교집합, 합집합 등)을 할 때 유용해요.

문자열 처리

문자열은 텍스트 데이터를 다룰 때 사용하는 시퀀스 자료형입니다. 따옴표로 묶어서 만들죠.

greeting = "Hello, World!"
print(greeting[7:])  # 'World!' 출력
print("Hello" in greeting)  # True 출력, 'Hello' 문자열이 greeting 안에 있는지 확인

파이썬에는 문자열을 처리하는 다양한 메소드가 있어 문자 데이터를 쉽게 다룰 수 있어요.

이처럼 파이썬은 다양한 자료형과 자료구조를 제공하고 있어, 여러분이 해결하려는 문제에 따라 가장 적합한 것을 선택해서 사용할 수 있습니다.

반응형

'파이썬(Phython)' 카테고리의 다른 글

pyhton 8. 객체지향 프로그래밍  (1) 2023.11.20
python 7. 파일 입출력  (0) 2023.11.15
Python 6. 에러와 예외 처리  (0) 2023.11.14
python 5. 함수와 모듈  (0) 2023.11.07
파이썬 python 3. 조건문과 반복문  (0) 2023.11.02
파이썬 python 2. 기본 문법  (0) 2023.11.01
1. 파이썬 소개  (0) 2023.10.31
파이썬(Python) 기초 강의  (0) 2023.10.31
반응형

3. 조건문과 반복문

1. if 문

if 문은 주어진 조건이 참(True)인지 거짓(False)인지 검사하여, 참인 경우에만 특정 코드를 실행하게 해주는 구문입니다.

age = 20
if age >= 18:
    print("You are an adult.")
else:
    print("You are a minor.")

여러 조건을 검사하고 싶다면 elif를 사용할 수 있습니다.

score = 85
if score >= 90:
    print("Grade: A")
elif score >= 80:
    print("Grade: B")
else:
    print("Grade: C or below")

2. for 문

for 문은 주어진 범위 내에서 반복 실행을 수행합니다. 주로 리스트나 튜플, 문자열과 같이 반복 가능한 객체를 사용합니다.

fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

range() 함수를 사용하면 정해진 범위의 숫자를 생성하여 반복할 수 있습니다.

for i in range(5):  # 0부터 4까지 반복
    print(i)

3. while 문

while 문은 주어진 조건이 참(True)인 동안 반복 실행을 수행합니다.

count = 0
while count < 5:
    print(count)
    count += 1

4. break와 continue

  • break: 현재의 반복문을 즉시 종료하고 반복문 다음에 오는 코드를 실행합니다.
  • continue: 반복문의 다음 반복으로 넘어가게 합니다.
for i in range(5):
    if i == 2:
        continue
    elif i == 4:
        break
    print(i)  # 0, 1, 3을 출력하고 종료

여기서 continue는 i가 2일 때 print문을 건너뛰고, break는 i가 4일 때 for 문을 종료합니다.

이러한 조건문과 반복문을 활용하면 프로그램의 흐름을 제어하고, 반복되는 작업을 효율적으로 처리할 수 있습니다.

반응형

'파이썬(Phython)' 카테고리의 다른 글

pyhton 8. 객체지향 프로그래밍  (1) 2023.11.20
python 7. 파일 입출력  (0) 2023.11.15
Python 6. 에러와 예외 처리  (0) 2023.11.14
python 5. 함수와 모듈  (0) 2023.11.07
python 4. 자료형과 자료구조  (0) 2023.11.06
파이썬 python 2. 기본 문법  (0) 2023.11.01
1. 파이썬 소개  (0) 2023.10.31
파이썬(Python) 기초 강의  (0) 2023.10.31

+ Recent posts