📘 CodingMarble Learn

고급 프로그래밍과 응용

고급 프로그래밍이란 알맞은 자료구조(배열, 연결 리스트, 스택, 큐)를 고르고, IDE에서 코드를 쓰고 테스트하며, 차트와 애니메이션을 그리고, 스프레드시트 함수를 쓰고, 관계형 데이터베이스에 데이터를 안전하게 저장해 SQL로 불러오는 것을 말해요.

🎬 단계별 이야기

  1. 배열은 칸의 수가 정해져 있어요. 여기서는 여섯 칸이에요. 크기는 처음에 정하고, 다 차면 더 넣을 수 없어요.
  2. 연결 리스트는 필요할 때 늘어나요. 각 노드에는 값과 다음 노드로 가는 링크가 있어요. 마지막 노드는 아무것도 가리키지 않아요(null). 추가 버튼을 눌러 보세요.
  3. 스택은 접시 더미와 같아요. 맨 위에 올리고(push), 맨 위에서 꺼내요(pop). 마지막에 들어간 것이 가장 먼저 나와요.
  4. 큐는 표를 사려고 선 줄과 같아요. 맨 뒤에 서고, 맨 앞에서 나가요. 먼저 들어간 것이 먼저 나와요.
  5. 데이터베이스는 데이터를 표(테이블)에 담아요. 두 표는 키인 id로 이어져요. SQL 쿼리는 원하는 행만 골라요. 여기서는 점수가 50 이상인 행이에요.
  6. 이제 직접 해 보세요. 리스트, 스택, 큐 중에서 고르고 버튼을 눌러 항목을 넣고 빼 보세요.

팁: 3D 화면을 드래그하면 돌아가요. 두 손가락으로 확대할 수 있어요.

🤔 헷갈리는 점, 한 번에 해결

배열에 일곱 번째 항목을 왜 넣을 수 없나요?

배열의 크기는 만들 때 정해져요. 0단계에서는 여섯 칸이 배열 전체예요. 계속 늘어나는 모음에는 리스트를 쓰세요.

연결 리스트는 순서를 어디에 기억하나요?

링크에 있어요. 각 노드는 다음 노드만 알기 때문에 화살표를 따라 걸어가야 해요. 1단계를 보세요.

pop을 하면 왜 마지막에 넣은 항목이 나오나요?

스택은 열린 끝이 하나, 맨 위뿐이에요. 가장 새 항목이 맨 위에 있으니 가장 먼저 나가요. 2단계를 보세요.

큐는 스택과 어떻게 다른가요?

큐는 뒤에서 넣고 앞에서 빼니까 가장 오래된 것이 먼저 나가요. 3단계에서 버튼을 눌러 보세요.

왜 표 하나가 아니라 두 개를 쓰나요?

같은 정보를 한 번만 저장하려고요. 이름은 한 표에, 성적은 다른 표에 두고 id로 이어요. 그러면 이름을 고칠 때 한 곳만 바꾸면 돼요. 4단계를 보세요.

어떤 구조를 써야 하나요?

크기가 정해져 있고 인덱스로 빨리 접근하려면 배열. 늘어나는 모음이면 리스트. 되돌리기와 뒤로 가기는 스택. 대기 줄은 큐. 5단계에서 하나씩 해 보세요.

자료구조: 배열, 연결 리스트, 스택, 큐

자료구조는 프로그램이 데이터를 빠르고 쉽게 쓰도록 데이터를 배열해 두는 방법이에요.

라이브러리에는 이런 도구가 이미 들어 있어요. 파이썬에서는 list가 스택처럼 동작하고(append, pop), collections.deque는 빠른 큐처럼 동작해요. 이미 있으면 새로 만들지 말고 가져다 쓰세요.

stack = []
stack.append(5); stack.append(8)
stack.pop()      # gives 8
from collections import deque
q = deque([4, 9]); q.append(2)
q.popleft()      # gives 4

IDE 사용하기: 쓰고, 실행하고, 테스트하기

IDE(통합 개발 환경)는 편집기, 실행 버튼, 디버거와 여러 도구를 한곳에 모아 둔 프로그램이에요. 코드에 색을 입히고, 이름을 추천해 주고, 입력하는 동안 오류를 보여 줘요.

2D와 3D 시각화 그리고 애니메이션

그림은 규칙을 찾는 데 도움이 돼요. 프로그램은 차트(막대, 선, 산점도), 2D 그림, 3D 장면을 그릴 수 있어요. 애니메이션은 조금씩 바뀐 같은 그림을 계속 다시 그리는 거예요(1초에 약 30~60번). 간단한 방법은 x 같은 변수를 두고, 프레임마다 조금씩 더한 뒤 다시 그리는 것이에요. 이 페이지의 3D도 3D 라이브러리로 같은 방식으로 만들었어요.

고급 스프레드시트 함수

스프레드시트는 함수로 프로그램처럼 일할 수 있어요.

관계형 데이터베이스와 SQL

관계형 데이터베이스는 행과 열로 된 테이블에 데이터를 담아요. 각 테이블에는 기본키(primary key)가 있어요. 값이 모두 다른 열이에요(id). 다른 테이블은 그 값을 외래키(foreign key)로 가지고 있어서 서로 이어져요. 좋은 설계는 같은 정보를 한 번만 저장해서 반복되는 데이터가 없게 해요.

SQL은 데이터에 질문하고 데이터를 바꾸는 언어예요.

SELECT name, score FROM students
JOIN marks ON students.id = marks.id
WHERE score >= 50 ORDER BY score DESC;

INSERT INTO marks (id, score) VALUES (5, 67);
UPDATE marks SET score = 55 WHERE id = 2;
DELETE FROM marks WHERE id = 5;

무결성(integrity)은 데이터가 늘 올바르게 유지된다는 뜻이에요. 키는 겹치지 않고, 외래키는 실제 있는 행과 맞아야 하고, 값은 알맞은 자료형이어야 해요. 보안은 사용자 비밀번호, 필요한 권한만 주기, 백업이에요. 그리고 사용자가 입력한 글을 SQL 문장에 그대로 붙이지 않고 매개변수(parameter)를 써서 SQL 인젝션을 막아요.

공개 자료에 기여하기

많은 도구와 라이브러리는 오픈 소스예요. 라이선스에 따라 누구나 읽고, 쓰고, 고칠 수 있어요. 버그를 고치거나, 설명서를 다듬거나, 페이지를 번역하거나, 예제를 더해서 도울 수 있어요. 항상 라이선스를 읽고, 출처를 밝히고, 고쳐 달라고 제안할 때는 분명하고 공손하게 써요.

해 보기

3D의 5단계에서 스택에 항목 3개를 넣고(push) 모두 꺼내(pop) 보세요. 나온 순서를 적어요. 큐로도 똑같이 해 보세요. 그다음 먼저 예상하고 나중에 확인해요. 4, 9, 2를 넣고 하나를 뺐을 때, 큐의 맨 앞과 스택의 맨 위에는 어떤 값이 남을까요?

핵심 공식과 정의

풀이 예제

1. 5, 8, 2를 이 순서로 스택에 넣었어요. 그다음 pop을 두 번 했어요. 지금 맨 위에는 무엇이 있나요?

넣은 뒤의 스택: 5, 8, 2 (2가 맨 위). pop은 먼저 2를, 그다음 8을 꺼내요. 남은 것은 5예요. 맨 위 = 5.

2. 4, 9, 2가 이 순서로 큐에 들어갔어요. dequeue를 한 번 했어요. 지금 맨 앞의 항목은 무엇인가요?

가장 먼저 들어온 것이 나가니까 4가 빠져요. 맨 앞은 9예요.

3. 성적 표: id 1~4의 점수가 72, 45, 88, 51이에요. WHERE score >= 50은 몇 개의 행을 돌려주나요?

72, 88, 51이 50 이상이에요. 그러니까 3개 행이에요.

4. B2:B5 셀에 72, 45, 88, 51이 들어 있어요. =SUMIF(B2:B5,">=50")의 값은 얼마인가요?

72, 88, 51만 더해요. 72 + 88 + 51 = 211.

5. ( [ ] ) 같은 식의 괄호를 검사할 때 왜 스택을 쓸까요?

여는 괄호를 만날 때마다 push해요. 닫는 괄호가 나오면 pop해서 짝이 맞는지 확인해요. 가장 최근에 연 괄호를 가장 먼저 닫아야 하는데(LIFO), 스택이 바로 그렇게 동작해요. 끝났을 때 스택이 비어 있으면 괄호가 모두 맞아요.

자주 하는 실수

연습 퀴즈

1. LIFO인 구조는 무엇인가요?
2. 링크로 이어져 노드가 하나씩 늘어나는 구조는 무엇인가요?
3. SQL에서 규칙에 맞는 행을 골라 주는 절은 무엇인가요?
4. 모든 행이 서로 다른 값을 가지는 열은 무엇인가요?
5. 디버거의 중단점(breakpoint)은 무엇을 하나요?

연습: 직접 풀어 보세요

답을 입력하거나 고른 뒤 확인을 누르세요. 막히면 힌트를 보세요. 풀이는 답을 낸 뒤에 나타나요.

자주 묻는 질문

배열과 연결 리스트는 무엇이 다른가요?

배열은 크기가 정해져 있고 인덱스로 어느 항목이든 바로 갈 수 있어요. 연결 리스트는 늘거나 줄 수 있지만, 항목에 가려면 링크를 하나씩 따라가야 해요.

기본키와 외래키는 무엇인가요?

기본키는 학번처럼 모든 행에 서로 다른 값을 주는 열이에요. 외래키는 다른 테이블에 있는 열로, 그 값을 가지고 두 테이블을 이어 줘요.

SQL 인젝션은 왜 위험하고 어떻게 막나요?

사용자가 입력한 글을 SQL 명령에 그대로 붙이면, 꾀를 낸 사용자가 자기 명령을 끼워 넣어 데이터를 보거나 지울 수 있어요. 매개변수화된 쿼리를 쓰면 입력한 글은 늘 데이터로만 다뤄져요.

먼저 배우기

다음에 배우기