업무 분석: 슈퍼마켓에서 업무가 어떻게 돌아가는지 파악한다. 물건은 어디서 들어오고 어떻게 계산하며 재고는 어떻게 관리하는지.
시스템 설계: 업무 분석을 컴퓨터에 적용시키기 위해서 알맞은 형태로 다듬는 과정 (UI/UX 포함)
프로그램 구현: 프로그래밍 언어로 코딩하는 단계
테스트: 코딩된 프로그램에 오류가 없는지 확인
유지보수: 온라인 쇼핑몰을 운영하면서 문제점을 보완하고 기능을 추가
테이블이 나오기 위해서는 다소 복잡한 절차를 거쳐야 한다. (정규화)
용어
데이터(data): 하나하나의 단편적인 정보
테이블(table): 회원이나 제품의 데이터를 입력하기 위해 표 형태로 표현한 것.
데이터베이스(Database): 테이블이 ㅉ저장되는 저장소. 데이터를 저장하는 곳.
DBMS: 데이터베이스 관리 시스템 또는 소프트웨어. (ex. MySQL)
열/컬럼/필드(column): 테이블의 세로. 각 테이블은 여러 개의 열로 구성된다.
열 이름: 각 열을 구분하기 위한 이름. 열 이름은 각 테이블 내에서는 서로 달라야 한다.
데이터 형식: 열에 저장된 데이터 형식. 숫자형, 문자형. 데이블을 생성할 때 열 이름과 함께 지정해준다.
행/로우/레코드(row): 실질적인 진짜 데이터. 즉 행의 개수가 데이터의 개수다.
기본 키/주키: 각 행을 구분하는 유일한 열. 중복되어서도 안 되고, 비어 있어서도 안 된다.
SQL: DBMS가 알아듣는, 구조화된 질의 언어
데이터베이스 구축 절차
데이터베이스 만들기→ 테이블 만들기→ 데이터 입력/수정/삭제하기→ 데이터 조회→활용하기
CRUD
테이블은 2차원의 표 형태로 이루어져 있으며, 각 열에 해당하는 데이터를 한 행씩 입력(C)할 수 있다.
필요하다면 행에 입력된 데이터를 수정(U)하거나 삭제(D)할 수 있다.
마지막으로 입력이 완료된 데이터를 조회(R)에서 활용할 수 있다.
DB 만들기
Table 만들기
데이터 입력하기
데이터 입력
INSERT INTO 'shop_db'.'member' ('member_id', 'member_name', 'member_addr') VALUES('carry', '머라이어', '미국 텍사스 사막');
데이터 수정
UPDATE 'shop_db'.'member' SET 'member_addr' = '영국 런던 먹자골목' WHERE ('member_id' = 'carry');
데이터 삭제
DELETE FROM 'shop_db'.'member' WHERE ('member_id' = 'carry');
데이터 활용
SELECT 열_이름 FROM 테이블_이름 [WHERE 조건]
SELECT member_name, member_addr FROM member;
SELECT * FROM member WHERE member_name ='아이유';
데이터베이스 개체
인덱스, 뷰, 스토어드 프로시저, 트리거, 함수, 커서 등의 개체는 모두 테이블과 연관이 있다.
인덱스
CREATE INDEX idx_member_name ON member(member_name);
찾아보기 시간을 단축한다.
뷰
create view member_view
as
select * from member;
실제 데이터를 가지고 있지 않고, 진짜 테이블에 링크된 개념
보안에 도움이 된다.
긴 SQL문을 간략하게 만들 수 있다.
스토어드 프로시저
DELIMITER //
CREATE PROCEDURE myProc()
BEGIN
SELECT * FROM member WHERE member_name = '나훈아';
SELECT * FROM product WHERE product_name = '삼각김밥' ;
END//
DELIMITER ;
def print_n_times(value, n):
for i in range(n):
print(value)
print_n_times("안녕하세요", 5)
안녕하세요 안녕하세요 안녕하세요 안녕하세요 안녕하세요
가변 매개변수
매개변수를 원하는 만큼 입력할 수 있는 함수 (매개변수의 개수가 변할 수 있다.)
가변 매개변수 뒤에는 일반 매개변수가 올 수 없다.
가변 매개변수는 하나만 사용할 수 있다.
def print_n_times(n, *values):
#n번 반복합니다.
for i in range(n):
#values는 리스트처럼 활용합니다.
for value in values:
print(value)
print()
print_n_times(2, "안녕하세요", "뚱쌤", "배고파요")
안녕하세요
뚱쌤
배고파요
안녕하세요
뚱쌤
배고파요
기본 매개변수
일반 매개변수(n), 기본 매개변수(n=2)
기본 매개변수 뒤에는 일반 매개변수가 올 수 없다.
def print_n_times(value, n=2):
for i in range(n):
print(value)
print_n_times("안녕하세요", 3)
안녕하세요
안녕하세요
안녕하세요
가변 매개변수가 기본 매개변수보다 앞에 오면, 어디까지가 values에 해당하는지 알 수가 없다.
def print_n_times(*values, n=2):
for i in range(n):
for value in values:
print(value)
print()
print_n_times("오늘", "점심은", "마라탕", 3)
오늘 점심은 마라탕 3
오늘 점심은 마라탕 3
키워드 매개변수
이러한 문제를 해결하기 위해 등장
매개변수 이름을 직접적으로 지정해서 값을 입력한다.
ex. end=""
def print_n_times(*values, n=2):
for i in range(n):
for value in values:
print(value)
print()
print_n_times("오늘", "점심은", "마라탕", n=3)
기본 매개변수 중에서 필요한 값만 입력하기
def test(a, b=10, c=100): #함수헤더
print(a+b+c) #함수 바디
#기본형태
test(10, 20, 30)
#키워드 매개변수로 모든 매개변수를 지정한 상태
test(a=10, b=100, c=200)
# 키워드 매개변수로 모든 매개변수를 마구잡이로 지정한 형태
test(c=10, a=100, b=200)
# 키워드 매개변수로 일부 매개변수만 지정한 형태
test(10, c=200)
60 310 310 220
리턴 return
def 함수 이름(): #함수 헤더 문장 #함수 바디
함수를 호출한 부분에 함수 바디에서 작업한 부분을 반환하는 장치
함수의 바디 부분에 [ return + 식 ]을 써주면 바디에서 수행된 결과를 호출한 곳으로 반환시킨다.
def return_test():
return
value = return_test()
print(value)
None
None은 없다는 뜻!
기본적인 함수의 활용
def 함수(매개변수): 변수=초깃값 # 여러가지 처리 # 여러가지 처리 # 여러가지 처리 return 변수
def sum_all(start, end):
output = 0
for i in range(start, end+1):
output += i
return output
print("0 to 100:", sum_all(0, 100))
print("0 to 1000:", sum_all(0, 1000))
print("50 to 100:", sum_all(50, 100))
print("500 to 1000:", sum_all(500, 1000))
0 to 100: 5050 0 to 1000: 500500 50 to 100: 3825 500 to 1000: 375750
기본 매개변수 사용하기
def sum_all(start=0, end=100, step=1):
output = 0
for i in range(start, end+1, step):
output += i
return output
print("A:", sum_all(0, 100, 10))
print("B:", sum_all(end=100))
print("C:", sum_all(end=100, step=2))
A: 550 B: 5050 C: 2550
B. 함수의 활용
재귀함수
팩토리얼 구하기
n! = n * (n-1) * (n-2) * ... * 1
반복문으로 구하기
def factorial(n):
output = 1
for i in range(1, n+1):
output *= i
return output
print("1!:", factorial(1))
print("2!:", factorial(2))
print("3!:", factorial(3))
print("4!:", factorial(4))
print("5!:", factorial(5))
#괄호가 없는 튜플
tuple_test = 10, 20, 30, 40
print("tuple_test:", tuple_test)
print("type(tuple_test):", type(tuple_test))
print()
#괄호가 없는 튜플 활용
a, b, c = 10, 20, 30
print("a:", a)
print("b:", b)
print("c:", c)
# a, b = 100, 200, 300
# ValueError: too many values to unpack (expected 2)
# a, b, c = 100, 200
# ValueError: not enough values to unpack (expected 3, got 2)
# 매개변수로 받은 함수를 10번 호출하는 함수
def call_10_times(func):
print(type(func))
for i in range(3):
func()
# 간단한 출력하는 함수
def print_hello():
print("안녕하세요")
# 조합하기
call_10_times(print_hello)
print(type(print_hello))
# map() 함수의 실행결과 map(power, list_input_a): <map object at 0x0000028F61ECAB00> map(power, list_input_a): [1, 4, 9, 16, 25] # filter() 함수의 실행결과 filter(power, list_input_a): <filter object at 0x0000028F61ECAC80> filter(power, list_input_a): [1, 2]
3이상이면 False, 3미만이면 Flase
결과로 나오는 <map object>와 <filter object>는 제너레이터다.
람다
lambda 매개변수: 리턴값
#일반 함수 사용
def power(item):
return item * item
def under_3(item):
return item < 3
#람다 함수 정의할 때 사용
power = lambda x: x * x
under_3 = lambda x: x < 3
#람다 함수 호출할 때 사용
output_a = map(lambda x: x*x)
output_b = filter(lambda x: x<3, list_input_a)
with open("basic.txt", "r") as file:
contents = file.read()
print(contents)
랜덤으로 1000명 키와 몸무게 만들기
# 랜덤한 숫자를 만들기 위해 가져온다.
import random
#간단한 한글 리스트를 만든다.
hanguls = list("가나다라마바사아자차카타파하")
#파일을 쓰기 모드로 연다.
with open("info.txt", "w") as file:
for i in range(1000):
#랜덥한 값으로 변수를 생성한다.
name = random.choice(hanguls) + random.choice(hanguls)
weight = random.randrange(40, 100)
height = random.randrange(140, 200)
#텍스트를 쓴다.
file.write("{}, {}, {}\n".format(name, weight, height))
for i in range(4, 0-1, -1): #4부터, 마지막까지, -1에서 증감한 값 0
print("현재 반복 변수: {}".format(i))
reversed()
함수와 반복문을 조합할 때는 함수의 결과를 여러 번 사용하지 않고 for 구문 내부에 reversed() 함수를 곧바로 넣어서 사용한다.
for i in reversed(range(5)):
print("현재 반복 변수: {}".format(i))
현재 반복 변수: 4 현재 반복 변수: 3 현재 반복 변수: 2 현재 반복 변수: 1 현재 반복 변수: 0
enumerate()
함수와 반복문 조합하기
for와 in 사이에 반복 변수를 두개 넣어서
index와 value를 각각 가져올 수 있다.
exapme_list = ["요소A", "요소B", "요소C"]
print("# enumerate() 함수 적용")
print(enumerate(exapme_list))
print()
print("# list() 함수로 강제 변환 출력")
print(list(enumerate(exapme_list)))
print()
print("# 반복문과 조합하기")
for i, value in enumerate(exapme_list): #반복설계구문
print("{}번째 요소는 {}입니다.".format(i, value))
# enumerate() 함수 적용 <enumerate object at 0x000002569F183880>
# list() 함수로 강제 변환 출력 [(0, '요소A'), (1, '요소B'), (2, '요소C')]
# 반복문과 조합하기 0번째 요소는 요소A입니다. 1번째 요소는 요소B입니다. 2번째 요소는 요소C입니다.
튜플
(0, '요소A') 같은 것들
수정 불가능한 리스트
같은 요소여도 메모리가 적다.
itmes()
example_dictionary = {
"키A": "값A",
"키B": "값B",
"키C": "값C",
}
print("#딕셔너리의 items() 함수")
print("items():", example_dictionary.items())
print()
print("#딕셔너리의 items() 함수와 반복문 조합하기")
for key, element in example_dictionary.items():
print("dictionary[{}] = {}".format(key, element))
#딕셔너리의 items() 함수 items(): dict_items([('키A', '값A'), ('키B', '값B'), ('키C', '값C')])