728x90
반응형

1. 순수 관계 연산자와 SQL 문장 비교

- SELECT 연산은 WHERE 절로 구현

- PROJECT 연산은 SELECT 절로 구현

- (NATURAL) JOIN 연산은 다양한 JOIN 기능으로 구현

- DIVIDE 연산은 현재 사용되지 않음

 

2. ANSI/ISO SQL에서 표시하는 FROM 절의 JOIN 형태

- INNER JOIN : INNER JOIN은 OUTER(외부) JOIN과 대비하여 내부 JOIN이라고 하며 JOIN 조건에서 동일한 값이 있는 행만 반환한다.

- NATURAL JOIN

- USING 조건절

- ON 조건절

- CROSS JOIN : 테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 말한다. 결과는 양쪽 집합의 M*N 건의 데이터 조합이 발생한다.

- OUTER JOIN(LEFT, RIGHT, FULL)

     > LEFT OUTER JOIN : 조인 수행 시 먼저 표기된 좌측 테이블에 해당하는 데이터를 먼저 읽은 후, 나중 표기된 우측 테이블에서 JOIN 대상 데이터를 읽어 온다. 즉, Table A와 B가 있을 때 (Table 'A'가 기준이 됨), A와 B를 비교해서 B의 JOIN 칼럼에서 같은 값이 있을 때 그 해당 데이터를 가져오고, B의 JOIN 칼럼에서 같은 값이 없는 경우에는 B 테이블에서 가져오는 칼럼들은 NULL 값으로 채운다.

     > FULL OUTER JOIN : JOIN 수행시 좌측, 우측 테이블의 모든 데이터를 읽어 JOIN 하여 결과를 생성한다. 즉, TABLE A와 B가 있을 때 (TABLE 'A', 'B' 모두 기준이 됨), RIGHT OUTER JOIN과 LEFT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일하다.

 

3. OUTER JOIN  문장 예시

SELECT X.KEY1, Y.KEY2
FROM TAB1 X
            LEFT OUTER JOIN TAB2 Y
ON (X.KEY1=Y.KEY2)

 

4. 집합 연산자

SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블명1
[WHERE 조건식]
[[GROUP BY 칼럼(Column)이나 표현식
 [HAVING 그룹조건식]]

집합 연산자

SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블명2
[WHERE 조건식]
[[GROUP BY 칼럼(Column)이나 표현식
 [HAVING 그룹조건식]]
[ORDER BY 1, 2 [ASC 또는 DESC] ];
※ ORDER BY는 집합 연산을 적용한 최종 결과에 대한 정렬 처리이므로 가장 마지막 줄에 한 번만 기술한다.

 

5. 집합 연산자의 종류

집합 연산자 연산자의 의미
UNION 여러 개의 SQL문의 결과에 대한 합집합으로 결과에서 모든 중복된 행은 하나의 행으로 만든다.
UNION ALL 여러 개의 SQL문의 결과에 대한 합집합으로 중복된 행도 그대로 결과로 표시된다. 즉, 단순히 결과만 합쳐놓은 것이다. 일반적으로 여러 질의 결과가 상호 배타적인(Exclusive)일 때 많이 사용한다. 개별 SQL문의 결과가 서로 중복되지 않는 경우, UNION과 결과가 동일하다. (결과의 정렬 순서에는 차이가 있을 수 있음)
INTERSECT 여러 개의 SQL문의 결과에 대한 교집합이다. 중복된 행은 하나의 행으로 만든다.
EXCEPT 앞의 SQL문의 결과에서 뒤의 SQL문의 결과에 대한 차집합이다. 중복된 행은 하나의 행으로 만든다. (일부 데이터베이스는 MINUS를 사용함)

 

6. 일반 집합 연산자를 SQL과 비교

- UNION 연산은 UNION 기능으로 구현

- INTERSECTION 연산은 INTERSECTION 기능으로 구현

- DIFFERENCE  연산은 EXCEPT(Oracle은 MINUS) 기능으로 구현

- PRODUCT 연산은 CROSS JOIN 기능으로 구현

 

7. 계층 구조

- PRIOP : CONNECT BY절에 사용되며, 현재 읽은 칼럼을 지정한다. PRIOR 자식 = 부모 형태를 사용하면 계층구조에서 부모 데이터에서 자식 데이터(부모 → 자식) 방향으로 전개하는 순방향 전개를 한다. 그리고 PRIOR 부모 = 자식 형태를 사용하면 반대로 자식 데이터에서 부모 데이터(자식 부모) 방향으로 전개하는 역방향 전개를 한다.

- START WITH : 계층 구조 전개의 시작 위치를 지정하는 구문이다. 즉, 루트 데이터를 지정한다.

- ORDER SIBLINGS BY : 형제 노드(동일 LEVEL) 사이에서 정렬을 수행한다.

 

8. 계층형 질의

테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해서 계층형 질의(Hierarchical Query)를 사용한다. 계층형 데이터란 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 말한다. 예를 들어, 사원 테이블에서는 사원들 사이에 상위 사원(관리자)과 하위 사원 관계가 존재하고 조직 테이블에서는 조직들 사이에 상위 조직과 하위 조직 관계가 존재한다.

 

9. SELF JOIN

- 셀프 조인(Self join)이란 동일 테이블 사이의 조인을 말한다. 따라서 FROM 절에 동일 테이블이 두 번 이상 나타난다. 동일 테이블 사이의 조인을 수행하면 테이블과 칼럼 이름이 모두 동일하기 때문에 식별을 위해 반드시 테이블 별칭(Alias)을 사용해야 한다.

- 셀프 조인(Self join) 문장

SELECT ALIAS명1.칼럼명,
               ALIAS명2.칼럼명, ...
FROM 테이블 ALIAS명1,
            테이블 ALIAS명2
WHERE ALIAS명1.칼럼명1 = ALIAS명2.칼럼명2;

 

10. 반환되는 데이터의 형태에 따른 서브쿼리 분류

서브쿼리 종류 설명
Single Row 서브쿼리
(단일 행 서브쿼리)
서브쿼리의 실행 결과가 항상 1건 이하인 서브쿼리를 의미한다. 단일 행 서브쿼리는 단일 행 비교 연산자와 함꼐 사용된다. 단일 행 비교 연산자에는 =, <, <=, >, >=. <> 이 있다.
Multi Row 서브쿼리
(다중 행 서브쿼리)
서브쿼리의 실행 결과가 여러 건인 서브쿼리를 의미한다. 다중 행 서브쿼리는 다중 행 비교 연산자와 함께 사용된다. 다중 행 비교 연산자에는 IN, ALL, ANY, SOME, EXISTS가 있다.
Multi Column 서브쿼리
(다중 칼럼 서브쿼리)
서브쿼리의 실행 결과로 여러 칼럼을 반환한다. 메인쿼리의 조건절에 여러 칼럼을 동시에 비교할 수 있다. 서브쿼리와 메인쿼리에서 비교하고자 하는 칼럼 개수와 칼럼의 위치가 동일 해야 한다.

 

11. 서브쿼리 사용 시 주의사항

① 서브쿼리를 괄호로 감싸서 사용한다.

② 서브쿼리는 단일 행(Single Row) 또는 복수 행(Multiple Row) 비교 연산자와 함께 사용 가능하다. 단일 행 비교 연산자는 서브쿼리의 결과가 반드시 1건 이하이어야 하고 복수 행 비교 연산자는 서브쿼리의 결과 건수와 상관없다.

③ 서브쿼리에서는 ORDER BY를 사용하지 못한다. ORDER BY절은 SELECT절에서 오직 한 개만 올 수 있기 때문에 ORDER BY절은 메인쿼리의 마지막 문장에 위치해야 한다.

 

12. 인라인 뷰(Inline View)

FROM 절에서 사용되는 서브쿼리를 인라인 뷰(Inline View)라고 한다. 서브쿼리의 결과가 마치 실행 시에 동적으로 생성된 테이블인 것처럼 사용할 수 있다. 인라인 뷰는 SQL 문이 실행될 때만 임시적으로 생성되는 동적인 뷰이기 때문에 데이터베이스에 해당 정보가 저장되지 않는다. 

 

13. 뷰 사용의 장점

- 독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 된다.

- 편리성 : 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수있다. 또한 해당 형태의 SQL문을 자주 사용할 때 뷰를 이용하면 편리하게 사용할 수 있다.

- 보안성 : 직원의 급여정보와 같이 숨기고 싶은 정보가 존재한다면, 뷰를 생성할 때 해당 칼럼을 빼고 생성함으로써 사용자에게 정보를 감출 수 있다.

 

14. CUBE

- Grouping Columns이 가질 수 있는 모든 경우에 대하여 Subtotal을 생성해야 하는 경우에는 CUBE를 사용하는 것이 바람직하나, ROLLUP에 비해 시스템에 많은 부담을 주므로 사용에 주의해야 한다

- CUBE는 결합 가능한 모든 값에 대하여 다차원 집계를 생성한다. CUBE도 결과에 대한 정렬이 필요한 경우는 ORDER BY 절에 명시적으로 정렬 칼럼이 표시가 되어야 한다.

 

15. GROUPING SETS

- GROUPING SETS은 다양한 소계 집합을 만들 수 있는데, GROUPING SETS에 표시된 인수들에 대한 개별 집계를 구할 수 있으며, 이때 표시된 인수들 간에는 계층 구조인 ROLLUP과는 달리 평등한 관계이므로 인수의 순서가 바뀌어도 결과는 같다. 그리고 GROUPING SETS 함수도 결과에 대한 정렬이 필요한 경우는 ORDER BY 절에 명시적으로 정렬 칼럼이 표시가 되어야 한다.

 

16. 순위 함수

- RANK 함수는 ORDER BY를 포함한 QUERY문에서 특정 항목(칼럼)에 대한 순위를 구하는 함수이며 동일한 순위를 부여하게 된다.

- DENSE_RANK 함수는 RANK 함수와 흡사하나, 동일한 순위를 하나의 건수로 취급하는 것이 다른 점이다.

- ROW_NUMBER 함수는 RANK나 DENSE_RANK 함수가 동일한 값에 대해서는 동일한 순위를 부여하는데 반해, 동일한 값이라도 고유한 순위를 부여한다.

 

17. LAG, LEAD

- LAG 함수를 이용해 파티션별 윈도우에서 이전 몇 번째 행의 값을 가져올 수 있다. 이후 몇 번째 행의 값을 가져오는 것은 LEAD 함수이며, SQL Server에서는 지원하지 않는 함수이다.

 

18. PL/SQL의 특징

- PL/SQL은 Block 구조로 되어있어 각 기능별로 모듈화가 가능하다.

- 변수, 상수 등을 선언하여 SQL 문장 간 값을 교환한다.

- IF, LOOP 등의 절차형 언어를 사용하여 절차적인 프로그램이 가능하도록 한다.

- DBMS 정의 에러나 사용자 정의 에러를 정의하여 사용할 수 있다.

- PL/SQL은 Oracle에 내장되어 있으므로 Oracle과 PL/SQL을 지원하는 어떤 서버로도 프로그램을 옮길 수 있다.

- PL/SQL은 응용 프로그램의 성능을 향상시킨다.

- PL/SQL은 여러 SQL문장을 Block으로 묶고 한 번에 Block 전부를 서버로 보내기 때문에 통신량을 줄일 수 있다.

 

19. 저장 모듈(Stored Module)

- SQL 문장을 데이터베이스 서버에 저장하여 사용자와 애플리케이션 사이에서 공유할 수 있도록 만든 일종의 SQL 컴포넌트 프로그램이며, 독립적으로 실행되거나 다른 프로그램으로 부터 실행될 수 있는 완전한 실행 프로그램이다. Oracle의 저장 모듈에는 Procedure, User Defined Function, Trigger가 있다.

 

20. Procedure와 Trigger의 차이점

Procedure Trigger
CREATE Proceduer 문법사용 CREATE Trigger 문법사용
EXECUTE 명령어로 실행 생성 후 자동으로 실행
COMMIT, ROLLBACK 실행 가능 COMMIT, ROLLBACK 실행 안됨
728x90
반응형

'Certificate > SQLD' 카테고리의 다른 글

[SQLD] 기출문제 오답정리 2  (3) 2023.11.15
[SQLD] 기출문제 오답정리  (2) 2023.11.12
[SQLD] 2과목 1장 핵심정리 모아놓기  (0) 2023.11.05
[SQLD] 단답형 정리  (0) 2023.11.05
[SQLD] 1과목 핵심정리 모아놓기  (0) 2023.11.05
728x90
반응형

주제 : 고객 정보 관리 시스템

 

1. 주요내용

기존의 로직을 MVC 패턴을 이용한 로직으로 변경하기

 

- Model

class CustomerModel:

    def do_I(self, customers, customer):
        customers.append(customer)
        index = len(customers) - 1
        return index
    def do_U(self, customers, customer, index):
        customers[index] = customer

 

- View

import re

class CustomerView:
    def chk_input_data(self, msg, func, upper=True):
        while True:
            x = input(msg)
            if upper:
                x = x.upper()
            if func(x):
                break
            else:
                print('잘못입력하셨습니다. 다시 입력 해 주세요.')
        return x

    def check_email_addr(email_addr):
        regex = re.compile('^[a-zA-Z][a-zA-Z0-9]{3,10}@[a-zA-Z0-9]{2,8}[.][a-zA-Z]{2,5}$') # re.compile 정규표현식 객체 바로 생성
        regex.search((email_addr))
        return regex.search(email_addr)

    def do_I(self):
        print('고객정보 입력')
        customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }
        customer['name'] = self.chk_input_data('이름을 입력하세요 : ', lambda x: True if len(x) > 2 else False) # 조건식이 참일 때 True리턴 거짓일때 False리턴
        customer['gender'] = self.chk_input_data('성별 (M/F)를 입력하세요 : ', lambda x: True if x in ('M','F') else False)
        customer['email'] = self.chk_input_data('이메일 주소를 입력하세요 : ', lambda x: True if self.check_email_addr(x) else False)
        customer['year'] = self.chk_input_data('출생년도 4자리 입력하세요 : ', lambda x: True if len(x) == 4 and x.isdigit() else False)
        # customers.append(customer)
        # index = len(customers) - 1
        return customer

    def do_U(self):
        print('현재 고객 정보 수정')
        customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }
        customer['name'] = self.chk_input_data('이름을 입력하세요 : ', lambda x: True if len(x) > 2 else False) # 조건식이 참일 때 True리턴 거짓일때 False리턴
        customer['gender'] = self.chk_input_data('성별 (M/F)를 입력하세요 : ', lambda x: True if x in ('M','F') else False)
        customer['email'] = self.chk_input_data('이메일 주소를 입력하세요 : ', lambda x: True if '@' in x else False)
        customer['year'] = self.chk_input_data('출생년도 4자리 입력하세요 : ', lambda x: True if len(x) == 4 and x.isdigit() else False)
        # customers[index] = customer
        return customer

 

- Controller

from customer_mvc_v import CustomerView
from customer_mvc_m import CustomerModel
import sys
import pickle
import os

class CustomerController:
    def __init__(self):
        self.customers = self.do_L()
        self.index = -1
        self.customer_view =CustomerView()
        self.customer_mode =CustomerModel()

    def print_menu(self):
            return input('''
                다음 중에서 하실 작업의 메뉴를 입력하세요.
                I - 고객 정보 입력
                P - 이전 고객 정보 조회
                C - 현재 고객 정보 조회
                N - 다음 고객 정보 조회
                U - 현재 고객 정보 수정
                S - 현재 고객 정보 저장
                D - 현재 고객 정보 삭제
                Q - 프로그램 종료
            ''').upper()

    def do_P(self, customers, index):
        print('이전 고객 정보 조회')
        if index <= 0:
            print('이전 데이타로 이동 불가.')
            print(index)
        else:
            index -= 1
            print(f'{index + 1}번째 고객 정보 입니다.')
            print(customers[index])
        return index

    def do_C(self, customers, index):
        print('현재 고객 정보 조회')
        if index >= 0:
            print(f'{index + 1}번째 고객 정보 입니다.')
            print(customers[index])
        else:
            print('입력된 정보가 없습니다. 정보 입력은 I를 선택하세요.')
            print(customers[index])

    def do_N(self, customers, index):
        print('다음 고객 정보 조회')
        if index >= (len(customers) - 1):
            print('이후 데이터 이동 불가')
            print(index)
        else:
            index += 1
            print(f'{index + 1}번째 고객 정보 입니다.')
            print(customers[index])
        return index

    def do_D(self, customers, index):
        print(f'현재 고객 정보{customers[index]["name"]} 삭제')
        del customers[index]

    def do_S(self, customers):
        print('고객 정보 저장')
        try:
            with open('cust/customers.pkl', 'wb') as f:
                pickle.dump(customers, f)
        except Exception as e:
            print('저장 오류!!!', e)

    def do_L(self):
        file_path = 'cust/customers.pkl'
        if os.path.exists(file_path):
            with open(file_path, 'rb') as f:
                return pickle.load(f)
        else:
            return list()

        # Main
    def main(self):
        while True:
            menu = self.print_menu()
            if menu == 'I':
                customer = self.customer_view.do_I()
                self.index = self.customer_model.do_I(self.customers, customer)
            elif menu == 'P':
                self.index = self.do_P(self.customers, self.index)
            elif menu == 'C':
                self.do_C(self.customers, self.index)
            elif menu == 'N':
                self.index = self.do_N(self.customers, self.index)
            elif menu == 'U':
                customer = self.customer_view.do_U()
                self.index = self.customer_mode.do_U(self.customers, customer, self.index)
            elif menu == 'D':
                self.do_D(self.customers, self.index)
            elif menu == 'S':
                self.do_S(self.customers)
            elif menu == 'Q':
                self.do_S(self.customers)
                print('안녕히가세요~')
                sys.exit()
            else:
                print('잘못 입력하셨습니다. 다시 입력 해주세요')


if __name__ == '__main__':
    a = CustomerController()
    a.main()

 

728x90
반응형
728x90
반응형

작성한 클래스 코드 설명

# 1.
class Tv():  
    def __init__(self):
        self.__channel = 0
        self.__volume = 0
        self.__on = 'on'
        self._off = 'off'
    # 2.
    def show(self):
        print(self.__channel, self.__volume, self.__on)
    # 3.    
    def set_channel(self, channel):
        # 지문인식 등록 된 사람 지문 인지 검사
        if 2 < channel and 99 > channel:
            self.__channel = channel
    # 4.
    def get_channel(self, on):
        self.__on = on
    # 5.    
    def get_on(self, on):
        return self.__on

# 1 : Tv 클래스는 __init__ 생성자를 가지고 있으며, 이 생성자는 __channel, __volume, __on, _off의 기본값으로 TV 객체를 초기화힌다. __channel, __volume, __on 앞의 "__"은 접근제어자로 해당 속성들이 클래스 외부에서 직접 접근되지 않아야 함을 나타낸다. _off 앞의 한 번의 밑줄은 보호된 속성이지만, 두 번의 밑줄보다는 덜 제한적이라는 관습적인 표기이다.

# 2 : show 메서드는 현재 __channel, __volume, __on의 값을 출력하는 간단한 메서드다. 이 메서드는 TV의 현재 상태를 표시하는 데 사용될 수 있다.

# 3 : set_channel 메서드는 TV의 채널을 설정하는 데 사용된다. 채널이 2에서 99 사이인지 확인한 후에 __channel 속성을 업데이트 한다. (입력 유효성 검사 )

# 4 : get_channer 메서드는 on 값을 받아서 __on 속성에 할당한다.

# 5 : get_on 메서드는 __on 속성의 값을 반환한다. 이 메서드는 일반적인 "get" 메서드로서, 속성 값을 외부에서 가져오는 용도로 사용된다.

 

- 실행 결과

 

 

입출금 클래스 만들기 실습

https://mzero.tistory.com/33

 

[Python] 파이썬 클래스 실습

입출금 클래스 만들기 1. 요구사항 - 은행 계좌 - 잔액(balance) 상태 - 저금(deposit) 행동, 인출(witndraw) 행동 2. 내가 작성해 본 코드 class Bank(): def __init__(self): self.__balance = 0 self.__money = 0 def deposit(self,

mzero.tistory.com

 

MVC

- 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴

- Model, View, Controller

- 사용자가 view를 통해 controller를 조작하면 controller는 model을 통해 데이터를 가져오고, 그 정보를 통해 시각적인 담당을 하는 view를 다시 제어해서 사용자에게 전달

- 패턴을 사용하면 사용자 인터페이스로부터 비즈니스 로직을 분리하여 어플리케이션의 시각적인 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 어플리케이션을 만들 수 있다.

- Model

     > 어플리케이션의 정보(데이터)를 나타냄

     > 데이터와 비즈니스 로직을 관리

     > 데이터베이스와의 상호작용, 데이터의 유효성 검사 등을 담당

 - controller

     > 모델과 뷰로 명령을 전달

     > 클라이언트의 요청을 받아 뷰와 모델 간의 조합을 구성하고, 어떤 뷰와 어떤 모델을 사용할지 결정.

- view

     > 레이아웃과 화면을 처리

     > 텍스트, 체크박스 등과 같은 사용자 인터페이스 요소를 나타냄

     > 클라이언트의 요청을 처리하고, 모델을 이용하여 데이터를 처리한 후, 클라이언트에게 결과를 전달하는 역할을 수행

 

MVC 패턴으로 고객 정보 관리 프로그램 만들기

https://mzero.tistory.com/35

 

[Python] 고객 정보 관리 프로그램 만들기 실습 4

주제 : 고객 정보 관리 시스템 1. 주요내용 기존의 로직을 MVC 패턴을 이용한 로직으로 변경하기 - Model class CustomerModel: def do_I(self, customers, customer): customers.append(customer) index = len(customers) - 1 return ind

mzero.tistory.com

 

728x90
반응형
728x90
반응형

입출금 클래스 만들기

 

1. 요구사항

- 은행 계좌
- 잔액(balance) 상태
- 저금(deposit) 행동, 인출(witndraw) 행동

 

2. 내가 작성해 본 코드

class Bank():
    def __init__(self):
        self.__balance = 0
        self.__money = 0
    def deposit(self, money):
        if money > 0:
            self.__money = money
            self.__balance += self.__money
        print('입금되었습니다.')
        print(f'잔액이 {self.__balance} 남았습니다.')
        return self.__balance
    def withdraw(self, money):
        if money > 0:
            self.__money = money
            self.__balance -= self.__money
        print('출금되었습니다.')
        print(f'잔액이 {self.__balance} 남았습니다.')
        return self.__balance

 

 2 -1. 실행 결과


3. 강사님 코드

   - 전달 받은 금액을 잔액에 누적한다.
    - 입금 금액의 범위가 0보다는 커야 한다.
    - 최대 입금액 한도를 초과하지 않아야 한다.
    - (옵션) 총 잔액을 반환한다.

class BankAccount:
    def __init__(self):
        self.__balance = 0
           
    def deposit(self, amount):
        if 0 < amount and 10000000 > amount:
            self.__balance += amount
        print(f'{amount}를 입금 하셨습니다. \n 잔액은 총 {self.__balance}입니다.')
        return self.__balance
    
    def withdraw(self, amount):
        if 0 < amount and 10000000 > amount:
            self.__balance -= amount
            print(f'{amount}를 출금 하셨습니다. \n 잔액은 총 {self.__balance}입니다.')
            return self.__balance

 

3 -1. 실행 결과

 

728x90
반응형
728x90
반응형

문자열

- 문자열은 문자들의 시퀀스로 정의된다. 글자들이 실(String)로 묶여 있는 것이 문자열이라고 생각하면 된다.

- 인덱싱 : 문자열도 크게 보면 시퀀스(Sequence)라는 자료 구조에 속한다. 시퀀스는 리스트와 같이 항목들이 순서를 가지고 모인 자료구조이다.

 

원시 문자열

- 문자열의 시작 따옴표 앞에 r을 두면 원시 문자열(raw string)이 된다.

- 앞에 r이 붙어 있는 원시 문자열이기 때문에 파이썬은 백슬래시를 문자열의 일부로 간주한다. 즉, 백슬래시를 이스케이프 문자로 취급하지 않는다.

- 원시 문자열은 r'C:\\User\Kim\Document'와 같은 윈도우 파일 경로를 나타내는 문자열에 필요하다.

 

슬라이싱

- 슬라이싱이란 문자열의 일부를 잘라서 서브 문자열을 만드는 연산

 

문자열 관련 메소드

https://mzero.tistory.com/31

 

[Python] 파이썬 문자열 메소드, 정규식

문자열 메소드 - lower() : 소문자로 변환된 새 문자열을 반환한다. - upper() : 대문자로 변환된 새 문자열을 반환한다. >> lower() 및 upper() 메소드는 대소문자를 구분하지 않고 비교할 때 아주 유용하

mzero.tistory.com

 

파이썬 소스 파일 확인하기

- 사용자가 입력한 문자열이 파이썬 소스 파일 이름인지를 검사하려면 다음과 같이 입력

s = input('파이썬 소스 파일 이름을 입력하시오 : ')
if s.endswith('.py'):
    print('올바른 파일 이름입니다.')
else:
    print('올바른 파일 이름이 아닙니다.')

 

예외처리

- 사용자들은 잘못된 데이터를 입력할 수도 있고, 우리가 오픈하고자하는 파일이 컴퓨터에 존재하지 않을 수도 있으며 인터넷이 다운될 수도 있다.

- 오류가 발생했을때 오류를 사용자에게 알려주고 모든 데이터를 저장하게 한 후에 사용자가 우아하게(gracefully) 프로그램을 종료할 수 있도록 하는 것이 바람직히다.

 

오류의 종류

- 사용자 입력 오류 : 사용자가 정수를 입력하여야 하는데 실수를 입력 할 수 있다.

- 장치오류 : 네트워크가 안 된다거나 하드 디스크 작동이 실패할 수 있다.

- 코드오류 : 잘못된 인덱스를 사용하여서 배열에 접근할 수 있다.

- IOError : 파일을 열 수 없으면 발생한다.

- importError : 파이썬이 모듈을 찾을 수 없으면 발생한다.

- ValueError : 연산이나 내장 함수에서 인수가 적절치 않은 값을 가지고 있으면 발생한다.

- KeyboardInterrupt : 사용자가 인터럽트 키를 누르면 발생한다. (ctrl-c 나 delete)

- EOFError : 내장 함수가 파일의 끝을 만나면 발생한다.

 

예외처리

- Try-catch 구조

-오류를 처리 할 수 있게끔 지원한다.


- 예외처리 형식


- finally : 오류 유무에 상관 없이 무조건 실행


객체 지향 프로그래밍

객체 지향 프로그래밍(OOP: object-oriented programming)은 우리가 사는 실제 세계가 객체(object)들로 구성된 것과 비슷하게, 소프트웨어도 객체로 구성하는 방법이다. 실제 세계에서는 사람, 자동차, 텔레비전, 세탁기, 냉장고 등의 많은 객체가 존재한다. 객체들은 객체 나름 대로 고유한 기능을 수행하면서 다른 객체들과 메세지를 통하여 상호작용 한다.

 

절차 지향과 객체 지향

- 절차 지향 프로그래밍(procedural programming)은 프로시저를 기반으로 하는 프로그래밍 방법이다.

- 객체 지향 프로그래밍(object-oriented programming)은 데이터와 함수를 하나의 덩어리로 묶어서 생각하는 방법이다.

- 절차지향의 문제 : 가장 중요한 단점은, 서로 관련된 데이터와 함수를 묶을 수가 없다는 점이다. 따라서 절차 지향 방법에서는 데이터가 프로그램의 중요한 부분임에도 불구하고 프로그래머들은 함수 작성에만 신경을 쓰게 된다.

 

객체

- 객체(object)는 속성과 동작을 가진다

- 자동차는 메이커나 모델, 색상, 연식, 가격과 같은 속성(attribute)을 가지고 있다. 또 자동차는 주행할 수 있고, 방향을 전환하거나 정지할 수 있다. 이러한 것을 객체의 동작(action)이라고 한다.

- 파이썬에서는 모든 것이 객체이다.

 

클래스

- 객체에 대한 설계도를 클래스(class) 라고 한다. 클래스란 특정한 종류의 객체들을 찍어내는 형틀(template) 또는 청사진(blueprint)이라고도 할 수 있다.

- 클래스로부터 만들어지는 객체를 그 클래스의 인스턴스(instance)라고 한다.

- 형식

class 클래스 이름:
    def __init__(): # 생성자
    def 메소드 이름(...): # 메소드

- 모든 메소드에 사용 유무와 상관 없이 "self" 파라미터가 첫번째로 들어가야 한다.

class Counter:
    counter_a = 0
    def __init__(self): # 생성자
        print("__init__")
        self.count = 0 
    def increment(self): # 메소드
        self.count += 1 
    def print_count(self): # 메소드
        print(self.count)
 

캡슐화💊

- 개발자로서 클래스의 객체를 갖고 작업할 때는 객체가 어떻게 내부적으로 속성을 저장하고 어떻게 메소드들이 구현되는지 알 필요가 없다. 공용 인터페이스만 제공하고 구현 세부사항을 감추는 것을 캡슐화(encapsulation)라고 한다.

- 캡슐화는 데이터와 알고리즘을 하나로 묶는 것이다.

728x90
반응형
728x90
반응형

문자열 메소드

- lower() : 소문자로 변환된 새 문자열을 반환한다.

- upper() : 대문자로 변환된 새 문자열을 반환한다.

     >> lower() 및 upper() 메소드는 대소문자를 구분하지 않고 비교할 때 아주 유용하다. 다음 코드에서는 문자열이 먼저 소문자로 변환되기 때문에, 사용자가 yes, Yes, YES중에서 어떤 것을 입력하더라도 올바르게 동작한다.

print('계속 진행하시겠습니까?')
response = input()
if response.lower() == 'yes':
    print('계속')
else:
    print('나가기')

- startswith(n) : 문자열 n으로 시작되는 문자열이면 True가 반환된다.

- endswith(n) : 문자열 n으로 종료되는 문자열이면 True가 반환된다.  

- split()

     > 주어진 분리자를 이용하여 문자열을 토큰들의 리스트로 반환한다.

     > 여러 줄로 이루어진 문자열을 한줄씩 분리하는데도 사용된다.

- list() : 문자열을 문자로 분해한다.


- join()

     > 문자열 리스트를 전달받아 접착제 문자를 중간에 넣어서 문자열을 결합한다.

     > 전화번호에서 '.'  문자 대신에 '-' 문자를 사용하고 싶으면 다음과 같은 코드 사용

'-'.join('010.1234.5678'.split('.'))

     > 문자들을 모아서 다시 문자열로 만들때 사용


     > split()와 join()을 함께 사용하면 문자열 중에서 필요 없는 공백을 제거할 수 있다.

- strip() : 시작이나 끝에 공백 문자가 없는 새 문자열을 반환한다.

- ord() : 문자의 코드값을 가져온다.

- chr() : ord()의 반대기능을 수행한다. 숫자 값 n을 전달하면, n에 해당하는 문자를 반환한다.

- len() :  문자열의 길이를 반환한다.

- find()

     > 문자열 안에서 특정 단어를 찾아서 인덱스를 반환한다. 찾지 못했을 경우에는 -1을 반환한다.

     > s.find()는 역순으로 문자열 안에서 단어를 검색한다.

- count() : 문자열 중에서 단어가 등장하는 횟수를 반환한다.

- replace() : 문자열에서 하나의 단어를 다른 단어로 교체할 때 사용한다.

 

문자열 검사 메소드

- isupper() :  문자열이 대문자로만 구성되는 경우 True를 반환한다.

- islower() :  문자열이 소문자로만 구성되는 경우 True를 반환한다.

- isalpha() : 문자열이 영문자로만 구성되는 경우 True를 반환한다.

- isalnum() : 문자열이 영문자와 숫자로만 구성되는 경우 True를 반환한다.

- isdecimal() : 문자열이 숫자로만 구성되는 경우 True를 반환한다.

- isspace() : 문자열이 공백, 탭 및 줄바꿈 문자인 경우 True를 반환한다.


정규식

- regular expression : 패턴을 이용해서 문자열을 찾거나 바꾸는 기능

- 문자열 표현 수


- 수량 한정자

 

728x90
반응형

+ Recent posts