파이썬 기초 및 활용
학습자료
python
-
python 공식 홈페이지: https://www.python.org
-
python 무료 책: 점프 투 파이썬
복습문제

파이썬의 개요
1. 파이썬이라는 이름에 대한 설명 중 틀린 것은?
- 비단뱀이라는 뜻도 있다.
- 고대 신화에 나오는 큰 뱀 이라는 뜻도 있다.
- 제작자가 좋아하는 코미디에서 따온 이름이다.
- 제작자의 이름이다.
2. 파이썬의 특징이 아닌 것은?
- 언어 자체는 쉽지만 아직 라이브러리가 많지 않아 일일이 개발해야 하는 어려움이 있다.
- 문법이 비교적 간결하다.
- 배우려고 마음만 먹으면 도움이 될 참고자료들이 넘쳐난다.
- 무료로 사용할 수 있다.
3. 파이썬으로 만들면 문제가 생길 만한 프로그램 종류는?
- 웹사이트
- AI 프로그램
- 데이터 분석 프로그램
- real time을 요하는 실시간 처리가 중요한 프로그램
4. 파이썬의 언어적 특징이 아닌 것은?
- 인터프리터 언어이다.
- 대화형 언어이다.
- 실행파일(exe 파일)이 생성된다.
- 질문하면 대답하는 형식으로 프로그램이 진행된다.
5. 다음 중 파이썬의 프롬프트는?
- ###
- >>>
- <<<
- ***
파이썬 자료형
1. 한 변수에 -3, -2, -1, 이렇게 3개 값만 들어간다. 이 경우 파이썬은 이 변수의 자료형을 무엇이라 판단할까?
- 문자열
- 정수형(integer)
- 실수형(float)
- 참/거짓형(boolean)
2. 다음 코드를 실행한 후 메모리의 모습으로 맞는 것은?
>>> a = 5
>>> b = 10
>>> a = 7
3. 다음 코드의 결과는?
>>> a = 1
>>> b = a + 0.1
>>> print (b)
- 1 + 0.1
- 1.01
- 10.1
- 1.1
4. 다음 코드에서 변수 b의 자료형은?
>>> a = 1
>>> b = a + 0.1
- 문자열
- 정수형(integer)
- 실수형(float)
- 참/거짓형(boolean)
5. 다음 코드의 결과는?
>>> 5 // 3
- 1
- 1.6666666666666667
- 2
- 3
6. 다음 코드의 결과는?
>>> 5 % 3
- 1
- 1.6666666666666667
- 2
- 3
7. 다음 코드의 결과는?
>>> 3 ** 3
- 9
- 33
- 27
- 45
8. 다음 코드의 결과는?
>>> a = "올해 연도 : "
>>> b = 2024
>>> c = a + b
- 에러가 발생한다.
- ‘올해 연도 : 2024’
- ‘올해 연도 :’
- ‘2024’
9. 바로 위 문제에서 에러가 발생했다면 이를 해결하기 위한 방법은?
- 문제없이 실행된다.
- c = a + b 를 c = a + len(b)로 수정한다.
- c = a + b 를 c = str(a) + b로 수정한다.
- c = a + b 를 c = a + str(b)로 수정한다.
10. 다음 코드의 결과는?
>>> a = 2024
>>> b = "올해 연도 : {0}".format(a)
>>> b
- 에러가 발생한다.
- ‘올해 연도 : 2024’
- ‘올해 연도 :’
- ‘2024’
11. 다음 코드의 결과는?
>>> a = "올해 연도 : {0}"
>>> b = 2024
>>> c = a.format(b)
>>> c
- 에러가 발생한다.
- ‘올해 연도 : 2024’
- ‘올해 연도 :’
- ‘2024’
12. list를 사용하는 이유가 아닌 것은?
- 변수 하나로 많은 양의 자료를 관리할 수 있다.
- 파이썬은 사용할 수 있는 변수의 갯수가 128개로 정해져 있다.
- 자료마다 변수를 생성하는 것은 매우 불편하고 사실상 그렇게는 개발이 불가능하기 때문
- 개발의 편리함때문
13. 다음 list에서 하나의 요소를 읽어오는 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2]
- ‘짜장’
- ‘짬뽕’
- ‘탕수육’
- ‘회’
14. list에서 하나의 요소를 바꾼 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2] = '깐풍기'
>>> a
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
- [‘짜장’, ‘짬뽕’, ‘깐풍기’, ‘회’]
- ‘깐풍기’
- 에러가 발생하고 값을 바꿀 수 없다.
15. list에 하나의 요소를 추가한 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a.append("육회")
>>> a
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’, ‘육회’]
- ‘육회’
- 에러가 발생하고 값을 바꿀 수 없다.
16. list에 하나의 요소를 특정 위치에 추가하기 위해, ??? 부분에 작성해야 하는 코드는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '짬뽕', '깐풍기', '탕수육', '회']
- a.insert(0, ‘깐풍기’)
- a.insert(1, ‘깐풍기’)
- a.insert(2, ‘깐풍기’)
- a.insert(3, ‘깐풍기’)
17. list에 하나의 요소를 삭제하기 위해, ??? 부분에 작성해야 하는 코드는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '탕수육', '회']
- del a[0]
- a.del[0]
- del a[1]
- a.del[1]
18. 다음 코드의 결과를 순서대로 표시한 것은?
>>> 2 < 5
???
>>> 5 < 2
???
- True, True
- True, False
- False, True
- False, False
파이썬 조건문
1. 파이썬에서 제공하는 제어문 2가지는?
- 조건문, 입출력
- 입출력, 라이브러리
- 조건문, 반복문
- 반복문, 입출력
2. 조건식이 참인 경우에만 실행되는 제어문은?
- 입출력
- 라이브러리
- 반복문
- 조건문
3. 다음 코드에서 실행되는 내용은?
if 3 < 5 :
a = 1 ⓐ
b = 2 ⓑ
c = 3 ⓒ
d = 4 ⓓ
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓐ ⓑ ⓒ ⓓ
4. 다음 조건문에서 실행되는 내용은?
if 3 > 5 :
a = 1 ⓐ
b = 2 ⓑ
c = 3 ⓒ
d = 4 ⓓ
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓓ
5. 다음 조건문의 실행 결과는?
if 3 == 5 :
print("a")
print("b")
- 에러가 난다.
- ‘a’
- ‘b’
- ‘a’
‘b’
6. 다음 조건문의 실행 결과는?
if 3 != 5 :
print("a")
print("b")
- 에러가 난다.
- ‘a’
- ‘b’
- ‘a’
‘b’
7. 조건식이 참이 아닐 경우 실행하는 부분은?
- iif
- then
- print()
- else
8. 다음 조건문 코드의 실행 결과는?
a = 10
if a < 3 :
print ("apple")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘banana’
- ‘apple’
‘banana’
9. 다음 조건문 코드의 실행 결과는?
a = 3
if a < 7 :
print ("apple")
elif a < 5 :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
10. 다음 조건문 코드의 실행 결과는?
a = 9
if a < 7 :
print ("apple")
elif 8 <= a :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
11. 다음 조건문 코드의 실행 결과는?
a = 11
if a < 7 :
print ("apple")
elif a < 4 :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
12. 다음 조건문 코드의 실행 결과는?
a = 6
if a < 7 :
print ("apple")
if 5 <= a :
print ("mango")
elif a < 4 :
print ("kiwi")
else:
print ("banana")
- ‘apple’
‘mango’ - ‘apple’
- ‘mango’
- ‘banana’
- ‘kiwi’
파이썬 반복문
1. “~하는 동안에” 라는 뜻으로 조건식이 참인 경우에만 반복 처리하는 반복문은 ?
- for
- during
- whale
- while
2. 주로 리스트의 모든 요소들을 하나씩 꺼내서 처리하는 방식의 반복문은?
- for
- during
- whale
- while
3. 다음 코드의 실행 결과는?
while True:
print("apple")
- 에러가 난다.
- 아무 것도 실행되지 않는 것처럼 보인다.
- “apple”
- “apple“이 무한히 출력된다.
4. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print(a)
- 에러가 난다.
- 아무 것도 실행되지 않는 것처럼 보인다.
- “3 4 5”
- “3“이 무한히 출력된다.
5. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print (a)
a = a + 1
- 에러가 난다.
- “3“이 무한히 출력된다.
- 3
4 - 3
4
5
6. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print (a)
a = a + 1
- 에러가 난다.
- “3“이 무한히 출력된다.
- 3
4 - 3
4
5
7. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
print(a)
- [1, 2, 3]
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1 2 3
8. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
print(item)
- [1, 2, 3]
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1 2 3
9. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item = 2 :
break
print(item)
- 에러가 발생한다.
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1e
10. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item == 2 :
break
print(item)
- 에러가 발생한다.
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1
11. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item == 2 :
continue
print(item)
- 1
2 - 1
2
3 - 2
- 1
3
12. 다음 코드의 실행 결과는?
for i in range(3):
print (i)
- 1
2
3 - 3
- 2
- 0
1
2
13. 다음 코드의 실행 결과는?
a = [i*3 for i in range(3)]
print (a)
- [1, 2, 3]
- [1, 3, 6]
- 6
- [0, 3, 6]
파이썬 자료형 II
1. list의 고정형 버전으로 각 항목들을 [] 으로 감싸는 list와 달리 ()으로 감싸는 파이썬 자료형은?
- boolean
- float
- tuple
- map
2. tuple에 대한 설명으로 옳은 것은?
- []나 ()로 항목들을 감싼다.
- 한 번 넣어둔 항목들은 바꿀 수 없다.
- 항목을 나중에 추가할 수 있다.
- tuple 안에 들어가는 하나의 항목으로 tuple을 사용할 수 없다.
3. tuple에 입력된 가장 첫 번째 항목을 사용하는 바른 코드는?
- a = tup[0]
- a = tup[1]
- a = tup.0
- a = tup.1
4. “apple” = “애플“과 같이 key와 value의 짝으로 이루어진 파이썬 자료형은?
- map
- float
- tuple
- dictionary
5. “apple” = “애플“과 같이 key와 value의 짝으로 이루어진 자료형에서 key가 “apple“인 자료를 가져오는 코드는 ?
- di[‘apple’]
- di.apple
- di.‘apple’
- di(‘apple’)
함수
1. 영어로는 function으로 번역되며, 프로그램 내에서 어떤 기능을 하도록 미리 만들어 놓은 것은?
- 라이브러리
- 제어문
- 비교문
- 함수
2. 다음 중 파이썬 내장 함수가 아닌 것은?
- print()
- len()
- get_temp()
- str()
3. 다음과 같이 사용자 정의 함수를 호출할 경우 실행되는, 함수의 몸체 부분은?
def plus1(a) :
b = 1 ⓐ
c = 2 ⓑ
d = 3 ⓒ
e = 4 ⓓ
plus1(5)
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓐ ⓑ ⓒ ⓓ
4. 다음 코드는 결과가 나오지 않는다. 그 이유는?
def plus1(a) :
b = a + 1
res = plus1(3)
print (res)
- 파이썬이 이해 못하는 심각한 오류가 있다.
- 함수 정의할 때 들여쓰기를 잘못 했다.
- res 는 예약어라 변수명으로 사용하면 안된다.
- plus1() 함수는 결과값을 리턴하지 않고 있다.
5. 다음 코드의 결과는?
def plus1(a) :
b = a + 1
return b
res = plus1(3)
print (res)
- 1
- 2
- 3
- 4
6. 다음 코드는 에러를 발생시킨다. 그 이유는?
def plus1(a) :
b = a + 1
return b
res = plus1(3)
print (b)
- plus1() 함수 내에 심각한 오류가 있다.
- b는 plus1() 함수 내에서만 사용하는 지역변수다
- res 는 예약어라 변수명으로 사용하면 안된다.
- 아무런 에러없이 잘 실행된다.
파이썬 입출력
1. 입력의 옳은 예가 아닌 것은?
- 키보드로부터 입력
- 파일로부터 입력
- 모니터로부터 입력
- 마우스로부터 입력
2. 출력의 옳은 예가 아닌 것은?
- 파일로 출력
- 스피커로 출력
- 프린터로 출력
- 마이크로 출력
3. 키보드로 문자를 입력받을 때 사용하는 함수는?
- keyboard()
- str()
- input()
- print()
4. 키보드로 숫자를 입력받을 때 사용하는 함수 조합은?
- int( input() )
- input( int() )
- str( input() )
- input( str() )
5. 파일을 새로 만들고 그 안에 내용을 쓰려 한다. 잘못된 부분은?
file = open("data.txt", 'r') ⓐ
file.write("내 이름은 별똥별") ⓑ
file.close() ⓒ
- 잘못된 부분 없음
- ⓐ
- ⓑ
- ⓒ
6. 다음 코드는 파일에서 내용을 읽어오는 코드이다. data.txt 파일의 내용이 다음과 같을 때 이 코드의 실행 결과는?

file = open("data.txt", 'r')
line = file.readline()
print (line)
file.close()
- 역삼역
- 기러기
- 역삼역
기러기 - 아무 것도 표시되지 않는다.
7. 다음 코드는 파일에서 내용을 읽어오는 코드이다. data.txt 파일의 내용이 다음과 같을 때, 파일의 전체 내용을 다 가져오려 하는 경우 ??? 부분에 맞는 것은?

file = open("data.txt", 'r')
lines = file.readlines()
for line ??? lines :
print (line)
file.close()
- as
- in
- all
- with
8. 다음 코드는 엑셀용 csv 파일을 만들기 위한 코드이다. 엑셀에서 열었을 때 왼쪽처럼 보일 거라는 기대와 달리 오른쪽 그림처럼 보이고 있다. 해결 방법은?

file = open("data.csv", 'w')
file.write ("이름,전화번호")
file.write ("홍길동,02-1111-1111")
file.write ("박길동,02-1111-2222")
file.write ("최길동,03-1111-3333")
file.close()
- 확장자를 csv가 아닌 xlsx 로 바꿔서 생성한다.
- 각 줄의 끝에 “,“를 추가한다.
- 각 줄의 끝에 개행문자인 “\n“을 추가한다.
- 각 줄의 앞에 “,“를 추가한다.
HTML
1. HTML은 무엇의 약자인가?
- High Text Markup Language
- Hyper Text Military Language
- Higher Text Military Language
- Hyper Text Markup Language
2. 주로 태그를 이용해 문서에 정보를 추가해 색이나 굵기 등을 바꾸라는 정보 등 추가 정보를 저장하는 것을 무엇이라 하는가?
- Markup
- MarkDown
- MakeUp
- MakeDown
3. HTML에서 <b> 태그의 기능은?
- 이탤릭체로 보여주라는 신호를 웹브라우저에게 준다.
- 시작 부분에 동그라미 같은 bullet을 보여주라는 신호를 웹브라우저에게 준다.
- 굵은 글씨체로 보여주라는 신호를 웹브라우저에게 준다.
- 취소선을 보여주라는 신호를 웹브라우저에게 준다.
4. 링크를 거는 태그와 속성은?
<a>태그, link 속성<a>태그, href 속성<l>태그, link 속성<l>태그, href 속성
5. 태그에 대한 틀린 말은?
- 열었으면 반드시 닫아야 한다.
- 속성이 여러 개 올 수 있다.
<태그명>의 형태를 가진다.- 닫는 태그는
</태그명>의 형태를 가진다.
6. HTML5 문서의 맨 위에 적어야 하는 문구는?
<!DOCTYPE html5><DOCTYPE='html5'><!DOCTYPE html><!DOCTYPE='html'>
7. 해당 HTML 문서에 대한 다양한 메타 정보들을 적거나 javascript를 적는 태그는?
<html><!DOCTYPE><!title><head>
8. 아래 그림과 같이 브라우저 탭에 내가 원하는 문구를 넣으려면 어떤 태그를 이용해야 하는가?

- 태그를 사용하는 게 아니라 해당 HTML 파일의 파일명이 자동으로 표시된다.
<subject><tab><title>
9. HTML 태그와 CSS, JavaScript를 이해하고 해석해서 보여주는 프로그램은?
- CPU
- 인터넷
- 웹브라우저
- HTML
10. 다음 중 가장 큰 글씨를 넣을 수 있는 태그는?
<h1><title><h6><title6>
11. 다음 중 수평선을 그어 내용을 구분하거나 분위기를 전환하는데 사용하는 태그는?
<line><split><hr><section>
12. 다음 HTML 코드가 브라우저에서 보여지는 결과는?
<body>
1번줄
2번줄
</body>
13. 위 문제와 같이 보여지는 현상에 대한 설명이 아닌 것은?
- HTML은 원래 자동 줄 나누기의 개념이 없다.
- 줄 나누기를 위한 태그가 따로 있다.
- 줄 나누기를 하려면 \n을 해야 한다.
- 브라우저에 따라 다르게 보일 수 있다.
14. 글자를 기울여 보이도록 해주는데 사용되는 태그는?
<i><s><a><c>
15. <strong> 태그에 대한 설명으로 틀린 것은?
<b>태그와 거의 같은 기능을 한다.- 이제는 쓰지 않는 태그이다.
- 두꺼운 글씨체로 보여줘 강조한다.
- 닫아야 하는 태그이다.
16. 오른쪽과 같이 보여지도록 하기 위해 각 1, 2, 3에 넣어야 하는 태그로 맞는 것은?

- ul, ol, li
- li, ol, ul
- ol, li, ul
- ul, li, ol
- li, ul, ol
- ol, ui, li
17. HTML로 테이블을 만들 때, 한 줄을 표현하는 태그와 셀 하나를 표현하는 태그가 순서대로 짝지어진 것은?
<td><tr><cell><td><tr><td><td><cell>
18. 다음과 같은 테이블을 만들기 위해 1과 2에 들어갈 속성이 순서대로 짝지어진 것은?

- colspan=2, rowspan=3
- colspan=2, rowspan=2
- rowspan=2, colspan=2
- rowspan=2, colspan=3
19. 테이블에 헤더를 추가하는데 사용되는 태그는?
<tr><header><head><th>
20. HTML에서 색을 표현하는 방법으로 #FF0000과 같은 방식을 사용할 수 있다. 다음 중 이 방식으로 표현한 색과 그 색을 부르는 이름의 짝이 맞는 것은?
- #000000: 하얀색
- #FFFFFF: 노란색
- #00FF00: 초록색
- #0000FF: 빨간색
21. 전 세계적으로 약속된 파일로, 특정 파일명을 명시하지 않았을 때, 웹서버에서 제일 먼저 찾아 보여주는 파일명은?
- front.html
- firstdoor.html
- index.html
- first.html
파이썬을 이용한 스크래핑
1. 웹의 정보를 긁어 내가 만들고 있는 프로그램 안으로 가져 오는 것은?
- scrapping
- scraping
- hacking
- API
2. 웹페이지의 파일 확장자는?
- hwp
- web
- page
- html
3. 스크래핑할 때 서버에 자료를 요청하고 받아올 때 사용하는 라이브러리는?
- response
- requests
- web
- search
4. 다음 중 웹 서버에게 cat.jpg 이미지 파일을 달라고 요청하는 코드로 맞는 것은?
- request.get(‘https://www.lx.or.kr/cat.jpg’)
- requests.get(‘https://www.lx.or.kr/cat.jpg’)
- request.get(https://www.lx.or.kr/cat.jpg)
- requests.get(https://www.lx.or.kr/cat.jpg)
5. 웹서버에 요청한 파일이 없을 때 받는 상태 코드는?
- 200
- 400
- 403
- 404
6. 웹서버로부터 다음과 같이 info.html 파일을 받아왔을 때, 이 info.html 파일의 내용을 가지고 있는 것은?
import requests
response = requests.get('https://www.lx.or.kr/info.html')
- response.html
- response.page
- response.text
- response.value
7. 다음과 같은 문자열 iu가 있을 때 ’밤 편지’만 빼내기 위한 코드는?

- iu[4:8]
- iu[4:7]
- iu[5:9]
- iu[5:8]
8. 다음과 같은 문자열 iu가 있을 때, 다음 코드를 실행한 후 i 의 값은?

i = iu.find('>')
- 0
- 1
- 2
- 3
9. 다음과 같은 문자열 iu가 있을 때, 다음 코드를 실행한 후 i 의 값은?

i = iu.find('>', 5)
- 3
- 4
- 12
- 13
10. REST에 대한 설명으로 틀린 것은?
- 웹을 통해 데이터를 배포하는 방법 중 하나이다.
- 화면을 꾸미는 요소없이 자료만 배포하기 때문에 HTML 분석 방법에 비해 훨씬 편하게 자료를 사용할 수 있다.
- 최근에는 대부분 JSON으로 자료를 배포한다.
- 모든 REST를 이용한 자료배포는 무료로 배포하기로 약속되어 있다.
파이썬을 이용한 업무자동화
1. 정해진 시간에 어떤 기능이나 프로그램이 동작하도록 만드는 것은?
- batch(배치)
- timer
- clock
- 스케쥴링
2. 스케쥴링이 동작하는 일반적인 방식이 아닌 것은?
- 1시간에 한 번씩 실행
- 매일 15:00에 실행
- 매주 수요일 10:00에 실행
- 컴퓨터가 꺼져 있으면 매일 00:00에 컴퓨터를 자동으로 켜고 실행
3. 스케쥴링을 편하게 사용할 수 있게 도와주는 라이브러리는?
- timer
- schedule
- taskmanager
- pandas
4. schedule 라이브러리를 이용해 1초에 한 번씩 job 함수를 실행하도록 만드는 코드는?
- schedule.every(1).seconds.do(job)
- schedule.seconds.every.do(job)
- schedule.every(1).hour.do(job)
- schedule.seconds.do(job)
5. schedule 라이브러리를 이용해 매일 13:00에 한 번씩 job 함수를 실행하도록 만드는 코드는?
- schedule.every.day.at(“13:00”).do(job)
- schedule.day.every.at(“13:00”).do(job)
- schedule.day.every().at(“13:00”).do(job)
- schedule.every().day.at(“13:00”).do(job)
파이썬을 이용한 오피스연동
1. 한컴오피스의 hwpx 파일에 대한 설명으로 맞는 것은?
- 확장자 hwp와 hwpx는 사실 같은 형식이다.
- 확장자 hwpx를 ’zip’으로 바꾸면 압축이 풀린다.
- 확장자 hwpx를 ’doc’로 바꾸면 MS word에서 정상적으로 열린다.
- 확장자 hwp가 표준이고 hwpx는 특별한 파일이므로 대부분의 경우 hwp 파일을 사용하면 된다.
2. 파이썬에서 엑셀 파일을 쉽게 조작하기 위해 사용하는 라이브러리는?
- excelib
- openexcellib
- openpyxl
- pythonxl
3. 다음 중 openpyxl 라이브러리를 이용해 엑셀의 B3 셀에 값을 쓰는 코드는?

- ws[B, 3] = 150
- ws[‘3, B’] = 150
- ws[B3] = 150
- ws[‘B3’] = 150
4. 위 3번과 같이 값을 적어준 후 그 B3 셀의 값을 읽는 방법으로 맞는 코드는?
- sal = ws[‘B3’]
- sal = ws[B3]
- sal = ws[‘B3’].value
- sal = ws[B3].value
5. 파이썬에서 파워포인트를 조작하기 위해 사용하는 라이브러리는?
- python-ppt
- python-pptx
- pptlib
- pptxlib
6. 파워포인트에는 다양한 레이아웃이 있다. 이 중 다음과 같은 모양을 가지는 레이아웃은?

- presentation.slide_layouts[-1]
- presentation.slide_layouts[0]
- presentation.slide_layouts[1]
- presentation.slide_layouts[2]
7. 파워포인트에는 다양한 레이아웃이 있다. 이 중 다음과 같은 모양을 가지는 레이아웃은?

- presentation.slide_layouts[-1]
- presentation.slide_layouts[0]
- presentation.slide_layouts[1]
- presentation.slide_layouts[2]
8. 파워포인트의 레이아웃 구성 요소 중 다음 부분에 대한 설명으로 맞는 것은?

- slide.head
- slide.shapes.head
- slide.title
- slide.shapes.title
9. python-pptx를 이용해 코딩할 때 파워포인트에 슬라이드를 하나도 추가하지 않고 파워포인트를 저장하면 어떻게 될까?
- 저장할 때 에러가 나면서 저장되지 않는다.
- 자동으로 슬라이드 1개가 추가되어 있는 파워포인트 파일이 생성된다.
- 슬라이드가 하나도 없는 파워포인트 파일이 생성된다.
- 에러는 나지 않지만 파일은 생성되지 않는다.
연습문제
연습문제 - 파이썬 자료형
1. “apple” 문자열의 길이를 구하는 코드를 작성하시오.
답(안) 1
a = "apple"
b = len(a)
print(b)
답(안) 2
a = "apple"
print(len(a))
답(안) 3
print(len("apple"))
2. “오늘 기온은 30도“와 같이 보여지는 코드를 작성하시오. 단 30은 숫자형임.
답(안) 1
a = "오늘 기온은 "
b = 30
c = a + str(b) + "도"
print(c)
답(안) 2
a = "오늘 기온은 {0}도".format(30)
print(a)
3. “오늘 기온은 30도, 습도는 65%“와 같이 보여지는 코드를 작성하시오. 단 30, 65는 숫자형임.
답(안) 1
a = "오늘 기온은 "
b = 30
c = "도, "
d = "습도는 "
e = 65
f = "%"
g = a + str(b) + c + d + str(e) + f
print(g)
답(안) 2
a = "오늘 기온은 {0}도, 습도는 {1}%".format(30, 65)
print(a)
4. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "불어", "수학", "과학"]
답(안)
a = ["국어", "영어", "수학", "과학"]
a[1] = "불어"
print(a)
5. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "영어", "수학", "과학", "체육"]
답(안)
a = ["국어", "영어", "수학", "과학"]
a.append("체육")
print(a)
6. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "음악", "영어", "수학", "과학"]
답(안)
a = ["국어", "영어", "수학", "과학"]
a.insert(1, "음악")
print(a)
7. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "음악", "영어", "과학"]
답(안) 1
a = ["국어", "영어", "수학", "과학"]
a.insert(1, "음악")
del a[3]
print(a)
답(안) 2
a = ["국어", "영어", "수학", "과학"]
del a[2]
a.insert(1, "음악")
print(a)
8. a와 같은 리스트를 정렬하여 b와 같은 리스트로 만드는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ['과학', '국어', '수학', '영어']
답(안)
a = ["국어", "영어", "수학", "과학"]
a.sort()
print(a)
9. a와 같은 리스트를 역순으로 바꿔서(정렬아님) b와 같은 리스트로 만드는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ['과학', '수학', '영어', '국어']
답(안)
a = ["국어", "영어", "수학", "과학"]
a.sort()
print(a)
10. a와 같은 리스트를 역순으로 정렬해서 b와 같은 리스트로 만드는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ['영어', '수학', '국어', '과학']
답(안)
a = ["국어", "영어", "수학", "과학"]
a.sort()
a.reverse()
print(a)
2. 파이썬의 조건문
1. 총싸움 게임에서 주인공 몸의 3D 공간상 위치 x, y, z를 player_x, player_y, player_z 라 하고, 총알의 3D 공간상 위치를 bullet_x, bullet_y, bullet_z라 할 때, 주인공의 몸과 총알의 3D 공간상 x축 상의 간격, y축 상의 간격, z축 상의 간격이 모두 10이하면 총알에 맞은 것으로 간주하는 코드 작성

x축의 예
답(안) 1
player_x = 0
player_y = 0
player_z = 0
bullet_x = 5
bullet_y = 5
bullet_z = 5
if bullet_x - player_x <= 10:
if bullet_y - player_y <= 10:
if bullet_z - player_z <= 10:
print("총알에 맞았음")
답(안) 2
player_x = 0
player_y = 0
player_z = 0
bullet_x = 5
bullet_y = 5
bullet_z = 10
if bullet_x - player_x <= 10 and bullet_y - player_y <= 10 and bullet_z - player_z <= 10:
print("총알에 맞았음")
2. 기온이 30도 이상이면 바다로 가고 미만이면 산으로 가자
답(안)
temp = 30
dest = ""
if 30 <= temp:
dest = "바다"
else:
dest = "산"
msg = "{0}(으)로 가자!".format(dest)
print(msg)
3. 남은 시간이 10분 이상이면 계속 책을 보고 미만이면 화장실에 간다.
답(안)
remain = 9
if 10 <= remain :
print("계속 책 본다.")
else:
print("화장실 다녀온다.")
4. 마트가서 우유사고 만약 아보카드 있으면 6개 사와
* 사실 이 문제는 유명한 개발자 유머임.
개발자 남편에게 위와 같이 말했는데 남편이 마트에 아보카드가 있었다면서 우유만 6개 사옴.
(어쩌면 개발자만 이해할 수 있는 유머)
답(안) 1
avocado = 1 # 또는 0
if 0 < avocado :
print("마트에 아보카드 있어서 우유 1개와 아보카드 6개 사왔어")
else:
print("마트에 아보카드 없어서 우유 1개만 사왔어")
답(안) 2
avocado = 1 # 또는 0
if 0 < avocado :
print("마트에 아보카드 있어서 우유 6개 사왔어")
else:
print("마트에 아보카드 없어서 우유 1개 사왔어")
5. 설날 삼촌이 세배돈으로 30,000원 이하로 주시면 너희들에게 떡볶이 사고, 50,000원 이하면 피자 사고, 100,000원 이하면 고기 부페 쏜다! (그 이상이면 조용히 헤드폰 바꿈)
============= RESTART: E:\TEST\test.py ============
삼촌이 20000원 주셨어. 떡볶이 쏜다!
============= RESTART: E:\TEST\test.py ============
삼촌이 50000원 주셨어. 피자 쏜다!
============= RESTART: E:\TEST\test.py ============
삼촌이 70000원 주셨어. 고기 부페 쏜다!
============= RESTART: E:\TEST\test.py ============
(200000원으로 헤드폰이나 바꾸자)
답(안)
money = 200000
dest = ""
if money <= 30000 :
dest = "떡볶이"
elif money <= 50000 :
dest = "피자"
elif money <= 100000 :
dest = "고기 부페"
else :
dest = ""
msg = ""
if dest != "" :
msg = "삼촌이 {0}원 주셨어. {1} 쏜다!".format(money, dest)
else :
msg = "({0}원으로 헤드폰이나 바꾸자)".format(money)
print(msg)
3. 파이썬의 반복문
1. 1~5까지의 정수가 출력되는 코드
============= RESTART: E:\TEST\test.py ============
1
2
3
4
5
답(안) 1: while문 사용
i = 1
while i <= 5 :
print(i)
i = i + 1
답(안) 2: for문 사용
for i in [1, 2, 3, 4, 5] :
print(i)
2. 1 ~ 100까지의 정수가 출력되는 코드
============= RESTART: E:\TEST\test.py ============
1
2
3
...
100
답(안) 1: while문 사용
i = 1
while i <= 100 :
print(i)
i = i + 1
답(안) 2: for문 사용
a = range(1, 101) # 1 ~ 100까지의 정수 리스트를 만든다. range()는 정수 리스트를 만드는 함수.
for i in a :
print(i)
3. 다음과 같이 오늘의 출근 일자를 리스트로 가져왔을 때 지각한 사람이 누구인지 출력하는 코드
morning = [ ["홍길동", "08:45"], ["나지적", "08:37"], ["박문수", "09:11"] ]
============= RESTART: E:\TEST\test.py ============
지각한 사람은 박문수
답(안) while 문
morning = [ ["홍길동", "08:45"], ["나지적", "08:37"], ["박문수", "09:11"] ]
count = len(morning)
i=0
while i < count:
item = morning[i]
if "09:00" < item[1] :
print("지각한 사람은 " + item[0])
i += 1
답(안) for 문
morning = [ ["홍길동", "08:45"], ["나지적", "08:37"], ["박문수", "09:11"] ]
for item in morning :
if "09:00" < item[1] :
print("지각한 사람은 " + item[0])
숫자도 아닌 문자열 "09:00"이 비교에 사용되는 이유
엄밀히 말하면 이 코드는 사실 틀린 코드다. 문자열을 크기 비교 하고 있으니. 그런데 이런 식의 코드는 실제로 많이 쓰이고 그만큼 오류도 없다.
왜냐하면 모든 문자열은 사실은 숫자의 나열이기 때문이다.
문자열 “ABC“는 숫자 65 66 67 의 나열이다.
“A” 문자의 코드값은 65이다. “B” 문자의 코드값은 66이다.
이런 숫자의 나열을 한글자씩 순서대로 비교하는 거다.
위 예제에서는
“09:00” 과 “08:37” 을 비교하는데,
이 둘을 비교할 때는 각 앞에서부터 한 글자씩 비교한다.
처음엔 ’0’과 ’0’을 비교한다. 같네? 그럼 다음으로 ’9’와 ’8’을 비교한다.
’0’의 코드값은 48이다.
’8’의 코드값은 56이다.
’9’의 코드값은 57이다.
그래서 파이썬은 ’8’보다 ’9’가 더 크다고 처리한다.
그래서 파이썬은 이 경우 문자열들의 2번째 글자까지만 보고 “09:00“이 “08:37” 보다 크다고 결론 내린다.
이런 식으로 처리하기 때문에 문자열도 크다 작다 비교가 가능하다.
여기서 말한 코드표를 보고 싶으면 아스키코드로 검색해 보자.
4. 구구단 프로그램
=================================== RESTART: E:\test\test.py ==================================
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
4 * 7 = 28
4 * 8 = 32
4 * 9 = 36
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63
8 * 1 = 8
8 * 2 = 16
8 * 3 = 24
8 * 4 = 32
8 * 5 = 40
8 * 6 = 48
8 * 7 = 56
8 * 8 = 64
8 * 9 = 72
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
답(안) while 문
a = 2
while a <= 9 :
b = 1
while b <= 9 :
c = a * b
msg = "{0} * {1} = {2}".format(a, b, c)
print(msg)
b = b + 1
a = a + 1
답(안) for 문
for a in range(2, 10) :
for b in range(1, 10) :
c = a * b
print(f"{a} * {b} = {c}") # 이제는 이걸 쓰자.
5. 위 구구단 프로그램에 단마다 구분하기
=================================== RESTART: E:\test\test.py ==================================
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
4 * 7 = 28
4 * 8 = 32
4 * 9 = 36
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63
8 * 1 = 8
8 * 2 = 16
8 * 3 = 24
8 * 4 = 32
8 * 5 = 40
8 * 6 = 48
8 * 7 = 56
8 * 8 = 64
8 * 9 = 72
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
답(안) while 문
a = 2
while a <= 9 :
b = 1
while b <= 9 :
c = a * b
msg = "{0} * {1} = {2}".format(a, b, c)
print(msg)
b = b + 1
a = a + 1
print("")
답(안) for 문
for a in range(2, 10) :
for b in range(1, 10) :
c = a * b
print(f"{a} * {b} = {c}") # 이제는 이걸 쓰자.
print("")
6. 좋아하는 과일로 리스트를 만들고 ’바나나’가 있으면 ‘미끄러져 조심해’ 라고 출력하고, 없으면 ‘바나나는 왜 없어’ 라고 출력하는 코드
답(안)
fruits = ['사과', '딸기', '바나나', '망고']
find_banana = False
for item in fruits :
if item == '바나나' :
find_banana = True
if find_banana == True :
print("미끄러져 조심해")
else :
print("바나나는 왜 없어")
7. 좋아하는 과일로 리스트를 만들고 ’바나나’가 있으면 ‘미끄러져 조심해’ 라고 출력하고, 더 이상 리스트를 조사하지 않는다. 바나나가 없으면 ‘바나나는 왜 없어’ 라고 출력하는 코드
답(안) 1
fruits = ['사과', '딸기', '바나나', '망고']
find_banana = False
for item in fruits :
if item == '바나나' :
find_banana = True
break
if find_banana == True :
print("미끄러져 조심해")
else :
print("바나나는 왜 없어")
답(안) 2
fruits = ['사과', '딸기', '바나나', '망고']
find_banana = False
for item in fruits :
print ("{0} 검사 중...".format(item))
if item == '바나나' :
find_banana = True
break
if find_banana == True :
print("미끄러져 조심해")
else :
print("바나나는 왜 없어")
8. 좋아하는 과일로 리스트를 만들고, 리스트의 각 아이템마다 “OOO 잼 만들기“를 출력하되 아이템이 ‘바나나’ 일 때만 그렇게 출력하지 않는 코드
답(안)
fruits = ['사과', '딸기', '바나나', '망고']
for item in fruits :
if item == '바나나' :
continue
print("{0} 잼 만들기".format(item) )
4. 함수
1. 10을 더해서 리턴하는 함수
답(안)
def plus10(a) :
return a + 10
res = plus10(5)
print(res)
2. a, b 두 수를 받아서 a의 b제곱을 리턴하는 함수 foo()
답(안)
def foo(a, b) :
c = a ** b
return c
res = foo(2, 3)
print(res)
3. a, b 두 수를 받아서 a를 b로 나눈 계산값의 나머지를 리턴하는 함수 foo()
답(안)
def foo(a, b) :
c = a % b
return c
res = foo(11, 3)
print(res)
4. a, b 두 수를 받아서 a를 b로 나눈 계산값의 몫을 리턴하는 함수 foo()
답(안)
def foo(a, b) :
c = a // b
return c
res = foo(11, 3)
print(res)
5. 파이썬입출력
1. 사용자 키보드로 이름을 받아 “안녕하세요 OOO님” 이라고 출력하는 코드
=================================== RESTART: E:\test\test.py ==================================
이름: apple
안녕하세요 apple님
답(안)
a = input("이름: ")
b = "안녕하세요 {0}님".format(a)
print(b)
2. 구구단을 gugudan.txt 파일로 출력하는 코드
답(안)
file = open("gugudan.txt", 'w')
i = 2
while i <= 9 :
j = 1
while j <= 9 :
a = "{0} * {1} = {2}\n".format(i, j, i*j)
file.write(a)
j += 1
i += 1
file.close()
3. 구구단을 아래 그림처럼 엑셀에서 읽을 수 있는 gugudan.csv 파일로 출력하는 코드

답(안)
file = open("gugudan.txt", 'w')
i = 2
while i <= 9 :
j = 1
while j <= 9 :
a = "{0} * {1} = {2}\n".format(i, j, i*j)
file.write(a)
j += 1
i += 1
file.close()
소스코드
실습: 비교연산자를 이용한 if 문
if 3 < 5 :
print ("3 < 5가 참이면 이 문장이 표시됨")
if 3 > 5 :
print ("3 > 5가 참이면 이 문장이 표시됨")
if 3 <= 5 :
print ("3 <= 5가 참이면 이 문장이 표시됨")
if 3 >= 5 :
print ("3 >= 5가 참이면 이 문장이 표시됨")
if 3 == 5 :
print ("3 == 5가 참이면 이 문장이 표시됨")
if 3 != 5 :
print ("3 != 5가 참이면 이 문장이 표시됨")
에어컨 온도조절 동작 코드
temp = 33
user_want_temp = 26
if temp <= user_want_temp :
print("에어컨을 잠시 멈춥니다.")
수박이 20,000원 미만이면 한 통 사와
water_melon = 25000
if water_melon < 20000 :
print("수박을 한 통 구입합니다")
온도가 내려가 에어컨이 멈추면 다시는 에어컨이 재가동되지 않는 문제 해결
temp = 27
user_want_temp = 26
if temp <= user_want_temp :
print("에어컨을 잠시 멈춥니다.")
else :
print("에어컨을 가동합니다.")
수박이 20,000원 미만이면 2통 사오고, 그 이상이면 1통만 사와
water_melon = 19000
if water_melon < 20000 :
print("수박을 2통 구입합니다.")
else :
print("수박을 1통 구입합니다.")
수박이 20,000원 미만이고 사이다가 1,000원 미만이면 둘 다 하나씩 사와. 그렇지 않으면 아무 것도 사오지 마.
water_melon = 19000
cider = 950
if water_melon < 20000 :
if cider < 1000 :
print("수박 1통과 사이다 1개를 구입합니다.")
수박이 20,000원 미만이고 사이다가 1,000원 미만이면 둘 다 하나씩 사와. 그렇지 않으면 아무 것도 사오지 마.
water_melon = 19000
cider = 1000
if water_melon < 20000 :
if cider < 1000 :
print("수박 1통과 사이다 1개를 구입합니다.")
else:
print("수박은 싼 데 사이다가 비싸서 아무 것도 안 사감")
else:
print("일단 수박부터 비싸서 아무 것도 안 사감")
수박이 20,000원 미만이면 3통 사오고, 20,000원 이상 ~ 25,00미만이면 2통만 사오고, 25,000원 이상이면 1통만 사와
if water_melon < 20000 :
print("수박을 3통 구입합니다.")
else :
if water_melon < 25000 :
print("수박을 2통 구입합니다.")
else :
print("수박을 1통 구입합니다.")
수박이 20,000원 미만이면 3통 사오고, 20,000원 이상 ~ 25,00미만이면 2통만 사오고, 25,000원 이상이면 1통만 사와
if water_melon < 20000 :
print("수박을 3통 구입합니다.")
elif water_melon < 25000 :
print("수박을 2통 구입합니다.")
else :
print("수박을 1통 구입합니다.")
실습: 약속에 늦은 날(elif)
message = "" # 메시지
late = 20 # 지각할 거 같은 시간(분)
if late < 5 :
message = ""
elif late < 20 :
message = "미안하다"
else:
message = "오늘 자동차가 펑크날거 같아"
if message != "":
print("친구에게 다음과 같이 메시지를 보냈습니다: ", message)
반복문 - while
a = 0
while a < 3 :
print (a)
a = a + 1
반복문 - while
a = 0
while True :
print (a)
a = a + 1
1, 3, 5, 7, 9, … 와 같이 홀수만 99까지 출력
a = 1
while a <= 99 :
print(a)
a = a + 2
반복문 - for
data = [1, 2, 3, 4, 5]
for a in data :
print (a)
1-9까지의 숫자를 list로 만들고 그 목록을 하나씩 출력
nums = [1,2,3,4,5,6,7,8,9]
for a in nums :
print (a)
좋아하는 음식을 list로 만들고 그 목록을 하나씩 출력
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
for food in food_list :
print (food)
좋아하는 음식을 list로 만들고 그 목록 중 “치킨“이 있을 때만 “치킨 찾았다!” 출력
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
for food in food_list :
if food == "치킨" :
print (food, "찾았다!")
좋아하는 음식을 list로 만들고 그 목록 중 “탕수육“이 있을 때만 “탕수육 찾았다! O번째에 있었어!” 출력
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
index = index + 1
무의미한 반복 작업 중단 - break
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
break;
index = index + 1
break 문이 없을 때
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
print(index, "번째 자료 조사 중...")
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
index = index + 1
break 문이 있을 때
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
print(index, "번째 자료 조사 중...")
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
break;
index = index + 1
목록 중 ‘트러플버섯’ 사달라고 조를 때
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
for food in food_list :
if food != "트러플버섯" :
continue
print (food, "사 주세요!")
반복문으로 list 값 추가하기(list comprehension)
for i in range(5):
print(i)
range() 함수 사용해 list 값 추가
a = [i for i in range(10)]
range() 함수 사용해 list 값 추가
a = [i*2 for i in range(10)]
함수 사용하기
def plus1(a) :
b = a + 1
plus1(10)
함수 결과를 사용하자 - return
def plus1(a) :
b = a + 1
return b
c = plus1(10)
print(c)
실습: 두 수를 더해서 return 하는 함수
def plus_2(a, b) :
return a + b
a = plus_2(10, 20)
print(a)
실습: 두 수를 빼서 return 하는 함수
def minus_2(a, b) :
return a - b
a = minus_2(10, 20)
print(a)
실습: 두 수 중 더 큰 수를 return 하는 함수
def get_max(a, b):
if a < b :
return b
else :
return a
res = get_max(10, 11)
print(res)
실습: 두 수 중 더 작은 수를 return 하는 함수
def get_min(a, b):
if a < b :
return a
else :
return b
res = get_min(10, 11)
print(res)
input() 함수 사용
a = input()
print(a)
화면에 메시지 출력하면서 입력하라고 안내
a = input(“입력하세요:”)
print(a)
input() 함수 사용
a = int( input("1~3중 입력하세요: ") )
print(a)
사용자 키보드로 숫자 값을 받아 1 더한 값을 보여주는 프로그램
a = int( input("숫자를 입력하세요: ") )
b = a + 1
print("결과 :" , b)
사용자 키보드로 숫자 값을 받아 1 뺀 값을 보여주는 프로그램
a = int( input("숫자를 입력하세요: ") )
b = a - 1
print("결과 :" , b)
사용자 키보드로 이름 받아 뒤에 “님 안녕하세요”를 보여주는 프로그램
a = input("이름을 입력하세요: ")
b = a + "님 안녕하세요"
print("결과 : " , b)
파일 새로 만들고 파일에 내용 쓰기
# 파일 생성하고 열기
file = open("sample.txt", 'w')
# 파일에 내용 쓰기
file.write("안녕하세요")
# 파일 닫기. 파일을 열었으면 꼭 닫아야 한다
file.close()
파일 읽기
# 파일 생성하고 열기
file = open("sample.txt", 'r')
# 파일 내용에서 맨 위 한 줄 읽어 오기
line = file.readline()
print (line)
# 파일 닫기. 파일을 열었으면 꼭 닫아야 한다
file.close()
반복문으로 여러 줄 쓰기
file = open("여러줄.txt", 'w')
index = 1
while index <= 100 :
file.write(str(index))
file.write("\n")
index = index + 1
file.close()
여러 줄 읽기
file = open("여러줄.txt", 'r')
while True:
line = file.readline()
if not line:
break;
print (line)
file.close()
여러 줄 읽기
file = open("여러줄.txt", 'r')
all_line_list = file.readlines()
for line in all_line_list :
print(line)
file.close()
sample.csv
file = open("sample.csv", 'w')
file.write ("이름,전화번호\n")
file.write ("홍길동,02-1111-1111\n")
file.write ("박길동,02-1111-2222\n")
file.write ("최길동,03-1111-3333\n")
file.close()
HTML 예제
저는 <b>치즈</b>를 좋아하는 <b>MIN</b>입니다.
hypertext
저는 <a>치즈</a>를 좋아하는 <a>MIN</a>입니다.
hypertext
저는 <a href='https://www.lx.or.kr'>치즈</a>를 좋아하는 <a>MIN</a>입니다.
hypertext
저는 <a href='https://www.lx.or.kr' target='_blank'>치즈</a>를 좋아하는 <a>MIN</a>입니다.
HTML5 전반적인 구조
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
list 태그
<ul>
<li>한식</li>
<li>
중식
<ol>
<li>짜장면</li>
<li>짬뽕</li>
</ol>
</li>
</ul>
HTML로 표 만들기
<table>
<tr>
<td>cell 1</td>
<td>cell 2</td>
</tr>
<tr>
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
HTML로 표 만들기
<table border=1>
<tr>
<td>cell 1</td>
<td>cell 2</td>
</tr>
<tr>
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
셀 합치기
<table border=1>
<tr>
<td colspan=2>cell 1</td>
</tr>
<tr>
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
셀 합치기
<table border=1>
<tr>
<td rowspan=2>cell 1</td>
<td>cell 2</td>
</tr>
<tr>
<td>cell 4</td>
</tr>
</table>
테이블에 헤더 추가
<table border=1>
<tr>
<th>cell 1</th>
<th>cell 2</th>
</tr>
<tr>
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
테이블을 색으로 꾸미기
<table border=1>
<tr>
<th>cell 1</th>
<th>cell 2</th>
</tr>
<tr style="background-color: yellow">
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
테이블을 색으로 꾸미기
<table border=1>
<tr>
<th>cell 1</th>
<th>cell 2</th>
</tr>
<tr>
<td style="background-color: red">cell 3</td>
<td>cell 4</td>
</tr>
</table>
테이블을 색으로 꾸미기
<table border=1>
<tr style="background-color: #FF0000">
<th>cell 1</th>
<th>cell 2</th>
</tr>
<tr>
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
request를 이용한 통신
import requests
requests.get('https://www.lx.or.kr')
request를 이용한 통신
import requests
requests.get('https://www.lx.or.kr/aaaaa.hwp')
웹서버에서 가져온 html 파일(index.html)
import requests
response = requests.get('https://lxeduweb.web.app')
response
웹서버에서 가져온 html 파일 분석(1.html)
import requests
response = requests.get('https://lxeduweb.web.app/1.html')
웹서버에서 가져온 html 파일 분석(1.html)
import requests
response = requests.get('https://lxeduweb.web.app/1.html')
A = response.text.find('A전자')
start = response.text.find('<td>', A + 3)
end = response.text.find('</td>', start + 1)
price = response.text[start+4 : end]
price
웹서버에서 가져온 html 파일 분석, 정보 표시
import requests
response = requests.get('https://lxeduweb.web.app/1.html')
A = response.text.find('A전자')
start = response.text.find('<td>', A + 3)
end = response.text.find('</td>', start + 1)
price = response.text[start+4 : end]
print("A전자 현재가:", price)
python에서 JSON 사용
import json
data = '{"name": "홍길동", "year": 1999, "phone": "010-1111-1111"}'
value = json.loads(data)
print(value["phone"])
1초에 한 번씩 자동 실행
import schedule
import time
# 실행할 함수 정의
def task():
print("task 실행")
#1초에 한 번씩 실행
schedule.every(1).seconds.do(task)
while True:
schedule.run_pending()
time.sleep(1)
1분에 한 번씩 자동 실행
import schedule
import time
# 실행할 함수 정의
def task():
print("task 실행")
#1분에 한 번씩 실행
schedule.every(1).minutes.do(task)
while True:
schedule.run_pending()
time.sleep(1)
1시간에 한 번씩 자동 실행
import schedule
import time
# 실행할 함수 정의
def task():
print("task 실행")
# 1시간에 한 번씩 실행
schedule.every(1).hour.do(task)
while True:
schedule.run_pending()
time.sleep(1)
매일 00:00에 자동 실행
import schedule
import time
# 실행할 함수 정의
def task():
print("task 실행")
# 매일 00:00에 실행
schedule.every().day.at("00:00").do(task)
while True:
schedule.run_pending()
time.sleep(1)
Openpyxl 기본 사용법(쓰기)
from openpyxl import Workbook
wb = Workbook()
# 워크북(엑셀)에서 활성화된 sheet을 ws라 부름.
ws = wb.active
# A1 셀에 자료 할당
ws['A1'] = '공개값'
ws['B2'] = 42
# 파일 저장
wb.save("sample.xlsx")
Openpyxl 기본 사용법(셀 읽고 쓰기)
from openpyxl import Workbook
wb = Workbook()
# 워크북(엑셀)에서 활성화된 sheet을 ws라 부름.
ws = wb.active
# A1 셀에 자료 할당
ws['A1'] = '공개값'
ws['B2'] = 42
c = ws['B2'].value
ws['C3'] = c + 1
# 파일 저장
wb.save("sample2.xlsx")
Openpyxl 기본 사용법(파일 읽기)
from openpyxl import load_workbook
wb = load_workbook(filename = 'sample2.xlsx)
# 워크북(엑셀)에서 활성화된 sheet을 ws라 부름.
ws = wb['Sheet']
v = ws['C3'].value
print("v:", v)
python-pptx 기본 사용법
from pptx import Presentation
prs = Presentation() # 파워포인트형으로 객체 생성
slide_layout = prs.slide_layouts[1] # 레이아웃 설정
slide = prs.slides.add_slide(slide_layout) # 슬라이드 하나 추가
slide.shapes.title.text = "제목"
slide.shapes.placeholders[1].text_frame.text = '내용1'
slide.shapes.placeholders[1].text_frame.add_paragraph().text = '내용2'
prs.save('sample.pptx') # 파일 저장
QnA
1. list del
append()나 insert()는 리스트명.append() 식인데, 왜 자료 삭제는 방식이 다를까?









공간정보 웹서비스 개발
학습자료
postgreSQL
- postgreSQL 공식 홈페이지: https://www.postgresql.org
- postgreSQL 안내서: https://www.postgresql.org/files/documentation/pdf/16/postgresql-16-A4.pdf
postGIS
- postGIS 공식 홈페이지: https://postgis.net
- postGIS 안내서: https://postgis.net/workshops/en/postgis-intro/PostGISIntro.pdf
- postGIS 함수들: https://postgis.net/docs/manual-3.5/ko_KR/PostGIS_Special_Functions_Index.html
pgAdmin
- pgAdmin 공식 홈페이지: https://www.pgadmin.org
복습문제

복습문제
1. 다음 중 데이터베이스의 특징이 아닌 것은?
- 자료를 체계적으로 저장한다.
- 자료를 저장하기 쉽고 읽기 쉽게 관리한다.
- 자료를 모아 놓은 것은 모두 데이터베이스이다.
- 회사 ERP가 데이터베이스의 한 예이다.
2. DBMS의 약자로 맞는 것은?
- DataBase Management System
- DB Manager System
- DB Management System
- DataBase Manager System
3. postgreSQL에 대한 설명 중 틀린 것은?
- open source로 개발된다.
- 개인은 무료, 공공기관은 비용을 지불해야 한다.
- 공간정보에 특화된 기능을 제공한다.
포스트그레스큐엘이라고 읽는다.
4. 다음 중 DBMS가 아닌 것은?
- postgreSQL
- MS SQLServer
- MySQL
- DBeaver
5. 다음 중 공간정보 데이터베이스에서 지원하는 기능이 아닌 것은?
- 다양한 좌표계 지원
- 3차원 스캐닝 기능 지원
- 공간정보 자료(점, 선, 면)을 자유롭게 저장
- 공간정보 계산 기능 지원
6. 다음 중 EPSG에 대한 설명으로 틀린 것은?
- 석유 산업계에서 탐사를 위해 표준화된 좌표 체계가 필요해 정리한 코드들이다.
- EPSG의 원 뜻은
유럽 석유 조사 그룹이다. - 각 좌표계 코드 표현식은
EPSG-4326과 같은 식이다. - 한국의 좌표 체계도 포함되어 있다.
복습문제
1. postgreSQL 설치에 대한 설명 중 틀린 것은?
- 공식 홈페이지에는 설치 프로그램이 업로드되어 있지 않아 다른 사이트에 가서 받아야 한다.
- postgreSQL을 설치하면 postGIS도 자동으로 설치된다.
- 기본으로 설치되는 postgreSQL 관리자 ID는 ‘postgres’ 이다.
- postgreSQL과 접속하는 기본 프로그램으로 pgAdmin이 같이 설치된다.
2. DB 구성의 한 요소로 엑셀과 같이 2차원의 표 형태로 자료를 관리하는 것은?
- DBMS
- 함수
- sheet
- table
3. 엑셀과 달리 DB 테이블은 각 항목에 숫자를 적을지 문자를 적을지를 미리 정해야 한다. 그 이유를 2개 고르시오
- 빠른 처리를 위해
- 해킹 등 재난에 대비하기 위해
- 전기 사용량을 줄이기 위해
- 효율적이고 정확하게 자료를 기록하기 위해
4. postgreSQL에서 member 라는 이름의 테이블을 만드는 방법으로 맞는 것은?
- create table member (name varchar(10));
- create member (name char);
- create table member (name 문자)
- create table member (name varchar(10))
5. postgreSQL의 주요 데이터 유형에 대해 올바르게 설명한 것은?
- Integer: 약 -900경 ~ + 900경 사이의 정수를 다룰 수 있다.
- BigInt: 약 -21억 ~ + 21억 사이의 정수를 다룰 수 있다.
- boolean: 참 또는 거짓을 기록할 수 있다.
- varchar: 사번처럼 그 길이가 정해진 문자만 입력할 수 있다.
6. pgAdmin에 대한 설명으로 틀린 것은?
- postgreSQL에 접속하기 위한 클라이언트 프로그램이다.
- DBMS에 sql문을 보내 실행할 수 있다.
- table을 생성하는 기능도 제공한다.
- 그래픽 UI가 아닌 텍스트 기반의 클라이언트 프로그램이다.
7. psql에 대한 바른 설명은?
- postgreSQL에 접속해 postgreSQL을 관리하거나 SQL문을 실행하는 데 사용하는 텍스트 기반의 클라이언트 프로그램
- sql문 만을 실행할 수 있다.
- 유료 버전을 구입하면 그래픽 UI도 사용할 수 있다.
- 관리자 전용 프로그램이다.
8. pgAdmin에서 psql을 실행하는 아이콘은?

복습문제
1. SQL에 대해 맞는 설명은?
- DBMS에서만 사용하는 언어이다.
- 자료를 DB에 입력, 수정, 삭제, 검색할 때 사용한다.
- DB관리자만 사용할 수 있다.
- 유료 버전에서만 사용할 수 있다.
2. 자료를 입력하기 위해 사용하는 SQL 명령어는?
- insert into 테이블명
- input 테이블명
- input into 테이블명
- insert 테이블명
3. 자료를 검색하기 위해 사용하는 SQL 명령어는?
- get from
- query from
- find from
- select from
4. member 테이블의 모든 자료를 가져오는 SQL 명령어는?
- get all from member;
- select * from member;
- select % from member;
- query from member;
복습문제
1. postgis에 대해 맞는 설명은?
- postgreSQL을 설치하면 자동으로 같이 설치된다.
- postgreSQL에서 옵션으로 기능을 켜고 끌 수 있다.
- postgreSQL 설치 후 별도 설치해야 한다.
- pgAdmin을 통해서만 설치할 수 있다.
2. 1개의 점을 저장할 때 맞는 테이터 유형은?
- geometry
- geometry(Point)
- geom(Point)
- geom(Point, 4326)
3. 1개의 점을 저장하되, 좌표계를 EPSG:4326으로 정할 때 맞는 데이터 유형은?
- geometry(EPSG, 4326)
- geometry(Point, 4326)
- geom(Point, 4326)
- geom(4326, Point)
4. 한 번에 1개 이상의 점을 저장할 수 있는 데이터 유형은?
- geometry(MultiPoint)
- geometry(4326)
- geom(Points)
- geom(4326, MultiPoint)
5. 1개의 선을 저장할 수 있는 데이터 유형은?
- geometry(Line)
- geometry(OneLine)
- geometry(Line1)
- geometry(LineString)
6. 한 번에 1개 이상의 선을 저장할 수 있는 데이터 유형은?
- geometry(Lines)
- geometry(MoreLine)
- geometry(LineStrings)
- geometry(MultiLineString)
7. 1개의 면을 저장할 수 있는 데이터 유형은?
- geometry(Box)
- geometry(Polygon)
- geometry(Poly)
- geometry(2DBox)
8. 한 번에 1개 이상의 면을 저장할 수 있는 데이터 유형은?
- geometry(Area)
- geometry(Polygons)
- geometry(MultiPolygon)
- geometry(MultiArea)
9. geometry 형식에 입력된 자료는 열어 보아도 값이 매우 복잡해 사람이 이해하기 어렵다. 이를 X, Y 좌표값으로 변환해 보여주는 함수의 짝으로 맞는 것은?
- ST_getXY()
- ST_getX(), ST_getY()
- ST_X(), ST_Y()
- ST_convX(), ST_convY()
10. 좌표계 간 변환하는 함수는?
- ST_Transaction()
- ST_Conversion()
- ST_Convert()
- ST_Transform()
11. 현재 데이터베이스에 EPSG:4326으로 설계되어 있는 테이블이 있고 필드명은 location이다. 이 테이블의 값을 EPSG:3857로 변환해 사용해야 하는 경우 맞는 SQL문은?
- select st_transform(4326, 3857) from 테이블명
- select st_transform(location, 4326, 3857) from 테이블명
- select st_transform(location, EPSG:3857) from 테이블명
- select st_transform(location, 3857) from 테이블명
12. 위 11번 문제와 같이 좌표계 값을 변환해 사용할 경우 틀린 것은?
- 좌표계 변환할 때 약간의 오차가 있을 수 있다.
- 위 11번 문제의 답과 같이 select 문을 사용하면 원래 테이블의 값 자체가 변환된 EPSG:3857의 값으로 변한다.
- st_transform( ) 괄호 안의 값 중 숫자는 EPSG 코드를 뜻한다.
- 최종적으로 변환될 좌표계의 코드만 적어줘도 된다.
13. ST_DistanceSphere() 함수를 사용해 곡률을 반영한 점간 거리를 계산하는 경우, 이 계산 결과의 단위는?
- mm
- cm
- m
- km
14. 공간정보 자료를 설명하는 문자열을 이용해 geometry 값을 만들 때 사용하는 함수는?
- ST_GISDataFromText() 함수
- ST_GeometryFromText() 함수
- ST_GeomText() 함수
- ST_GeomFromText() 함수
15. 점이 면 안에 포함되어 있는지 여부를 판단하기 위해 만든 SQL 문의 일부이다. 다음 중 감싸고 있는 자료와 안에 있는 자료를 순서대로 적은 것은 ?
ST_Contains(A, B)
- A, B
- B, A
- 순서는 상관없다.
연습문제
공간데이터베이스 연습문제
Q. 다음과 같은 food 테이블을 SQL문을 이용해 생성

A.
create table food
(
name varchar(20),
price int
);
Q. food 테이블에 SQL을 사용해 값 입력하기(데이터 추가)
A.
insert into food (name, price) values ('짜장면', 6000);
insert into food (name, price) values ('탕수육', 21000);
insert into food (name, price) values ('연어구이', 11000);
insert into food (name, price) values ('고등어구이', 12000);
insert into food (name, price) values ('짬뽕', 7000);
Q. 다음과 같이 점이 지도에 표시되도록 자료 입력

A.
insert into point_test (location, name) values
('point( 5 4 )', '금 묻은 곳');
Q. 다음과 같이 점이 지도에 표시되도록 자료 입력

A.
insert into point_test (location, name) values
('point( -5 -4 )', '은 묻은 곳');
Q. 다음과 같이 점들이 지도에 표시되도록 1개의 자료 입력

A.
insert into multi_point_test (location, name) values
('multipoint( -5 -4, 5 4 )', '해상 공원');
Q. 다음과 같이 점들이 지도에 표시되도록 1개의 자료 입력

A.
insert into multi_point_test (location, name) values
('multipoint( -10 -11.5, 10 3 )', '석유 매장 추정지');
Q. 다음과 같이 선이 지도에 표시되도록 1개의 자료 입력

A.
insert into line_test (location, name) values
('lineString(-10 12.7, 10 11.5 )', '이동 최단거리');
Q. 다음과 같이 선이 지도에 표시되도록 1개의 자료 입력

A.
insert into line_test (location, name) values
('lineString(-20 -12.7, -10 -11.5, 5 3.7 )', '이동 최단거리');
Q. 다음과 같이 여러 선이 지도에 표시되도록 1개의 자료 입력

A.
insert into multi_line_test (location, name) values
('MultiLineString( (20.5 0.5, 20.6 0.6 ), (20.8 0.6, 20.95 0.61) )', '등산로');
Q. 다음과 같이 여러 선이 지도에 표시되도록 1개의 자료 입력

A.
insert into multi_line_test (location, name) values
('MultiLineString( (3 4, 3 5, 4 6, 5 4 ), (0 1, 1 1, 2 2, 3 1, 1 0) )', '등산로');
Q. 다음과 같이 면이 지도에 표시되도록 1개의 자료 입력

A.
insert into polygon_test (location, name) values
('polygon( (3 4, 3 5, 4 6, 3 4 ) )', '어장1');
Q. 다음과 같이 면이 지도에 표시되도록 1개의 자료 입력

A.
insert into polygon_test (location, name) values
('polygon( (3.5 4, 3.3 5.2, 4.7 6.1, 5.0 3.5, 5.3 3.2, 3.5 4 ) )', '어장 2');
Q. 다음과 같이 여러 면이 지도에 표시되도록 1개의 자료 입력

A.
insert into multi_polygon_test (location, name) values
('Polygon( (3 -5, 4 -5, 2 -6, 3 -5 ), (2.5 -7, 5 -8, 4 -9, 2.5 -7) )', '석유 매장지');
Q. 다음과 같이 여러 면이 지도에 표시되도록 1개의 자료 입력

A.
insert into multi_polygon_test (location, name) values
('Polygon( (1 4, 1 5, 2 6, 1 4 ), (3.5 4, 3.3 5.2, 4.7 6.1, 5.0 3.5, 5.3 3.2, 3.5 4 ) )', '어장들');
공간정보 웹서비스 개발 2025
학습자료
postgreSQL
- postgreSQL 공식 홈페이지: https://www.postgresql.org
- postgreSQL 안내서: https://www.postgresql.org/files/documentation/pdf/16/postgresql-16-A4.pdf
postGIS
- postGIS 공식 홈페이지: https://postgis.net
- postGIS 안내서: https://postgis.net/workshops/en/postgis-intro/PostGISIntro.pdf
- postGIS 함수들: https://postgis.net/docs/manual-3.5/ko_KR/PostGIS_Special_Functions_Index.html
pgAdmin
- pgAdmin 공식 홈페이지: https://www.pgadmin.org
QGIS에서 점 표시한 shp 파일 만들기
QGIS 마우스 기본 사용법
- 화면 이동 : 마우스 휠 누르고 움직이기
QGIS 점(point) 표시한 shp 파일 만들기
다음 순서대로 진행한다.
1. 새 프로젝트 만들기

[새 프로젝트] 아이콘을 클릭해 새 프로젝트를 만든다.
2. OpenStreeMap 밑에 깔기

XYZ Tiles > OpenStreetMap 을 더블클릭한다.
3. shp 파일을 생성하고, 그걸 이용하는 레이어 추가

[새 세이프파일 레이어] 툴바를 클릭한다.

[…] 버튼을 클릭한다.

shp 파일명을 정해준다.

위 그림 부분을 다음과 같이 세팅한다.
- 파일 인코딩: UTF-8
- 도형 유형: 포인트
- 추가 차원: 없음
- 좌표계: EPSG:4326 - WGS 84

다음의 방법으로 필드를 추가한다.
- 이름: name
이렇게 추가한 필드가 각 점의 정보를 저장하는데 사용된다.
점을 하나 추가할 때마다, 필드 목록에 있는 id와 name을 입력해야 한다.
4. 레이어 편집 모드로 변경

5. 점 추가

점 추가 버튼을 누른 다음,
원하는 위치에 점을 추가할 수 있다.

- [1] 클릭한 위치에 점이 추가되고
- [2] 점이 추가되자마자 위와 같은 속성 창이 나타나서 자료를 입력할 수 있다. id값은 점을 찍을 때마다 중복된 값이 입력되지 않도록 1, 2, 3, 4, 5, … 으로 알아서 점마다 다른 값을입력해야 한다.
name 항목은 조금 전에 추가한 그 항목이다.
복습문제
복습문제 1
1. 공간정보를 다운로드 받을 수 있는 곳이 아닌 것은?
- 공공데이터포털(data.go.kr)
- 브이월드(vworld.kr)
- 국토정보플랫폼
- LX 홈페이지
2. “콤마로 구분된 값들“이라는 뜻으로 엑셀 자료를 text 형식으로 공유하는데 사용하는 파일 포맷은?
- txt
- xls
- xlsx
- csv
3. 다운로드받은 공간정보를 전처리하는 방법의 예로 옳지 않은 것은?
- 10개의 항목 중 어느 한 항목의 값이 없으면 그 데이터 한 줄은 지운다
- 10개의 항목 중 어느 한 항목의 값이 없으면 그 칸에는 그 항목의 평균값으로 채워 넣는다.
- 10개의 항목 중 어느 한 항목의 값이 이상할 정도로 너무 크면 그 데이터 한 줄은 지운다.
- 값이 이상해도 지우거나 다른 값으로 대체하면 안된다.
4. 공간정보가 포함된 csv 파일을 DBMS에 입력하는 방법으로 가장 올바른 것은?
- hwp 파일로 변환한 후 DBMS에서 불러온다.
- QGIS에서 읽어온 후 DBMS로 내보낸다.
- 엑셀 파일로 변환한 후 DBMS에서 불러온다.
- 모든 DBMS가 공간정보 csv 파일을 불러올 수 있으니 그냥 사용하면 된다.
5. geoserver에서 입력으로 받을 수 있는 데이터 유형이 아닌 것은?
- shp 파일
- postgreSQL등 공간정보 데이터베이스 연결
- hwp 파일
- jpg 파일
6. geoserver에서 출력된 정보는 지도 앱에서 어떤 용도로 사용할 수 있나?
- 도형의 모양을 정의
- 주제도를 위한 레이어
- 축척과 방위 표시
- 범례 표시
7. openLayers에서 geoserver의 정보를 사용하는 방법은?
- geoserver에서 보내주는 정보를 이용해 지도의 축척을 계산한다
- geoserver에서 보내주는 정보를 이용해 지도의 크기와 방위를 계산한다
- geoserver에서 보내주는 정보를 이용해 레이어를 생성한다.
- geoserver에서 보내주는 정보를 이용해 범례를 생성한다.
8. openLayers에서 사용하는 프로그래밍 언어는?
- c/c++
- java
- javascript
- sql
9. postGIS와 연동해 공간정보를 잘 다룰 수 있는 무료/오픈소스 DBMS는?
- oracle
- mysql
- sqlServer
- postgreSQL
10. openLayers의 역할은?
- 본격적인 지도 앱 생성
- 공간정보 자료 관리
- 다양한 공간정보 자료를 이용한 레이어 생성
- 인터넷 앱을 사용자에게 보여주는 범용 뷰어
11. geoserver가 csv 등 다양한 곳에서 값을 받을 수 있는데도 더 복잡하게 postgreSQL같은 DBMS로 부터 값을 받도록 구성하는 이유는?
- postgreSQL은 무료니까
- DBMS로부터 실시간으로 입력되는 정보를 실시간으로 지도에 반영하기 위해서
- csv는 믿을 수 없어서
- geoserver는 DBMS로부터만 값을 받을 수 있기 때문
복습문제 2
1. node.js에 대해 틀린 설명은?
- 웹브라우저에서만 실행된다.
- javascript용이다.
- 윈도우, macos, 리눅스 등 다양한 OS에서 실행된다.
- 개발 환경이다.
2. node.js가 개발된 이유로 가장 큰 것은?
- javascript가 너무 느려서 보완하기 위해
- javascript의 보안이 너무 떨어져서 보완하기 위해
- javascript의 부족한 기능을 추가한 것이 node.js이다.
- javascript를 웹 브라우저에서먼아 아닌 범용 목적으로 사용하기 위해
3. node.js를 이용해 주로 개발하는 분야에 대해 잘못 설명한 것은?
- DB 프로그램
- GIS 프로그램
- AI 프로그램
- 군사용 프로그램
4. 자바스크립트는 원래 웹브라우저에서만 실행되었다. 이 문제를 해결해 윈도우용 프로그램을 자바스크립트로도 만들기 위해 개발된 것은?
- tomcat
- node.js
- geoserver
- openLayers
5. openLayers 프로젝트를 생성하는 명령어로 올바른 것은?
- npm create
- npm create ol-app
- create npm
- create npm ol-app
6. openLayers 프로젝트를 실행해 웹브라우저에서 지도가 나타나도록 하는 명령어는?
- npm start
- npm ol-app
- start npm
- start ol-app
7. OGC 표준 중 하나로, 지도 데이터 이미지를 png, jpg와 같은 래스터 형태로 제공하는 기술은?
- WMS
- WFS
- WMTS
- WCS
8. OGC 표준 중 하나로, 지도에 표현할 데이터를 벡터 형태로 제공하는 기술은 ?
- WMS
- WFS
- WMTS
- WCS
9. OGC 표준 중 하나로, 지도를 통짜로 제공하는 것이 아닌 작은 타일 형태로 잘라 제공하는 기술은 ?
- WMS
- WFS
- WMTS
- WCS
복습문제 3
1. javascript에 대해 틀린 설명은?
- 줄여서 java 라고도 부른다.
- 웹브라우저에서 다양한 기능을 할 수 있도록 해준다.
- 다양한 분야의 프로그램을 개발할 수 있다.
- 웹브라우저 종류마다 각각 다르게 동작하기도 한다.
2. 다음 자바스크립트의 결과로 맞는 것은?
a = 10
b = 20
c = a + b
console.log(c)
- 10
- 20
- 30
- 40
3. 자바스크립트의 함수에 대한 설명으로 가장 맞는 것은?
- 사칙연산을 담당한다
- 문자열 관련 처리를 한다
- 기능을 정의한다
- 메모리 관련 처리를 한다.
4. 다음 자바스크립트 코드에서 괄호 안의 a나 b를 부르는 용어는?
function sum(a, b)
{
c = a + b
return c
}
- 자료
- value
- 파라미터
- 상수
5. 자바스크립트에서 버튼이 눌리거나 마우스가 움직이는 등 사용자의 행동에 의해 발생하는 것을 통틀어 무엇이라 부르나?
- 클릭
- 함수
- move
- 이벤트
연습문제 답안
1.
A = 10
B = 20
C = A + B
console.log(C)
2.
A = 15
B = 6
C = A % B
console.log(C)
3.
A = true
B = false
console.log("A = " + A)
console.log("B = " + B)
4.
A = 3 < 5
B = 3 > 5
console.log("A = " + A)
console.log("B = " + B)
5.
A = "apple"
B = "2025"
console.log("A = " + A)
console.log("B = " + B)
6.
A = "apple"
B = "2025"
C = A + B
console.log("C = " + C)
7.
A = "apple"
B = "2025"
C = A == B
console.log("C = " + C)
8.
function func(A, B)
{
C = A * B
return C
}
ret = func(3, 5)
console.log("ret = " + ret)
9.
function func(A, B, C)
{
D = A + B + C
return D
}
ret = func(3, 5, 4)
console.log("ret = " + ret)
10.
function func(A, B)
{
if (A < B)
return A
else
return B
}
ret = func(3, 5)
console.log("ret = " + ret)
11.
function func(A, B)
{
if (A < B)
return B
else
return A
}
ret = func(3, 5)
console.log("ret = " + ret)
12.
function func(A, B, C)
{
if (A < B)
if (B < C)
return C
else
return B
else
return A
}
ret = func(3, 5, 6)
console.log("ret = " + ret)
13.
function func(A, B, C)
{
if (B < C)
if (A < B)
return A
else
return B
else
return C
}
ret = func(3, 5, 6)
console.log("ret = " + ret)
14.
<script>
function func()
{
console.log("clock")
}
</script>
<button onclick="func()">시계</button>
15.
<script>
function func1()
{
console.log("clock")
}
function func2()
{
console.log("book")
}
</script>
<button onclick="func1()">시계</button>
<button onclick="func2()">책</button>
16.
<script>
function func()
{
alert(form.txt.value)
}
</script>
<form name="form">
<input type="text" name="txt"><button type='button' onclick="func()">확인</button>
</form>
국토정보프로그래밍(python)
학습자료
python
-
python 공식 홈페이지: https://www.python.org
-
python 무료 책: 점프 투 파이썬
복습문제

1. 파이썬의 개요
1. 파이썬이라는 이름에 대한 설명 중 틀린 것은?
- 비단뱀이라는 뜻도 있다.
- 고대 신화에 나오는 큰 뱀 이라는 뜻도 있다.
- 제작자가 좋아하는 코미디에서 따온 이름이다.
- 제작자의 이름이다.
2. 파이썬의 특징이 아닌 것은?
- 언어 자체는 쉽지만 아직 라이브러리가 많지 않아 일일이 개발해야 하는 어려움이 있다.
- 문법이 비교적 간결하다.
- 배우려고 마음만 먹으면 도움이 될 참고자료들이 넘쳐난다.
- 무료로 사용할 수 있다.
3. 파이썬으로 만들면 문제가 생길 만한 프로그램 종류는?
- 웹사이트
- AI 프로그램
- 데이터 분석 프로그램
- real time을 요하는 실시간 처리가 중요한 프로그램
4. 파이썬의 언어적 특징이 아닌 것은?
- 인터프리터 언어이다.
- 대화형 언어이다.
- 실행파일(exe 파일)이 생성된다.
- 질문하면 대답하는 형식으로 프로그램이 진행된다.
5. 다음 중 파이썬의 프롬프트는?
- ###
- >>>
- <<<
- ***
2. 파이썬 자료형
1. 한 변수에 -3, -2, -1, 이렇게 3개 값만 들어간다. 이 경우 파이썬은 이 변수의 자료형을 무엇이라 판단할까?
- 문자열
- 정수형(integer)
- 실수형(float)
- 참/거짓형(boolean)
2. 다음 코드를 실행한 후 메모리의 모습으로 맞는 것은?
>>> a = 5
>>> b = 10
>>> a = 7
3. 다음 코드의 결과는?
>>> a = 1
>>> b = a + 0.1
>>> print (b)
- 1 + 0.1
- 1.01
- 10.1
- 1.1
4. 다음 코드에서 변수 b의 자료형은?
>>> a = 1
>>> b = a + 0.1
- 문자열
- 정수형(integer)
- 실수형(float)
- 참/거짓형(boolean)
5. 다음 코드의 결과는?
>>> 5 // 3
- 1
- 1.6666666666666667
- 2
- 3
6. 다음 코드의 결과는?
>>> 5 % 3
- 1
- 1.6666666666666667
- 2
- 3
7. 다음 코드의 결과는?
>>> 3 ** 3
- 9
- 33
- 27
- 45
8. 다음 코드의 결과는?
>>> a = "올해 연도 : "
>>> b = 2024
>>> c = a + b
- 에러가 발생한다.
- ‘올해 연도 : 2024’
- ‘올해 연도 :’
- ‘2024’
9. 바로 위 문제에서 에러가 발생했다면 이를 해결하기 위한 방법은?
- 문제없이 실행된다.
- c = a + b 를 c = a + len(b)로 수정한다.
- c = a + b 를 c = str(a) + b로 수정한다.
- c = a + b 를 c = a + str(b)로 수정한다.
10. 다음 코드의 결과는?
>>> a = 2024
>>> b = "올해 연도 : {0}".format(a)
>>> b
- 에러가 발생한다.
- ‘올해 연도 : 2024’
- ‘올해 연도 :’
- ‘2024’
11. 다음 코드의 결과는?
>>> a = "올해 연도 : {0}"
>>> b = 2024
>>> c = a.format(b)
>>> c
- 에러가 발생한다.
- ‘올해 연도 : 2024’
- ‘올해 연도 :’
- ‘2024’
12. list를 사용하는 이유가 아닌 것은?
- 변수 하나로 많은 양의 자료를 관리할 수 있다.
- 파이썬은 사용할 수 있는 변수의 갯수가 128개로 정해져 있다.
- 자료마다 변수를 생성하는 것은 매우 불편하고 사실상 그렇게는 개발이 불가능하기 때문
- 개발의 편리함때문
13. 다음 list에서 하나의 요소를 읽어오는 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2]
- ‘짜장’
- ‘짬뽕’
- ‘탕수육’
- ‘회’
14. list에서 하나의 요소를 바꾼 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2] = '깐풍기'
>>> a
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
- [‘짜장’, ‘짬뽕’, ‘깐풍기’, ‘회’]
- ‘깐풍기’
- 에러가 발생하고 값을 바꿀 수 없다.
15. list에 하나의 요소를 추가한 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a.append("육회")
>>> a
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’, ‘육회’]
- ‘육회’
- 에러가 발생하고 값을 바꿀 수 없다.
16. list에 하나의 요소를 특정 위치에 추가하기 위해, ??? 부분에 작성해야 하는 코드는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '짬뽕', '깐풍기', '탕수육', '회']
- a.insert(0, ‘깐풍기’)
- a.insert(1, ‘깐풍기’)
- a.insert(2, ‘깐풍기’)
- a.insert(3, ‘깐풍기’)
17. list에 하나의 요소를 삭제하기 위해, ??? 부분에 작성해야 하는 코드는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '탕수육', '회']
- del a[0]
- a.del[0]
- del a[1]
- a.del[1]
18. 다음 코드의 결과를 순서대로 표시한 것은?
>>> 2 < 5
???
>>> 5 < 2
???
- True, True
- True, False
- False, True
- False, False
3. 파이썬 제어문
1. 파이썬에서 제공하는 제어문 2가지는?
- 조건문, 입출력
- 입출력, 라이브러리
- 조건문, 반복문
- 반복문, 입출력
2. 조건식이 참인 경우에만 실행되는 제어문은?
- 입출력
- 라이브러리
- 반복문
- 조건문
3. 다음 조건문에서 실행되는 내용은?
if 3 < 5 :
a = 1 ⓐ
b = 2 ⓑ
c = 3 ⓒ
d = 4 ⓓ
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓓ
4. 다음 조건문에서 실행되는 내용은?
if 3 > 5 :
a = 1 ⓐ
b = 2 ⓑ
c = 3 ⓒ
d = 4 ⓓ
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓓ
5. 다음 조건문의 실행 결과는?
if 3 == 5 :
print("a")
print("b")
- 에러가 난다.
- ‘a’
- ‘b’
- ‘a’
‘b’
6. 다음 조건문의 실행 결과는?
if 3 != 5 :
print("a")
print("b")
- 에러가 난다.
- ‘a’
- ‘b’
- ‘a’
‘b’
7. 조건식이 참이 아닐 경우 실행하는 부분은?
- iif
- then
- print()
- else
8. 다음 조건문 코드의 실행 결과는?
a = 10
if a < 3 :
print ("apple")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘banana’
- ‘apple’
‘banana’
9. 다음 조건문 코드의 실행 결과는?
a = 3
if a < 7 :
print ("apple")
elif a < 5 :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
10. 다음 조건문 코드의 실행 결과는?
a = 9
if a < 7 :
print ("apple")
elif 8 <= a :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
11. 다음 조건문 코드의 실행 결과는?
a = 11
if a < 7 :
print ("apple")
elif a < 4 :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
12. 다음 조건문 코드의 실행 결과는?
a = 6
if a < 7 :
print ("apple")
if 5 <= a :
print ("mango")
elif a < 4 :
print ("kiwi")
else:
print ("banana")
- ‘apple’
‘mango’ - ‘apple’
- ‘mango’
- ‘banana’
- ‘kiwi’
4. 파이썬 반복문
1. “~하는 동안에” 라는 뜻으로 조건식이 참인 경우에만 반복 처리하는 반복문은 ?
- for
- during
- whale
- while
2. 주로 리스트의 모든 요소들을 하나씩 꺼내서 처리하는 방식의 반복문은?
- for
- during
- whale
- while
3. 다음 코드의 실행 결과는?
while True:
print("apple")
- 에러가 난다.
- 아무 것도 실행되지 않는 것처럼 보인다.
- “apple”
- “apple“이 무한히 출력된다.
4. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print(a)
- 에러가 난다.
- 아무 것도 실행되지 않는 것처럼 보인다.
- “3 4 5”
- “3“이 무한히 출력된다.
5. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print (a)
a = a + 1
- 에러가 난다.
- “3“이 무한히 출력된다.
- 3
4 - 3
4
5
6. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print (a)
a = a + 1
- 에러가 난다.
- “3“이 무한히 출력된다.
- 3
4 - 3
4
5
7. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
print(a)
- [1, 2, 3]
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1 2 3
8. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
print(item)
- [1, 2, 3]
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1 2 3
9. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item = 2 :
break
print(item)
- 에러가 발생한다.
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1e
10. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item == 2 :
break
print(item)
- 에러가 발생한다.
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1
11. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item == 2 :
continue
print(item)
- 1
2 - 1
2
3 - 2
- 1
3
12. 다음 코드의 실행 결과는?
for i in range(3):
print (i)
- 1
2
3 - 3
- 2
- 0
1
2
13. 다음 코드의 실행 결과는?
a = [i*3 for i in range(3)]
print (a)
- [1, 2, 3]
- [1, 3, 6]
- 6
- [0, 3, 6]
5. 파이썬 자료형 II
1. list의 고정형 버전으로 각 항목들을 [] 으로 감싸는 list와 달리 ()으로 감싸는 파이썬 자료형은?
- boolean
- float
- tuple
- map
2. tuple에 대한 설명으로 옳은 것은?
- []나 ()로 항목들을 감싼다.
- 한 번 넣어둔 항목들은 바꿀 수 없다.
- 항목을 나중에 추가할 수 있다.
- tuple 안에 들어가는 하나의 항목으로 tuple을 사용할 수 없다.
3. tuple에 입력된 가장 첫 번째 항목을 사용하는 바른 코드는?
- a = tup[0]
- a = tup[1]
- a = tup.0
- a = tup.1
4. “apple” = “애플“과 같이 key와 value의 짝으로 이루어진 파이썬 자료형은?
- map
- float
- tuple
- dictionary
5. “apple” = “애플“과 같이 key와 value의 짝으로 이루어진 자료형에서 key가 “apple“인 자료를 가져오는 코드는 ?
- di[‘apple’]
- di.apple
- di.‘apple’
- di(‘apple’)
6. 함수
1. 영어로는 function으로 번역되며, 프로그램 내에서 어떤 기능을 하도록 미리 만들어 놓은 것은?
- 라이브러리
- 제어문
- 비교문
- 함수
2. 다음 중 파이썬 내장 함수가 아닌 것은?
- print()
- len()
- get_temp()
- str()
3. 다음과 같이 사용자 정의 함수를 호출할 경우 실행되는, 함수의 몸체 부분은?
def plus1(a) :
b = 1 ⓐ
c = 2 ⓑ
d = 3 ⓒ
e = 4 ⓓ
plus1(5)
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓐ ⓑ ⓒ ⓓ
4. 다음 코드는 결과가 나오지 않는다. 그 이유는?
def plus1(a) :
b = a + 1
res = plus1(3)
print (res)
- 파이썬이 이해 못하는 심각한 오류가 있다.
- 함수 정의할 때 들여쓰기를 잘못 했다.
- res 는 예약어라 변수명으로 사용하면 안된다.
- plus1() 함수는 결과값을 리턴하지 않고 있다.
5. 다음 코드의 결과는?
def plus1(a) :
b = a + 1
return b
res = plus1(3)
print (res)
- 1
- 2
- 3
- 4
6. 다음 코드는 에러를 발생시킨다. 그 이유는?
def plus1(a) :
b = a + 1
return b
res = plus1(3)
print (b)
- plus1() 함수 내에 심각한 오류가 있다.
- b는 plus1() 함수 내에서만 사용하는 지역변수다
- res 는 예약어라 변수명으로 사용하면 안된다.
- 아무런 에러없이 잘 실행된다.
7. 정규표현식
1. 정규표현식에 대한 설명으로 틀린 것은?
- 주어진 문자열이 어떤 패턴에 맞는지를 검사한다.
- 정규표현식의 표현 방법은 모든 개발 언어나 프로그램마다 다 똑같다.
- 파이썬은 기본적으로 정규표현식을 지원한다.
- 패턴의 문자열이 앞에 시작하는지 뒤에서 시작하는지 정할 수 있다.
2. 윈도우 탐색기 프로그램에서 ‘LX’ 라는 문자가 포함된 모든 파일을 찾으려 할 때 사용하는 정규표현식은?
- LX
- LX.*
- *LX*
- *.LX
3. 윈도우 탐색기 프로그램에서 ‘LX’ 라는 문자열로 시작하는 모든 파일을 찾으려 할 때 사용하는 정규표현식은?
- LX
- LX*
- *LX*
- *LX
4. 파이썬 정규표현식에서 ‘LX’ 라는 문자열로 시작하는 모든 파일을 찾으려 할 때 사용하는 정규표현식은?
- ‘LX*’
- ‘*LX’
- ‘^LX’
- ‘LX^’
5. 다음 파이썬 정규표현식 코드의 결과는?
>>> import re
>>> pattern = re.compile('배움')
>>> title = '나라배움터'
>>> m = pattern.search(title)
>>> m
- 찾을 수 없다고 나온다.
- 한글은 정규표현식으로 찾을 수 없다.
- 파이썬은 기본적으로 정규표현식을 지원하지 않는다.
- 찾았다고 나온다.
8. 파이썬 입출력
1. 입력의 옳은 예가 아닌 것은?
- 키보드로부터 입력
- 파일로부터 입력
- 모니터로부터 입력
- 마우스로부터 입력
2. 출력의 옳은 예가 아닌 것은?
- 파일로 출력
- 스피커로 출력
- 프린터로 출력
- 마이크로 출력
3. 키보드로 문자를 입력받을 때 사용하는 함수는?
- keyboard()
- str()
- input()
- print()
4. 키보드로 숫자를 입력받을 때 사용하는 함수 조합은?
- int( input() )
- input( int() )
- str( input() )
- input( str() )
5. 파일을 새로 만들고 그 안에 내용을 쓰려 한다. 잘못된 부분은?
file = open("data.txt", 'r') ⓐ
file.write("내 이름은 별똥별") ⓑ
file.close() ⓒ
- 잘못된 부분 없음
- ⓐ
- ⓑ
- ⓒ
6. 다음 코드는 파일에서 내용을 읽어오는 코드이다. data.txt 파일의 내용이 다음과 같을 때 이 코드의 실행 결과는?

file = open("data.txt", 'r')
line = file.readline()
print (line)
file.close()
- 역삼역
- 기러기
- 역삼역
기러기 - 아무 것도 표시되지 않는다.
7. 다음 코드는 파일에서 내용을 읽어오는 코드이다. data.txt 파일의 내용이 다음과 같을 때, 파일의 전체 내용을 다 가져오려 하는 경우 ??? 부분에 맞는 것은?

file = open("data.txt", 'r')
lines = file.readlines()
for line ??? lines :
print (line)
file.close()
- as
- in
- all
- with
8. 다음 코드는 엑셀용 csv 파일을 만들기 위한 코드이다. 엑셀에서 열었을 때 왼쪽처럼 보일 거라는 기대와 달리 오른쪽 그림처럼 보이고 있다. 해결 방법은?

file = open("data.csv", 'w')
file.write ("이름,전화번호")
file.write ("홍길동,02-1111-1111")
file.write ("박길동,02-1111-2222")
file.write ("최길동,03-1111-3333")
file.close()
- 확장자를 csv가 아닌 xlsx 로 바꿔서 생성한다.
- 각 줄의 끝에 “,“를 추가한다.
- 각 줄의 끝에 개행문자인 “\n“을 추가한다.
- 각 줄의 앞에 “,“를 추가한다.
9. 파이썬 라이브러리
1. 파이썬에서 제공하는 math 라이브러리의 기능 중 올림 기능(예: 3.1 => 4)을 제공하는 함수는?
- ceil()
- floor()
- gcd()
- print()
2. 파이썬에서 제공하는 math 라이브러리의 기능 중 내림 기능(예: 3.1 => 3)을 제공하는 함수는?
- ceil()
- floor()
- gcd()
- print()
3. 임의의 수(난수)를 만들어 주는 기능을 제공하는 파이썬 표준 라이브러리는?
- math
- random
- string
- AI
4. 다음 코드의 실행 결과는?
import random
a = random.randint(1, 7)
print(a)
- 0
- 5
- 10
- 15
5. 다음 중 파이썬의 AI 관련 외부 라이브러리가 아닌 것은?
- TensorFlow
- PyTorch
- Scikit Learn
- pip
6. 다음 중 파이썬의 데이터 시각화 라이브러리는?
- TensorFlow
- Matplotlib
- pip
- anaconda
7. 다음 중 파이썬의 라이브러리 관리 프로그램은?
- TensorFlow
- Matplotlib
- pip
- anaconda
8. 다음 중 파이썬의 라이브러리를 효율적으로 관리하기 위해 가상환경을 만들어 각 가상환경마다 각기 다른 라이브러리 버전을 설치할 수 있도록 해 주는 프로그램은?
- TensorFlow
- Matplotlib
- pip
- anaconda
9. 다음 중 아나콘다에 대한 설명 중 틀린 것은?
- 오픈소스로 누구나 무료로 사용할 수 있다.
- 파이썬이 실행되는 가상환경을 만들어 주는 프로그램이다.
- 라이브러리 버전 문제가 발생하는 경우 좋은 해결책이다.
- 각 가상환경마다 파이썬 버전을 달리 설정할 수 있다.
10. 다음 중 엑셀과 같이 2차원 표형식으로 데이터를 처리하는 라이브러리는?
- pandas
- Matplotlib
- moviepy
- anaconda
연습문제
연습문제 - 파이썬 자료형
1. “apple” 문자열의 길이를 구하는 코드를 작성하시오.
답(안) 1
a = "apple"
b = len(a)
print(b)
답(안) 2
a = "apple"
print(len(a))
답(안) 3
print(len("apple"))
2. “오늘 기온은 30도“와 같이 보여지는 코드를 작성하시오. 단 30은 숫자형임.
답(안) 1
a = "오늘 기온은 "
b = 30
c = a + str(b) + "도"
print(c)
답(안) 2
a = "오늘 기온은 {0}도".format(30)
print(a)
3. “오늘 기온은 30도, 습도는 65%“와 같이 보여지는 코드를 작성하시오. 단 30, 65는 숫자형임.
답(안) 1
a = "오늘 기온은 "
b = 30
c = "도, "
d = "습도는 "
e = 65
f = "%"
g = a + str(b) + c + d + str(e) + f
print(g)
답(안) 2
a = "오늘 기온은 {0}도, 습도는 {1}%".format(30, 65)
print(a)
4. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "불어", "수학", "과학"]
답(안)
a = ["국어", "영어", "수학", "과학"]
a[1] = "불어"
print(a)
5. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "영어", "수학", "과학", "체육"]
답(안)
a = ["국어", "영어", "수학", "과학"]
a.append("체육")
print(a)
6. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "음악", "영어", "수학", "과학"]
답(안)
a = ["국어", "영어", "수학", "과학"]
a.insert(1, "음악")
print(a)
7. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "음악", "영어", "과학"]
답(안) 1
a = ["국어", "영어", "수학", "과학"]
a.insert(1, "음악")
del a[3]
print(a)
답(안) 2
a = ["국어", "영어", "수학", "과학"]
del a[2]
a.insert(1, "음악")
print(a)
8. a와 같은 리스트를 정렬하여 b와 같은 리스트로 만드는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ['과학', '국어', '수학', '영어']
답(안)
a = ["국어", "영어", "수학", "과학"]
a.sort()
print(a)
9. a와 같은 리스트를 역순으로 바꿔서(정렬아님) b와 같은 리스트로 만드는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ['과학', '수학', '영어', '국어']
답(안)
a = ["국어", "영어", "수학", "과학"]
a.sort()
print(a)
10. a와 같은 리스트를 역순으로 정렬해서 b와 같은 리스트로 만드는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ['영어', '수학', '국어', '과학']
답(안)
a = ["국어", "영어", "수학", "과학"]
a.sort()
a.reverse()
print(a)
2. 파이썬의 조건문
1. 총싸움 게임에서 주인공 몸의 3D 공간상 위치 x, y, z를 player_x, player_y, player_z 라 하고, 총알의 3D 공간상 위치를 bullet_x, bullet_y, bullet_z라 할 때, 주인공의 몸과 총알의 3D 공간상 x축 상의 간격, y축 상의 간격, z축 상의 간격이 모두 10이하면 총알에 맞은 것으로 간주하는 코드 작성

x축의 예
답(안) 1
player_x = 0
player_y = 0
player_z = 0
bullet_x = 5
bullet_y = 5
bullet_z = 5
if bullet_x - player_x <= 10:
if bullet_y - player_y <= 10:
if bullet_z - player_z <= 10:
print("총알에 맞았음")
답(안) 2
player_x = 0
player_y = 0
player_z = 0
bullet_x = 5
bullet_y = 5
bullet_z = 10
if bullet_x - player_x <= 10 and bullet_y - player_y <= 10 and bullet_z - player_z <= 10:
print("총알에 맞았음")
2. 기온이 30도 이상이면 바다로 가고 미만이면 산으로 가자
답(안)
temp = 30
dest = ""
if 30 <= temp:
dest = "바다"
else:
dest = "산"
msg = "{0}(으)로 가자!".format(dest)
print(msg)
3. 남은 시간이 10분 이상이면 계속 책을 보고 미만이면 화장실에 간다.
답(안)
remain = 9
if 10 <= remain :
print("계속 책 본다.")
else:
print("화장실 다녀온다.")
4. 마트가서 우유사고 만약 아보카드 있으면 6개 사와
* 사실 이 문제는 유명한 개발자 유머임.
개발자 남편에게 위와 같이 말했는데 남편이 마트에 아보카드가 있었다면서 우유만 6개 사옴.
(어쩌면 개발자만 이해할 수 있는 유머)
답(안) 1
avocado = 1 # 또는 0
if 0 < avocado :
print("마트에 아보카드 있어서 우유 1개와 아보카드 6개 사왔어")
else:
print("마트에 아보카드 없어서 우유 1개만 사왔어")
답(안) 2
avocado = 1 # 또는 0
if 0 < avocado :
print("마트에 아보카드 있어서 우유 6개 사왔어")
else:
print("마트에 아보카드 없어서 우유 1개 사왔어")
5. 설날 삼촌이 세배돈으로 30,000원 이하로 주시면 너희들에게 떡볶이 사고, 50,000원 이하면 피자 사고, 100,000원 이하면 고기 부페 쏜다! (그 이상이면 조용히 헤드폰 바꿈)
============= RESTART: E:\TEST\test.py ============
삼촌이 20000원 주셨어. 떡볶이 쏜다!
============= RESTART: E:\TEST\test.py ============
삼촌이 50000원 주셨어. 피자 쏜다!
============= RESTART: E:\TEST\test.py ============
삼촌이 70000원 주셨어. 고기 부페 쏜다!
============= RESTART: E:\TEST\test.py ============
(200000원으로 헤드폰이나 바꾸자)
답(안)
money = 200000
dest = ""
if money <= 30000 :
dest = "떡볶이"
elif money <= 50000 :
dest = "피자"
elif money <= 100000 :
dest = "고기 부페"
else :
dest = ""
msg = ""
if dest != "" :
msg = "삼촌이 {0}원 주셨어. {1} 쏜다!".format(money, dest)
else :
msg = "({0}원으로 헤드폰이나 바꾸자)".format(money)
print(msg)
3. 파이썬의 반복문
1. 1~5까지의 정수가 출력되는 코드
============= RESTART: E:\TEST\test.py ============
1
2
3
4
5
답(안) 1: while문 사용
i = 1
while i <= 5 :
print(i)
i = i + 1
답(안) 2: for문 사용
for i in [1, 2, 3, 4, 5] :
print(i)
2. 1 ~ 100까지의 정수가 출력되는 코드
============= RESTART: E:\TEST\test.py ============
1
2
3
...
100
답(안) 1: while문 사용
i = 1
while i <= 100 :
print(i)
i = i + 1
답(안) 2: for문 사용
a = range(1, 101) # 1 ~ 100까지의 정수 리스트를 만든다. range()는 정수 리스트를 만드는 함수.
for i in a :
print(i)
3. 다음과 같이 오늘의 출근 일자를 리스트로 가져왔을 때 지각한 사람이 누구인지 출력하는 코드
morning = [ ["홍길동", "08:45"], ["나지적", "08:37"], ["박문수", "09:11"] ]
============= RESTART: E:\TEST\test.py ============
지각한 사람은 박문수
답(안) for 문
morning = [ ["홍길동", "08:45"], ["나지적", "08:37"], ["박문수", "09:11"] ]
for item in morning :
if "09:00" < item[1] :
print("지각한 사람은 " + item[0])
답(안) while 문
morning = [ ["홍길동", "08:45"], ["나지적", "08:37"], ["박문수", "09:11"] ]
for item in morning :
if "09:00" < item[1] :
print("지각한 사람은 " + item[0])
4. 구구단 프로그램
=================================== RESTART: E:\test\test.py ==================================
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
4 * 7 = 28
4 * 8 = 32
4 * 9 = 36
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63
8 * 1 = 8
8 * 2 = 16
8 * 3 = 24
8 * 4 = 32
8 * 5 = 40
8 * 6 = 48
8 * 7 = 56
8 * 8 = 64
8 * 9 = 72
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
답(안)
a = 2
while a <= 9 :
b = 1
while b <= 9 :
c = a * b
msg = "{0} * {1} = {2}".format(a, b, c)
print(msg)
b = b + 1
a = a + 1
5. 위 구구단 프로그램에 단마다 구분하기
=================================== RESTART: E:\test\test.py ==================================
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
4 * 7 = 28
4 * 8 = 32
4 * 9 = 36
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63
8 * 1 = 8
8 * 2 = 16
8 * 3 = 24
8 * 4 = 32
8 * 5 = 40
8 * 6 = 48
8 * 7 = 56
8 * 8 = 64
8 * 9 = 72
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
답(안)
a = 2
while a <= 9 :
b = 1
while b <= 9 :
c = a * b
msg = "{0} * {1} = {2}".format(a, b, c)
print(msg)
b = b + 1
a = a + 1
print("")
6. 좋아하는 과일로 리스트를 만들고 ’바나나’가 있으면 ‘미끄러져 조심해’ 라고 출력하고, 없으면 ‘바나나는 왜 없어’ 라고 출력하는 코드
답(안)
fruits = ['사과', '딸기', '바나나', '망고']
find_banana = False
for item in fruits :
if item == '바나나' :
find_banana = True
if find_banana == True :
print("미끄러져 조심해")
else :
print("바나나는 왜 없어")
7. 좋아하는 과일로 리스트를 만들고 ’바나나’가 있으면 ‘미끄러져 조심해’ 라고 출력하고, 더 이상 리스트를 조사하지 않는다. 바나나가 없으면 ‘바나나는 왜 없어’ 라고 출력하는 코드
답(안) 1
fruits = ['사과', '딸기', '바나나', '망고']
find_banana = False
for item in fruits :
if item == '바나나' :
find_banana = True
break
if find_banana == True :
print("미끄러져 조심해")
else :
print("바나나는 왜 없어")
답(안) 2
fruits = ['사과', '딸기', '바나나', '망고']
find_banana = False
for item in fruits :
print ("{0} 검사 중...".format(item))
if item == '바나나' :
find_banana = True
break
if find_banana == True :
print("미끄러져 조심해")
else :
print("바나나는 왜 없어")
8. 좋아하는 과일로 리스트를 만들고, 리스트의 각 아이템마다 “OOO 잼 만들기“를 출력하되 아이템이 ‘바나나’ 일 때만 그렇게 출력하지 않는 코드
답(안)
fruits = ['사과', '딸기', '바나나', '망고']
for item in fruits :
if item == '바나나' :
continue
print("{0} 잼 만들기".format(item) )
4. 함수
1. 10을 더해서 리턴하는 함수
답(안)
def plus10(a) :
return a + 10
res = plus10(5)
print(res)
2. a, b 두 수를 받아서 a의 b제곱을 리턴하는 함수 foo()
답(안)
def foo(a, b) :
c = a ** b
return c
res = foo(2, 3)
print(res)
3. a, b 두 수를 받아서 a를 b로 나눈 계산값의 나머지를 리턴하는 함수 foo()
답(안)
def foo(a, b) :
c = a % b
return c
res = foo(11, 3)
print(res)
4. a, b 두 수를 받아서 a를 b로 나눈 계산값의 몫을 리턴하는 함수 foo()
답(안)
def foo(a, b) :
c = a // b
return c
res = foo(11, 3)
print(res)
5. 파이썬입출력
1. 사용자 키보드로 이름을 받아 “안녕하세요 OOO님” 이라고 출력하는 코드
=================================== RESTART: E:\test\test.py ==================================
이름: apple
안녕하세요 apple님
답(안)
a = input("이름: ")
b = "안녕하세요 {0}님".format(a)
print(b)
2. 구구단을 gugudan.txt 파일로 출력하는 코드
답(안)
file = open("gugudan.txt", 'w')
i = 2
while i <= 9 :
j = 1
while j <= 9 :
a = "{0} * {1} = {2}\n".format(i, j, i*j)
file.write(a)
j += 1
i += 1
file.close()
3. 구구단을 아래 그림처럼 엑셀에서 읽을 수 있는 gugudan.csv 파일로 출력하는 코드

답(안)
file = open("gugudan.txt", 'w')
i = 2
while i <= 9 :
j = 1
while j <= 9 :
a = "{0} * {1} = {2}\n".format(i, j, i*j)
file.write(a)
j += 1
i += 1
file.close()
소스코드
실습: 비교연산자를 이용한 if 문
if 3 < 5 :
print ("3 < 5가 참이면 이 문장이 표시됨")
if 3 > 5 :
print ("3 > 5가 참이면 이 문장이 표시됨")
if 3 <= 5 :
print ("3 <= 5가 참이면 이 문장이 표시됨")
if 3 >= 5 :
print ("3 >= 5가 참이면 이 문장이 표시됨")
if 3 == 5 :
print ("3 == 5가 참이면 이 문장이 표시됨")
if 3 != 5 :
print ("3 != 5가 참이면 이 문장이 표시됨")
에어컨 온도조절 동작 코드
temp = 33
user_want_temp = 26
if temp <= user_want_temp :
print("에어컨을 잠시 멈춥니다.")
수박이 20,000원 미만이면 한 통 사와
water_melon = 25000
if water_melon < 20000 :
print("수박을 한 통 구입합니다")
온도가 내려가 에어컨이 멈추면 다시는 에어컨이 재가동되지 않는 문제 해결
temp = 27
user_want_temp = 26
if temp <= user_want_temp :
print("에어컨을 잠시 멈춥니다.")
else :
print("에어컨을 가동합니다.")
수박이 20,000원 미만이면 2통 사오고, 그 이상이면 1통만 사와
water_melon = 19000
if water_melon < 20000 :
print("수박을 2통 구입합니다.")
else :
print("수박을 1통 구입합니다.")
수박이 20,000원 미만이고 사이다가 1,000원 미만이면 둘 다 하나씩 사와. 그렇지 않으면 아무 것도 사오지 마.
water_melon = 19000
cider = 950
if water_melon < 20000 :
if cider < 1000 :
print("수박 1통과 사이다 1개를 구입합니다.")
수박이 20,000원 미만이고 사이다가 1,000원 미만이면 둘 다 하나씩 사와. 그렇지 않으면 아무 것도 사오지 마.
water_melon = 19000
cider = 1000
if water_melon < 20000 :
if cider < 1000 :
print("수박 1통과 사이다 1개를 구입합니다.")
else:
print("수박은 싼 데 사이다가 비싸서 아무 것도 안 사감")
else:
print("일단 수박부터 비싸서 아무 것도 안 사감")
수박이 20,000원 미만이면 3통 사오고, 20,000원 이상 ~ 25,00미만이면 2통만 사오고, 25,000원 이상이면 1통만 사와
if water_melon < 20000 :
print("수박을 3통 구입합니다.")
else :
if water_melon < 25000 :
print("수박을 2통 구입합니다.")
else :
print("수박을 1통 구입합니다.")
수박이 20,000원 미만이면 3통 사오고, 20,000원 이상 ~ 25,00미만이면 2통만 사오고, 25,000원 이상이면 1통만 사와
if water_melon < 20000 :
print("수박을 3통 구입합니다.")
elif water_melon < 25000 :
print("수박을 2통 구입합니다.")
else :
print("수박을 1통 구입합니다.")
실습: 약속에 늦은 날(elif)
message = "" # 메시지
late = 20 # 지각할 거 같은 시간(분)
if late < 5 :
message = ""
elif late < 20 :
message = "미안하다"
else:
message = "오늘 자동차가 펑크날거 같아"
if message != "":
print("친구에게 다음과 같이 메시지를 보냈습니다: ", message)
반복문 - while
a = 0
while a < 3 :
print (a)
a = a + 1
반복문 - while
a = 0
while True :
print (a)
a = a + 1
1, 3, 5, 7, 9, … 와 같이 홀수만 99까지 출력
a = 1
while a <= 99 :
print(a)
a = a + 2
반복문 - for
data = [1, 2, 3, 4, 5]
for a in data :
print (a)
1-9까지의 숫자를 list로 만들고 그 목록을 하나씩 출력
nums = [1,2,3,4,5,6,7,8,9]
for a in nums :
print (a)
좋아하는 음식을 list로 만들고 그 목록을 하나씩 출력
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
for food in food_list :
print (food)
좋아하는 음식을 list로 만들고 그 목록 중 “치킨“이 있을 때만 “치킨 찾았다!” 출력
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
for food in food_list :
if food == "치킨" :
print (food, "찾았다!")
좋아하는 음식을 list로 만들고 그 목록 중 “탕수육“이 있을 때만 “탕수육 찾았다! O번째에 있었어!” 출력
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
index = index + 1
무의미한 반복 작업 중단 - break
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
break;
index = index + 1
break 문이 없을 때
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
print(index, "번째 자료 조사 중...")
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
index = index + 1
break 문이 있을 때
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
print(index, "번째 자료 조사 중...")
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
break;
index = index + 1
목록 중 ‘트러플버섯’ 사달라고 조를 때
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
for food in food_list :
if food != "트러플버섯" :
continue
print (food, "사 주세요!")
반복문으로 list 값 추가하기(list comprehension)
for i in range(5):
print(i)
range() 함수 사용해 list 값 추가
a = [i for i in range(10)]
range() 함수 사용해 list 값 추가
a = [i*2 for i in range(10)]
함수 사용하기
def plus1(a) :
b = a + 1
plus1(10)
함수 결과를 사용하자 - return
def plus1(a) :
b = a + 1
return b
c = plus1(10)
print(c)
실습: 두 수를 더해서 return 하는 함수
def plus_2(a, b) :
return a + b
a = plus_2(10, 20)
print(a)
실습: 두 수를 빼서 return 하는 함수
def minus_2(a, b) :
return a - b
a = minus_2(10, 20)
print(a)
실습: 두 수 중 더 큰 수를 return 하는 함수
def get_max(a, b):
if a < b :
return b
else :
return a
res = get_max(10, 11)
print(res)
실습: 두 수 중 더 작은 수를 return 하는 함수
def get_min(a, b):
if a < b :
return a
else :
return b
res = get_min(10, 11)
print(res)
파이썬의 정규표현식
import re
pattern = re.compile('연어')
pic = '멸치요리.jpg'
m = pattern.search(pic)
파이썬의 정규표현식
import re
pattern = re.compile('멸치')
pic = '멸치요리.jpg'
m = pattern.search(pic)
파일명으로 리스트 만들고, 그 리스트를 돌며 ’연어’라는 글자가 들어있는 파일명만 찾기
import re
files = ["멸치요리.jpg", "연어요리.jpg", "연어 튀기기 전.png"]
pattern = re.compile('연어')
for item in files:
m = pattern.search(item)
if m != None:
print(item, '은 조건에 맞음.')
else:
print(item, '은 조건에 맞지 않음')
시작이 같은지 검사하기 : K로 시작하는지 검사
import re
pic = "Korea.jpg"
pattern = re.compile('^K')
m = pattern.search(pic)
import re
pic = "booK.jpg"
pattern = re.compile('^K')
m = pattern.search(pic)
끝이 같은지 검사하기: ’jpg’로 끝나는지 검사하기
import re
pic = "booK.jpg"
pattern = re.compile('jpg$')
m = pattern.search(pic)
import re
pic = "booK.jpg"
pattern = re.compile('png$')
m = pattern.search(pic)
input() 함수 사용
a = input()
print(a)
화면에 메시지 출력하면서 입력하라고 안내
a = input(“입력하세요:”)
print(a)
input() 함수 사용
a = int( input("1~3중 입력하세요: ") )
print(a)
사용자 키보드로 숫자 값을 받아 1 더한 값을 보여주는 프로그램
a = int( input("숫자를 입력하세요: ") )
b = a + 1
print("결과 :" , b)
사용자 키보드로 숫자 값을 받아 1 뺀 값을 보여주는 프로그램
a = int( input("숫자를 입력하세요: ") )
b = a - 1
print("결과 :" , b)
사용자 키보드로 이름 받아 뒤에 “님 안녕하세요”를 보여주는 프로그램
a = input("이름을 입력하세요: ")
b = a + "님 안녕하세요"
print("결과 : " , b)
파일 새로 만들고 파일에 내용 쓰기
# 파일 생성하고 열기
file = open("sample.txt", 'w')
# 파일에 내용 쓰기
file.write("안녕하세요")
# 파일 닫기. 파일을 열었으면 꼭 닫아야 한다
file.close()
파일 읽기
# 파일 생성하고 열기
file = open("sample.txt", 'r')
# 파일 내용에서 맨 위 한 줄 읽어 오기
line = file.readline()
print (line)
# 파일 닫기. 파일을 열었으면 꼭 닫아야 한다
file.close()
반복문으로 여러 줄 쓰기
file = open("여러줄.txt", 'w')
index = 1
while index <= 100 :
file.write(str(index))
file.write("\n")
index = index + 1
file.close()
여러 줄 읽기
file = open("여러줄.txt", 'r')
while True:
line = file.readline()
if not line:
break;
print (line)
file.close()
여러 줄 읽기
file = open("여러줄.txt", 'r')
all_line_list = file.readlines()
for line in all_line_list :
print(line)
file.close()
sample.csv
file = open("sample.csv", 'w')
file.write ("이름,전화번호\n")
file.write ("홍길동,02-1111-1111\n")
file.write ("박길동,02-1111-2222\n")
file.write ("최길동,03-1111-3333\n")
file.close()
math
import math
# 올림. 주어진 수보다 큰 수중 가장 작은 정수
a = math.ceil(3.1)
# 내림. 주어진 수보다 작은 수중 가장 큰 정수
b = math.floor(3.1)
# 최대공약수
c = math.gcd(12, 20, 40, 60)
print(a, b, c)
random
import random
# 1~10 사이 아무 정수나 생성
a = random.randint(1,10)
# 0 <= x < 1 사이의 실수 생성
b = random.random()
print(a, b)
matplotlib
import matplotlib.pyplot
matplotlib.pyplot.plot([1, 5, 3, 3, 4])
matplotlib.pyplot.show()
matplotlib
import matplotlib.pyplot
matplotlib.pyplot.plot([1, 5, 3, 3, 4], 'ro')
matplotlib.pyplot.show()
pandas
import pandas as pd
df = pd.DataFrame(columns = ['이름','키'])
df['이름'] = ["홍길동", "박길동", "김길동"]
df['키'] = [175, 183, 178]
print(df)
pandas 엑셀 파일로 저장하기
import pandas as pd
df = pd.DataFrame(columns = ['이름','키'])
df['이름'] = ["홍길동", "박길동", "김길동"]
df['키'] = [175, 183, 178]
print(df)
df.to_excel('test.xlsx')
pandas 자료를 matplotlib 로 시각화
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(columns = ['이름','키'])
df['이름'] = ["홍길동", "박길동", "김길동"]
df['키'] = [175, 183, 178]
df.plot()
plt.show()
moviepy
from moviepy.editor import ImageSequenceClip
# 이미지 파일이 저장된 폴더 경로
image_folder = 'images'
video_name = 'output.mp4'
# 이미지 시퀀스 클립 생성 (fps: 초당 프레임 수)
clip = ImageSequenceClip(image_folder, fps=1)
# 비디오 저장
clip.write_videofile(video_name)
결과

사진 보정의 세계

샘플사진
1. 자르기
2. 회전
3. 선명도
4. 아웃포커싱
5. 비네팅
6. 잡티제거
7. 스타일
8. 색감-밝기
9. 색감-대비
10. 색감-채도
11. 색감-색온도
12. 색감-커브
스냅시드 튜토리얼
이 사이트의 샘플사진을 다운로드 받아 스냅시드를 이용해 보정하는 방법을 보여주는 간단한 영상입니다.
3차원 공간정보 서비스 구현

샘플: 웹 3D 지도
- https://profkim2000.github.io/cesiumjs_1
* PC, 스마트폰에서 사용 가능.

블렌더 활용실습
1. 건물만들기
2. 책상만들기 1
3. 책상만들기 2
loop cut
면을 나눌 때 사용. 단축키: ctrl + R

4. 책상만들기 3
5. 탑
inset
선택한 면과 같은 모양으로 내부에 작은 면을 만들 때 사용. 단축키: I

6. 시계탑
7. 나무 글자
8. 평면도
1/3
2/3
3/3
cesium 소스코드
* 2024. 11. 12. cesium js 1.123 동작 확인.
cesium_js/server.js
const express = require('express');
const path = require('path');
const app = express();
app.use(express.static(path.join(__dirname, 'node_modules/cesium/Build/Cesium')));
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
});
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
cesium_js/index.html
<html>
<head>
<meta charset="utf-8">
<script src="https://cesium.com/downloads/cesiumjs/releases/1.123/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.123/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
</head>
<body onload="render()">
<div id="cesiumContainer"></div>
<div id="toolbar"></div>
<script>
async function render()
{
Cesium.Ion.defaultAccessToken = "여기에_토큰_붙여넣기";
// cesium에서 제공하는 지형을 보여주는 뷰어 생성.
const viewer = new Cesium.Viewer("cesiumContainer", {
terrainProvider: await Cesium.CesiumTerrainProvider.fromIonAssetId(1)
});
viewer.scene.globe.depthTestAgainstTerrain = true;
try
{
// 애셋을 추가한다.
// OSM Building 애셋 추가.
var tileset = await Cesium.Cesium3DTileset.fromIonAssetId(96188);
viewer.scene.primitives.add(tileset);
// 카메라 위치와 방향 조정
await viewer.scene.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(127.056718, 36.527274, 300), // 위도, 경도, 높이
orientation: new Cesium.HeadingPitchRoll.fromDegrees(0, -10, 0,), // Heading(Yaw), Pitch, Roll(bank)
});
} catch (error)
{
console.log(error);
}
};
</script>
</body>
</html>
cesium_js/index.html 에셋 추가 예
<html>
<head>
<meta charset="utf-8">
<script src="https://cesium.com/downloads/cesiumjs/releases/1.123/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.123/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
</head>
<body onload="render()">
<div id="cesiumContainer"></div>
<div id="toolbar"></div>
<script>
async function render()
{
Cesium.Ion.defaultAccessToken = "여기에_토큰_붙여넣기";
// cesium에서 제공하는 지형을 보여주는 뷰어 생성.
const viewer = new Cesium.Viewer("cesiumContainer", {
terrainProvider: await Cesium.CesiumTerrainProvider.fromIonAssetId(1)
});
viewer.scene.globe.depthTestAgainstTerrain = true;
try
{
// 애셋을 추가한다.
var tileset = await Cesium.Cesium3DTileset.fromIonAssetId(96188);
viewer.scene.primitives.add(tileset);
tileset = await Cesium.Cesium3DTileset.fromIonAssetId(111111111);
viewer.scene.primitives.add(tileset);
// 카메라 위치와 방향 조정
await viewer.scene.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(127.056718, 36.527274, 300), // 경도, 위도, 높이
orientation: new Cesium.HeadingPitchRoll.fromDegrees(0, -10, 0,), // Heading(Yaw), Pitch, Roll(bank)
});
} catch (error)
{
console.log(error);
}
};
</script>
</body>
</html>
평면도 샘플


복습문제

1. 블렌더 기초 실습(1)
1. blender에 대한 설명으로 틀린 것은?
- 공사 규모에서는 유료로 구입해야 한다.
- 오픈소스로 개발되고 있다.
- 직관적인 UI로 큰 인기를 모으고 있다.
- 다양한 시스템들과 co-work하고 있다.
2. blender에 대한 설명으로 맞는 것은?
- 사진과 같은 품질을 제작할 수 있다.
- 동영상은 만들 수 없다.
- 플러그인을 사용할 수 없어 활용도가 낮다.
- 유료 구입하면 특수 기능을 사용할 수 있다.
3. x, y, z라고 축의 이름이 붙어 있지 않은 경우라도 어떤 축이 각각 x, y, z 축임을 알 수 있는 방법은?
- ABC
- GOD
- YOU
- RGB
4. 빨간색 축은 x, y, z 중 어떤 축인가?
- X
- Y
- Z
- 아무런 축도 나타내지 않는다.
5. 파란색 축은 x, y, z, 중 어떤 축인가?
- X
- Y
- Z
- 아무런 축도 나타내지 않는다.
6. 2D에 비해 3D의 특징은?
- 더 많은 색을 표현할 수 있다.
- 더 촘촘하게 간격을 구분할 수 있다.
- 높이 개념이 있다.
- 데이터의 양이 더 적다.
7. 다음 그림에서 빨간 점의 좌표값은?

- (5, 4, 0)
- (0, 4, 5)
- (5, 0, 4)
- (4, 5, 0)
2. 블렌더 기초 실습(2)
1. LMB는 무엇의 약자인가?
- Large Mouse Button
- Left Mouse Button
- Left Move Button
- Light Move Button
2. MMB를 누르라고 적혀 있으면 마우스의 어떤 부분을 눌러야 하나?
- 왼쪽 버튼
- 왼쪽 버튼과 오른쪽 버튼을 동시에
- 마우스 휠
- 오른쪽 버튼
3. cube가 하나 있는 경우 이 큐브를 확인하기 위해 궤도식 회전(orbit)을 하려 한다. 가장 좋은 방법은?
- 왼쪽 버튼으로 화면을 눌러 돌린다.
- shift + 왼쪽 버튼으로 화면을 눌러 돌린다.
- 오른쪽 버튼으로 화면을 눌러 돌린다.
- 마우스 휠로 화면을 눌러 돌린다.
4. 궤도식 회전(orbit)을 하면 어느 한 점을 중심으로 카메라가 일정거리를 두고 회전하게 된다. 이 때 회전 중점을 바꾸고 싶다면 어떻게 해야 하나?
- 원하는 중점에 마우스를 위치하고 MMB를 누른다.
- 원하는 중점에 마우스를 위치하고 Alt + MMB를 누른다.
- 원하는 중점에 마우스를 위치하고 LMB를 누른다.
- 원하는 중점에 마우스를 위치하고 Alt + LMB를 누른다.
5. 현재 화면에서 오른쪽에 반만 보이는 object를 화면 가운데에 보이도록 하고 싶으면 panning을 해야 한다. 패닝하는 방법은?

- MMB를 누른 채로 마우스를 움직인다.
- LMB를 누른 채로 마우스를 움직인다.
- Shift를 누른 상태에서 MMB를 꾹 누르고 (떼지않고) 마우스를 움직인다.
- Shift를 누른 상태에서 LMB를 꾹 누르고 (떼지않고) 마우스를 움직인다.
6. zoom in / zoom out 하는 방법으로 틀린 것은?
- 마우스 휠을 돌린다.
- 숫자 키패드에서 + 키나 - 키를 누른다.
- 마우스 휠을 누르고 움직인다.
- Ctrl + MMB를 하고 마우스를 위아래로 움직인다.
7. 작업하다 보니 많은 수의 mesh들을 만들게 되었다. 이 mesh들과 카메라, 조명까지 모두 한 화면에 표시되도록 zoom out 하는 가장 빠르고 쉬운 방법은?
/키를 누른다..키를 누른다.*키를 누른다.home키를 누른다.
8. 작업하면서 zoom in / out 을 여러 번 하다보니 어느 순간부터 zoom in 이 제대로 안되었다. 이 문제를 가장 빠르게 해결하는 방법은 ?
- zoom in하고 싶은 mesh를 선택하고
/키를 누른다. - zoom in하고 싶은 mesh를 선택하고
.키를 누른다. - zoom in하고 싶은 mesh를 선택하고
*키를 누른다. - zoom in하고 싶은 mesh를 선택하고
home키를 누른다.
9. viewpoint를 설정하는 방법으로 틀린 것은 ?
- Top view: 숫자키패드 7
- Front view: 숫자키패드 5
- Right view: 숫자키패드 3
- Bottom view: Ctrl + 숫자키패드 7
10. Top view로 보고 있다가 반대쪽인 bottom view로 바꾸고 싶거나, Left view로 보고 있다가 반대쪽인 right view로 바꾸고 싶거나, Front view로 보고 있다가 back view로 바꾸고 싶을 때 모든 경우에 한 번에 바꾸는 방법은 ?
숫자키패드 5를 누른다.숫자키패드 9를 누른다.숫자키패드 .을 누른다.숫자키패드 -를 누른다.
11. 다음과 같이 quad view로 전환하는 방법은 ?

ctrl+alt+q를 누른다.ctrl+alt+v를 누른다.ctrl+alt+4를 누른다.ctrl+alt+/를 누른다.
3. 블렌더 기초 실습(3)
1. 다음 줄 틀린 말은 ?
- perspective: 입체적인 표현을 한다.
- orthographic: 직교투영으로 표현한다.
- perspective: top view, front view, right view에서 사용한다.
- orthographic: 거리와 상관없이 물체의 크기를 똑같이 보여준다.
2. 오브젝트를 이동할 때 사용하는 키는 ?
G키R키A키S키
3. 오브젝트를 이동할 때 y축으로만 이동하려 한다. 이 경우 눌러야 하는 키는 ?
G키X키Y키Z키
4. 오브젝트를 이동할 때 x, y축으로만 이동하고 z축으로의 이동은 제한하려 한다. 이 경우 눌러야 하는 키는 ?
Ctrl+Z키Z키Alt+Z키Shift+Z키
5. 아래 그림과 같이 cube가 회전되어 있을 때 바닥과 평형을 이루도록 하는 방법은 ?

G키를 눌러 회전시킨다.R키를 눌러 회전시킨다.B키를 눌러 회전시킨다.A키를 눌러 회전시킨다.
6. 위 문제의 답과 같이 회전시켰더니 오히려 더 이상한 방향으로 회전되었다. 바닥과 평형을 이루도록 회전시키는 방법은 ?

X키를 눌러 X축을 기준으로 회전시킨다.Y키를 눌러 Y축을 기준으로 회전시킨다.Z키를 눌러 Z축을 기준으로 회전시킨다.- blender는 무료 프로그램이라 이런 문제는 해결할 수 없다.
7. 아래와 같이 눈사람을 만들었는데 아래에 있는 sphere(구)를 좀 더 크게 해주고 싶을 때 사용할 수 있는 방법은 ?

- 아래에 있는 sphere를 선택하고
G키를 눌러 약간 키워준다. - 아래에 있는 sphere를 선택하고
R키를 눌러 약간 키워준다. - 아래에 있는 sphere를 선택하고
S키를 눌러 약간 키워준다. - 아래에 있는 sphere를 선택하고
A키를 눌러 약간 키워준다.
8. 아래와 같이 어느 한 점의 위치를 변경하려 할 때 제일 처음 할 일은 ?

e키를 눌러 edit 모드로 들어간다.ctrl키를 눌러 edit 모드로 들어간다.m키를 눌러 edit 모드로 들어간다.tab키를 눌러 edit 모드로 들어간다.
9. edit 모드 진입 후 아래와 같이 어느 한 점(vertex)의 위치를 변경하려 할 때 할 일은 ?

p키를 눌러 점편집 모드로 변경한다.1키를 눌러 edit 모드로 변경한다.2키를 눌러 edit 모드로 변경한다.3키를 눌러 edit 모드로 변경한다.
10. edit 모드 진입 후 아래와 같이 어느 한 선(edge)의 위치를 변경하려 할 때 할 일은 ?

L키를 눌러 선편집 모드로 변경한다.1키를 눌러 선편집 모드로 변경한다.2키를 눌러 선편집 모드로 변경한다.3키를 눌러 선편집 모드로 변경한다.
11. edit 모드 진입 후 아래와 같이 어느 한 면(face)의 크기를 변경하려 할 때 할 일은 ?

f키를 눌러 면편집 모드로 변경한다.1키를 눌러 면편집 모드로 변경한다.2키를 눌러 면편집 모드로 변경한다.3키를 눌러 면편집 모드로 변경한다.
12. 다음과 같이 작업했을 때 결과물은 ?
1. cube를 선택한다.
2. tab 키를 눌러 edit 모드로 들어간다.
3. 1키를 누른다.
4. 어느 한 점을 선택한다.
5. G키를 누른다.
6. X키를 누른다.
7. 마우스를 움직인다.




13. 다음과 같은 작업결과물을 만드는 작업을 순서대로 기술했다. 이 중 틀린 것은 ?

-
cube를 선택한다.
-
tab키를 눌러 편집 모드로 들어간다.
-
3키를 눌러 면편집 모드로 변경한다. -
r키를 눌러 회전 기능을 활성화한다. -
ctrl + z키를 눌러 z축 회전으로 설정한다. -
마우스를 움직여 선택된 면을 회전한다.
14. 다음 그림과 같은 편집과 방법을 올바르게 짝지은 것은?

- 모따기,
ctrl + v키 - 모깎기,
ctrl + v키 - 모따기,
ctrl + b키 - 모깎기,
ctrl + b키
15. 다음 그림과 같은 편집과 방법을 올바르게 짝지은 것은?

- 모따기, 모깎기 후 마우스 휠
- 모깎기, 모따기 후 마우스 휠
- 모따기, 모깎기 후 마우스 휠
- 모깎기, 모따기 후 마우스 휠
16. 다음 그림과 같이 면을 도출(extrude)할 떄 사용하는 키는?

e키x키t키r키
17. 면을 도출(extrude)시킨 직후 이 작업을 취소하려면 ctrl + z 키를 누른다. 그런데 이 때, ctrl + z 키를 2번 이상 눌러 그 면을 선택한 것까지 취소해야 한다. 그 이유는(답 2개)?
- extrude는 메모리를 많이 차지하는 연산이므로
- extrude는 CPU를 많이 차지하는 연산이라 정확하게 제거하지 않으면 앞으로 CPU를 더 많이 사용하기 때문
- extrude는 면을 하나 더 생성하는 거라 나중에 이 면이 반드시 문제가 되기 때문에 완벽하게 제거하려고.
- extrude하면 바로 그 자리에 똑같은 면이 하나 더 생성되기 때문에 면이 하나 더 있는지 알아보기 어렵기 때문
18. fbx는 무엇의 약자인가?
- 약자가 아니다.
- FaceBook eXtension
- FilmBook eXtension
- FilmBoX
4. 블렌더 활용 실습
1. 다음과 같이 건물 모델의 벽에 붙인 그림을 3D에서는 특별히 무엇이라 부르는가?

- pic
- texture
- uv
- jpg
2. 건물 모델의 벽에 texture를 붙이기 위해 생성한 전개도를 부르는 말은?
- pic
- texture
- uv map
- jpg
3. 하나의 mesh로 책상을 만들기 위해 다리를 뽑아내는 경우 mesh를 여러 개로 나누기 위해 사용하는 기술과 단축키로 옳은 것은?
- loop cut, ctrl + L
- knife, ctrl + L
- loop cut, ctrl + R
- knife, ctrl + K
4. 하나의 mesh object에 여러 개의 재질을 사용하려 한다. 새 재질을 추가하기 위해 눌러야 하는 버튼은?

- 1
- 2
- 3
- 4
5. mesh의 크기를 조절한 후 ctrl + A키를 눌러 apply - scale로 scale을 재설정하는 이유는?
- 크기가 변경되었다고 조명에 알려준다.
- 크기가 변경되었다고 카메라에 알려준다.
- UV맵을 펼 때 크기가 변경된 사항이 적용되도록 하기 위해
- blender에서 발생하는 오류를 막기 위해
6. 창문 등을 위해 벽에 구멍을 뚫을 때 사용하는 기능은?
- merge(합치기)
- loop cut
- extrude
- boolean
7. 다음 그림과 같이 연결된 면을 한 번에 선택하는 기능의 용어는?

- select all
- loop cut
- select loop
- boolean
8. 다음 그림과 같이 연결된 면을 한 번에 선택하는 방법은?

- ctrl 키를 누른 채로 LMB로 면을 누른다.
- alt 키를 누른 채로 LMB로 면을 누른다.
- shift 키를 누른 채로 LMB로 면을 누른다.
- 면을 더블클릭한다.
9. 다음 그림과 같이 연결된 면을 한 번에 선택하는 select loop 기능을 사용하려 할 때 정확하게 눌러야 하는 곳은?

- 1
- 2
- 3
10. select loop 기능을 쓰기 어려워 면을 하나하나 선택하려 한다. 이 때 한 면을 선택하고 이 면이 계속 선택되게 만들면서 다른 면도 선택에 포함하려 할 때 LMB와 같이 눌러야 하는 키는?
- ctrl
- alt
- shift
- ctrl + alt
5. 세슘 기초 실습(1)
1. 세슘의 특징이 아닌 것은?
- 무료이며 누구나 사용할 수 있다.
- 사용자가 추가한 asset들을 3D 형태로 보여준다.
- 나만의 3D 맵을 만들 수 있다.
- 내가 올린 3D asset들은 기본적으로 나한테만 보인다.
2. blender에서 만든 3D 모델을 세슘에 asset으로 등록할 때 사용하는 파일 포맷은?
- .blender
- .fbx
- .blend
- .asset
3. blender에서 만든 3D 모델을 fbx 파일로 내보내기 할 때 틀린 것은?
- 특정 모델만 fbx 파일에 추가되게 설정할 수 있다.
- File / Export / FBX(.fbx) 메뉴를 선택한다.
- export 하기 전에 export할 모델을 선택해 놓아야 한다.
- 기본 설정으로 texture가 자동 포함된다.
4. blender로 만든 3D 모델을 세슘에 asset으로 등록한 후에 할 일은?
- 정합을 확인한다.
- texture를 변경한다
- ID를 확인한다.
- 좌표를 설정한다.
5. 세슘을 무료로 사용할 수 있는 경우는?
- 비상업적인 개인적인 프로젝트
- 국가 SOC 사업
- 공공기관의 업무
- 대학의 상업적인 프로젝트
6. 세슘에 등록한 3D asset의 좌표를 잘못 등록할 것을 알게 되었다. 현재 asset 관리 창에 있을 때 이 문제를 해결하기 위해 눌러야 하는 것은?

- 1
- 2
- 3
- 4
7. 세슘 제품군 중 사용자의 3D asset 들을 등록 등 관리하고, 3D 맵을 만들기 위한 자료를 제공하는 것은?
- cesium ion
- cesium js
- cesium for unreal
- cesium for unity
6. 세슘 기초 실습(2)
1. 세슘이 제공하는 기능으로 3D 지도를 기반으로 한 프레젠테이션 기능을 제공하는 것은?
- cesium ion
- cesium stories
- cesium assets
- cesium js
2. 세슘 스토리에서 새 슬라이드를 추가하는 방법은?
- ctrl + + 키를 누른다.
- alt + n 키를 누른다.
- [new page] 버튼을 누른다.
- [new slide] 버튼을 누른다.
3. 세슘 스토리에서, 내가 올린 3D asset을 추가할 때 맞는 것은?
- 내가 올린 3D asset들의 목록이 나타나서 선택할 수 있다.
- 스토리에 보여주기 위해서는 새로 asset을 추가해야 한다.
- 내가 올린 asset들은 보여줄 수 없고 공용 asset 들만 보여줄 수 있다.
- 유료 버전은 가능하지만 무료 버전은 내가 올린 asset들을 볼 수 없다.
4. 세슘 스토리에서 슬라이드에 보여줄 모습을 확정하기 위해 누르는 버튼은?
- OK good
- Good position
- confirm
- capture view
7. 세슘 활용 실습
1. 세슘은 기본적으로 대용량의 3D 지도 자료를 한 번에 전송하지 않고 잘게 쪼개서 전송한다. 이러한 기술을 무엇이라 하는가?
- 스트리밍
- down bit
- 분할 전송
- 3D Tiles
2. 세슘은 모든 현재 보여줘야 하는 모든 파일이 다 다운로드 될 때 까지 한참 기다린 후 화면에 짠 하고 한꺼번에 나타나는 것이 아닌, 조금씩이라도 다운로드받은 내용을 지속적으로 화면에 보여주는 방식을 사용한다. 이런 기술을 무엇이라 하는가?
- 스트리밍
- down bit
- 분할 전송
- 3D Tiles
3. 세슘이 기본 제공하는 기능이 아닌 것은?
- Cesium World Terrain(전 세계의 3차원 지도)
- Imagery(위성 영상)
- OSM 건물
- 네이버지도
4. 세슘에 저장한 자료를 java script 언어로 프로그래밍해 볼 수 있게 해주는 cesium 의 구성 요소는?
- cesium ion
- cesium for unity
- cesium js
- cesium for o3de
5. 세슘에 저장한 자료를 이용해 전 세계 지도가 3D형태로 보여지고 내가 만들어 올린 3D asset 들이 3D 지도 위에 정확하게 위치하는 3D 게임을 만들고 싶을 때 사용하는 cesium 구성 요소는?
- cesium ion
- cesium for unreal
- cesium js
- cesium
6. 세슘을 이용해 디지털트윈 웹버전을 만들려고 한다. 이 때 사용하는 세슘의 구성 요소는?
- cesium ion
- cesium for unity
- cesium js
- cesium for o3de
7. 세슘을 이용해 디지털트윈 웹버전을 만들려고 개발환경을 구축하려 한다. 이 때 설치하는 프로그램으로 자바스크립트를 웹브라우저가 아닌 곳에서 실행할 수 있도록 만들어 주는 프로그램은?
- visual studio code
- node.js
- express.js
- cesium js
8. node.js를 기반으로 실행되는 프로그램으로 내 PC를 웹서버로 만들어 주는 프로그램은?
- visual studio code
- node.js
- express.js
- cesium js
9. 다음 중 heading에 대해 설명한 그림은?



10. 세슘을 이용해 디지털트윈 웹버전을 만들기 위해 cisium js를 사용해 프로그램을 만들었다. 다음과 같은 코드에서 AAAA 부분에 실제로 넣어야 하는 값은?
Cesium.Ion.defaultAccessToken = "AAAA"
- cesium ion에 로그인할 때 사용하는 user ID
- cesium ion에 로그인할 때 사용하는 password
- cesium ion에서 제공하는 토큰
- cesium ion에서 제공하는 asset ID
8. 공간정보 웹서비스 구현
1. 대부분 건물의 경우 최소 5장의 이미지가 필요한데, 일반적으로 3D에서는 텍스처 파일 하나에 5장의 이미지를 모두 저장해 사용하는 이유는?
- 하나의 모델에 이미지 파일을 여러 장 사용하면 보여질 때 실행속도가 느려지기 때문.
- 대부분의 3D 프로그램들이 여러 개의 텍스처를 허용하지 않기 때문
- 아무런 상관없으나 관례이다.
- 색감을 고정하기 위해
2. GIMP의 기능 중 “층“이라는 뜻을 가지고 있으며, 각 층마다 순서대로 덮어쓰며 그려지는 기능을 제공하는 것은”?
- brush
- alpha
- layer
- layout
3. 텍스처 파일을 만들기 위해 사진촬영을 할 때 광각으로 촬영하는 것은 가급적 피해야 하는 이유는?
- 사진 중앙부가 왜곡되기 때문
- 사진 주변부가 왜곡되기 때문
- 구조적으로 화질이 나빠지기 때문
- 가로세로 비율을 정확하게 맞출 수 없기 때문
4. gimp에 대해 틀린 설명은?
- 오픈소스에 무료이다.
- 상업적인 사용을 할 때는 요금을 지불해야 한다.
- layer 기능을 제공한다.
- uv map을 편집하기에 적절한 기능을 제공한다.
세슘기반 디지털트윈 구현
cesium 관련 자료 다운로드
건물
asset 등록 안내 영상
복습문제

1. 세슘 기초 실습(1)
1. 세슘의 특징이 아닌 것은?
- 무료이며 누구나 사용할 수 있다.
- 사용자가 추가한 asset들을 3D 형태로 보여준다.
- 나만의 3D 맵을 만들 수 있다.
- 내가 올린 3D asset들은 기본적으로 나한테만 보인다.
2. blender에서 만든 3D 모델을 세슘에 asset으로 등록할 때 사용하는 파일 포맷은?
- .blender
- .fbx
- .blend
- .asset
3. blender에서 만든 3D 모델을 fbx 파일로 내보내기 할 때 틀린 것은?
- 특정 모델만 fbx 파일에 추가되게 설정할 수 있다.
- File / Export / FBX(.fbx) 메뉴를 선택한다.
- export 하기 전에 export할 모델을 선택해 놓아야 한다.
- 기본 설정으로 texture가 자동 포함된다.
4. blender로 만든 3D 모델을 세슘에 asset으로 등록한 후에 할 일은?
- 정합을 확인한다.
- texture를 변경한다
- ID를 확인한다.
- 좌표를 설정한다.
5. 세슘을 무료로 사용할 수 있는 경우는?
- 비상업적인 개인적인 프로젝트
- 국가 SOC 사업
- 공공기관의 업무
- 대학의 상업적인 프로젝트
6. 세슘에 등록한 3D asset의 좌표를 잘못 등록할 것을 알게 되었다. 현재 asset 관리 창에 있을 때 이 문제를 해결하기 위해 눌러야 하는 것은?

- 1
- 2
- 3
- 4
7. 세슘 제품군 중 사용자의 3D asset 들을 등록 등 관리하고, 3D 맵을 만들기 위한 자료를 제공하는 것은?
- cesium ion
- cesium js
- cesium for unreal
- cesium for unity
2. 세슘 기초 실습(2)
1. 세슘이 제공하는 기능으로 3D 지도를 기반으로 한 프레젠테이션 기능을 제공하는 것은?
- cesium ion
- cesium stories
- cesium assets
- cesium js
2. 세슘 스토리에서 새 슬라이드를 추가하는 방법은?
- ctrl + + 키를 누른다.
- alt + n 키를 누른다.
- [new page] 버튼을 누른다.
- [new slide] 버튼을 누른다.
3. 세슘 스토리에서, 내가 올린 3D asset을 추가할 때 맞는 것은?
- 내가 올린 3D asset들의 목록이 나타나서 선택할 수 있다.
- 스토리에 보여주기 위해서는 새로 asset을 추가해야 한다.
- 내가 올린 asset들은 보여줄 수 없고 공용 asset 들만 보여줄 수 있다.
- 유료 버전은 가능하지만 무료 버전은 내가 올린 asset들을 볼 수 없다.
4. 세슘 스토리에서 슬라이드에 보여줄 모습을 확정하기 위해 누르는 버튼은?
- OK good
- Good position
- confirm
- capture view
3. 세슘 활용 실습
1. 세슘은 기본적으로 대용량의 3D 지도 자료를 한 번에 전송하지 않고 잘게 쪼개서 전송한다. 이러한 기술을 무엇이라 하는가?
- 스트리밍
- down bit
- 분할 전송
- 3D Tiles
2. 세슘은 모든 현재 보여줘야 하는 모든 파일이 다 다운로드 될 때 까지 한참 기다린 후 화면에 짠 하고 한꺼번에 나타나는 것이 아닌, 조금씩이라도 다운로드받은 내용을 지속적으로 화면에 보여주는 방식을 사용한다. 이런 기술을 무엇이라 하는가?
- 스트리밍
- down bit
- 분할 전송
- 3D Tiles
3. 세슘이 기본 제공하는 기능이 아닌 것은?
- Cesium World Terrain(전 세계의 3차원 지도)
- Imagery(위성 영상)
- OSM 건물
- 네이버지도
4. 세슘에 저장한 자료를 java script 언어로 프로그래밍해 볼 수 있게 해주는 cesium 의 구성 요소는?
- cesium ion
- cesium for unity
- cesium js
- cesium for o3de
5. 세슘에 저장한 자료를 이용해 전 세계 지도가 3D형태로 보여지고 내가 만들어 올린 3D asset 들이 3D 지도 위에 정확하게 위치하는 3D 게임을 만들고 싶을 때 사용하는 cesium 구성 요소는?
- cesium ion
- cesium for unreal
- cesium js
- cesium
6. 세슘을 이용해 디지털트윈 웹버전을 만들려고 한다. 이 때 사용하는 세슘의 구성 요소는?
- cesium ion
- cesium for unity
- cesium js
- cesium for o3de
7. 세슘을 이용해 디지털트윈 웹버전을 만들려고 개발환경을 구축하려 한다. 이 때 설치하는 프로그램으로 자바스크립트를 웹브라우저가 아닌 곳에서 실행할 수 있도록 만들어 주는 프로그램은?
- visual studio code
- node.js
- express.js
- cesium js
8. node.js를 기반으로 실행되는 프로그램으로 내 PC를 웹서버로 만들어 주는 프로그램은?
- visual studio code
- node.js
- express.js
- cesium js
9. 다음 중 heading에 대해 설명한 그림은?



10. 세슘을 이용해 디지털트윈 웹버전을 만들기 위해 cisium js를 사용해 프로그램을 만들었다. 다음과 같은 코드에서 AAAA 부분에 실제로 넣어야 하는 값은?
Cesium.Ion.defaultAccessToken = "AAAA"
- cesium ion에 로그인할 때 사용하는 user ID
- cesium ion에 로그인할 때 사용하는 password
- cesium ion에서 제공하는 토큰
- cesium ion에서 제공하는 asset ID
공간정보 DB 기본
sql
도근점 테이블 생성
create table dogun
(
x float8,
y float8,
coord int,
name varchar(20),
memo varchar(100)
);
샘플 자료 입력
insert into dogun (x, y, coord, name, memo) values (10.5, 8.7, 15, '도근점 1', '');
insert into dogun (x, y, coord, name, memo) values (8.415, 13.174, 15, '도근점 2', '');
insert into dogun (x, y, coord, name, memo) values (5.514, 7.74, 15, '도근점 3', '연석 바로 밑에 있음');
insert into dogun (x, y, coord, name, memo) values (19.1, 4.785, 15, '도근점 4', '');
insert into dogun (x, y, coord, name, memo) values (16.554, 9.63, 15, '도근점 4', '연석 위에 있음');
insert into dogun (x, y, coord, name, memo) values (15.212, 8.546, 15, '도근점 4', '');
insert into dogun (x, y, coord, name, memo) values (10.105, 9.644, 15, '도근점 5', '잘 안보임');
insert into dogun (x, y, coord, name, memo) values (5.157, 14.451, 15, '도근점 6', '철도근처');
insert into dogun (x, y, coord, name, memo) values (12.11, 12.547, 15, '도근점 7', '수풀에 가려져 있음');
insert into dogun (x, y, coord, name, memo) values (11.54, 10.557, 15, '도근점 8', '4차선 주변 연석 바로 뒤');
insert into dogun (x, y, coord, name, memo) values (10.5154, 7.8815, 15, '도근점1', '연석 위에 있음');
insert into dogun (x, coord, name, memo) values (14.14, 15, '', '');
insert into dogun (x, y, coord) values (11.54, 7.21, 15);
insert into dogun (x, y) values (12.532, 12.771);
도근점 테이블 검색
select * from dogun;
결과
testdb=> select * from dogun;
x | y | coord | name | memo
---------+--------+-------+----------+-------------------------
10.5 | 8.7 | 15 | 도근점 1 |
8.415 | 13.174 | 15 | 도근점 2 |
5.514 | 7.74 | 15 | 도근점 3 | 연석 바로 밑에 있음
19.1 | 4.785 | 15 | 도근점 4 |
16.554 | 9.63 | 15 | 도근점 4 | 연석 위에 있음
15.212 | 8.546 | 15 | 도근점 4 |
10.105 | 9.644 | 15 | 도근점 5 | 잘 안보임
5.157 | 14.451 | 15 | 도근점 6 | 철도근처
12.11 | 12.547 | 15 | 도근점 7 | 수풀에 가려져 있음
11.54 | 10.557 | 15 | 도근점 8 | 4차선 주변 연석 바로 뒤
14.14 | | 15 | |
11.54 | 7.21 | 15 | |
12.532 | 12.771 | | |
10.5154 | 7.8815 | 15 | 도근점1 | 연석 위에 있음
(14개 행)
**insert문으로 입력한 순서대로 나오는 것이 아닌, 걸리는대로 보여짐 **
새로운 도근점 테이블
drop table dogun;
create table dogun
(
id int not null,
x float8 not null,
y float8 not null,
coord int not null,
name varchar(20) not null,
memo varchar(100)
);
샘플 자료 입력
insert into dogun (id, x, y, coord, name, memo) values (1, 10.5, 8.7, 15, '도근점 1', '');
insert into dogun (id, x, y, coord, name, memo) values (2, 8.415, 13.174, 15, '도근점 2', '');
insert into dogun (id, x, y, coord, name, memo) values (3, 5.514, 7.74, 15, '도근점 3', '연석 바로 밑에 있음');
insert into dogun (id, x, y, coord, name, memo) values (4, 19.1, 4.785, 15, '도근점 4', '');
insert into dogun (id, x, y, coord, name, memo) values (5, 16.554, 9.63, 15, '도근점 4', '연석 위에 있음');
insert into dogun (id, x, y, coord, name, memo) values (6, 15.212, 8.546, 15, '도근점 4', '');
insert into dogun (id, x, y, coord, name, memo) values (7, 10.105, 9.644, 15, '도근점 5', '잘 안보임');
insert into dogun (id, x, y, coord, name, memo) values (8, 5.157, 14.451, 15, '도근점 6', '철도근처');
insert into dogun (id, x, y, coord, name, memo) values (9, 12.11, 12.547, 15, '도근점 7', '수풀에 가려져 있음');
insert into dogun (id, x, y, coord, name, memo) values (10, 11.54, 10.557, 15, '도근점 8', '4차선 주변 연석 바로 뒤');
insert into dogun (id, x, y, coord, name, memo) values (11, 10.5154, 7.8815, 15, '도근점1', '연석 위에 있음');
자동증가 기능을 추가한 도근점 테이블
drop table dogun;
create table dogun
(
id serial primary key,
x float8 not null,
y float8 not null,
coord int not null,
name varchar(20) not null,
memo varchar(100)
);
샘플 자료 입력
id가 자동증가되니 id는 따로 입력하지 않음.
insert into dogun (x, y, coord, name, memo) values (10.5, 8.7, 15, '도근점 1', '');
insert into dogun (x, y, coord, name, memo) values (8.415, 13.174, 15, '도근점 2', '');
insert into dogun (x, y, coord, name, memo) values (5.514, 7.74, 15, '도근점 3', '연석 바로 밑에 있음');
insert into dogun (x, y, coord, name, memo) values (19.1, 4.785, 15, '도근점 4', '');
insert into dogun (x, y, coord, name, memo) values (16.554, 9.63, 15, '도근점 4', '연석 위에 있음');
insert into dogun (x, y, coord, name, memo) values (15.212, 8.546, 15, '도근점 4', '');
insert into dogun (x, y, coord, name, memo) values (10.105, 9.644, 15, '도근점 5', '잘 안보임');
insert into dogun (x, y, coord, name, memo) values (5.157, 14.451, 15, '도근점 6', '철도근처');
insert into dogun (x, y, coord, name, memo) values (12.11, 12.547, 15, '도근점 7', '수풀에 가려져 있음');
insert into dogun (x, y, coord, name, memo) values (11.54, 10.557, 15, '도근점 8', '4차선 주변 연석 바로 뒤');
insert into dogun (x, y, coord, name, memo) values (10.5154, 7.8815, 15, '도근점1', '연석 위에 있음');
측량사 정보 테이블 생성
create table surveyors
(
name varchar(10)
);
측량사 정보 입력
insert into surveyors (name) values ('홍길동');
insert into surveyors (name) values ('박길동');
insert into surveyors (name) values ('고길동');
측량사 정보 테이블 생성
drop table surveyors;
create table surveyors
(
name varchar(10) UNIQUE
);
측량사 정보 테이블을 이용하도록 dogun 테이블 생성
drop table dogun;
create table dogun
(
id serial primary key,
x float8 not null,
y float8 not null,
coord int not null,
name varchar(20) not null,
memo varchar(100),
surveyor varchar(10),
constraint FK_DOGUN_SURVEYOR
foreign key (surveyor)
references surveyors(name)
);
측량사 정보 테이블에 ID 반영
drop table surveyors;
create table surveyors
(
id int primary key,
name varchar(10)
);
측량사 정보 테이블의 ID를 이용하도록 dogun 테이블 생성
drop table dogun;
create table dogun
(
id serial primary key,
x float8 not null,
y float8 not null,
coord int not null,
name varchar(20) not null,
memo varchar(100),
surveyor int,
constraint FK_DOGUN_SURVEYOR
foreign key (surveyor)
references surveyors(id)
);
측량사 정보 입력
insert into surveyors (id, name) values (1, '홍길동');
insert into surveyors (id, name) values (2, '박길동');
insert into surveyors (id, name) values (3, '구길동');
insert into surveyors (id, name) values (4, '박길동');
도근 정보 입력
insert into dogun (x, y, coord, name, memo, surveyor) values (10.5, 8.7, 15, '도근점 1', '', 1);
insert into dogun (x, y, coord, name, memo, surveyor) values (8.415, 13.174, 15, '도근점 2', '', 3);
insert into dogun (x, y, coord, name, memo, surveyor) values (5.514, 7.74, 15, '도근점 3', '연석 바로 밑에 있음', 3);
insert into dogun (x, y, coord, name, memo, surveyor) values (19.1, 4.785, 15, '도근점 4', '', 1);
insert into dogun (x, y, coord, name, memo, surveyor) values (16.554, 9.63, 15, '도근점 4', '연석 위에 있음', 4);
insert into dogun (x, y, coord, name, memo, surveyor) values (15.212, 8.546, 15, '도근점 4', '', 4);
insert into dogun (x, y, coord, name, memo, surveyor) values (10.105, 9.644, 15, '도근점 5', '잘 안보임', 2);
insert into dogun (x, y, coord, name, memo, surveyor) values (5.157, 14.451, 15, '도근점 6', '철도근처', 3);
insert into dogun (x, y, coord, name, memo, surveyor) values (12.11, 12.547, 15, '도근점 7', '수풀에 가려져 있음', 1);
insert into dogun (x, y, coord, name, memo, surveyor) values (11.54, 10.557, 15, '도근점 8', '4차선 주변 연석 바로 뒤', 1);
insert into dogun (x, y, coord, name, memo, surveyor) values (10.5154, 7.8815, 15, '도근점1', '연석 위에 있음', 2);
실습 : dogun 테이블과 surveyors 테이블을 join해 아래와 같이 보이도록
[결과]
도근점 번호 | 도근점 이름 | 축량사
-------------+-------------+--------
1 | 도근점 1 | 홍길동
3 | 도근점 3 | 구길동
4 | 도근점 4 | 홍길동
5 | 도근점 4 | 박길동
6 | 도근점 4 | 박길동
7 | 도근점 5 | 박길동
8 | 도근점 6 | 구길동
9 | 도근점 7 | 홍길동
10 | 도근점 8 | 홍길동
11 | 도근점1 | 박길동
2 | 도근점 2 | 구길동
(11개 행)
[sql]
select
dogun.id as "도근점 번호"
, dogun.name "도근점 이름"
, surveyors.name as "축량사"
from
dogun
, surveyors
where
dogun.surveyor = surveyors.id;
실습 : dogun 테이블과 surveyors 테이블을 join하고 y좌표가 10 초과
[결과]
도근점 번호 | x | y | 도근점 이름 | 측량사
-------------+-------+--------+-------------+--------
8 | 5.157 | 14.451 | 도근점 6 | 구길동
9 | 12.11 | 12.547 | 도근점 7 | 홍길동
10 | 11.54 | 10.557 | 도근점 8 | 홍길동
2 | 8.415 | 13.174 | 도근점 2 | 구길동
(4개 행)
[sql]
select
dogun.id as "도근점 번호"
, dogun.name "도근점 이름"
, surveyors.name as "축량사"
from
dogun
, surveyors
where
dogun.surveyor = surveyors.id
and 10.0 < y;
sql 실습
foods 테이블 생성
create table foods
(
ID serial primary key,
name varchar (100) UNIQUE
);
cars 테이블 생성
create table cars
(
ID serial primary key,
name varchar (100) UNIQUE
);
address 테이블 생성
create table address
(
ID serial primary key,
name varchar(20) NOT NULL,
birthday date,
hphone varchar(13) NOT NULL,
memo varchar(100),
food int,
car int,
CONSTRAINT fk_address_food
FOREIGN KEY(food)
REFERENCES foods(ID)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk_address_car
FOREIGN KEY(car)
REFERENCES cars(ID)
ON DELETE CASCADE
ON UPDATE CASCADE
);
insert into foods (name) values ('짜장면');
insert into foods (name) values ('짬뽕');
insert into foods (name) values ('새우튀김');
insert into foods (name) values ('고기완자');
insert into cars (name) values ('sonata');
insert into cars (name) values ('benz');
insert into cars (name) values ('bmw');
insert into cars (name) values ('audi');
insert into cars (name) values ('tico');
insert into address (name, birthday, hphone, memo, food, car) values ('홍길동', '1987-01-05', '010-1111-1111', '절친', 1, 3);
insert into address (name, birthday, hphone, memo, food, car) values ('박길동', '2010-03-07', '010-1123-0515', '', 1, 1);
insert into address (name, birthday, hphone, memo, food, car) values ('최길동', '2000-01-01', '010-5515-4574', '절친', 3, 2);
insert into address (name, birthday, hphone, memo, food, car) values ('나길동', '1988-03-14', '010-7743-5743', '돈 빌림', 3, 3);
insert into address (name, birthday, hphone, memo, food, car) values ('윤지원', '1996-04-22', '010-7457-6475', '', 4, 3);
insert into address (name, birthday, hphone, memo, food, car) values ('고길동', '2007-09-09', '010-3511-5858', '', 4, NULL);
insert into address (name, birthday, hphone, memo, food) values ('박길동', '1997-05-05', '010-4874-7871', '절친 아님', 2);
웹프로그래밍 기본
[실습] 유머튜브
힘들 때 보는 나만의 웃긴 영상 모음집(미리보기)

프로젝트 생성 & 세팅
프로젝트를 생성하기 위해 d:\test\html5 폴더에서 power shell을 실행한다.

탐색기 D:\test\html5 폴더에서 빈 부분을 shift 키를 누른 채로 마우스 오른쪽 클릭하고 [여기에 PowerShell 창 열기] 메뉴 선택

PS D:\test\html5> npm create vite
> npx
> create-vite
|
o Project name:
| humortube
|
o Select a framework:
| React
|
o Select a variant:
| JavaScript
|
o Scaffolding project in D:\test\html5\humortube...
|
— Done. Now run:
power shell에서 위와 같이 npm create vite 를 실행해 vite - react 프로젝트를 생성하면서 다음과 같이 옵션을 정해준다.
- project name: humortube
- Select a framework: React
- Select a variant: JavaScript
프로젝트 생성이 완료되면 다음과 같이 프로젝트를 실행한다.
PS D:\test\html5> cd humortube
PS D:\test\html5\humortube> npm install
결과
added 199 packages, and audited 200 packages in 19s
33 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
vite - react 관련 패키지가 모두 설치되었다.
= vite - react 관련 필요 프로그램이 모두 설치되었다.
PS D:\test\html5\humortube> code .
code .을 하면 vscode가 실행되고 현재 폴더를 읽어들인다.

이 폴더의 저자를 믿겠냐는 메시지. 나니까 믿고 파란색 [Yes, I trust the authors]를 눌러주자.
vscode에서 프로젝트 실행하기
ctrl 키를 누른 상태에서 ` 키를 누르면 vscode의 아래쪽에 power shell 같은 창이 열린다.
` 키는 [tab]키 위, [ESC]키 아래 쪽에 있는 키이다.

여기에 npm run dev 라고 입력한다.
npm run dev

그럼 다음과 같이 프로젝트가 실행된다.

vscode에는 이렇게 프로그램 개발에 필요한 기능들이 매우 많이 포함되어 있어 편하게 개발할 수 있도록 도와준다.
만약 이런 기능이 없다면 power shell과 vscode를 왔다갔다 하며 개발해야 하는데 vscode에 power shell이 내장되어 있어 하나의 프로그램 안에서 편하게 개발할 수 있다.
powerShell에는 내가 만든 프로그램이 실행되면서 발생하는 상황들이 나타난다. 이게 흔히 log 라고 부르는 것들이다.
PS D:\test\html5\humortube> npm run dev
> humortube@0.0.0 dev
> vite
VITE v6.3.5 ready in 325 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h + enter to show help

http://localhost:5173/ 부분을 ctrl 키를 누른 채로 클릭하면 웹브라우저가 실행되면서 저 주소까지 자동으로 이동한다.

이렇게 vite + react 프로젝트를 생성하면 기본으로 만들어지는 앱의 모습을 볼 수 있다.
이렇게 기본으로 제공되는 기능은 우리에게는 필요없기 때문에 아래에서 모두 지울거다.
vscode를 이용한 github 관리
이 프로젝트는 지금 github로 부터 복제한 html5 repository 내에 생성했다. 그래서 이 프로젝트도 github로 관리할 수 있다. github는 사실 프로그램을 수정할 때마다 그 버전을 관리하기 위한 프로그램이다.

위 순서대로 클릭하면,

vscode가 우리의 html5 레포지토리를 찾아내서 보여준다.
여기서 html5 를 클릭하면 이제부터 우리는 vscode를 이용해 github의 버전관리 기능을 이용할 수 있다.
프로젝트가 생성된 직후의 코드, 그러니까 아래에서 불필요한 부분을 다 삭제하기 전의 모습을 하나의 버전으로 기록하고 싶다면

위와 같이 [1] 부분에 이번 버전에 대한 설명을 적고, [2]와 같이 [Commit] 버튼을 눌러 commit 한다. 여기서 commit 하면 github desktop에서도 commit 한 것과 똑같이 적용된다. (github desktop에서도 commit한 이후의 모습이 나타난다.)
commit을 여러 번 한 다음, 서버에 보내는 push main은 나중에 한꺼번에 해도 된다.
vscode를 이용한 코드 수정

src/App.jsx 파일을 수정하려 하면 vscode에서 위와 같이 파일을 클릭하면 된다. 그럼 오른쪽에 그 파일의 내용이 나타난다.
프로젝트에서 불필요한 부분 모두 정리하기
다음을 따라 프로젝트에서 불필요한 부분을 모두 삭제하자.
App.jsx에서 불필요한 부분 모두 삭제하기

function App() {
return (
<>
</>
)
}
export default App
App.jsx 파일이 꽤 긴데 위와 같은 코드만 남기고 전부 다 지우자.
여기까지 작업하고 저장하면, 웹브라우저에 이 작업 내용이 자동으로 반영된다. (refresh를 하지 않아도 자동으로 반영된다)

App.css 파일 삭제
우리는 쓸 일이 없으니 App.css 파일을 지운다.
원하는 문구 넣어보기
App.jsx 파일을 수정해 원하는 문구가 내 앱에 나타나게 해보자.
// src\App.jsx
function App() {
return (
<>
<h1>웃긴 유튜브 영상 모음</h1>
</>
)
}
export default App
App.jsx파일에 아래 한줄 추가했다.
<h1>웃긴 유튜브 영상 모음</h1>

이제 이 아래에 유튜브 영상을 추가해 보자.
// src/App.jsx
function App() {
return (
<>
<h1>웃긴 유튜브 영상 모음</h1>
<iframe width="560" height="315" src="https://www.youtube.com/embed/5ru4shNLokA?si=3tzsQHuDBipu0-o-&start=412" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</>
)
}
export default App

이렇게 유튜브 영상이 나타난다.
유튜브 영상 가져오는 법
유튜브를 보다가 재밌는 장면이 나오면 멈춘다.

[공유] 버튼을 누른다.

[1] 시작 시간을 체크한다.
[2] 퍼가기 버튼을 누른다.

[복사] 버튼을 누른다.
App.jsx 파일에 붙여 넣는다.

만약 웹브라우저에서 클릭했을 때 시작위치가 맞지 않으면,

저 부분이 시작위치를 초로 나타내는 부분이니, 1-2초 단위로 조정하며 맞춰준다.
몇 개 더 추가해 보자.
// src\App.jsx
function App() {
return (
<>
<h1>웃긴 유튜브 영상 모음</h1>
<iframe width="560" height="315" src="https://www.youtube.com/embed/5ru4shNLokA?si=3tzsQHuDBipu0-o-&start=412" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/CVfksjKuaPQ?si=4NnG8NyNJzZf58Ot&start=126" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/_6hSZhy_6DI?si=e2sM3ET_D4gCXtEK&start=126" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</>
)
}
export default App

음악 등 다른 분야의 영상도 추가해 보자.


가운데 정렬
왼쪽에 치우쳐 있으니 가운데 정렬을 하자. 가운데 정렬은 css의 도움을 받는다.
우선 이 영상을 가운데로 정렬할 영역을 잡자. 영역은 div 태그를 이용한다.
여기서는 “웃긴 유튜브 영상 모음”, “음악” 같은 제목부터 유튜브 영상까지 모두 한 번에 가운데 정렬이 되어야 하기 때문에 한 번에 div를 이용해 영역으로 잡아준다.
App.jsx 파일 수정

function App() {
return (
<>
<div>
<h1>웃긴 유튜브 영상 모음</h1>
<iframe width="560" height="315" src="https://www.youtube.com/embed/5ru4shNLokA?si=3tzsQHuDBipu0-o-&start=412" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/CVfksjKuaPQ?si=4NnG8NyNJzZf58Ot&start=126" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/_6hSZhy_6DI?si=e2sM3ET_D4gCXtEK&start=126" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<h1>음악</h1>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Wl_GTYOid2o?si=BffPzSWFULhXAuP9" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Fh8dU0SPYyg?si=rYUZaTWEGpT8yed0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/sJK2l7g5Yl8?si=pPk87U8r8Stgm3Mh" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div>
</>
)
}
export default App
css 클래스 생성
이제 가운데로 보내주는 css 클래스를 만들어 이 div에 적용해 주자.
index.css 파일의 맨 밑에 다음을 추가하자.
// src\index.css
.center_div
{
text-align: center;
}
이 클래스를 전체 영역으로 잡은 영역 div에 적용하자.
// src\App.jsx
<div className="center_div">

그러면 아래와 같이 전체 영역이 다 가운데 정렬이 된다.

vite - react 프로젝트 빌드하고 서버에 올리기
PowerShell 여러 개 실행시키기
vscode는 PowerShell 기능을 내장하고 있다. 우리는 지금 PowerShell 기능을 이용해 프로젝트를 실행하고 있다.
그리고 PowerShell에서 보여주는 메시지를 참조하며 개발하고 있다 .

현재 프로젝트를 실행시키며 로그를 보여주고 있는 PowerShell.
PowerShell이 하나 밖에 없는 상황에서는 PowerShell을 이용해 뭔가 다른 걸 시키려면 현재 PowerShell이 하고 있는 일을 멈춰야 한다.
PowerShell 영역을 한 번 클릭하고
ctrl + c 키를 누르면 PowerShell이 멈춘다.

그런데 이렇게 되면 우리의 웹브라우저도 먹통이 된다.

npm run dev 를 실행시켜 다시 프로젝트를 실행시켜 놓자.

그런데 다행히도 vscode에는 이런 일이 벌어지지 않도록 여러 개의 PowerShell을 실행시킬 수 있다.
그러니까 지금 프로젝트를 실행시키고 있는 PowerShell은 그냥 놔두고 새로운 PowerShell을 실행시킬 수 있는 거다.

저 버튼을 클릭하면 창이 반으로 나눠지고, 오른쪽에 PowerShell 이 나타난다.

PowerShell이 반으로 나뉘며 오른쪽에 새로운 PowerShell이 나타났다.
그러니까 프로젝트 실행은 멈추지 않으면서 새로운 기능을 수행하고 싶을 때 이렇게 PowerShell을 하나 더 띄운다.
프로젝트 build
여태까지는 테스트용으로 웹브라우저에서 그 결과를 봤다. 테스트용은 말 그대로 테스트에 관련된 많은 정보를 담고 있다. 실제 서비스할 때는 필요없는 정보들까지 포함되기 때문에 용량도 크고 속도도 느리다.
실제 서비스하기 위한 버전을 만드는 것을 build라 한다.
실제 서비스하기 위한 버전은 훨씬 작고 속도도 빠르다. 서비스에 꼭 필요한 정보 외에 것들은 모두 빼버리기 때문이다.

새로 만들어진 오른쪽 PowerShell 창에서 npm run buld를 해준다.
npm run build

맨 마지막처럼
built in OOOms
같은 문구가 보이면 서비스용 버전으로 만드는 것, build에 성공한거다.
테스트할 때는 아무 문제 없는 것처럼 보이다가 build 할 때 엄청 많은 에러를 내기도 하기 때문에 한 번에 성공했다면 꽤 행운이다.
이렇게 build 된 서비스용 버전은 dist 폴더에 저장된다. dist는 distribute(배포)의 약자이다.
우리의 dist 폴더인 D:\test\html5\humortube\dist 폴더로 가보자.

이렇게 파일 몇 개만 단촐하게 있는 걸 볼 수 있다.
build 결과물 웹호스팅
이제 이 파일을 이용해 웹호스팅을 받아보자.
우리는 github에 html5 라는 이름의 레포지토리를 만들었고 D:\test\html5에 복제해 사용하고 있다.
그리고 docs 폴더에 html 파일들을 놓아두면 그게 웹호스팅이 되어 전세계 어디에서나 접속할 수 있다.
전송할 준비
방금 만든 dist 폴더도 docs 폴더 안에 놓아 웹호스팅을 받도록 하자.

D:\test\html5\dist 폴더를 오른쪽 클릭하고 ’복사’를 선택한다.

D:\test\html5\docs 폴더로 이동한 후 탐색기 안의 빈 공간을 오른쪽 클릭하고 ’붙여넣기’를 선택한다.

F2키를 눌러 이름바꾸기 모드로 들어간 다음,

’humortube’로 이름을 바꾼다.
github desktop을 이용해 서버로 업로드
이제 github desktop을 이용해 서버로 업로드하자.

[1] 부분에 이번 저장의 묶음에 대한 설명을 달자. 예를 들면, ’humortube 업로드’와 같은 식이다.
[2] 파란색의 [Commit OO files to main] 버튼을 누른다. 위 사진에서는 6 files라고 나오지만 이걸 따라하는 여러분은 훨씬 많은 file을 commit 할 거다. (글쓴이는 중간에 계속 commit하며 만들었기 때문에 숫자가 다름)

commit 이 되면 파란색 [push origin] 버튼이 나타난다. 이 버튼을 눌러 서버로 전송하자. (commit은 내 컴퓨터에만 변화가 저장되는 것임)
이제 2-3분 후에 우리의 github.io page로 가보자.
우리가 접속해야 할 주소는 github.io가 알려준 주소 뒤에 /humortube를 덧붙여야 한다 .
github.io가 알려준 주소 안에 humortube라는 폴더를 만들고 그 안에 build 한 자료를 넣었기 때문이다.

강사의 경우, https://studentkim2000.github.io/html5/humortube 가 방금 올린 humortube의 주소이다.

그런데 어렵게 찾아가도 막상 가 보면 아래와 같이 빈 칸으로 보일 거다.

이유는 우리가 docs 안에 폴더로 저장했기 때문인데, (= /humortuber 가 붙게 만들었기 때문) 쉽게 해결할 수 있다.
humortue 폴더 밑에 vite.config.js 파일을 수정하면 된다.
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vite.dev/config/
export default defineConfig({
base: '/html5/humortube/',
plugins: [react()],
})
base: '/html5/humortube/',
기존 코드에서 base: 부분을 추가했다.
다시 build 하고, commit, push 하고 잠깐 후에 다시 refresh 하면,

내가 만든 앱이 전세계 어디에서나 접속할 수 있는 상태가 되었다. 물론 핸드폰에서도 볼 수 있다.
vite.config.js 파일을 수정하는 이유

기타, 정리
웹브라우저의 제목 바꾸기

이제 어느 정도 기능이 되니 저 부분이 눈에 들어온다.
웹브라우저의 제목은 프로젝트 폴더의 index.html 파일을 수정해 바꿀 수 있다.

저 title 태그 부분을 바꾸면 된다.
// index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>유머튜브</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>

레이아웃 조정
먼저 pc에서 본 모습은 다음과 같다.

옆으로 길게 뻗어나가는 중이다.
우리는 세로로 길게 나가길 원했는데.
이런 화면에 보여지는 모양, 레이아웃은 css를 통해 바로 잡는다.
우리는 화면에 보여지는 아이템들 전체를 감싸는 div를 하나 가지고 있고, 그 div에 center_div 클래스를 할당해 놓았다.
App.jsx 파일을 보면,
<div className="center_div">
로 되어 있다. 세로로 길게 내려가게 하려면 이 center_div를 수정하면 된다.
index.css 파일의 맨 끝에 있는 .center_div를 다음과 같이 수정하자.
.center_div
{
display: flex;
flex-direction: column;
}
이렇게 하면 아래로 길게 배열하는 모양이 된다.

다음은 이 div 안에 있는 요소들간의 간격을 좀 벌리자. gap을 설정하면 된다.
.center_div
{
display: flex;
flex-direction: column;
gap: 20px;
}

이 div안의 모든 요소들의 간격이 다 20픽셀씩 떨어졌다.
이제 이걸 가운데로 정렬해 보자.
align-items: center; 를 추가해 주면 된다.
.center_div
{
display: flex;
flex-direction: column;
gap: 20px;
align-items: center;
}

어라, 아무런 변화가 없다. 가운데 정렬을 헀을 때 아무런 변화가 없으면 현재 이 div의 크기가 어떤지 확인해야 한다.
div의 크기를 보려면 테두리를 그려보는게 가장 편하다.
border: 2px solid; 를 추가한다.
.center_div
{
display: flex;
flex-direction: column;
gap: 20px;
align-items: center;
border: 2px solid;
}

테두리 그려진 것을 보면 매우 작은 영역 안에서 가운데 정렬을 하고 있었다는 것을 알 수 있다. 저렿게 작은 영역 안에서 가운데 정렬을 해 봤자 아무 소용이 없다.
그러니 폭을 화면의 전체 영역으로 넓히자.
width: 100vw를 주면 된다.
vw는 ViewPoint Width의 약자이고, 화면에 보이는 영역의 넓이를 뜻한다. 100vw는 ViewPoint Width를 100% 사용하라는 뜻이다. 만약 50vw라고 주면 화면에 보이는 영역의 50%를 사용하라는 뜻이 된다.
.center_div
{
display: flex;
flex-direction: column;
gap: 20px;
align-items: center;
border: 2px solid;
width: 100vw;
}

사용할 영역을 화면에 보이는 전체 영역으로 주니 가운데 정렬(align-items: center;)가 제대로 효과를 발휘한다.
이제 영역 크기를 확인하기 위해 사용한 border 관련 설정은 지워버리자.
.center_div
{
display: flex;
flex-direction: column;
gap: 20px;
align-items: center;
width: 100vw;
}

실습 2 - 더하기 1
1. 프로젝트 세팅
프로젝트명을 “plus1“으로 새 vite 프로젝트를 생성한다
PS E:\test\html5> npm create vite
> npx
> create-vite
|
o Project name:
| plus1
|
o Select a framework:
| React
|
o Select a variant:
| JavaScript
|
o Scaffolding project in E:\test\html5\plus1...
|
— Done. Now run:
cd plus1
npm install
npm run dev
PS E:\test\html5>
App.jsx 파일에서 불필요한 부분을 모두 삭제하고 다음만 남긴다.
// App.jsx 파일
function App() {
return (
<>
</>
)
}
export default App
2. 버튼 누르면 1 더하기
자바스크립트의 값 사용하기
// App.jsx
function App() {
let a = 1
return (
<>
{a}
</>
)
}
export default App

버튼 사용하기
// App.jsx
function App() {
function btn1()
{
console.log('홍길동 버튼 눌림');
alert('홍길동입니다.');
}
function btn2()
{
console.log('나지적 버튼 눌림.');
alert('나지적입니다.');
}
return (
<>
<button onClick={btn1}>홍길동</button>
<button onClick={btn2}>나지적</button>
</>
)
}
export default App


useState를 이용해 상태 관리하기
// App.jsx
import { useState } from "react"
function App() {
const [a, set_a] = useState(0)
return (
<>
<button>1 더하기 : {a}</button>
</>
)
}
export default App

버튼 클릭하면 1 더하기
// App.jsx
import { useState } from "react"
function App() {
const [a, set_a] = useState(0)
function plus1()
{
set_a(a+1)
}
return (
<>
<button onClick={plus1}>1 더하기 : {a}</button>
</>
)
}
export default App

또 하나의 별도로 관리되는 상태 버튼
import { useState } from "react"
function App() {
const [a, set_a] = useState(0)
const [z, set_z] = useState(0)
function plus1()
{
set_a(a+1)
}
function plus2()
{
set_z(z+1)
}
return (
<>
<button onClick={plus1}>1 더하기 : {a}</button>
<br />
<button onClick={plus2}>1 플러스 : {z}</button>
</>
)
}
export default App

[실습] 나 그거 했던가?
내가 오늘 출근 체크를 했던가?
내가 오늘 퇴근 체크를 했던가?
내가 오늘 차 문을 잠궜던가?
이런 것들은 정확히 기억나지 않으면 매우 괴롭다.

이 앱은 출근 체크를 하면서 동시에 스마트폰 앱을 띄우고 그 안에 버튼을 누르면 그 시간이 기록되도록 하는 앱이다.
나중에 궁금해질 때 이 앱을 실행하면 “아~ 오늘 08:37:15에 출근 체크 했었구나~” 하고 바로 알 수 있다.
1. 프로젝트 세팅
vite - react 프로젝트 생성
프로젝트를 생성하기 위해 d:\test\html5 폴더에서 power shell을 실행한다.

탐색기 D:\test\html5 폴더에서 빈 부분을 shift 키를 누른 채로 마우스 오른쪽 클릭하고 [여기에 PowerShell 창 열기] 메뉴 선택
PS D:\test\html5> npm create vite
> npx
> create-vite
|
o Project name:
| didi
|
o Select a framework:
| React
|
o Select a variant:
| JavaScript
|
o Scaffolding project in D:\test\html5\didi...
|
— Done. Now run:
cd didi
npm install
npm run dev
PS D:\test\html5>
power shell에서 위와 같이 npm create vite 를 실행해 vite - react 프로젝트를 생성하면서 다음과 같이 옵션을 정해준다.
- project name: didi
- Select a framework: React
- Select a variant: JavaScript
프로젝트 생성이 완료되면 다음과 같이 프로젝트를 실행한다.
PS D:\test\html5> cd didi
PS D:\test\html5\didi> npm install
결과
added 198 packages, and audited 199 packages in 21s
33 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
PS D:\test\html5\didi>
vscode 실행하면서 didi 프로젝트 읽어들이기
탐색기에서 d:\test\html5\didi 폴더로 이동한다.

탐색기의 빈 곳에서 오른쪽 클릭한다.
팝업 메뉴에서 [code(으)로 열기] 를 선택한다.
그럼 아래와 같이 vscode가 실행된다.

이 폴더를 만든 사람을 믿느냐는 질문이 나오는데 이거 만든 사람 나니까 그냥 파란색의 [Yes I trust the authors] 버튼을 클릭한다.
vscode에서 프로젝트 실행하기
ctrl 키를 누른 상태에서 ` 키를 누르면 vscode의 아래쪽에 power shell 같은 창이 열린다.
` 키는 [tab]키 위, [ESC]키 아래 쪽에 있는 키이다.

여기에 npm run dev 라고 입력한다.
npm run dev

그럼 다음과 같이 프로젝트가 실행된다.
vscode에는 이렇게 프로그램 개발에 필요한 기능들이 매우 많이 포함되어 있어 편하게 개발할 수 있도록 도와준다.
만약 이런 기능이 없다면 power shell과 vscode를 왔다갔다 하며 개발해야 하는데 vscode에 power shell이 내장되어 있어 하나의 프로그램 안에서 편하게 개발할 수 있다.
power shell에는 내가 만든 프로그램이 실행되면서 발생하는 상황이 나타난다. 이게 흔히 log 라고 부르는 것들이다.

PS D:\test\html5\didi> npm run dev
> didi@0.0.0 dev
> vite
VITE v6.3.5 ready in 288 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h + enter to show help

http://localhost:5173/ 부분을 ctrl 키를 누른 채로 클릭하면 웹브라우저가 실행되면서 저 주소까지 자동으로 이동한다.

이렇게 vite + react 프로젝트를 생성하면 자동으로 생성되는 앱의 모습을 볼 수 있다.
이렇게 기본으로 제공되는 기능은 우리에게는 필요없기 때문에 아래에서 모두 지울거다.
vscode를 이용한 코드 수정

먼저 src/App.jsx 파일을 수정하려 하면 vscode에서 위와 같이 파일을 클릭하면 된다. 그럼 오른쪽에 그 파일의 내용이 나타난다.
vscode를 이용한 github 관리
이 프로젝트는 지금 github로 부터 복제한 html5 repository 내에 생성했다. 그래서 이 프로젝트도 github로 관리할 수 있다. github는 사실 프로그램을 수정할 때마다 그 버전을 관리하기 위한 프로그램이다.

위 순서대로 클릭하면,

vscode가 우리의 html5 레포지토리를 찾아내서 보여준다.
여기서 html5 를 클릭하면 이제부터 우리는 vscode를 이용해 github의 버전관리 기능을 이용할 수 있다.
프로젝트가 생성된 직후의 코드, 그러니까 아래에서 불필요한 부분을 다 삭제하기 전의 모습을 하나의 버전으로 기록하고 싶다면

위와 같이 [1] 부분에 이번 버전에 대한 설명을 적고, [2]와 같이 [Commit] 버튼을 눌러 commit 한다. 여기서 commit 하면 github desktop에서도 commit 한 것과 똑같이 적용된다. (github desktop에서도 commit한 이후의 모습이 나타난다.)
commit을 여러 번 한 다음, 서버에 보내는 push main은 나중에 한꺼번에 해도 된다.
프로젝트에서 불필요한 부분 모두 정리하기
다음을 따라 프로젝트에서 불필요한 부분을 모두 삭제하자.
App.jsx에서 불필요한 부분 모두 삭제하기

function App() {
return (
<>
</>
)
}
export default App
App.jsx 파일이 꽤 긴데 위와 같은 코드만 남기고 전부 다 지우자.
여기까지 작업하고 저장하면, 웹브라우저에 이 작업 내용이 자동으로 반영된다. (refresh를 하지 않아도 자동으로 반영된다)

App.css 파일 삭제
우리는 쓸 일이 없으니 App.css 파일을 지운다.
버튼 누르면 시간 기록
이 앱은 버튼을 누를 때마다 현재 시각을 기록하는 앱이다. 그래서 가장 중요한 기능인 현재 시각을 가져오는 함수부터 만들어 본다.
현재 시각 얻는 함수
function getdate()
{
const date = new Date();
return date.toLocaleDateString('ko-KR') + ' ' + date.toLocaleTimeString('ko-KR');
}
이 함수를 이용하면 현재 시각을 쉽게 얻을 수 있다 .
이 함수를 App.jsx에 추가해서 현재 시각이 잘 나오는지 확인해 보자.
// App.jsx
function App() {
function getdate()
{
const date = new Date();
return date.toLocaleDateString('ko-KR') + ' ' + date.toLocaleTimeString('ko-KR');
}
return (
<>
{getdate()}
</>
)
}
export default App

이렇게 날짜와 시간이 한국식으로 잘 표현되어 나오는 걸 확인할 수 있다.
버튼 추가
버튼을 추가해 보자.
function App() {
function getdate()
{
const date = new Date();
return date.toLocaleDateString('ko-KR') + ' ' + date.toLocaleTimeString('ko-KR');
}
return (
<>
<button>출/퇴근</button>
{getdate()}
</>
)
}
export default App

버튼 아래에 날짜가 찍히도록 하기 위해 div 태그로 구역을 나눠준다.
function App() {
function getdate()
{
const date = new Date();
return date.toLocaleDateString('ko-KR') + ' ' + date.toLocaleTimeString('ko-KR');
}
return (
<>
<div>
<button>출/퇴근</button>
</div>
<div>
{getdate()}
</div>
</>
)
}
export default App

css: 전체적으로 가운데로 옮기기
index.css 파일을 수정해 버튼과 시간이 가운데로 옮겨주려 한다.
그 전에 먼저 테두리를 그려서 영역을 확인해야 한다 .
index.css 파일의 맨 끝에 다음을 추가한다.
.center_div
{
border: 1px solid;
}
css 클래스의 이름은 center_div이다. 그리고 이 css 클래스는 border(테두리)를 1픽셀 두께만큼 실선으로 그린다.
이 css 클래스를 버튼이 있는 div에 적용한다.
<div className='center_div'>
<button>출/퇴근</button>
</div>

react에서는 class가 아닌 className 으로 css 클래스를 설정한다.
가만보면 영역이 매우 작다. 아래 낢짜와 숫자 부분만으로 영역이 정혀졌다. 만약 이 상태에서 가운데 정렬을 시키면, 저 검은색 테두리 부분 안에서만 가운데 정렬이 될 거기 때문에 아무 의미없다. 일단 이 상태에서라도 가운데 정렬을 해보면,
index.css 파일을 다시 이렇게 수정한다.
.center_div
{
border: 1px solid;
text-align: center;
}

예상대로 검은 테두리 선 내에서반 가운데 정렬이 이루어졌다. 가운데 정렬할 범위를 넓혀줘야 한다.
다시 index.css 파일을 수정하자.
.center_div
{
border: 1px solid;
text-align: center;
width: 100vw;
}

100vw에서 vw은 Viewport Width라는 뜻이다. viewport는 화면에 보이는 영역이다. 웹브라우저에서 글자가 보여지는 영역이 viewport이다.
1vw는 웹브라우저 폭의 1%라는 뜻이다. 100vw는 웹브라우저 폭의 100%라는 뜻이다.
그래서 웹브라우저의 폭을 모두 쓰게 된다.
스크롤바가 생긴 건 css로 border를 그렸기 때문이다. border는 영역의 바깥쪽에 선을 그리기 때문에 왼쪽에 1px, 오른쪽에 1px 선을 그리느라 스크롤바가 생겼다. 단지 div의 크기가 얼마나 되는지 보기 위해 선을 그렸으니 border는 이제 없애도 된다.
.center_div
{
text-align: center;
width: 100vw;
}

이제 버튼은 가운데로 오는 문제가 해결되었다.
아래 시각을 가운데로 옮겨야 하는데 각각 가운데로 옮기지 않고, 보통은 아래와 같이 하나의 div로 묶어 가운데로 옮기는 방법을 사용한다.
return (
<>
<div className='center_div'>
<div>
<button>출/퇴근</button>
</div>
<div>
{getdate()}
</div>
</div>
</>
)
버튼 누르면 동작하게 만들기
지금은 앱 시작하자마자 시간이 바로 표시되는데 사실은 버튼을 누를 때의 시간을 기록하는 게 목적이다. 그러니 버튼을 누르기 전까지는 시간이 표시되면 안 된다.
return (
<>
<div className='center_div'>
<div>
<button>출/퇴근</button>
</div>
<div>
</div>
</div>
</>
)
그래서 일단 위와 같이 시간 표시되는 부분을 없앴다.
react의 상태 관리 매커니즘을 이용해 버튼 누를 때의 시간을 기록하고 보여주자.
import {useState} from 'react';
function App() {
const [did_time, set_did_time] = useState("");
function getdate()
{
const date = new Date();
return date.toLocaleDateString('ko-KR') + ' ' + date.toLocaleTimeString('ko-KR');
}
function checkTime()
{
let current_time = getdate()
set_did_time(current_time)
}
return (
<>
<div className="center_div">
<div>
<button onClick={checkTime}>출/퇴근</button>
</div>
<div>
{did_time}
</div>
</div>
</>
)
}
export default App

실행 직후. 버튼을 누르지 않으면 시간 관련 값이 세팅되어 있지 않으니 화면에 시간이 표시되지 않는다.

버튼을 누르면 onClick에 의해 checkTime 함수가 실행된다.
checkTime 함수는 지금 시각을 getdate() 함수를 통해 가져오고,
이 시간 정보는 set_did_time() 함수를 통해 did_time 값을 세팅하고,
그렇게 되면 결국 react의 상태 관리 매커니즘에 따라 자동으로 그 아래쪽에 버튼을 누른 시각이 바뀐다. 처음에는 아무것도 없었으니 나타나는 것처럼 보인다.
계속 버튼을 누르면 누를 때마다 시간이 바뀌는 걸 볼 수 있다.
차 잘 잠궜나 확인 추가
차 잘 잠궜나 확인하는 기능도 추가해서 다음과 같은 모양이 되게 하고 싶다.

이렇게 하려면 아래와 같이
return (
<>
<div className="center_div">
<div>
<button onClick={checkTime}>출/퇴근</button>
</div>
<div>
{did_time}
</div>
<div>
<button onClick={checkTime}>차 잠궜나</button>
</div>
<div>
{did_time}
</div>
</div>
</>
)
똑같은 코드를 복사해 놓는 걸 우선 생각할 거다. 당연하다.
그리고 출퇴근 용 시간 상태 정보와 차 잠궜는지에 대한 시간 상태 정보를 따로 두는 등 코드가 조금 복잡해진다.
그런데 react는 부품들을 만들어 놓고 조립해 사용하는 형태로 쓰기 때문에 저렇게 같은 일을 하는 코드를 중복해서 사용하는 걸 싫어한다.
컴퍼넌트란
출퇴근 확인 버튼을 부품, 컴퍼넌트 형태로 바꿔 사용해 보자.
지금 쓰고 있는 컴퓨터 키보드를 봐라. A키와 B키, C키… 등등을 보면 모두 같은 모양의 키이고 누르면 들어갔다 나오는 등 똑같은 동작을 하는데 그 위에 인쇄만 A, B, C라고 해 놓고 누를 때마다 컴퓨터로 전달되는 값만 다르게 해놨다.
이렇게 키보드의 키처럼 똑같이 생겼지만 정해준 값에 따라 다르게 일하는 녀석들을 부품, 컴퍼넌트라고 한다.
지금까지 만든 걸 컴퍼넌트 형태로 바꾸고 그 컴퍼넌트를 이용하는 형태로 바꿔보자.
지금까지 만든 걸 컴퍼넌트로 바꾸면 버튼 하나, 그 밑에 시간 정보 표시 하나가 있는 그런 모양의 컴퍼넌트가 된다.

이런 컴퍼넌트가 되는거다. 만약 ‘차 잠궜나’ 같은 기능이 필요하면

와 같이 컴퍼넌트를 2개 놓으면 된다.
컴퍼넌트의 생성
DidTime이라는 이름의 컴퍼넌트를 만들자.
vscode에서

마우스를 위쪽으로 가져가면 저렇게 생긴 아이콘이 나타난다. 저 파일을 누르면 새 파일이 생성된다.
src\DidTime.jsx 파일을 만들고 그 파일의 내용을 다음과 같이 한다.
만드는 방법은 간단한데, App.jsx 파일의 내용을 그대로 복사해서 붙여넣고 App만 DidTime으로 2군데 고친다. 3번째 줄과 맨 마지막 줄.
// src/DidTime.jsx
import {useState} from 'react';
function DidTime() {
const [did_time, set_did_time] = useState("");
function getdate()
{
const date = new Date();
return date.toLocaleDateString('ko-KR') + ' ' + date.toLocaleTimeString('ko-KR');
}
function checkTime()
{
let current_time = getdate()
set_did_time(current_time)
}
return (
<>
<div className="center_div">
<div>
<button onClick={checkTime}>출/퇴근</button>
</div>
<div>
{did_time}
</div>
</div>
</>
)
}
export default DidTime
이렇게 하면

이런 컴퍼넌트가 하나 생긴거다. 컴퍼넌트 이름은 DidTime이고.
이제 App.jsx 파일을 수정해서 이 컴퍼넌트를 사용하도록 해보자.
우선 App.jsx의 기능을 전부 DidTime 컴퍼넌트에게 줬으니 이제 App.jsx에서는 불필요하게 된 부분은 싹 지워보자.
// src/App.jsx
function App() {
return (
<>
</>
)
}
export default App
맨 처음에 정리했던 그 모습이 되었다.
이제 App.jsx에서 DidTime 컴퍼넌트를 사용해 보자.
// src/App.jsx
import DidTime from "./DidTime"
function App() {
return (
<>
<DidTime />
</>
)
}
export default App

쉽게 컴퍼넌트 형태로 고쳤고, 그 컴퍼넌트를 사용하는 형태로 고쳤는데 이전과 똑같이 잘 동작하고 있다.
컴퍼넌트 하나 더 추가해서 차 잠궛는지 확인해 보자.
// src/App.jsx
import DidTime from "./DidTime"
function App() {
return (
<>
<DidTime />
<DidTime />
</>
)
}
export default App

두 개의 컴퍼넌트가 각각 따로 동작하는 건 확인할 수 있다. 각각의 컴퍼넌트는 각각 상태를 관리하기 때문이다.
그런데 큰 문제가 2개 있다.
하나는 위아래가 너무 붙은 거고,
하나는 둘다 출/퇴근 버튼을 가졌다는 거다. 이름을 달리해야 한다.
먼저 위아래가 너무 붙은 문제부터 해결하자.
또 css의 도움을 받아야 한다.
index.css 파일의 맨 끝에 다음 클래스를 추가하자.
.components
{
display: flex;
flex-direction: column;
gap: 30px;
}
이 css는 세로로 길게 요소들을 배치하고 그 요소들의 세로 간격은 30픽셀만큼 떨어뜨리라는 것이다.
이 css 클래스를 App.jsx에 반영한다.
<div className='components'>
<DidTime />
<DidTime />
</div>
전체 App.jsx 파일은 다음과 같다.
// src\App.jsx
import DidTime from "./DidTime"
function App() {
return (
<>
<div className='components'>
<DidTime />
<DidTime />
</div>
</>
)
}
export default App

2개의 컴퍼넌트들간의 세로 간격이 30픽셀만큼 벌어졌다.
컴퍼넌트에 값 전달
버튼의 이름을 컴퍼넌트마다 다르게 해야 한다.
그러기 위해서는 App.jsx 파일에서 컴퍼넌트를 사용할 때마다 ‘너가 가진 버튼의 이름은 OOO이다’ 라고 알려줘야 한다.
먼저 DidTime.jsx 파일을 수정해 DidTime 컴퍼넌트를 고쳐보자.
DidTime.jsx 파일의 세번째 줄이
function DidTime() {
인데 이 부분을
function DidTime( {title} ) {
으로 바꾸자.
이렇게 하면 이 DidTime 컴퍼넌트는 ‘나한테 title 이라는 이름의 변수로 값을 넘겨주면 내가 내부적으로 사용할께’ 라고 선언하는 것과 같다.
이 컴퍼넌트를 사용하는 App.jsx 파일에서는 DidTime 컴퍼넌트에게 title 값을 다음과 같이 넘겨줄 수 있다.
// src\App.jsx
<DidTime title = "출/퇴근" />
<DidTime title = "차 잠궜나"/>
그럼 DidTime 컴퍼넌트에서는 이 값을 내부적으로 자유롭게 사용할 수 있는데, 우리는 버튼 이름을 바꾸는 데 사용할 거다.
// src\DidTime.jsx
<button onClick={checkTime}>{title}</button>
버튼의 이름을 바꾸기 위해 {title} 을 사용했다.
App.jsx 파일의 전체 파일은 다음과 같다.
import DidTime from "./DidTime"
function App() {
return (
<>
<div className='components'>
<DidTime title = "출/퇴근" />
<DidTime title = "차 잠궜나"/>
</div>
</>
)
}
export default App
import {useState} from 'react';
function DidTime( {title }) {
const [did_time, set_did_time] = useState("");
function getdate()
{
const date = new Date();
return date.toLocaleDateString('ko-KR') + ' ' + date.toLocaleTimeString('ko-KR');
}
function checkTime()
{
let current_time = getdate()
set_did_time(current_time)
}
return (
<>
<div className="center_div">
<div>
<button onClick={checkTime}>{title}</button>
</div>
<div>
{did_time}
</div>
</div>
</>
)
}
export default DidTime

기타, 정리
웹브라우저의 제목 바꾸기

이제 어느 정도 기능이 되니 저 부분이 눈에 들어온다.
웹브라우저의 제목은 프로젝트 폴더의 index.html 파일을 수정해 바꿀 수 있다.

저 title 태그 부분을 바꾸면 된다.
// index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>출퇴근 기록기</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>

2개 이상의 기록 보여주기
위 그림과 같이 2개 이상의 기록을 보여주려면 배열로 전환해야 한다.
DidTime.jsx 파일을 고쳐 DidTime 컴퍼넌트를 수정한다.
// src\DidTime.jsx
import {useState} from 'react';
function DidTime( {title }) {
const [did_times, set_did_times] = useState([]);
function getdate()
{
const date = new Date();
return date.toLocaleDateString('ko-KR') + ' ' + date.toLocaleTimeString('ko-KR');
}
function checkTime()
{
const current_time = getdate();
// 전체 개수가 1개 이하면 배열에 현재 시간을 추가한다.
if (did_times.length <= 1)
{
const new_did_times = [...did_times, current_time];
console.log("did_times :", new_did_times);
set_did_times(new_did_times);
}
else // 전체 개수가 2개면 2번째 배열의 값은 지금 시간으로 변경한다.
{
const new_did_times = [...did_times];
new_did_times[1] = current_time;
set_did_times(new_did_times);
}
}
return (
<>
<div className="center_div">
<div>
<button onClick={checkTime}>{title}</button>
</div>
<div>
{
did_times.map( (item) => (
<div>{item}</div>
)
)
}
</div>
</div>
</>
)
}
export default DidTime

여기가지 하면 문제가 있다. 맨 아래 한줄만 값이 바뀐다. 가장 옛날 건 지워지고 가장 최신 것 2개가 남아야 하는데 맨 아래 한 줄만 값이 바뀌니 가장 옛날 거 하나와 가장 최신 것 하나가 보여지는 셈.
이 문제는 배열을 역순으로 정렬하면 된다.
그럼 맨 아래에는 가장 오래된 자료가 보일 거고, 가장 밑에 있는 그 가장 오래된 자료를 수정하고 현재 시각으로 바꾸고 다시 역순으로 정렬하면 된다.
배열을 정렬하는 함수는 sort() 함수이고 역순으로 뒤집는 함수는 reverse()이다. 그러니까 sort()로 배열을 정렬하고, reverse() 함수로 역순으로 만들어주면 결국 역순 정렬이 된다.
// src\DidTime.jsx
import {useState} from 'react';
function DidTime( {title }) {
const [did_times, set_did_times] = useState([]);
function getdate()
{
const date = new Date();
return date.toLocaleDateString('ko-KR') + ' ' + date.toLocaleTimeString('ko-KR');
}
function checkTime()
{
const current_time = getdate();
// 전체 개수가 1개 이하면 배열에 현재 시간을 추가한다.
if (did_times.length <= 1)
{
const new_did_times = [...did_times, current_time];
console.log("did_times :", new_did_times);
set_did_times(new_did_times.sort().reverse());
}
else // 전체 개수가 2개면 2번째 배열의 값은 지금 시간으로 변경한다.
{
const new_did_times = [...did_times];
new_did_times[1] = current_time;
set_did_times(new_did_times.sort().reverse());
}
}
return (
<>
<div className="center_div">
<div>
<button onClick={checkTime}>{title}</button>
</div>
<div>
{
did_times.map( (item) => (
<div>{item}</div>
)
)
}
</div>
</div>
</>
)
}
export default DidTime

QGIS
연습문제
1. Open Street Map 위에 GPS로 관측한 값으로 정확하게 위치 표시하기
주안점
- Open Street Map의 좌표체계는 EPSG:3857이다.
- GPS에서 관측한 값의 좌표체계는 EPSG:4326(WGS-84)이다.
해결책
- QGIS는 각 레이어의 좌표체계가 달라도 실시간으로 투영하여 렌더링하기 때문에 각 레이어간의 위치가 정확하게 맞춰진다.
작업 순서
- OSM 레이어를 추가한다.(EPSG:3857)
- 새 Shape File 레이어를 추가한다. EPSG:4326
- 원하는 위치에 대략의 모양으로 건물의 모양을 잡는다.
- 편집 모드를 켠다
- 꼭짓점 도구를 켠다.
- 건물 각 꼭짓점의 위치를 오른쪽 클릭한다.
- 꼭짓점 편집기에서 5개의 꼭짓점 모두 정확한 GPS 입력값으로 변경한다.
2. 건물의 면적 구하기
작업 순서
- 필드계산기를 연다.
- 가상필드를 추가한다.
- 계산식으로 area 를 입력한다.
3. 공간정보 분석 위치로 선택 예제 만들기

위 8가지 feature 위치에 대해 잘 설명할 수 있는 샘플을 만들어보자.
각 항목 설명
교차(intersect)
가장 넓은 개념으로 두 feature가 접촉하거나 겹치는 경우를 모두 포함하는 경우 선택됨

접촉(touch)
두 feature가 경계선에서만 만나는 경우 선택됨

되는 경우
안되는 경우
포함(contain)
위에서 선택한 feature가 아래에 선택한 feature를 포함하는 경우(위에서 선택한 feature가 더 커야 함) 위에서 선택한 feature가 선택됨
중첩(overlap)
두 feature가 서로 겹치지만 어느 한쪽이 다른 쪽을 완전히 포함하거나 똑같지는 않는 경우
분절(disjoint)
두 feature 사이에 공통된 부분이 전혀 없는 경우
내부(are within)
위에서 선택한 feature가 아래에 선택한 feature의 내부에 있는 경우 위에서 선택한 feature가 선택됨. 포함(contain)의 반대.
동등(equal)
두 feature의 영역이 완전히 같을 때 선택됨
공간교차(cross)
위에서 선택한 feature가 아래에 선택한 feature를 가로지를 때 선택됨. line string과 polygon간에 성립하며, polygon:polygon이나 point:point 간에는 성립하지 않음.
3D 그래픽 기본
따라하기
건물 모델링
책상만들기 1
책상만들기 2
loop cut
면을 나눌 때 사용. 단축키: ctrl + R
책상만들기 3
평면도 모델링
평면도 샘플


평면도 제작 실습
1/2
2/2
재질
PBR 기본 설정값: base color, roghness, metalic 설정
텍스처 직접 그리기
텍스처 입히기 - 주사위 텍스처
normal map(노말맵) - 실사같은 나무 상자
라이트
라이트 일반 사용 실습
렌더
재료 다운로드
렌더 기본
랜디를 이용한 fog 렌더링
애니메이션
주사위 굴리기
주사위 굴리기 결과 동영상
복습문제
1. 3D 그래픽 기본
1. blender에 대한 설명으로 틀린 것은?
- 공사 규모에서는 유료로 구입해야 한다.
- 오픈소스로 개발되고 있다.
- 직관적인 UI로 큰 인기를 모으고 있다.
- 다양한 시스템들과 co-work하고 있다.
2. blender에 대한 설명으로 맞는 것은?
- 사진과 같은 품질을 제작할 수 있다.
- 동영상은 만들 수 없다.
- 플러그인을 사용할 수 없어 활용도가 낮다.
- 유료 구입하면 특수 기능을 사용할 수 있다.
3. x, y, z라고 축의 이름이 붙어 있지 않은 경우라도 어떤 축이 각각 x, y, z 축임을 알 수 있는 방법은?
- ABC
- GOD
- YOU
- RGB
4. 빨간색 축은 x, y, z 중 어떤 축인가?
- X
- Y
- Z
- 아무런 축도 나타내지 않는다.
5. 파란색 축은 x, y, z, 중 어떤 축인가?
- X
- Y
- Z
- 아무런 축도 나타내지 않는다.
6. 2D에 비해 3D의 특징은?
- 더 많은 색을 표현할 수 있다.
- 더 촘촘하게 간격을 구분할 수 있다.
- 높이 개념이 있다.
- 데이터의 양이 더 적다.
7. 다음 그림에서 빨간 점의 (x, y, z) 좌표값은?

- (5, 4, 0)
- (0, 4, 5)
- (5, 0, 4)
- (4, 5, 0)
blender 실습 1
1. LMB는 무엇의 약자인가?
- Large Mouse Button
- Left Mouse Button
- Left Move Button
- Light Move Button
2. MMB를 누르라고 적혀 있으면 마우스의 어떤 부분을 눌러야 하나?
- 왼쪽 버튼
- 왼쪽 버튼과 오른쪽 버튼을 동시에
- 마우스 휠
- 오른쪽 버튼
3. cube가 하나 있는 경우 이 큐브를 확인하기 위해 궤도식 회전(orbit)을 하려 한다. 가장 좋은 방법은?
- 왼쪽 버튼으로 화면을 눌러 돌린다.
- shift + 왼쪽 버튼으로 화면을 눌러 돌린다.
- 오른쪽 버튼으로 화면을 눌러 돌린다.
- 마우스 휠로 화면을 눌러 돌린다.
4. 궤도식 회전(orbit)을 하면 어느 한 점을 중심으로 카메라가 일정거리를 두고 회전하게 된다. 이 때 회전 중점을 바꾸고 싶다면 어떻게 해야 하나?
- 원하는 중점에 마우스를 위치하고 MMB를 누른다.
- 원하는 중점에 마우스를 위치하고 Alt + MMB를 누른다.
- 원하는 중점에 마우스를 위치하고 LMB를 누른다.
- 원하는 중점에 마우스를 위치하고 Alt + LMB를 누른다.
5. 현재 화면에서 오른쪽에 반만 보이는 object를 화면 가운데에 보이도록 하고 싶으면 panning을 해야 한다. 패닝하는 방법은?

- MMB를 누른 채로 마우스를 움직인다.
- LMB를 누른 채로 마우스를 움직인다.
- Shift를 누른 상태에서 MMB를 꾹 누르고 (떼지않고) 마우스를 움직인다.
- Shift를 누른 상태에서 LMB를 꾹 누르고 (떼지않고) 마우스를 움직인다.
6. zoom in / zoom out 하는 방법으로 틀린 것은?
- 마우스 휠을 돌린다.
- 숫자 키패드에서 + 키나 - 키를 누른다.
- 마우스 휠을 누르고 움직인다.
- Ctrl + MMB를 하고 마우스를 위아래로 움직인다.
7. 작업하다 보니 많은 수의 mesh들을 만들게 되었다. 이 mesh들과 카메라, 조명까지 모두 한 화면에 표시되도록 zoom out 하는 가장 빠르고 쉬운 방법은?
/키를 누른다..키를 누른다.*키를 누른다.home키를 누른다.
8. 작업하면서 zoom in / out 을 여러 번 하다보니 어느 순간부터 zoom in 이 제대로 안되었다. 이 문제를 가장 빠르게 해결하는 방법은 ?
- zoom in하고 싶은 mesh를 선택하고
/키를 누른다. - zoom in하고 싶은 mesh를 선택하고
.키를 누른다. - zoom in하고 싶은 mesh를 선택하고
*키를 누른다. - zoom in하고 싶은 mesh를 선택하고
home키를 누른다.
9. viewpoint를 설정하는 방법으로 틀린 것은 ?
- Top view: 숫자키패드 7
- Front view: 숫자키패드 5
- Right view: 숫자키패드 3
- Bottom view: Ctrl + 숫자키패드 7
10. Top view로 보고 있다가 반대쪽인 bottom view로 바꾸고 싶거나, Left view로 보고 있다가 반대쪽인 right view로 바꾸고 싶거나, Front view로 보고 있다가 back view로 바꾸고 싶을 때 모든 경우에 한 번에 바꾸는 방법은 ?
숫자키패드 5를 누른다.숫자키패드 9를 누른다.숫자키패드 .을 누른다.숫자키패드 -를 누른다.
11. 다음과 같이 quad view로 전환하는 방법은 ?

ctrl+alt+q를 누른다.ctrl+alt+v를 누른다.ctrl+alt+4를 누른다.ctrl+alt+/를 누른다.
12. 다음 줄 틀린 말은 ?
- perspective: 입체적인 표현을 한다.
- orthographic: 직교투영으로 표현한다.
- perspective: top view, front view, right view에서 사용한다.
- orthographic: 거리와 상관없이 물체의 크기를 똑같이 보여준다.
13. 오브젝트를 이동할 때 사용하는 키는 ?
G키R키A키S키
14. 오브젝트를 이동할 때 y축으로만 이동하려 한다. 이 경우 눌러야 하는 키는 ?
G키X키Y키Z키
15. 오브젝트를 이동할 때 x, y축으로만 이동하고 z축으로의 이동은 제한하려 한다. 이 경우 눌러야 하는 키는 ?
Ctrl+Z키Z키Alt+Z키Shift+Z키
16. 아래 그림과 같이 cube가 회전되어 있을 때 바닥과 평형을 이루도록 하는 방법은 ?

G키를 눌러 회전시킨다.R키를 눌러 회전시킨다.B키를 눌러 회전시킨다.A키를 눌러 회전시킨다.
17. 위 문제의 답과 같이 회전시켰더니 오히려 더 이상한 방향으로 회전되었다. 바닥과 평형을 이루도록 회전시키는 방법은 ?

X키를 눌러 X축을 기준으로 회전시킨다.Y키를 눌러 Y축을 기준으로 회전시킨다.Z키를 눌러 Z축을 기준으로 회전시킨다.- blender는 무료 프로그램이라 이런 문제는 해결할 수 없다.
18. 아래와 같이 눈사람을 만들었는데 아래에 있는 sphere(구)를 좀 더 크게 해주고 싶을 때 사용할 수 있는 방법은 ?

- 아래에 있는 sphere를 선택하고
G키를 눌러 약간 키워준다. - 아래에 있는 sphere를 선택하고
R키를 눌러 약간 키워준다. - 아래에 있는 sphere를 선택하고
S키를 눌러 약간 키워준다. - 아래에 있는 sphere를 선택하고
A키를 눌러 약간 키워준다.
19. 아래와 같이 어느 한 점의 위치를 변경하려 할 때 제일 처음 할 일은 ?

e키를 눌러 edit 모드로 들어간다.ctrl키를 눌러 edit 모드로 들어간다.m키를 눌러 edit 모드로 들어간다.tab키를 눌러 edit 모드로 들어간다.
20. edit 모드 진입 후 아래와 같이 어느 한 점(vertex)의 위치를 변경하려 할 때 할 일은 ?

p키를 눌러 점편집 모드로 변경한다.1키를 눌러 점편집 모드로 변경한다.2키를 눌러 점편집 모드로 변경한다.3키를 눌러 점편집 모드로 변경한다.
21. edit 모드 진입 후 아래와 같이 어느 한 선(edge)의 위치를 변경하려 할 때 할 일은 ?

L키를 눌러 선편집 모드로 변경한다.1키를 눌러 선편집 모드로 변경한다.2키를 눌러 선편집 모드로 변경한다.3키를 눌러 선편집 모드로 변경한다.
22. edit 모드 진입 후 아래와 같이 어느 한 면(face)의 크기를 변경하려 할 때 할 일은 ?

f키를 눌러 면편집 모드로 변경한다.1키를 눌러 면편집 모드로 변경한다.2키를 눌러 면편집 모드로 변경한다.3키를 눌러 면편집 모드로 변경한다.
23. 다음과 같이 작업했을 때 결과물은 ?
1. cube를 선택한다.
2. tab 키를 눌러 edit 모드로 들어간다.
3. 1키를 누른다.
4. 어느 한 점을 선택한다.
5. G키를 누른다.
6. X키를 누른다.
7. 마우스를 움직인다.




24. 다음과 같은 작업결과물을 만드는 작업을 순서대로 기술했다. 이 중 틀린 것은 ?

-
cube를 선택한다.
-
tab키를 눌러 편집 모드로 들어간다.
-
3키를 눌러 면편집 모드로 변경한다. -
r키를 눌러 회전 기능을 활성화한다. -
ctrl + z키를 눌러 z축 회전으로 설정한다. -
마우스를 움직여 선택된 면을 회전한다.
25. 다음 그림과 같은 편집과 방법을 올바르게 짝지은 것은?

- 모따기,
ctrl + v키 - 모깎기,
ctrl + v키 - 모따기,
ctrl + b키 - 모깎기,
ctrl + b키
26. 다음 그림과 같은 편집과 방법을 올바르게 짝지은 것은?

- 모따기, 모깎기 후 마우스 휠
- 모깎기, 모따기 후 마우스 휠
- 모따기, 모깎기 후 마우스 휠
- 모깎기, 모따기 후 마우스 휠
27. 다음 그림과 같이 면을 도출(extrude)할 떄 사용하는 키는?

e키x키t키r키
28. 면을 도출(extrude)시킨 직후 이 작업을 취소하려면 ctrl + z 키를 누른다. 그런데 이 때, ctrl + z 키를 2번 이상 눌러 그 면을 선택한 것까지 취소해야 한다. 그 이유는(답 2개)?
- extrude는 메모리를 많이 차지하는 연산이므로
- extrude는 CPU를 많이 차지하는 연산이라 정확하게 제거하지 않으면 앞으로 CPU를 더 많이 사용하기 때문
- extrude는 면을 하나 더 생성하는 거라 나중에 이 면이 반드시 문제가 되기 때문에 완벽하게 제거하려고.
- extrude하면 바로 그 자리에 똑같은 면이 하나 더 생성되기 때문에 면이 하나 더 있는지 알아보기 어렵기 때문
29. fbx는 무엇의 약자인가?
- 약자가 아니다.
- FaceBook eXtension
- FilmBook eXtension
- FilmBoX
blendr 실습 2
1. 평면도 모델링을 위해 blender에 평면도를 올려놓는 메뉴는?
- Add > Image > panel
- Add > Image > Reference
- Add > Image > Back
- Add > Reference > Image
2. 평면도 모델링을 위해 벽을 세울 때 사용하는 기술은?
- loop cut
- extrude
- array
- boolean
3. extrude할 때 영향받는 방향을 x축 방향으로 고정하기 위해 사용하는 방법으로 옳은 것은?
- e 키를 눌러 extrude를 시작하고 x 키를 누른다.
- x 키를 눌러 extrude를 시작하고 x 키를 누른다.
- e 키를 눌러 extrude를 시작하고 ctrl + x 키를 누른다.
- x 키를 눌러 extrude를 시작하고 ctrl + x 키를 누른다.
4. blender에서 벽에 창문 구멍을 내기 위해 사용하는 기술은?
- loop cut
- select
- array
- boolean
5. 디즈니에서 처음 상업화해 사용한 기술로, 재질을 시각화하기 위해 물리적인 속성을 이용하는 통일된 표현법은?
- material
- PBR
- metalic
- physical
6. 다음 중 PBR의 주요 속성이 아닌 것은?
- base color
- roughness
- metalic
- glossy
7. 다음 중 PBR의 속성에 대한 설명 중 틀린 것은?
- base color: 물체 고유색 표현
- roughness: 표면의 거친 정도
- metalic: 금속의 느낌인 정도
- round: 표면의 둥근 정도
8. model의 겉면에 붙이는 이미지를 무엇이라 부르나?
- texture
- picture
- outer
- uv
9. 육면체 모델의 경우, 각 면을 하나씩 전개도처럼 펴서 각각의 면에 이미지를 그린 후 다시 입히는 기법은?
- texture
- picture
- outer
- uv
10. 모델의 겉면에 자잘한 상처나 결이 있는 경우, 이걸 모델에 전부 다 반영하면 처리 속도가 너무 느려져, 이를 막고자 그런 자잘한 상처나 결을 그림자로 표현해 입체감을 주는 방법으로 실사 느낌을 주는 효과적인 기법은?
- roughness
- material
- normal map
- uv
11. light 중 전구와 같은 효과의 조명이며, 있는 곳에서 멀어질수록 점점 어두워지는 조명은?
- point
- sun
- spot
- area
12. light 중 공연장의 스포트라이트 느낌을 주는 조명은?
- point
- sun
- spot
- area
13. light 중 멀리 있는 태양과 같이 위치는 전혀 상관없고 각도만 중요하며 화면 전체에 일정한 밝기를 제공하는 조명은?
- point
- sun
- spot
- area
14. light 중 창문을 통해 빛이 들어오거나 TV나 모니터에서 퍼져나오는 빛을 표현할 때 사용하는 조명은?
- point
- sun
- spot
- area
15. blender에서 light를 모두 없애면 완전히 검은색으로만 렌더링된다?
- O
- X
16. blender에서 면을 나누는 기술 중 하나는?
- loop cut
- uv
- area
- spot
blender 실습 3
1. 3D 그래픽에서 모델링 후 실제와 똑같이 텍스처를 입혀도 실사와 동떨어진 3D 그래픽이라는 느낌이 드는데 그 이유는 겉표면이 아주 매끈하고 흠집, 결 등이 없기 때문이다. 실제 모델에 흠집, 결 등을 추가하지 않아도, 흠집, 결 등으로부터 생기는 사소한 그림자를 만들어 작은 요철, 흠집, 결 등을 표현해 실사같은 느낌을 주는 기술은?
- render
- material
- spot
- normal map
2. blender 에서 제공하는 렌더링 엔진 중 반사, 그림자 처리 등에 실제 물리와 비슷한 처리를 하기보다는 최대한 빨리 최대한 비슷하게 처리하는데 중점을 둔 렌더 엔진은?
- defalut 엔진
- eevee
- cycles
- v-ray
3. blender 에서 기본 제공하는 렌더링 엔진 중 반사, 그림자 처리 등에 실제 물리와 비슷한 처리를 해 시간은 매우 오래 걸리지만 실사와 비슷한 결과물을 만들어 주는 렌더 엔진은?
- defalut 엔진
- eevee
- cycles
- v-ray
4. blender에서 특정 영역에 안개같은 입자들이 차 있는 느낌을 주고 싶을 때 사용하는 기술은?
- area
- space
- fog
- volume
5. 3D 그래픽 관련 기술 중, 실제 물리 현상과 같이 빛 입자(포톤)를 쏘아 포톤들이 오브젝트들에 반사되는 경로를 추적해 실제와 유사한 그림자와 밝기를 가지도록 결과물을 만들어 주는 기술은?
- uv mapping
- normal map
- photon cannon
- ray tracing
AI를 이용한 드론 운용
자료
LM Studio와 엑셀의 연동

사용법
-
파일 다운로드: 엑셀 파일
-
압축풀고
ai_excel.xlsm파일을 실행한다. 파일 열리는 데 한참 걸림(1분. 열릴 때까지 기다리자) -
ALT + F11을 눌러 VBA 모드로 들어간다.
-
도구 > 참조 메뉴로 들어간다.
-
Microsoft Scripting Runtime을 체크한다.

-
VBA-JSON을 설치한다.
-
https://github.com/VBA-tools/VBA-JSON?tab=readme-ov-file 에 접속
-
latest release를 다운로드 받아 압축을 푼다
-
파일 > 파일 가져오기를 이용해 ‘JsonConverter.bas’ 파일을 가져온다.
- 엑셀 파일에서 AI에 질의한다. 예) =toAI(A1 & “ 의 뜻 번역해줘“)
국토정보 프로그래밍_파이썬
복습문제
1. 파이썬 환경 이해
1. 파이썬이라는 이름에 대한 설명 중 틀린 것은?
- 비단뱀이라는 뜻도 있다.
- 고대 신화에 나오는 큰 뱀 이라는 뜻도 있다.
- 제작자가 좋아하는 코미디에서 따온 이름이다.
- 제작자의 이름이다.
2. 파이썬의 특징이 아닌 것은?
- 언어 자체는 쉽지만 아직 라이브러리가 많지 않아 일일이 개발해야 하는 어려움이 있다.
- 문법이 비교적 간결하다.
- 배우려고 마음만 먹으면 도움이 될 참고자료들이 넘쳐난다.
- 무료로 사용할 수 있다.
3. 파이썬으로 만들면 문제가 생길 만한 프로그램 종류는?
- 웹사이트
- AI 프로그램
- 데이터 분석 프로그램
- real time을 요하는 실시간 처리가 중요한 프로그램
4. 파이썬의 언어적 특징이 아닌 것은?
- 인터프리터 언어이다.
- 대화형 언어이다.
- 실행파일(exe 파일)이 생성된다.
- 질문하면 대답하는 형식으로 프로그램이 진행된다.
5. 다음 중 파이썬의 프롬프트는?
- ###
- >>>
- <<<
- ***
2. 파이썬 자료구조
1. 한 변수에 -3, -2, -1, 이렇게 3개 값만 들어간다. 이 경우 파이썬은 이 변수의 자료형을 무엇이라 판단할까?
- 문자열
- 정수형(integer)
- 실수형(float)
- 참/거짓형(boolean)
2. 다음 코드를 실행한 후 메모리의 모습으로 맞는 것은?
>>> a = 5
>>> b = 10
>>> a = 7
3. 다음 코드의 결과는?
>>> a = 1
>>> b = a + 0.1
>>> print (b)
- 1 + 0.1
- 1.01
- 10.1
- 1.1
4. 다음 코드에서 변수 b의 자료형은?
>>> a = 1
>>> b = a + 0.1
- 문자열
- 정수형(integer)
- 실수형(float)
- 참/거짓형(boolean)
5. 다음 코드의 결과는?
>>> 5 // 3
- 1
- 1.6666666666666667
- 2
- 3
6. 다음 코드의 결과는?
>>> 5 % 3
- 1
- 1.6666666666666667
- 2
- 3
7. 다음 코드의 결과는?
>>> 3 ** 3
- 9
- 33
- 27
- 45
8. 다음 코드의 결과는?
>>> a = "올해 연도 : "
>>> b = 2024
>>> c = a + b
- 에러가 발생한다.
- ‘올해 연도 : 2024’
- ‘올해 연도 :’
- ‘2024’
9. 바로 위 문제에서 에러가 발생했다면 이를 해결하기 위한 방법은?
- 문제없이 실행된다.
- c = a + b 를 c = a + len(b)로 수정한다.
- c = a + b 를 c = str(a) + b로 수정한다.
- c = a + b 를 c = a + str(b)로 수정한다.
10. list를 사용하는 이유가 아닌 것은?
- 변수 하나로 많은 양의 자료를 관리할 수 있다.
- 파이썬은 사용할 수 있는 변수의 갯수가 128개로 정해져 있다.
- 자료마다 변수를 생성하는 것은 매우 불편하고 사실상 그렇게는 개발이 불가능하기 때문
- 개발의 편리함때문
11. 다음 list에서 하나의 요소를 읽어오는 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2]
- ‘짜장’
- ‘짬뽕’
- ‘탕수육’
- ‘회’
12. list에서 하나의 요소를 바꾼 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2] = '깐풍기'
>>> a
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
- [‘짜장’, ‘짬뽕’, ‘깐풍기’, ‘회’]
- ‘깐풍기’
- 에러가 발생하고 값을 바꿀 수 없다.
13. list에 하나의 요소를 추가한 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a.append("육회")
>>> a
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’, ‘육회’]
- ‘육회’
- 에러가 발생하고 값을 바꿀 수 없다.
14. list에 하나의 요소를 특정 위치에 추가하기 위해, ??? 부분에 작성해야 하는 코드는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '짬뽕', '깐풍기', '탕수육', '회']
- a.insert(0, ‘깐풍기’)
- a.insert(1, ‘깐풍기’)
- a.insert(2, ‘깐풍기’)
- a.insert(3, ‘깐풍기’)
15. list에 하나의 요소를 삭제하기 위해, ??? 부분에 작성해야 하는 코드는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '탕수육', '회']
- del a[0]
- a.del[0]
- del a[1]
- a.del[1]
16. 다음 코드의 결과를 순서대로 표시한 것은?
>>> 2 < 5
???
>>> 5 < 2
???
- True, True
- True, False
- False, True
- False, False
3. 파이썬 조건문
1. 파이썬에서 제공하는 제어문 2가지는?
- 조건문, 입출력
- 입출력, 라이브러리
- 조건문, 반복문
- 반복문, 입출력
2. 조건식이 참인 경우에만 실행되는 제어문은?
- 입출력
- 라이브러리
- 반복문
- 조건문
3. 다음 코드에서 실행되는 내용은?
if 3 < 5 :
a = 1 ⓐ
b = 2 ⓑ
c = 3 ⓒ
d = 4 ⓓ
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓐ ⓑ ⓒ ⓓ
4. 다음 조건문에서 실행되는 내용은?
if 3 > 5 :
a = 1 ⓐ
b = 2 ⓑ
c = 3 ⓒ
d = 4 ⓓ
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓓ
5. 다음 조건문의 실행 결과는?
if 3 == 5 :
print("a")
print("b")
- 에러가 난다.
- ‘a’
- ‘b’
- ‘a’
‘b’
6. 다음 조건문의 실행 결과는?
if 3 != 5 :
print("a")
print("b")
- 에러가 난다.
- ‘a’
- ‘b’
- ‘a’
‘b’
7. 조건식이 참이 아닐 경우 실행하는 부분은?
- iif
- then
- print()
- else
8. 다음 조건문 코드의 실행 결과는?
a = 10
if a < 3 :
print ("apple")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘banana’
- ‘apple’
‘banana’
9. 다음 조건문 코드의 실행 결과는?
a = 3
if a < 7 :
print ("apple")
elif a < 5 :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
10. 다음 조건문 코드의 실행 결과는?
a = 9
if a < 7 :
print ("apple")
elif 8 <= a :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
11. 다음 조건문 코드의 실행 결과는?
a = 11
if a < 7 :
print ("apple")
elif a < 4 :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
12. 다음 조건문 코드의 실행 결과는?
a = 6
if a < 7 :
print ("apple")
if 5 <= a :
print ("mango")
elif a < 4 :
print ("kiwi")
else:
print ("banana")
- ‘apple’
‘mango’ - ‘apple’
- ‘mango’
- ‘banana’
- ‘kiwi’
4. 파이썬 반복문
1. “~하는 동안에” 라는 뜻으로 조건식이 참인 경우에만 반복 처리하는 반복문은 ?
- for
- during
- whale
- while
2. 주로 리스트의 모든 요소들을 하나씩 꺼내서 처리하는 방식의 반복문은?
- for
- during
- whale
- while
3. 다음 코드의 실행 결과는?
while True:
print("apple")
- 에러가 난다.
- 아무 것도 실행되지 않는 것처럼 보인다.
- “apple”
- “apple“이 무한히 출력된다.
4. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print(a)
- 에러가 난다.
- 아무 것도 실행되지 않는 것처럼 보인다.
- “3 4 5”
- “3“이 무한히 출력된다.
5. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print (a)
a = a + 1
- 에러가 난다.
- “3“이 무한히 출력된다.
- 3
4 - 3
4
5
6. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print (a)
a = a + 1
- 에러가 난다.
- “3“이 무한히 출력된다.
- 3
4 - 3
4
5
7. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
print(a)
- [1, 2, 3]
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1 2 3
8. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
print(item)
- [1, 2, 3]
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1 2 3
9. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item = 2 :
break
print(item)
- 에러가 발생한다.
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1e
10. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item == 2 :
break
print(item)
- 에러가 발생한다.
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1
11. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item == 2 :
continue
print(item)
- 1
2 - 1
2
3 - 2
- 1
3
공간정보플랫폼 기술융합
자료 영상
복습문제
1. 공간정보 코딩 기초
1. 프로그램 내에서 변수에 저장된 자료가 실제로 저장되는 곳은?
- CPU
- 메모리
- GPU
- HDD
2. 메모리에 다음과 같은 코드를 실행한 후의 메모리의 모습으로 맞는 것은?
a = 5
b = 10
3. 메모리에 다음과 같은 코드를 실행한 후의 메모리의 모습으로 맞는 것은?
a = 5
b = 10
a = 7
4. 다음 중 사용할 수 있는 변수명은?
- 3rd
- int
- my love
- _int
5. 기본 데이터 타입에 대해 잘못 설명한 것은?
- int : 정수
- float: 소수점이 있는 실수
- char: 문자열
- boolean: 참/거짓
6. 다음 Big-O notation을 봤을 때 가장 빠른 알고리즘은?
- O(n)
- O(log n)
- O(nlog n)
- O(1)
7. 메모리에 다음과 같이 저장된 리스트에서 컴퓨터의 입장으로 봤을 때 3번쨰에 있는 원소는?

- 복숭아
- 사과
- 포도
- 귤
8. First In First Out 을 구현한 자료구조는?
- list
- queue
- stack
- linked list
9. First In Last Out( = Last In First Out) 을 구현한 자료구조는?
- list
- queue
- stack
- linked list
10. linked list에 대해 잘못 설명한 것은?
- 메모리를 효율적으로 사용할 수 있다.
- 추가 삭제가 빠르다.
- 데이터 탐색에 시간이 오래 걸릴 수도 있다는 단점이 있다.
- ‘복숭아’, ‘사과’, ‘포도’, … 등을 위한 데이터 공간 외에는 별도의 메모리 공간이 필요없다.
11. 자료관계를 선으로 구현한 자료구조는?
- tree
- binary tree
- map
- graph
12. 탐색기의 폴더 구조와 같은 계층적 표현에 적합한 자료구조는?
- tree
- binary tree
- map
- graph
13. 모든 노드가 최대 2개의 자식 노드를 가지는 tree 형태의 자료구조는?
- tree
- binary tree
- map
- graph
14. key : value 형식으로 값을 저장하는 자료구조로 영어사전 등에서 사용하는 자료구조는?
- tree
- binary tree
- map
- graph
15. 다음 중 산술연산자에 대해 잘못 설명한 것은?
/: 나눗셈++: 1 증가--: 1감소%: 나눗셈의 몫
16. 다음 중 관계연산자에 대해 잘못 설명한 것은?
==: 같다!==: 같지 않다<=: 오른쪽이 크거나 같다>: 왼쪽이 크다
17. 다음 비트연산의 결과는?

- 111
- 110
- 010
- 101
18. 다음 코드의 결과, 변수 a에 저장되는 값은?
a = 1
a += 2
- 1
- 2
- 3
- 4
19. stack과 heap에 대한 설명 중 잘못된 것은?
- stack은 작고 빠른 반면, heap은 크고 느리다.
- stack은 동적처리에 사용되고, heap은 정적처리에 사용된다.
- 다 사용 후 stack은 OS가 자동으로 삭제해 주지만 heap은 그렇지 않아 개발자가 직접 정리해야 한다.
- stack은 관리가 용이한 작은 창고같은 느낌이라면 heap은 넓고 황량한 공터같은 느낌이다.
20. 자바 언어가 윈도우에서도, macos에서도 linux에서도, 다양한 OS에서 실행될 수 있는 이유는?
- 컴퍼넌트 방식 때문
- 대화형 언어이기 때문
- JVM(Java Virtual Machine) 구조이기 때문
- 객체지향 언어이기 때문
21. 객체지향의 4대 특성이 아닌 것은?
- abstraction(추상화)
- inheritance(상속)
- encapsulation(캡슐화)
- polymorphism(다형성)
- brevity(간결성)
22. 상위 객체에서 정의한 기능을 상속받은 하위 객체에서 재정의하는 것을 의미하는 것은?
- overloading
- overriding
- interface
- encapsulation
23. 하나의 클래스에 같은 이름의 메소드가 여러 개 있는 것을 무엇이라 하나. ?
- overloading
- overriding
- interface
- encapsulation
24. ‘나는 이 이름의 기능은 꼭 제공할꺼야’ 라는 약속을 뜻하는 것은?
- overloading
- overriding
- interface
- encapsulation
25. 좋은 설계에 대해 잘못 설명한 것은?
- 객체들 간의 의존도를 최소화한다
- 객체들끼리 서로서로 잘 알고 있다
- 객체 간 신호 전달은 이벤트를 이용한다.
- 한 번 만든 객체를 다른 프로그램에서도 사용할 수 있다
26. 버튼을 누를 때마다, 예를 들면 ’저장’이라고 적힌 버튼을 누르면 파일이 저장되는데, 이렇게 어떤 버튼을 눌렀을 때 그에 맞는 행동을 하도록 하는 것을 무엇이라 하나?
- event
- event handling
- processor
- error handling
27. 프로그램 에외 처리에 대해 잘못 설명한 것은?
- try-catch-finally 기법을 사용한다.
- 파일을 열려고 했으나 파일이 없는 등 문제가 발생할 수도 있는 코드를 try 안에 적는다.
- 실제 파일이 없어 예외 사항이 발생했다면 catch 부분이 실행된다.
- catch 부분이 실행된 경우에만 finally 부분이 실행된다.
2. 공간정보 서비스 개발
1. 웹서비스를 구성하는 서버 구성 요소에 대한 설명으로 틀린 것은?
- client: 사용자
- Web server: 클라이언트 요청 처리
- WAS: 클라이언트 요청 히스토리 관리
- DBMS: 자료 관리
2. 클라이언트에서 웹서버에 정적자료(이미지, 텍스트)만 요청할 때 벌어지는 일은?
- 웹서버에서 이미지, 텍스트 등을 찾아 클라이언트에게 돌려준다.
- 웹서버에 이어 WAS까지 이 요청 처리에 참여한다.
- 웹서버, WAS, DBMS까지 이 요청 처리에 참여한다.
- 정적자료 요청은 웹서버까지 도달하지 않고 클라이언트에서 알아서 처리된다.
3. 클라이언트에서 동적자료(데이터베이스에 저장된 자료)를 요청할 때 벌어지는 일은?
- 웹서버에서 이미지, 텍스트 등을 찾아 클라이언트에게 돌려준다.
- 웹서버에 이어 WAS까지 이 요청 처리에 참여한다.
- 웹서버, WAS, DBMS까지 이 요청 처리에 참여한다.
- 정적자료 요청은 웹서버까지 도달하지 않고 클라이언트에서 알아서 처리된다.
4. HTML은 무엇의 약자인가?
- High Text Markup Language
- High Text Makeup Language
- HyperText Markup Language
- HyperText Makeup Language
5. hypertext가 뜻하는 것은?
- 웹에서 사용되는 모든 텍스트를 hypertext라 부른다
- 빅데이터
- 빠른 속도로 전달되어야 하는 자료
- 링크
6. 태그에 대한 설명으로 틀린 것은?
- HTML 내에서 어떤 효과를 주기 위한 표시이다
- 여는 태그와 닫는 태그가 있다.
- 모든 태그는 닫아야 한다.
- 속성값을 가질 수 있고, 속성값을 여러 개일 수 있다.
7. 브라우저의 탭에 적히는 문자열을 바꿀 수 있는 태그는?
- title
- body
- head
- b
8. 웹서비스 개발 중 보통 디자이너의 영역으로 웹브라우저에서 보여지는 모양을 꾸미기 위한 것은?
- HTML
- Javascript
- CSS
- library
9. <h1> 태그는 초록색으로 보여지도록 “태그 선택자“를 설정한 코드는?
<style>h1 {color: green}</style><style>.h1 {color: green}</style><css>h1 {color: green}</css><css>.h1 {color: green}</css>
10. 태그 선택자를 이용해 h1 태그는 모두 초록색으로 보여지도록 했는데, 특정 부분은 h1 태그라 하더라도 파란색으로 보여지게 하고 싶을 사용하는 것은?
- 태그 선택자
- 외부 스타일시트
- 레이아웃
- 클래스 선택자
11. 태그 선택자를 이용해 h1 태그는 모두 초록색으로 보여지도록 했는데, 특정 부분은 h1 태그라 하더라도 파란색으로 보여지게 만든 클래스 선택자가 포함된 css 파일의 내용으로 옳은 것은?
<h1 class="want_to_blue_text">공간정보 융합</h1>
.want_to_blue_text {color: blue}want_to_blue_text {color: blue}h1.want_to_blue_text {color: blue}h1_want_to_blue_text {color: blue}
12. 특별한 어떤 모양을 보여주지는 않는 태그로, 레이아웃이나 박스 형태의 경계선 등을 만들 때 사용하는 태그는?
- box
- layout
- boxes
- div
13. HTML의 table 등에서 “테두리“를 그리기 위한 css 요소는?
- border
- box
- layout
- line
14. css의 박스 모델의 요소들에 대한 설명을 틀린 것은?

- 콘텐츠 영역: 실제로 글, 그림 등이 보여지는 영역
- padding: border부터 콘텐츠 영역까지의 안쪽 여백
- border: 테두리선
- margin: 테두리선의 두께
15. 웹 UI에서 사용자가 ‘아이폰’ 이라고 쓰인 버튼을 누르는 이벤트가 발생하면 apple() 함수를 실행하는 HTML 코드는?
<button onClick='apple()'>아이폰<button><button click='apple()'>아이폰<button><button clickd='apple()'>아이폰<button><button clickevent='apple()'>아이폰<button>
16. 간단한 정보부터 복잡한 계산, DB 검색 결과, 지도 이미지 등을 웹을 통해 기능을 배포하는 방법은?
- SDK
- App
- open API
- layout
17. OGC 표준 기술 중 하나로 지도 위에 올라갈 정보를 이미지, raster 형태로 제공하는 기술은?
- WMS
- WFS
- WCS
- WMTS
18. OGC 표준 기술 중 하나로 지도 위에 올라갈 벡터 데이터 정보를 문자열 형태로 제공하는 기술은?
- WMS
- WFS
- WCS
- WMTS
19. OGC 표준 기술 중 지도를 하나의 통으로 제공하는 것이 아닌, 큰 이미지를 잘게 쪼갠 작은 타일 형태로 제공하는 기술은?
- WMS
- WFS
- WCS
- WMTS
20. 지도 앱을 만들 때 사용하는 openLayers에 대한 설명으로 틀린 것은?
- 자바스크립트를 이용해 지도 앱을 만든다
- 여러 개의 레이어를 사용할 수 있어 주제도를 만들기 편하다
- 지도의 위치와 확대 정도(줌)을 설정할 수 있다.
- 공공기관에서는 유료로 구입해 사용해야 한다.
21. openLayers 프로젝트를 ‘test’ 라는 이름으로 생성하는 명령어로 옳은 것은?
npm create ol-app testnpm create openlayers testnpm create test projectnpm create project test
22. geoServer에 대한 설명으로 틀린 것은?
- 다양한 소스를 저장하고 있다가 WMS, WFS 등의 서비스를 제공해 지도 앱을 쉽게 만들 수 있다
- DBMS, CSV 파일과의 연계도 가능하다
- shp 파일은 사용하지 못한다는 단점이 있다.
- 무료로 사용할 수 있다.
3. 공간정보 시각화
1. “유럽 석유 조사 그룹” 이란 뜻으로 전 세계 좌표체계에 코드 번호를 부여한 것은?
- PSG
- EPSG
- MPG
- OPEC
2. 데이터베이스에서 엑셀의 하나의 컬럼(세로 줄)에 해당하는 것은?
- row
- value
- field
- DBMS
3. 다음 중 데이터베이스의 스키마에 대한 설명으로 틀린 것은?
- 외부 스키마: 개발자가 사용하는 스키마
- 개념 스키마: 조직 전체의 관점에서 데이터베이스를 정의한 스키마
- 내부 스키마: 데이터베이스가 물리적 저장장치에 저장되는 방법을 기술한 스키마
- 관리 스키마: 데이터베이스의 전체 관리를 위한 스키마
4. 도근점 정보를 관리하는 테이블을 생성하려 한다. 아래 네모 친 부분에 들어갈 코드로 적절한 것은?

- create
- make
- create table
- make table
5. 위에서 만든 도근점 테이블 dogun에 자료를 하나 insert 하는 코드로 사용할 수 있는 SQL은?
insert dogun (x, y) values (10, 20);insert into dogun (x, y, coord) value (10, 20, 4326);insert into table dogun (x, y, coord) value (10, 20, 4326);insert into dogun (x, y, coord) values (10, 20, 4326);
6. 위에서 만든 도근점 테이블 dogun에 자료를 하나 insert 하는 sql문으로 불가능한 것은?
insert into dogun (x, y) values (10, 20);insert into dogun (x, y, coord) values (10, 20, 4326);insert into dogun (x, y, coord) values (10, 20, '4326');insert into dogun (x, y, coord, name) values (10, 20, 4326, '도근1');
7. 위에서 만든 도근점 테이블 dogun에 입력한 자료의 모든 필드를 확인하는 SQL문은?
select * from dogun;select all from dogun;select fields from dogun;select all_field from dogun;
8. 위에서 만든 도근점 테이블 dogun에 입력한 자료를 도근점의 이름 순으로 정렬하는 SQL문은?
select * from dogun order name;select * from dogun where order name;select * from dogun order = name;select * from dogun order by name;
9. 위에서 만든 도근점 테이블 dogun에 입력한 자료에서, 이름이 ’도근점1’인 자료의 좌표계를 5183 으로 수정하는 SQL문은?
update dogun coord=5183 where name='도근점1';update set dogun coord=5183 where name='도근점1';update dogun set coord=5183 where name='도근점1';update dogun coord=5183;
10. 위에서 만든 도근점 테이블 dogun에 입력한 자료에서, 이름이 ’도근점1’인 자료를 삭제하는 SQL문은?
delete dogun name='도근점1';delete dogun where name='도근점1';delete from dogun name='도근점1';delete from dogun where name='도근점1';
4. 공간정보 매시업
1. 다음 설명이 뜻하는 것은?
지표상에 분포되어 있는 자연 현상과 인문 현상들의 상호관계, 입지, 속성 등에 관한 정보를 저장, 전달, 분석하기 위한 수단으로 고안된 것
- 레이어
- 레이아웃
- 메시
- 지도
2. 기능에 따른 지도의 분류로 틀린 것은?
- 일반도: 다양한 지리적 현상의 공간적 관계를 나타내는 지도
- 주제도: 특정 주제에 대한 공간적 구조, 현황 등을 나타내는 지도
- 해도: 바닷길을 알려주는 지도
- 참조도: 인문학적 특정 주제에 대해 자세한 정보를 주기 위한 지도
3. 지도에서 사용하는 명목척도에 대해 잘못 설명한 것은?
- 숫자로만 보여진다.
- 해당 자료를 구분하기 위해 사용된다.
- 분류코드표로서의 기능도 한다
- 예를 들면, 산지/농지, 하천/도로 등과 같은 구분을 한다.
4. 지도에서 사용하는 서열척도에 대해 잘못 설명한 것은?
- 순위척도라고도 한다.
- 속성의 크고 작음을 표현한다
- 값의 크고 작음을 결정하는데 대체로 정성적인 경우가 많다
- 예를 들면, 기온 등이 있다.
5. 지도에서 사용하는 등간척도에 대해 잘못 설명한 것은?
- 속성 간의 양적인 차이를 정량적으로 측정해 나타낸다
- 순위 사이의 간격이 동일하다
- 절대적인 0점이 존재한다
- 예를 들면 기온, 시간 등이 있다.
6. 지도에서 사용하는 비율척도에 대해 잘못 설명한 것은?
- 절대적인 0점이 존재한다
- 척도 4가지 중 가장 많은 정보를 제공한다
- 가장 많은 정보를 제공하지만 통계, 4칙연산등은 불가능하다
- 예를 들면 해발고도, 강수량, 연령 등이 있다.
7. 다음이 설명하는 것은?
picture와 telegram(전보)의 합성어로, 상징적인 그림문자를 이용한 언어를 초월하는 그림 언어
- 인포그래픽
- 히스토그램
- 호모그래피
- 픽토그램
8. 지도 그래픽에서 사용하는 컬러적 요소에 해당하지 않는 것은?
- 색상(hue)
- 명도(value)
- 채도(chroma)
- 선명도(clearity)
9. 지도 제작의 기본 원칙이 아닌 것은?
- 단순성(simple)
- 명료성(clear)
- 직관성(easy to read)
- 선명성(clear)
10. 특정 주제에 대한 공간적 구조, 현황, 패턴, 상호연관성을 나타내며, 기본도 위에 수치, 색채, 도형 등으로 표현하는 것을 무엇이라 하나?
- 일반도
- 주제도
- 해도
- 참조도
11. 다음 그림은 주제도 중 무엇에 해당하나?
- 점묘도
- 도형표현도
- 등치선도
- 유선도
- 단계구분도
- 왜상통계지도
- 격자형 통계지도
12. 다음 그림은 주제도 중 무엇에 해당하나?
- 점묘도
- 도형표현도
- 등치선도
- 유선도
- 단계구분도
- 왜상통계지도
- 격자형 통계지도
13. 다음 그림은 주제도 중 무엇에 해당하나?
- 점묘도
- 도형표현도
- 등치선도
- 유선도
- 단계구분도
- 왜상통계지도
- 격자형 통계지도
14. 다음 그림은 주제도 중 무엇에 해당하나?
- 점묘도
- 도형표현도
- 등치선도
- 유선도
- 단계구분도
- 왜상통계지도
- 격자형 통계지도
15. 다음 그림은 주제도 중 무엇에 해당하나?
- 점묘도
- 도형표현도
- 등치선도
- 유선도
- 단계구분도
- 왜상통계지도
- 격자형 통계지도
16. 다음 그림은 주제도 중 무엇에 해당하나?
- 점묘도
- 도형표현도
- 등치선도
- 유선도
- 단계구분도
- 왜상통계지도
- 격자형 통계지도
17. 다음 그림은 주제도 중 무엇에 해당하나?
- 점묘도
- 도형표현도
- 등치선도
- 유선도
- 단계구분도
- 왜상통계지도
- 격자형 통계지도
18. 다음이 설명하는 것은?
2개 이상의 다른 요소들을 혼합해 새로운 것을 만들어 내는 것
- join
- union
- mashup
- coupling
19. 주소를 지리좌표(위도, 경도)로 변환하는 프로세스는?
- 지오매핑
- 지오코딩
- 역지오코딩
- 역지오매핑
20. 지오코딩 가능한 공간정보 소스가 아닌 것은?
- 법정동 코드 10자리
- 지번 형태의 전체 주소
- 행정동 코드 10자리
- 연속지적도의 PNU 코드 19자리
21. 지오매핑을 위한 전문 도구에 대한 설명으로 틀린 것은?
- X-Ray Map: 공간자료를 지오코딩 후 지도에 표시해준다.
- OpenHeatMap: 비공간자료(엑셀, csv)를 지도화
- openLayers: 웹용 본격 지도 생성 라이브러리
- katograph: 웹용 벡터 데이터 표시 라이브러리
22. Leaflet과 openLayers의 특성을 순서대로 옳게 짝지은 것은?
- 데이터 시각화 도구, 지오매핑 도구
- 지오매핑 도구, 데이터 시각화 도구
- 지오매핑 도구, 3D 그래픽 도구
- 3D 그래픽 도구, 지오매핑 도구
23. 지오코딩 절차를 순서대로 나열한 것은?
ㄱ. 비공간 데이터 획득
L. 비공간 데이터 정제
ㄷ. 지오코딩 후처리
ㄹ. 주소 정보 이용 지리적 좌표값 도출
- ㄱ - ㄴ - ㄷ - ㄹ
- ㄱ - ㄹ - ㄷ - ㄴ
- ㄴ - ㄱ - ㄷ - ㄹ
- ㄱ - ㄴ - ㄹ - ㄷ
24. 지오매핑 도구로, 전문적으로 지도를 생성하고 지도의 위치, 줌 등을 조절할 수 있도록 자바스크립트로 코딩할 수 있는 본격 지도 라이브러리는?
- openLayers
- leaflet
- WMS
- InstantAtlas
인공지능 실용기술 이해와 활용 실습
이 과목에서 실습할 내용에 대해 다음과 같이 계획했었음.
1. LM Studio LLM RAG 실습
2. podman AI Lab 실습
3. ComfyUI 실습
- 로컬에서 이미지 만들기 - NetaYume Lumina
- 로컬에서 이미지 편집하기 - Flux
- 로컬에서 음악만들기 - Stable Audio
- 로컬에서 가사있는 음악만들기 - Ace Step v1
- 로컬에서 동영상 만들기 - Wan 2.1
하지만 계획과 달리 실제로는 위와 같은 내용을 다루지 않는다. 준비하다 실패했기 때문이라 함. 실제 수업 시간에 배우는 것은 AI가 아니고 알파고의 각 버전별 차이, 그리고 이세돌 9단과 커제 9단과의 대결 이후에는 크게 이슈화되지 않았던 테스트 결과들과 해체 과정이다.
관련지식
LLM RAG 실습

LM Studio 실행 후 클립 모양의 “attach a file” 버튼을 누른다.

파일 첨부를 통해 RAG를 하는 방법에 대한 설명이 나온다.
- 파일은 최대 5개까지, 합쳐서 최대 30메가까지 한 번에 첨부할 수 있음.
- 지원하는 파일 포맷은 PDF, DOCX, TXT, CSV.
- LLM에 질문할 때, 어떤 파일을 이용해서 답해야 하는지 최대한 상세하게 질의할 것. 예를 들면, “전화번호부에서 OOO 해 줘”, “공사 사규에서 OOO 해 줘“와 같은 식
- 다양하게 질문해서 어떻게 질문해야 가장 좋은 답이 나오는지 확인할 것.
여기서 “Upload File” 버튼을 누르고 파일을 찾아 파일을 첨부한다.
실습 1 - 전화번호부(CSV) 파일 내용 질의


여기서는 전화번호부-utf8.csv 파일을 첨부했다.

-
질문: 전화번호에서 연봉이 가장 큰 사람의 연봉과 전화번호 알려줘
-
답: 전화번호 데이터에서 연봉이 가장 큰 사람은 한지적이고, 연봉은 10000만원입니다. 전화번호는 010-1234-6666 입니다.
실습 2 - PDF 파일 내용 질의
행동강령.pdf 파일을 첨부한다.

관련 사규 질의
- 질문: 행동강령을 보고, 부정청탁과 관련된 사규 전부 알려줘
- 답
부정청탁 관련 행동강령 규정 요약 제공해주신 행동강령 문서를 바탕으로 부정청탁과 관련된 주요 규정을 정리했습니다. 1. 청렴서약 (제64조) 임직원은 청렴하고 공정한 직무수행과 국민으로부터 신뢰받는 공직자상 정립을 위해 청렴서약을 실시해야 합니다. 청렴서약 및 부정청탁금지법 준수 서약은 신규 임용 시 별지 제22호, 23호 서식에 따라 실시해야 합니다. 2. 청렴지킴이 (제65조) 공사의 주요 업무(지적측량, 국토정보관리, 계약 분야 등) 추진 과정의 공정성, 투명성, 책임성 확보 및 청렴 문화 확산을 위해 청렴지킴이를 구성합니다. 청렴지킴이는 종합 청렴도 향상, 고객 대상 청렴 활동, 부패 발생 요인 사전 예방 등을 수행하며, 반기별로 회의를 개최합니다. 3. 부정청탁 관련 상담 및 신고 (제54조, 55조) 금품 등 수수, 외부 강의 사례금 수수, 경조사 통지, 감독기관 부당한 요구 등 행동강령 위반 여부가 불명확한 경우 행동강령 책임자와 상담 후 처리해야 합니다. 행동강령 책임자는 상담 내용 관리를 위한 별지 제17호 서식에 따라 기록해야 합니다. 임직원이 강령 위반 사실을 알게 된 경우, 행동강령 책임자, 소속기관의 장 또는 국민권익위원회에 신고할 수 있습니다. (별지 제18호 서식 사용) 신고자의 신분은 비밀을 보장하며, 신고에 따른 어떠한 차별이나 불이익도 받지 않도록 보호해야 합니다. 4. 부당한 요구 관련 (별지 제16호, 15호) 부정청탁으로 판단되는 부당한 요구 발생 시, 관련 내용(요구 내용, 부당하다고 판단한 이유 등)을 신고할 수 있습니다. 신고는 별지 제16호, 15호 서식에 따라 진행합니다. 참고: 위에 언급된 규정들은 부정청탁과 관련된 주요 내용을 담고 있으며, 전체 행동강령 문서에는 더 자세한 내용이 포함되어 있을 수 있습니다. 더 궁금한 점이나 특정 부분에 대한 추가 정보가 필요하시면 언제든지 문의해주세요.
문제 생성

-
질문: 행동강령의 내용으로 중요한 내용만 추려서 문제를 만들고 싶어. 4지선다형으로 10문제와 답 만들어줘
-
답
행동강령 4지선다형 문제 (총 10문제) 다음은 제공된 행동강령 문서를 바탕으로 구성한 4지선다형 문제입니다. 각 문제에 대한 정답은 괄호 안에 표시되어 있습니다. 1. 임직원이 경조사 관련 금품을 받을 수 있는 금액은 다음 중 얼마까지인가? ① 5만원 이하 ② 10만원 이하 (단, 특정 조건 충족 시) (가) ③ 30만원 이하 ④ 5만원 초과 2. 감독기관 임직원이 피감기관으로부터 부당한 요구를 받을 경우, 어떤 요구를 하지 않아야 하는가? ① 법령에 근거 없는 금품 제공 요구 ② 정상적인 예우의 요구 ③ 업무 효율성을 높이기 위한 협조 요청 ④ 기관장의 개인적인 친목 도모를 위한 선물 요구 3. 임직원 간의 관계에서 지켜야 할 가장 중요한 태도는 무엇인가? ① 상사의 명령에 절대적으로 복종한다. ② 서로 존중하고, 의견을 경청하며 격려한다. (가) ③ 직장 내 파벌을 형성하여 영향력을 행사한다. ④ 비판적인 의견은 무시하고, 맹목적으로 따른다. 4. 사조직 결성은 다음 중 어떤 이유로 금지되는가? ① 업무 효율성 증진을 위해 ② 공정한 업무 수행을 저해할 수 있기 때문에 (가) ③ 조직 문화 활성화를 위해 ④ 직원들의 친목 도모를 위해 5. 임직원이 다른 임직원에게 해서는 안 되는 행위는 다음 중 무엇인가? ① 상호 간의 의견을 존중하고 격려한다. ② 성적 유혹이나 성적 수치심을 유발시키는 행위를 하지 않는다. (가) ③ 회식 자리에서 분위기를 즐기도록 권유한다. ④ 업무 관련 정보를 공유한다. 6. 임직원은 자기계발을 통해 어떤 인재상을 추구해야 하는가? ① 개인적인 욕심 충족 ② 국제화·개방화 시대에 바람직한 인재상에 부합되도록 (가) ③ 조직의 전통 유지 ④ 업무 능력 향상만 추구 7. 임직원이 고객을 대할 때 가장 중요하게 생각해야 할 것은 무엇인가? ① 회사의 이익 증진 ② 고객을 존중하고 고객의 입장에서 생각하는 것 (가) ③ 고객에게 불리한 정보 제공 ④ 고객과의 관계는 형식적으로 처리 8. 임직원이 고객의 이익을 보호하기 위해 지켜야 할 사항은 무엇인가? ① 회사 재산보다 고객 자산을 더 소중하게 보호한다. (가) ② 비도덕적인 행위로 고객의 이익을 침해하지 않는다. ③ 고객에게 불필요한 정보 제공 ④ 고객 정보를 다른 사람에게 유출 9. 직무 수행 시 지연·혈연·학연 등을 이유로 특혜를 주거나 차별하는 것은 어떤 이유로 금지되는가? ① 조직의 안정성 유지 ② 공정한 경쟁을 저해하고 불이익을 초래할 수 있기 때문에 (가) ③ 개인적인 관계 활용 ④ 업무 효율성 증진 10. 고객의 의견과 제안사항은 어떻게 처리해야 하는가? ① 무시한다. ② 경청하고 겸허하게 수용하며 신속하고 공정하게 처리한다. (가) ③ 긍정적인 의견만 수용한다. ④ 고객에게 불리한 내용만 전달한다.** 정답: (각 문제 옆에 표시됨) 참고: 위 문제는 제공된 문서를 토대로 작성되었으며, 실제 행동강령의 모든 내용을 포함하지 않을 수 있습니다. 더 자세한 내용은 전체 행동강령 문서를 참고하시기 바랍니다.
podman AI Lab 실습
podman AI Lab Extension 설치

podman AI Lab extension을 다운로드 받아 설치한다.

AI의 빠른 처리를 위해 GPU 사용을 활성화한다.
Audio To Text(whisper) 다운로드

Audio To Text에서 whisper를 다운로드 받는다.

whisper를 정상적으로 다운로드 받으면 위와 같이 표시된다.
whisper 서비스 시작

‘more details’ 버튼을 누른다.

‘start’ 버튼을 누른다.

‘Start Audio To Text recipe’ 버튼을 누른다.

자동으로 모델을 다운로드 받는다.

모델을 사용할 준비가 다 되었다.
whisper 서비스 활용

Running 섹션을 선택한 후, whisper.cpp 모델을 확인하고, ’Open AI App’을 클릭한다.

웹브라우저가 열리고 음성 인식 앱이 실행된다.

‘Browse Files’ 버튼을 눌러 mp3 파일이나 mp4 파일 등을 선택한다. 이 음성 파일의 내용을 텍스트로 변환하는 거다.

표시한 부분의 이미지가 바뀌며 음성을 텍스트로 바꾸는 작업 중임을 표시한다.

이렇게 하면 한글 음성 파일을 줬는데도 영어로 번역해서 화면에 결과를 표시해 준다. 영어로 번역하는게 기본값이기 때문이다.
번역없이 한글 그대로 출력하도록 수정
다음과 같이 번역하지 않고 한글 그대로 보여주도록 수정해 준다.

- AI Lab을 선택한다(계속 선택되어 있는 상태)
- “Running“을 선택한다.
- Actions의 … 을 선택한다.
- “Open Recipe“를 선택한다.

“Open In VSCode“를 선택한다.


이렇게 2번 정도 경고가 나오는데 모두 “예“를 선택한다.

vscode가 실행되고 whisper_client.py 라는 파일이 열린다. 좀전의 웹페이지를 만드는 파이썬 코드인데, 이 코드를 다 지우고 다음의 코드로 완전히 대체한다.
import streamlit as st
import requests
import os
import ffmpeg
st.set_page_config(page_title="Whisper Speech Recognition!", page_icon=":studio_microphone:")
st.title(":studio_microphone: Speech Recognition 한글")
st.markdown("Upload an audio file you wish to have translated!")
endpoint = os.getenv("MODEL_ENDPOINT", default="http://0.0.0.0:8001")
endpoint = f"{endpoint}/inference"
endpoint_bearer = os.getenv("MODEL_ENDPOINT_BEARER")
request_kwargs = {}
if endpoint_bearer is not None:
request_kwargs["headers"] = {"Authorization": f"Bearer {endpoint_bearer}"}
audio = st.file_uploader("", type=["wav","mp3","mp4","flac"], accept_multiple_files=False)
# read audio file
if audio:
audio_bytes = audio.read()
st.audio(audio_bytes, format='audio/wav', start_time=0)
request_kwargs["files"] = {'file': audio_bytes}
request_kwargs["data"] = {'language': 'ko', 'translate': 'false'}
response = requests.post(endpoint, **request_kwargs)
response_json = response.json()
st.subheader(f"Translated Text")
st.text_area(label="", value=response_json['text'], height=300)
else:
st.write("Input not provided")
코드는 한 두줄 수정되었는데, 한국어를 사용하고, 번역은 하지 말라는 코드를 추가했다.
request_kwargs["data"] = {'language': 'ko', 'translate': 'false'}
이 부분이 핵심이다.
이제 이 서비스를 다시 시작해야 한다. 웹페이지에서 “새로 고침“하는 것으로는 안 된다.

“Restart AI App“을 실행한다.


2번 정도 확인하는데 다시 실행하기 위해 “Confirm”, “Continue” 등의 긍정적인 답을 해준다.

이 화면이 계속 나온다. 서비스가 다시 시작되기까지 약 2-3분 정도 걸린다.
서비스가 다시 시작되면

“Open AI App” 버튼을 누른다.

이제 한글 음성이 영어로 번역되지 않고 한글로 잘 나온다.
음성인식 샘플
ComfyUI 기본 사용법
기본 사용법
화면 이동(패닝)
마우스 가운데 휠을 누르고 마우스 움직이기
화면 확대 축소(줌 인 / 줌 아웃)
마우스 가운데 휠 돌리기
템플릿 열기

comfyUI 실행하면 바로 위와 같은 템플릿이 나온다. 이 템플릿을 다시 보는 방법은 2가지가 있다.
-
메뉴에서 “템플릿 탐색” 실행

-
툴바에서 Templates 선택

결과 이미지로 워크플로 다시 로드하기
comfyUI로 만든 이미지에는 그 이미지를 만들 때의 워크플로가 저장되어 있어, 그 이미지만으로도 나중에 다시 워크플로를 로드할 수 있다.
-
comfyui로 만든 이미지를 내 PC에 저장한다.
-
새 워크플로를 연다.

-
저장했던 이미지를 워크플로에 드래그 & 드롭한다.
-
그 이미지를 만들 때 사용했던 워크플로가 다시 나타난다.
한 번에 여러 개 실행하기
compyUI를 이용해 모델에게 일을 시키면, 그 때마다 약간씩 다른 결과물을 보여준다. 문제는 결과가 나오기까지 한참 기다린 다음 실행 버튼 누르고 또 한참 기다려야 한다는 점이다.
만약 10개를 한 번에 만들어 보고 싶으면

실행 버튼 옆의 위아래 화살표를 눌러 “1“이라 되어 있는 숫자를 “10“으로 바꿔주면 된다.
이렇게 일괄 처리 해주는 것을 batch(배치) 라 한다.
이렇게 10으로 바꾸고 실행하면,

queue에 10개의 칸이 생기고 맨 아래 하나만 Running(실행) 상태이고 나머지는 Pending(대기) 상태로 표시된다.
queue에서 결과물 삭제

결과물 이미지, 동영상 등을 오른쪽 클릭한 후 “삭제” 버튼
queue에 있는 결과물을 만들었던 워크플로 다시 읽어들이기

결과물 이미지, 동영상 등을 오른쪽 클릭한 후 “워크플로 로드” 버튼
이걸 만들었던 워크플로를 다시 읽어들여 다시 사용했던 프롬프트 등을 확인할 수 있고, 다시 수정해서 다른 결과를 만드는데 사용할 수 있다.
유료 모델

유료 모델은 노드에 금액이 표시된다. 이 모델의 경우 한 번 실행할 때마다 $0.48를 지불해야 한다.

그래서 “실행” 버튼을 누르면 과금을 위한 로그인을 하라는 안내가 나온다.
ComfyUI 설치
파일 다운로드

ComfyUI 웹페이지 https://www.comfy.org에 접속한 후, “Download ConmfyUI” 버튼 클릭

“Download for Windows” 클릭, 파일 다운로드
(여기서는 0.5.5) 버전을 기준으로 함.
설치 프로그램 실행

다운로드 받은 파일을 실행한 후 “설치” 버튼을 클릭한다.

comfyUI는 특별한 설정없이 바로 설치할 수 있다.

설치가 완료되었다. 기본 설정되어 있는 “ComfyUI 실행하기” 를 체크된 채로 “마침” 버튼을 누르면 설치 완료와 동시에 ComfyUI가 실행된다.

“Get Started” 버튼을 누른다.

“nVidia CUDA” 옵션을 선택하고 “Next” 버튼을 누른다.

comfyUI가 설치될 경로를 물어보는데 이 경로는 그림과 같이 “C:\comfyui“로 하고 “Next” 버튼을 누른다.

빨간색 표시한 부분은 활용에 관한 정보를 comfyui 측에 익명으로 보낼지 여부이다. 개인 판단에 따라 켜거나 끈다.
“Install” 버튼을 누르면 설치가 실행된다. 이 설치에는 comfyui에서 사용할 python 설치도 포함된다.

설치가 완료되면 다음과 같이 comfyUI가 실행된다.

comfyui 모델 경로 등 폴더 변경
AI 모델은 용량이 상당하기 때문에 C드라이브에 다운로드받아 사용하기 어렵다. 많은 경우 C드라이브는 비싸고 빠른 SSD를 사용하고, D, E 드라이브는 데이터 전용으로 싸고 느린 HDD를 사용하기 때문이다.
이런 경우라면 AI 모델을 다운로드 받는 디렉토리를 D, E 드라이브로 바꾸는 것도 고려해 볼 수 있다. 다음의 방법으로 바꾼다.
우리처럼 desktop 버전을 설치한 경우에는 2가지 설정을 바꿔야 한다.
1. extra_model_paths.yaml 파일 변경
가. extra_model_paths.yaml 파일 열기

위 방법으로 “extra_model_paths.yaml” 파일을 연다.
파일의 내용은 다음과 같다.
# ComfyUI extra_model_paths.yaml for win32
comfyui_desktop:
is_default: "true"
custom_nodes: custom_nodes/
download_model_base: models
base_path: C:\comfyui
desktop_extensions:
custom_nodes: C:\Users\USER\AppData\Local\Programs\ComfyUI\resources\ComfyUI\custom_nodes
여기서 “base_path: C:\comfyui” 부분을 바꿔준다. 이 값은 사람마다 다 다를 수 있다. 중요한 것은 C:\comfyui 위치(이하 A위치라 하겠음)에 있는 것을 우리가 원하는 것으로 바꿔주는 것이다.
가. 파일 복사
바꿔주기 전에 먼저 탐색기를 열어 저 A 위치로 가자. 우리가 할 일은 A 의 내용을 그대로 새로운 폴더(D:\comfyui, 이하 B)로 복사할 거기 때문에 미리 복사해 놔야 원래 값이 뭐였지 하며 고민하는 수고를 하지 않을 수 있다.
그러니 먼저 A 폴더를 복사해 B위치에 가도록 복사해 놓자.
나. extra_model_paths.yaml 파일 변경 마무리
다시 extra_model_paths.yaml로 돌아오자.
여기서는 D:\comfyui로 바꿔주겠다.
base_path: D:\comfyui
위와 같이 D 혹은 E 드라이브로 바꿔준다.
다. comfyui 종료
comfyui를 종료한다.
2. config.json 파일 설정
탐색기에서 %appdata%/comfyui 로 간다. 주소가 조금 이상한데 저대로 복사해서 탐색기 주소 넣는 부분에 넣으면 된다.
그 폴더 안에 config.json 파일이 있다. 혹시 모르니 복사, 붙여넣기를 바로 해서 이 파일의 복사본을 만들어 놓고 (그럼 config.json - 복사본 파일이 만들어진다), config.json 파일을 메모장으로 연다.
{
"installState": "installed",
"detectedGpu": "nvidia",
"basePath": "C:\\comfyui",
"versionConsentedMetrics": "0.5.5",
"selectedDevice": "nvidia",
"hasGeneratedSuccessfully": true
}
위와 같이 되어 있는데 여기서 basePath 부분을 수정한다. B 로 바꾸면 된다. 내 경우엔
"basePath": "D:\\comfyui",
으로 수정했다.
재실행
comfyui를 닫고 다시 실행한다.
ComfyUI - NetaYume Lumina
NetaYume Lumina 모델 기본

이미지 관련 템플릿이 많지만 여기서 NetaYume Lumina 모델을 선택한다. 이 모델은 텍스트를 이미지로 바꿔준다.
샘플값으로 실행해 보기

위와 같이 이 템플릿을 열자마자 바로 “실행” 버튼을 누른다. 샘플로 적혀 있는 내용으로 이미지가 만들어진다.
샘플로 적혀 있는 내용은 다음과 같다.
You are an assistant designed to generate high quality anime images based on textual prompts. <Prompt Start> @comfyanonymous, "Warm and cheerful digital illustration of a girl standing in the middle of an orange grove, surrounded by lush green leaves and ripe, vibrant oranges hanging from the trees. She has chestnut-brown hair tied in a single loose braid draped over her shoulder, with soft bangs framing her bright, smiling face.
Her expression is full of joy and sunshine—eyes squinting slightly, mouth open in a wide, carefree smile, radiating pure happiness. She wears a crisp white blouse underneath a black jacket, slightly unbuttoned for a relaxed look. The sunlight filters through the leaves above, casting dappled golden light on her hair and shoulders, creating a warm, inviting atmosphere.
A few oranges hang close to her head, and one or two lie on the ground around her feet. The background features soft-focus trees stretching into the distance, with sunlight breaking through the foliage. The art style is painterly and soft, emphasizing the natural setting and the girl's radiant, wholesome charm."
이미지 내용 서술은 영어로 한다.
이미지 내용 서술은 2가지로 하는데, 하나는 이렇게 만들어 달라는 뜻의 Positive Prompt(긍정적 서술) 이고 다른 하나는 이렇게는 만들지 말아달라는 뜻의 Negative Prompt(부정적 서술) 이다.
샘플로 적혀 있는 Negative Prompt는 다음과 같다.
You are an assistant designed to generate low-quality images based on textual prompts <Prompt Start> blurry, worst quality, low quality, jpeg artifacts, signature, watermark, username, error, deformed hands, bad anatomy, extra limbs, poorly drawn hands, poorly drawn face, mutation, deformed, extra eyes, extra arms, extra legs, malformed limbs, fused fingers, too many fingers, long neck, cross-eyed, bad proportions, missing arms, missing legs, extra digit, fewer digits, cropped
샘플로 적혀 있는 Negative Prompt가 충분히 훌륭하니 특별한 이유가 없다면 수정하지 않는 것이 좋겠다.
prompt 입력해 이미지 만들기
이제 Positive Prompt를 수정해 내가 원하는 이미지를 만들어 보자.
prompt는 먼저 한글로 쓴 다음, 영어로 번역해 사용한다.
구글 번역 사이트를 이용하면 편하다.
구글 번역 사이트 url: https://translate.google.co.kr/?sl=ko&tl=en&op=translate
다음과 같이 사용할 수 있다.

여기서 입력한 내용은 다음과 같다.
파란 하늘 아래 깨끗한 바다가 있고, 바다 위에 노란색 돛을 단 멋진 요트가 있고 그 배의 맨 앞에 하얀색 예쁜 고양이가 앞쪽을 바라보고 있는 이미지
번역된 내용은 다음과 같다.
An image of a clear sea under a blue sky, a beautiful yacht with yellow sails on the sea, and a pretty white cat at the very front of the ship looking forward.

positive prompt 부분에 위와 같이 붙여 넣은 후 “실행” 버튼을 누른다.

왼쪽 툴바에서 “Queue” 버튼을 누르면 실행 대기열이 나오고, 여기에 여태 실행한 내역과 현재 실행 중인 내역이 나타난다.

약 1분 후 결과가 나타난다. 의도했던 바와는 약간 다르게 나타났지만.
결과 저장

위와 같이 생성된 파일을 내 컴퓨터에 저장할 수 있다.
ComfyUI - Flux 인페인트 워크플로
Flux 인페인트 워크플로 기본

이미지 편집. 예를 들면 토끼 이미지에 옷을 입힌다거나 하는 식.

이런 류의 모델을 사용하려면 알파채널에 대해 이해해야 한다. 위 경우에서는 하얀 귀여운 크리처(creature)를 놓을 위치를 알파채널을 통해 AI 모델에게 알려줘야 하기 때문이다.
실습 1: comfyUI에서 생성한 이미지 사용

워크플로 실행
-
툴바에서 “Queue“를 선택한다.
-
이미 만들었던 결과물 중 하나를 Upload Image 쪽으로 드래그 & 드롭한다.
2.1. 다음의 방법으로 효과가 나타날 영역을 알파채널로 표시한다.
2.2. 이미지를 오른쪽 클릭하고 “Open in MaskEditor | Image Canvas” 메뉴를 선택한다.
2.3. 마스크 에디터에서 AI가 편집해 줘야 하는 영역을 마우스 왼쪽 버튼을 누른 채로 문질러 표시하고 “완료” 버튼을 누른다.
2.4. 노드에 반영된 걸 확인한다.
-
프롬프트를 적는다. 여기서는 “A very cute white milky creature on her shoulder (어깨 위에 아주 귀여운 우윳빛깔 생물)” 라고 적었다.
-
“실행” 버튼을 누른다.
실행 결과

실습 2: 다운로드받은 이미지 사용
편집에 사용할 이미지 준비
https://pixabay.com/illustrations/cartoon-easter-bunny-cartoon-bunny-7011655
위 url에서 이미지 다운로드 받아 사용

워크플로 실행

-
“업로드할 파일 선택” 버튼을 눌러 다운로드받은 토끼 이미지를 선택한다.
1.1. 위 실습 1의 2.1 부분의 방법으로 토끼의 몸통과 한 쪽 귀에 마스킹을 한다.
-
수정할 내용을 입력한다.

한글
토끼에게 파란색 코트를 입혀주고, 귀에 작은 빨간 모자를 씌워줘영문
Dress the rabbit in a blue coat and put a little red hat -
“실행” 버튼을 누른다.
실행 결과

의도한 바와 조금 다른 결과가 나왔다. 파란 코트는 잘 입혀줬는데 귀에 작은 빨간 모자를 씌워주지 않았다.
한 번에 한 곳에만 마스킹을 하고 일을 시켜야 잘 해준다. 그래서 1의 방법을 이용해 추가로 작업한다.
실행 결과를 이용해 계속 작업

작업 결과물을 소스 이미지 영역에 드래그 & 드롭 한다.

귀 부분만 마스킹한다. 그리고 내용도 수정한다.

put a little red hat on rabbit's ear
그리고 마스킹을 귀에만 수정한 다음 실행 버튼을 눌러준다.
결과는 다음과 같다.

마스킹 수정

위 방법으로 마스킹을 수정하는데 마스킹하는 영역을 더 크게 해야 모자가 귀를 다 덮을 듯 하다.

위와 같이 마스킹을 수정하고 prompt도 아래와 같이 수정(little을 뺌)하고 다시 실행해 본다.
put a red hat on rabbit's ear
수정된 실행 결과

이 결과도 마음에 들지 않아 문구를 다음과 같이 수정했다.
put a long red hat on rabbit's ear

마스킹 삭제 방법
만약 마스킹을 삭제 등 수정해야 한다면 다음과 같이 한다.

마스킹을 수정하기 위해 업로드한 이미지 부분을 오른쪽 클릭하고 “Open in MaskEditor | Image Canvas” 를 또 선택한다.

- 지우개를 누르고,
- 코트를 위해 칠했던 부분을, 마우스 왼쪽을 누른 채로 마우스를 움직여 지워준다.

브러시 설정의 두께 값을 올려주면 브러시가 커져서 지우거나 색칠할 때 편하다.

위와 같이 귀만 남기고 코트 부분의 마스킹을 지워, 마스킹을 수정했다.
ComfyUI - Stable Audio 워크플로
Stable Audio 워크플로 기본

음악을 만들어 준다.
이 워크플로에서는 2가지를 설정해 줘야 한다.

- 길이: 기본값이 47.6초인데, 길면 길수록 시간이 오래 걸린다. 여기서는 10초로 설정한다.
- prompt: 음악의 내용
워크플로 실행
- 길이를 10초로 설정한다. 초의 숫자 부분을 클릭하면 숫자를 입력할 수 있는 창이 나타난다.

- prompt: calm piano solo for media opening
- “실행” 버튼을 누른다.
실행 결과
결과 듣기

queue에서 play 버튼을 누르면 재생할 수 있다.
결과 mp3 파일 다운로드

… 버튼을 누른 다음,

다운로드 버튼을 누른다.
ComfyUI - ACE-Step v1 워크플로
ACE-Step v1 워크플로 기본

가사를 불러주는 보컬이 있는 음악을 만들어 준다.
이 워크플로에서는 크게 4가지를 설정해 줘야 한다.

- 길이: 길이가 길면 길수록 시간이 오래 걸린다.
- prompt: 음악의 내용.
- Verse: 곡의 도입부 가사. 영어로만 작성한다. 한글은 아직 안된다.
- Chorus: 우리말로 하면 하이라이트 부분 가사. 후렴부이다. 역시 영어로만 작성한다.
워크플로 실행
- 길이를 40초로 설정한다.
- prompt: kpop, piano, acoustic guitar, happy, synth
- Verse(도입부 가사): 샘플의 기본값 그대로 사용.
Neon rain on my screen,Dreams compile in silver sheen. No weight, just motion,I’m plugged into emotion.
- Chorus(후렴부 가사): 샘플의 기본값 그대로 사용
Comfy Cloud — breathing light, Code and color, spark and wire. Drift through data, feel alive,In your circuits, I arrive.
- “실행” 버튼을 누른다.
실행 결과
결과 듣기

queue에서 play 버튼을 누르면 재생할 수 있다.
결과 mp3 파일 다운로드

… 버튼을 누른 다음,

다운로드 버튼을 누른다.
ComfyUI - Wan 2.1 텍스트 to 비디오 워크플로
Wan 2.1 텍스트 to 비디오 워크플로 기본
텍스트로 동영상을 만들어 준다.

이 워크플로에서는 크게 4가지를 설정해 줘야 한다.

- 너비: 동영상 한 프레임의 폭. 클수록 처리 시간이 오래 걸린다.
- 높이: 동영상 한 프레임의 높이. 클수록 처리 시간이 오래 걸린다.
- 길이: 동영상의 시간 길이를 프레임단위로 설정할 수 있다. 이 워크플로의 기본값은 1초에 16프레임을 보여주도록 설정되어 있다. 그래서 32라 적으면 2초, 160 이라 적으면 10초 짜리 영상이 만들어진다. 길수록 처리 시간이 오래 걸린다.
- prompt: 영상의 내용. 영어로 적는다.
워크플로 실행 1 - 기본값 그대로
- 너비: 기본값 832를 그대로 둔다.
- 높이: 기본값 480을 그대로 둔다.
- 길이: 33을 그대로 둔다. 약 2초 짜리 영상이 만들어진다.
- prompt: 기본값 그대로 둔다.
실행 결과
2초 영상. 약 8분 걸림
워크플로 실행 2 - 내가 원하는 prompt로
- 너비: 기본값 832를 그대로 둔다.
- 높이: 기본값 480을 그대로 둔다.
- 길이: 33을 그대로 둔다. 약 2초 짜리 영상이 만들어진다.
- prompt: a penguin is walking on the white land, and camera is tracking his back. (펭귄이 하얀 땅위를 걷고 있고, 카메라가 그 뒤를 따른다.)
실행 결과
2초 영상. 약 3분 걸림
워크플로 실행 3 - 내가 원하는 prompt로
- 너비: 기본값 832를 그대로 둔다.
- 높이: 기본값 480을 그대로 둔다.
- 길이: 33을 그대로 둔다. 약 2초 짜리 영상이 만들어진다.
- prompt: penguins diving in a line from a snow-covered ground about 3 meters high into the sea 3 meters below.(펭귄들이 줄지어 약 3미터 높이의 눈덮인 땅 위에서 3미터 아래의 바다로 다이빙하는 영상)
실행 결과
2초 영상. 약 3분 걸림
워크플로 실행 4 - 내가 원하는 prompt로
- 너비: 기본값 832를 그대로 둔다.
- 높이: 기본값 480을 그대로 둔다.
- 길이: 33을 그대로 둔다. 약 2초 짜리 영상이 만들어진다.
- prompt: A puppy jumps into the pool water and plays happily(강아지가 수영장에서 즐겁게 노는 영상)
실행 결과
10초 영상. 약 6시간 걸림(아마도 물을 처리하느라)
AI 이해 및 활용

LM Studio 설치
version : 0.3.37(2026. 1. 12.)
1. 설치 파일 다운로드
설치 파일 다운로드 URL: https://lmstudio.ai

https://lmstudio.ai 사이트에 접속해 [Download for Windows] 버튼을 클릭해 파일을 다운로드받는다.
2. 설치파일 실행

다운로드받은 설치파일을 실행한다.




3. 프로그램 실행

LM Studio 사용 일반
1. AI 모델 다운로드받기-Gemma 3
사용할 모델: Gemma 3n E4B

2. AI 모델 로드
AI 모델을 사용하려면 AI 모델을 LM Studio에 로드해야 한다.
방법 1. AI 모델 다운로드 완료 직후
AI 모델(여기서는 Gemma 3) 다운로드가 완료되면 아래와 같이 창이 나타난다. Load Model 버튼을 클릭한다.

방법 2. AI 모델 다운로드 상관없이



①에서 클릭한 부분에 현재 로드한 AI 모델명이 나타난다.
3. AI 모델 사용

AI를 이용한 일반적인 chatting이 가능하다.
이 AI는 컴퓨터의 랜선을 뽑아도(네트워크 연결을 끊어도) 사용이 가능한 모델로, 외부 서버를 사용하지 않고 내 컴퓨터에서만 실행되어 보안이 유지된다.

LM Studio LLM RAG 실습

LM Studio 실행 후 클립 모양의 “attach a file” 버튼을 누른다.

파일 첨부를 통해 RAG를 하는 방법에 대한 설명이 나온다.
- 파일은 최대 5개까지, 합쳐서 최대 30메가까지 한 번에 첨부할 수 있음.
- 지원하는 파일 포맷은 PDF, DOCX, TXT, CSV.
- LLM에 질문할 때, 어떤 파일을 이용해서 답해야 하는지 최대한 상세하게 질의할 것. 예를 들면, “전화번호부에서 OOO 해 줘”, “공사 사규에서 OOO 해 줘“와 같은 식
- 다양하게 질문해서 어떻게 질문해야 가장 좋은 답이 나오는지 확인할 것.
여기서 “Upload File” 버튼을 누르고 파일을 찾아 파일을 첨부한다.
여기서는 전화번호부-utf8.csv 파일을 첨부한다.
첨부한 엑셀 파일의 내용

실습 1 - 전화번호부(CSV) 파일 내용 질의

Upload file 을 하면 위와 같이 표시된다.

-
질문: 전화번호부에서 연봉이 가장 높은 사람의 연봉과 전화번호 알려줘
-
답: 전화번호부에서 연봉이 가장 높은 사람은 한지적님이며, 연봉은 10000만원입니다. 전화번호는 010-1234-6666 입니다.
실습 2 - PDF 파일 내용 질의
나라장터에서 측량 관련 발주 문서를 검색해서 사전규격공개 문서를 다운로드 받는다.

hwp 문서를 pdf로 변환해 사용한다.(LM Studio는 hwp 문서를 읽지 못한다)
- 질문: 과업지시서의 용역을 수주하고 싶어. 수주하기 위한 전략 세워줘.
MCP
1. MCP를 이용한 드론 조종
2. MCP를 이용한 3D 그래픽(blender) 사용
3. MCP를 이용한 엑셀 사용
4. MCP를 이용한 QGIS 사용
복습문제
1. AI 기법으로 학습시켜 놓은 결과물은?
- 알고리즘
- 라벨
- 모델
- RAG
2. 아이스크림 판매량 예측 등 대부분의 예측은 기존 데이터를 기반으로 한다. 사람이 2차원 그래프 그려가며 예측해도 충분한데 AI에게 학습시켜 판매량 예측시키는 이유는?
- 사람은 실수를 많이 하기 때문에 그러한 실수를 미연에 방지하려고
- 사람은 각자의 이해관계와 목적에 따라 판매량 예측 등의 결과를 왜곡할 수 있기 때문
- 여러 요소를 고려하려면 3차원 그래프 이상이 필요한데, AI는 그래프를 그리지 않고도 몇 십가지 요소를 모두 고려한 판매량 예측이 가능하기 때문
- 사람이 예측하나 AI가 예측하나 결국 엑셀의 기능을 이용해 결과를 예측하는데 AI가 조금 더 엑셀과 가깝기 때문
3. AI 학습을 통해 다음과 같은 수식이 완성되었다. 이 때 a 와 b 를 일컫는 AI 용어는?
판매량 예측 = a * 온도 + b * 습도 + c
- chatGPT
- 알고리즘
- 가중치
- 라벨
4. AI 학습을 위해, 기존 데이터에 사람의 의미를 부여한 값(예: 스펨메일인가 아닌가)을 추가로 AI에게 전달하는 것을 무엇이라 하는가?
- 신경망
- 딥러닝
- LLM
- 라벨
5. AI 모델을 공유하는 사이트는?
- models
- huggingface
- rag
6. 인간의 언어로 학습한 모델로, chatGPT와 같이 인간의 언어를 이해하고 답을 주는 AI 관련 기술은?
- LLM
- MCP
- RAG
- LoRA
7. fine tuning에 대해 제대로 설명한 것은?
- 처음 설계부터 모델을 만들어 내는 것을 뜻한다.
- 다른 사람이 설계한 모델을 학습만 내가 시키는 것을 뜻한다.
- 다른 사람이 만든 모델에 약간의 학습만 더 시키는 것을 뜻한다.
- 다른 사람이 만든 모델에 모델명만 바꿔서 사용하는 것을 뜻한다.
8. RAG 기술에 대해 틀린 것은?
- AI 모델을 처음부터 만들지 않고도 내가 원하는대로 동작하게 만드는 기술 중 하나이다.
- 별도의 학습과정 없이도 pdf 파일, 텍스트 파일, 엑셀 파일 등을 AI 모델이 이용하게 하는 기술이다.
- AI 모델에 별도의 학습을 더 시키지 않고도 내가 원하는대로 동작하게 만드는 기술 중 하나이다.
- 기존 모델에 약간의 학습을 더 시켜야 해서 사용하기 까다롭다.
9. LLM에 대한 해킹 시도로 볼 수 없는 것은?
- LLM이 학습할 원본 자료를 잘못된 자료로 제공하는 것
- 학습 원본 데이터 탈취 시도
- LLM을 무료로 사용하는 것
- LLM이 답할 수 없는 민감한 정보를 오랜 시간 우회 요청 끝에 끝내 답하게 하는 것
영업전문가 2026
저작권 걱정없이 다운로드받아 사용할 수 있는 사이트들
주의사항: 모든 자료에 대해 반드시 건별로 라이선스 확인해야 함.
업데이트: 2026. 2. 28.
관련 용어
public domain
- 공적 사용 라이선스. 누구나 무료로 사용 가능함. 상업적 사용 가능 포함.
- CC0: public domain 표기법 중 하나.
- 나무위키 설명: 링크
- 라이선스 관련 사이트: Creative Commons
- 아래 사이트에서 CC0 라이선스로 공시한 걸 보고 다운로드 받아 사용했는데, 업로드한 사람이 다른 사람의 작품을 속여서 업로드한 거라면 소송에 휘말릴 수 있음
- 업로드한 이미지가 한 두개만 있는 사람이 올린 자료는 가급적 피한다.
- 한 사람이 여러 개 올렸어도 화풍이 확연히 다른 이미지는 가급적 피한다.
attribution
- 원래는 속성, 원인, 책임 등의 뜻을 가지는데, 라이선스 분야에서는 “출처 표시” 라는 뜻으로 사용된다.
- 예: without attribution = “출처 표시없이”
commercial use
- 상업적 사용
- 사용 예(iconmonstr의 Q&A 발췌):

pixabay
- URL: https://pixabay.com
- 사진, 그림, 비디오, 오디오, 음향효과 등 제공.
- 자료 제공자가 처음부터 라이선스를 요청하지 않을 것(royalty free)에 동의하고 올리기 때문에 문제없이 사용할 수 있음
- 사진 업로드 승인이 잘 나지 않음 = 고퀄리티 사진 제공
- 검색어는 영어만 가능
공유마당
- URL: https://gongu.copyright.or.kr
- 사진, 비디오, 영상, 글꼴 등 제공
- 저작권이 만료된 오래된 자료나 자료 제공자가 공공 사용을 전제로 하고 업로드 하는 경우가 대부분
- 주의 사항: 자료 제공자가 다양한 라이선스 요청하고 있음.(예: 음악을 동영상 제작에 사용 시, 작곡자를 동영상에 몇 초 이상 표시할 것) 따라서 사용 전에 라이선스를 반드시 확인해야 함.
퍼블릭 벡터
- URL: https://publicdomainvectors.org
- CC0의 벡터 이미지만 공유하는 사이트
- 위 아래 광고
아이콘몬스터
- URL: https://iconmonstr.com
- 아이콘 다운로드 받아 사용
- 변형없이 그대로 사용해야 한다는 라이선스
- 단순 다운로드가 아니라 크기, 선색 등 변경 가능
눈누
- URL: https://noonnu.cc
- 글꼴을 모아 보여주고 체험할 수 있는 사이트
- 이 사이트의 모든 글꼴이 다 무료는 아님
- 무료였던 글꼴이 유료로 바뀌는 경우도 있으니 사용할 때마다 확인하고 라이선스 파일을 다운로드 받아 잘 저장해야 함
- 글꼴은 네이버 글꼴을 사용하는 것이 저작권상 안전하다
- 한컴 오피스에서 제공하는 글꼴을 한컴 오피스 외 (예: 파워포인트)에서 사용은 가능하지만, 라이선스 위반임.
유튜브 스튜디오
- 주의사항: 음악, 효과음등 제공하지만 이 애셋들을 이용해 만든 영상은 유튜브에만 올려야 함. 유튜브 스튜디오에서 제공하는 애셋을 이용해 만든 영상을 유튜브 외에 올리면 라이선스 위반.
클라우드 AI 활용
테스트를 위해 무료로 사용할 수 있는 클라우드 AI들
huggingface
-
일상 공유는 인스타그램으로, 내가 만든 AI 모델 공유는 허깅페이스로.
-
로그인없이도 spaces 사용 가능
-
spaces: 허깅페이스에 공유된 AI 모델을 다운로드받지 않고 클라우드 AI로 사용해 볼 수 있는 기능. 하루에 짧은 시간 동안만 사용 가능(유료)
deepAI
-
이미지, 비디오, 음악, 목소리 등 생성
-
URL: https://deepai.org
-
로그인없이도 잠깐 이용 가능
-
한국어 사용 불가
AI-Free-Forever
-
회원 가입, 로그인없이 사용 가능한 AI 모음
-
무료인만큼 서버의 GPU 사용가능할 때까지 줄서서 기다려야 함.
microsoft 코파일럿
- 윈도우 내 바로가기 키:

허깅페이스 spaces - FireRed Image Edit

spaces에서 이번 주 핫한 모델인 FireRed Image Edit 1.0 Fast 선택

여기서는 아래쪽에 샘플을 이용한다.
사람 이미지와 옷 이미지를 동시에 넘겨주면 사람이 입은 옷을 바꿀 수 있다.
로컬 AI 활용 - ComfyUI
기본 사용법
화면 이동(패닝)
마우스 가운데 휠을 누르고 마우스 움직이기
화면 확대 축소(줌 인 / 줌 아웃)
마우스 가운데 휠 돌리기
템플릿 열기

comfyUI 실행하면 바로 위와 같은 템플릿이 나온다. 이 템플릿을 다시 보는 방법은 2가지가 있다.
-
메뉴에서 “템플릿 탐색” 실행

-
툴바에서 Templates 선택

결과 이미지로 워크플로 다시 로드하기
comfyUI로 만든 이미지에는 그 이미지를 만들 때의 워크플로가 저장되어 있어, 그 이미지만으로도 나중에 다시 워크플로를 로드할 수 있다.
-
comfyui로 만든 이미지를 내 PC에 저장한다.
-
새 워크플로를 연다.

-
저장했던 이미지를 워크플로에 드래그 & 드롭한다.
-
그 이미지를 만들 때 사용했던 워크플로가 다시 나타난다.
한 번에 여러 개 실행하기
compyUI를 이용해 모델에게 일을 시키면, 그 때마다 약간씩 다른 결과물을 보여준다. 문제는 결과가 나오기까지 한참 기다린 다음 실행 버튼 누르고 또 한참 기다려야 한다는 점이다.
만약 10개를 한 번에 만들어 보고 싶으면

실행 버튼 옆의 위아래 화살표를 눌러 “1“이라 되어 있는 숫자를 “10“으로 바꿔주면 된다.
이렇게 일괄 처리 해주는 것을 batch(배치) 라 한다.
이렇게 10으로 바꾸고 실행하면,

queue에 10개의 칸이 생기고 맨 아래 하나만 Running(실행) 상태이고 나머지는 Pending(대기) 상태로 표시된다.
queue에서 결과물 삭제

결과물 이미지, 동영상 등을 오른쪽 클릭한 후 “삭제” 버튼
queue에 있는 결과물을 만들었던 워크플로 다시 읽어들이기

결과물 이미지, 동영상 등을 오른쪽 클릭한 후 “워크플로 로드” 버튼
이걸 만들었던 워크플로를 다시 읽어들여 다시 사용했던 프롬프트 등을 확인할 수 있고, 다시 수정해서 다른 결과를 만드는데 사용할 수 있다.
유료 모델

유료 모델은 노드에 금액이 표시된다. 이 모델의 경우 한 번 실행할 때마다 $0.48를 지불해야 한다.

그래서 “실행” 버튼을 누르면 과금을 위한 로그인을 하라는 안내가 나온다.
ComfyUI 설치
파일 다운로드

ComfyUI 웹페이지 https://www.comfy.org에 접속한 후, “Download ConmfyUI” 버튼 클릭

“Download for Windows” 클릭, 파일 다운로드
(여기서는 0.8.11) 버전을 기준으로 함.
설치 프로그램 실행

다운로드 받은 파일을 실행한 후 “설치” 버튼을 클릭한다.

comfyUI는 특별한 설정없이 바로 설치할 수 있다.

설치가 완료되었다. 기본 설정되어 있는 “ComfyUI 실행하기” 를 체크된 채로 “마침” 버튼을 누르면 설치 완료와 동시에 ComfyUI가 실행된다.

“Get Started” 버튼을 누른다.

실행 중 위와 같이 git 프로그램이 없으니 설치하겠다는 메시지가 나온다.
“Open git downloads page” 버튼을 눌러준다.

- “windows“를 선택하고,
- 윈도우용 프로그램을 다운로드 받아 실행한다.

설치를 시작한다. 옵션이 굉장히 많이 나오는데 그냥 모두 “Next” 버튼을 눌러주자.


“nVidia CUDA” 옵션을 선택하고 “Next” 버튼을 누른다.

comfyUI가 설치될 경로를 물어보는데 이 경로는 그림과 같이 “C:\comfyui“로 하고 “Next” 버튼을 누른다.

빨간색 표시한 부분은 활용에 관한 정보를 comfyui 측에 익명으로 보낼지 여부이다. 개인 판단에 따라 켜거나 끈다.
“Install” 버튼을 누르면 설치가 실행된다. 이 설치에는 comfyui에서 사용할 python 설치도 포함된다.

설치가 완료되면 다음과 같이 comfyUI가 실행된다.

comfyui 모델 경로 등 폴더 변경
AI 모델은 용량이 상당하기 때문에 C드라이브에 다운로드받아 사용하기 어렵다. 많은 경우 C드라이브는 비싸고 빠른 SSD를 사용하고, D, E 드라이브는 데이터 전용으로 싸고 느린 HDD를 사용하기 때문이다.
이런 경우라면 AI 모델을 다운로드 받는 디렉토리를 D, E 드라이브로 바꾸는 것도 고려해 볼 수 있다. 다음의 방법으로 바꾼다.
우리처럼 desktop 버전을 설치한 경우에는 2가지 설정을 바꿔야 한다.
1. extra_model_paths.yaml 파일 변경
가. extra_model_paths.yaml 파일 열기

위 방법으로 “extra_model_paths.yaml” 파일을 연다.
파일의 내용은 다음과 같다.
# ComfyUI extra_model_paths.yaml for win32
comfyui_desktop:
is_default: "true"
custom_nodes: custom_nodes/
download_model_base: models
base_path: C:\comfyui
desktop_extensions:
custom_nodes: C:\Users\USER\AppData\Local\Programs\ComfyUI\resources\ComfyUI\custom_nodes
여기서 “base_path: C:\comfyui” 부분을 바꿔준다. 이 값은 사람마다 다 다를 수 있다. 중요한 것은 C:\comfyui 위치(이하 A위치라 하겠음)에 있는 것을 우리가 원하는 것으로 바꿔주는 것이다.
가. 파일 복사
바꿔주기 전에 먼저 탐색기를 열어 저 A 위치로 가자. 우리가 할 일은 A 의 내용을 그대로 새로운 폴더(D:\comfyui, 이하 B)로 복사할 거기 때문에 미리 복사해 놔야 원래 값이 뭐였지 하며 고민하는 수고를 하지 않을 수 있다.
그러니 먼저 A 폴더를 복사해 B위치에 가도록 복사해 놓자.
나. extra_model_paths.yaml 파일 변경 마무리
다시 extra_model_paths.yaml로 돌아오자.
여기서는 D:\comfyui로 바꿔주겠다.
base_path: D:\comfyui
위와 같이 D 혹은 E 드라이브로 바꿔준다.
다. comfyui 종료
comfyui를 종료한다.
2. config.json 파일 설정
탐색기에서 %appdata%/comfyui 로 간다. 주소가 조금 이상한데 저대로 복사해서 탐색기 주소 넣는 부분에 넣으면 된다.
그 폴더 안에 config.json 파일이 있다. 혹시 모르니 복사, 붙여넣기를 바로 해서 이 파일의 복사본을 만들어 놓고 (그럼 config.json - 복사본 파일이 만들어진다), config.json 파일을 메모장으로 연다.
{
"installState": "installed",
"detectedGpu": "nvidia",
"basePath": "C:\\comfyui",
"versionConsentedMetrics": "0.5.5",
"selectedDevice": "nvidia",
"hasGeneratedSuccessfully": true
}
위와 같이 되어 있는데 여기서 basePath 부분을 수정한다. B 로 바꾸면 된다. 내 경우엔
"basePath": "D:\\comfyui",
으로 수정했다.
재실행
comfyui를 닫고 다시 실행한다.
로컬에서 이미지 만들기 - SDXL Turbo

comfyui 템플릿에서 다음과 같이 SDXL 터보를 선택한다.

모델이 없다는 메시지가 나오면 그 아래 모델 목록에서 전부 “다운로드” 버튼을 누른다. 다운로드가 완료되면 그 때 이 기능을 사용할 수 있다.

- 프롬프트를 (반드시 영어로) 입력하고
- “실행” 버튼을 누른다.
제미나이에게 프롬프트를 물어보는 것은 매우 훌륭한 전략이다.

질문:
sdxl turbo를 이용해 그림을 그리는데, 측량사들이 장비를 이용해 측량하는 그림을 지브리 스타일로 그리고 싶어. 프롬프트 만들어줘
답:
Studio Ghibli style, a professional surveyor using a yellow total station on a tripod, lush green rolling hills, fluffy white cumulus clouds, blue sky, cinematic lighting, hand-drawn aesthetic, high detail, vibrant colors, scenery by Hayao Miyazaki.
결과:

공간정보정책과 디지털 트윈국토 이해
학습 자료
제7차 국가공간정보정책 기본계획
공간정보정책과 인공지능
실습 1.
3-1. 화재여부 판단 AI 모델 학습 상세과정
디지털트윈 활용 실무
실습 1
dictionary
알파채널
이미지의 투명도를 정하는 채널. 배경이 투명한 이미지를 만들려면 알차채널을 이용해야 한다.
png 등의 이미지 파일은 작은 점(픽셀)로 이루어져 있다. 이 각각의 점들마다 투명도를 정해주는게 알파채널.
알파채널의 값은 0 ~ 255사이의 값을 가질 수 있다. 알파채널의 값이 0인 점은 완전히 투명하고, 255인 점은 완전히 불투명하다. 알파채널의 값이 125인 점은 반투명하다.
예를 들어, 내 서명을 전자파일로 만들어 문서 위에 올려 놓는 경우를 생각해 보자.
종이에 내 서명을 그리고 스캔받아 사용할 거다.

이 문서 위에 내 서명을 올리는 경우,

이런 식으로 되어 있는 문서를 많이 보았을 거다. 이 경우의 문제는 서명의 배경에 알파채널을 적용해 배경을 투명하게 만들지 않았다는 거다.

배경 부분인 회색 부분은 알파채널의 값을 0으로 주어 투명하게 만들면 깨끗하게 서명만 나타나게 할 수 있다.

이미지에 알파채널의 값을 설정하려면 포토샵, gimp 등 다양한 프로그램을 이용할 수 있다.
backup
파이썬 기초 및 활용
학습자료
python
-
python 공식 홈페이지: https://www.python.org
-
python 무료 책: 점프 투 파이썬
복습문제

파이썬의 개요
1. 파이썬이라는 이름에 대한 설명 중 틀린 것은?
- 비단뱀이라는 뜻도 있다.
- 고대 신화에 나오는 큰 뱀 이라는 뜻도 있다.
- 제작자가 좋아하는 코미디에서 따온 이름이다.
- 제작자의 이름이다.
2. 파이썬의 특징이 아닌 것은?
- 언어 자체는 쉽지만 아직 라이브러리가 많지 않아 일일이 개발해야 하는 어려움이 있다.
- 문법이 비교적 간결하다.
- 배우려고 마음만 먹으면 도움이 될 참고자료들이 넘쳐난다.
- 무료로 사용할 수 있다.
3. 파이썬으로 만들면 문제가 생길 만한 프로그램 종류는?
- 웹사이트
- AI 프로그램
- 데이터 분석 프로그램
- real time을 요하는 실시간 처리가 중요한 프로그램
4. 파이썬의 언어적 특징이 아닌 것은?
- 인터프리터 언어이다.
- 대화형 언어이다.
- 실행파일(exe 파일)이 생성된다.
- 질문하면 대답하는 형식으로 프로그램이 진행된다.
5. 다음 중 파이썬의 프롬프트는?
- ###
- >>>
- <<<
- ***
파이썬 자료형
1. 한 변수에 -3, -2, -1, 이렇게 3개 값만 들어간다. 이 경우 파이썬은 이 변수의 자료형을 무엇이라 판단할까?
- 문자열
- 정수형(integer)
- 실수형(float)
- 참/거짓형(boolean)
2. 다음 코드를 실행한 후 메모리의 모습으로 맞는 것은?
>>> a = 5
>>> b = 10
>>> a = 7
3. 다음 코드의 결과는?
>>> a = 1
>>> b = a + 0.1
>>> print (b)
- 1 + 0.1
- 1.01
- 10.1
- 1.1
4. 다음 코드에서 변수 b의 자료형은?
>>> a = 1
>>> b = a + 0.1
- 문자열
- 정수형(integer)
- 실수형(float)
- 참/거짓형(boolean)
5. 다음 코드의 결과는?
>>> 5 // 3
- 1
- 1.6666666666666667
- 2
- 3
6. 다음 코드의 결과는?
>>> 5 % 3
- 1
- 1.6666666666666667
- 2
- 3
7. 다음 코드의 결과는?
>>> 3 ** 3
- 9
- 33
- 27
- 45
8. 다음 코드의 결과는?
>>> a = "올해 연도 : "
>>> b = 2024
>>> c = a + b
- 에러가 발생한다.
- ‘올해 연도 : 2024’
- ‘올해 연도 :’
- ‘2024’
9. 바로 위 문제에서 에러가 발생했다면 이를 해결하기 위한 방법은?
- 문제없이 실행된다.
- c = a + b 를 c = a + len(b)로 수정한다.
- c = a + b 를 c = str(a) + b로 수정한다.
- c = a + b 를 c = a + str(b)로 수정한다.
10. 다음 코드의 결과는?
>>> a = 2024
>>> b = "올해 연도 : {0}".format(a)
>>> b
- 에러가 발생한다.
- ‘올해 연도 : 2024’
- ‘올해 연도 :’
- ‘2024’
11. 다음 코드의 결과는?
>>> a = "올해 연도 : {0}"
>>> b = 2024
>>> c = a.format(b)
>>> c
- 에러가 발생한다.
- ‘올해 연도 : 2024’
- ‘올해 연도 :’
- ‘2024’
12. list를 사용하는 이유가 아닌 것은?
- 변수 하나로 많은 양의 자료를 관리할 수 있다.
- 파이썬은 사용할 수 있는 변수의 갯수가 128개로 정해져 있다.
- 자료마다 변수를 생성하는 것은 매우 불편하고 사실상 그렇게는 개발이 불가능하기 때문
- 개발의 편리함때문
13. 다음 list에서 하나의 요소를 읽어오는 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2]
- ‘짜장’
- ‘짬뽕’
- ‘탕수육’
- ‘회’
14. list에서 하나의 요소를 바꾼 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2] = '깐풍기'
>>> a
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
- [‘짜장’, ‘짬뽕’, ‘깐풍기’, ‘회’]
- ‘깐풍기’
- 에러가 발생하고 값을 바꿀 수 없다.
15. list에 하나의 요소를 추가한 코드의 결과는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a.append("육회")
>>> a
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
- [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’, ‘육회’]
- ‘육회’
- 에러가 발생하고 값을 바꿀 수 없다.
16. list에 하나의 요소를 특정 위치에 추가하기 위해, ??? 부분에 작성해야 하는 코드는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '짬뽕', '깐풍기', '탕수육', '회']
- a.insert(0, ‘깐풍기’)
- a.insert(1, ‘깐풍기’)
- a.insert(2, ‘깐풍기’)
- a.insert(3, ‘깐풍기’)
17. list에 하나의 요소를 삭제하기 위해, ??? 부분에 작성해야 하는 코드는?
>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '탕수육', '회']
- del a[0]
- a.del[0]
- del a[1]
- a.del[1]
18. 다음 코드의 결과를 순서대로 표시한 것은?
>>> 2 < 5
???
>>> 5 < 2
???
- True, True
- True, False
- False, True
- False, False
파이썬 조건문
1. 파이썬에서 제공하는 제어문 2가지는?
- 조건문, 입출력
- 입출력, 라이브러리
- 조건문, 반복문
- 반복문, 입출력
2. 조건식이 참인 경우에만 실행되는 제어문은?
- 입출력
- 라이브러리
- 반복문
- 조건문
3. 다음 코드에서 실행되는 내용은?
if 3 < 5 :
a = 1 ⓐ
b = 2 ⓑ
c = 3 ⓒ
d = 4 ⓓ
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓐ ⓑ ⓒ ⓓ
4. 다음 조건문에서 실행되는 내용은?
if 3 > 5 :
a = 1 ⓐ
b = 2 ⓑ
c = 3 ⓒ
d = 4 ⓓ
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓓ
5. 다음 조건문의 실행 결과는?
if 3 == 5 :
print("a")
print("b")
- 에러가 난다.
- ‘a’
- ‘b’
- ‘a’
‘b’
6. 다음 조건문의 실행 결과는?
if 3 != 5 :
print("a")
print("b")
- 에러가 난다.
- ‘a’
- ‘b’
- ‘a’
‘b’
7. 조건식이 참이 아닐 경우 실행하는 부분은?
- iif
- then
- print()
- else
8. 다음 조건문 코드의 실행 결과는?
a = 10
if a < 3 :
print ("apple")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘banana’
- ‘apple’
‘banana’
9. 다음 조건문 코드의 실행 결과는?
a = 3
if a < 7 :
print ("apple")
elif a < 5 :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
10. 다음 조건문 코드의 실행 결과는?
a = 9
if a < 7 :
print ("apple")
elif 8 <= a :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
11. 다음 조건문 코드의 실행 결과는?
a = 11
if a < 7 :
print ("apple")
elif a < 4 :
print ("kiwi")
else:
print ("banana")
- 에러가 발생한다.
- ‘apple’
- ‘kiwi’
- ‘banana’
12. 다음 조건문 코드의 실행 결과는?
a = 6
if a < 7 :
print ("apple")
if 5 <= a :
print ("mango")
elif a < 4 :
print ("kiwi")
else:
print ("banana")
- ‘apple’
‘mango’ - ‘apple’
- ‘mango’
- ‘banana’
- ‘kiwi’
파이썬 반복문
1. “~하는 동안에” 라는 뜻으로 조건식이 참인 경우에만 반복 처리하는 반복문은 ?
- for
- during
- whale
- while
2. 주로 리스트의 모든 요소들을 하나씩 꺼내서 처리하는 방식의 반복문은?
- for
- during
- whale
- while
3. 다음 코드의 실행 결과는?
while True:
print("apple")
- 에러가 난다.
- 아무 것도 실행되지 않는 것처럼 보인다.
- “apple”
- “apple“이 무한히 출력된다.
4. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print(a)
- 에러가 난다.
- 아무 것도 실행되지 않는 것처럼 보인다.
- “3 4 5”
- “3“이 무한히 출력된다.
5. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print (a)
a = a + 1
- 에러가 난다.
- “3“이 무한히 출력된다.
- 3
4 - 3
4
5
6. 다음 코드의 실행 결과는?
a = 3
while a < 5 :
print (a)
a = a + 1
- 에러가 난다.
- “3“이 무한히 출력된다.
- 3
4 - 3
4
5
7. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
print(a)
- [1, 2, 3]
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1 2 3
8. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
print(item)
- [1, 2, 3]
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1 2 3
9. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item = 2 :
break
print(item)
- 에러가 발생한다.
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1e
10. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item == 2 :
break
print(item)
- 에러가 발생한다.
- 1
2
3 - [1, 2, 3]
[1, 2, 3]
[1, 2, 3] - 1
11. 다음 코드의 실행 결과는?
a = [1, 2, 3]
for item in a :
if item == 2 :
continue
print(item)
- 1
2 - 1
2
3 - 2
- 1
3
12. 다음 코드의 실행 결과는?
for i in range(3):
print (i)
- 1
2
3 - 3
- 2
- 0
1
2
13. 다음 코드의 실행 결과는?
a = [i*3 for i in range(3)]
print (a)
- [1, 2, 3]
- [1, 3, 6]
- 6
- [0, 3, 6]
파이썬 자료형 II
1. list의 고정형 버전으로 각 항목들을 [] 으로 감싸는 list와 달리 ()으로 감싸는 파이썬 자료형은?
- boolean
- float
- tuple
- map
2. tuple에 대한 설명으로 옳은 것은?
- []나 ()로 항목들을 감싼다.
- 한 번 넣어둔 항목들은 바꿀 수 없다.
- 항목을 나중에 추가할 수 있다.
- tuple 안에 들어가는 하나의 항목으로 tuple을 사용할 수 없다.
3. tuple에 입력된 가장 첫 번째 항목을 사용하는 바른 코드는?
- a = tup[0]
- a = tup[1]
- a = tup.0
- a = tup.1
4. “apple” = “애플“과 같이 key와 value의 짝으로 이루어진 파이썬 자료형은?
- map
- float
- tuple
- dictionary
5. “apple” = “애플“과 같이 key와 value의 짝으로 이루어진 자료형에서 key가 “apple“인 자료를 가져오는 코드는 ?
- di[‘apple’]
- di.apple
- di.‘apple’
- di(‘apple’)
함수
1. 영어로는 function으로 번역되며, 프로그램 내에서 어떤 기능을 하도록 미리 만들어 놓은 것은?
- 라이브러리
- 제어문
- 비교문
- 함수
2. 다음 중 파이썬 내장 함수가 아닌 것은?
- print()
- len()
- get_temp()
- str()
3. 다음과 같이 사용자 정의 함수를 호출할 경우 실행되는, 함수의 몸체 부분은?
def plus1(a) :
b = 1 ⓐ
c = 2 ⓑ
d = 3 ⓒ
e = 4 ⓓ
plus1(5)
- ⓐ
- ⓐ ⓑ
- ⓐ ⓑ ⓒ
- ⓐ ⓑ ⓒ ⓓ
4. 다음 코드는 결과가 나오지 않는다. 그 이유는?
def plus1(a) :
b = a + 1
res = plus1(3)
print (res)
- 파이썬이 이해 못하는 심각한 오류가 있다.
- 함수 정의할 때 들여쓰기를 잘못 했다.
- res 는 예약어라 변수명으로 사용하면 안된다.
- plus1() 함수는 결과값을 리턴하지 않고 있다.
5. 다음 코드의 결과는?
def plus1(a) :
b = a + 1
return b
res = plus1(3)
print (res)
- 1
- 2
- 3
- 4
6. 다음 코드는 에러를 발생시킨다. 그 이유는?
def plus1(a) :
b = a + 1
return b
res = plus1(3)
print (b)
- plus1() 함수 내에 심각한 오류가 있다.
- b는 plus1() 함수 내에서만 사용하는 지역변수다
- res 는 예약어라 변수명으로 사용하면 안된다.
- 아무런 에러없이 잘 실행된다.
파이썬 입출력
1. 입력의 옳은 예가 아닌 것은?
- 키보드로부터 입력
- 파일로부터 입력
- 모니터로부터 입력
- 마우스로부터 입력
2. 출력의 옳은 예가 아닌 것은?
- 파일로 출력
- 스피커로 출력
- 프린터로 출력
- 마이크로 출력
3. 키보드로 문자를 입력받을 때 사용하는 함수는?
- keyboard()
- str()
- input()
- print()
4. 키보드로 숫자를 입력받을 때 사용하는 함수 조합은?
- int( input() )
- input( int() )
- str( input() )
- input( str() )
5. 파일을 새로 만들고 그 안에 내용을 쓰려 한다. 잘못된 부분은?
file = open("data.txt", 'r') ⓐ
file.write("내 이름은 별똥별") ⓑ
file.close() ⓒ
- 잘못된 부분 없음
- ⓐ
- ⓑ
- ⓒ
6. 다음 코드는 파일에서 내용을 읽어오는 코드이다. data.txt 파일의 내용이 다음과 같을 때 이 코드의 실행 결과는?

file = open("data.txt", 'r')
line = file.readline()
print (line)
file.close()
- 역삼역
- 기러기
- 역삼역
기러기 - 아무 것도 표시되지 않는다.
7. 다음 코드는 파일에서 내용을 읽어오는 코드이다. data.txt 파일의 내용이 다음과 같을 때, 파일의 전체 내용을 다 가져오려 하는 경우 ??? 부분에 맞는 것은?

file = open("data.txt", 'r')
lines = file.readlines()
for line ??? lines :
print (line)
file.close()
- as
- in
- all
- with
8. 다음 코드는 엑셀용 csv 파일을 만들기 위한 코드이다. 엑셀에서 열었을 때 왼쪽처럼 보일 거라는 기대와 달리 오른쪽 그림처럼 보이고 있다. 해결 방법은?

file = open("data.csv", 'w')
file.write ("이름,전화번호")
file.write ("홍길동,02-1111-1111")
file.write ("박길동,02-1111-2222")
file.write ("최길동,03-1111-3333")
file.close()
- 확장자를 csv가 아닌 xlsx 로 바꿔서 생성한다.
- 각 줄의 끝에 “,“를 추가한다.
- 각 줄의 끝에 개행문자인 “\n“을 추가한다.
- 각 줄의 앞에 “,“를 추가한다.
HTML
1. HTML은 무엇의 약자인가?
- High Text Markup Language
- Hyper Text Military Language
- Higher Text Military Language
- Hyper Text Markup Language
2. 주로 태그를 이용해 문서에 정보를 추가해 색이나 굵기 등을 바꾸라는 정보 등 추가 정보를 저장하는 것을 무엇이라 하는가?
- Markup
- MarkDown
- MakeUp
- MakeDown
3. HTML에서 <b> 태그의 기능은?
- 이탤릭체로 보여주라는 신호를 웹브라우저에게 준다.
- 시작 부분에 동그라미 같은 bullet을 보여주라는 신호를 웹브라우저에게 준다.
- 굵은 글씨체로 보여주라는 신호를 웹브라우저에게 준다.
- 취소선을 보여주라는 신호를 웹브라우저에게 준다.
4. 링크를 거는 태그와 속성은?
<a>태그, link 속성<a>태그, href 속성<l>태그, link 속성<l>태그, href 속성
5. 태그에 대한 틀린 말은?
- 열었으면 반드시 닫아야 한다.
- 속성이 여러 개 올 수 있다.
<태그명>의 형태를 가진다.- 닫는 태그는
</태그명>의 형태를 가진다.
6. HTML5 문서의 맨 위에 적어야 하는 문구는?
<!DOCTYPE html5><DOCTYPE='html5'><!DOCTYPE html><!DOCTYPE='html'>
7. 해당 HTML 문서에 대한 다양한 메타 정보들을 적거나 javascript를 적는 태그는?
<html><!DOCTYPE><!title><head>
8. 아래 그림과 같이 브라우저 탭에 내가 원하는 문구를 넣으려면 어떤 태그를 이용해야 하는가?

- 태그를 사용하는 게 아니라 해당 HTML 파일의 파일명이 자동으로 표시된다.
<subject><tab><title>
9. HTML 태그와 CSS, JavaScript를 이해하고 해석해서 보여주는 프로그램은?
- CPU
- 인터넷
- 웹브라우저
- HTML
10. 다음 중 가장 큰 글씨를 넣을 수 있는 태그는?
<h1><title><h6><title6>
11. 다음 중 수평선을 그어 내용을 구분하거나 분위기를 전환하는데 사용하는 태그는?
<line><split><hr><section>
12. 다음 HTML 코드가 브라우저에서 보여지는 결과는?
<body>
1번줄
2번줄
</body>
13. 위 문제와 같이 보여지는 현상에 대한 설명이 아닌 것은?
- HTML은 원래 자동 줄 나누기의 개념이 없다.
- 줄 나누기를 위한 태그가 따로 있다.
- 줄 나누기를 하려면 \n을 해야 한다.
- 브라우저에 따라 다르게 보일 수 있다.
14. 글자를 기울여 보이도록 해주는데 사용되는 태그는?
<i><s><a><c>
15. <strong> 태그에 대한 설명으로 틀린 것은?
<b>태그와 거의 같은 기능을 한다.- 이제는 쓰지 않는 태그이다.
- 두꺼운 글씨체로 보여줘 강조한다.
- 닫아야 하는 태그이다.
16. 오른쪽과 같이 보여지도록 하기 위해 각 1, 2, 3에 넣어야 하는 태그로 맞는 것은?

- ul, ol, li
- li, ol, ul
- ol, li, ul
- ul, li, ol
- li, ul, ol
- ol, ui, li
17. HTML로 테이블을 만들 때, 한 줄을 표현하는 태그와 셀 하나를 표현하는 태그가 순서대로 짝지어진 것은?
<td><tr><cell><td><tr><td><td><cell>
18. 다음과 같은 테이블을 만들기 위해 1과 2에 들어갈 속성이 순서대로 짝지어진 것은?

- colspan=2, rowspan=3
- colspan=2, rowspan=2
- rowspan=2, colspan=2
- rowspan=2, colspan=3
19. 테이블에 헤더를 추가하는데 사용되는 태그는?
<tr><header><head><th>
20. HTML에서 색을 표현하는 방법으로 #FF0000과 같은 방식을 사용할 수 있다. 다음 중 이 방식으로 표현한 색과 그 색을 부르는 이름의 짝이 맞는 것은?
- #000000: 하얀색
- #FFFFFF: 노란색
- #00FF00: 초록색
- #0000FF: 빨간색
21. 전 세계적으로 약속된 파일로, 특정 파일명을 명시하지 않았을 때, 웹서버에서 제일 먼저 찾아 보여주는 파일명은?
- front.html
- firstdoor.html
- index.html
- first.html
파이썬을 이용한 스크래핑
1. 웹의 정보를 긁어 내가 만들고 있는 프로그램 안으로 가져 오는 것은?
- scrapping
- scraping
- hacking
- API
2. 웹페이지의 파일 확장자는?
- hwp
- web
- page
- html
3. 스크래핑할 때 서버에 자료를 요청하고 받아올 때 사용하는 라이브러리는?
- response
- requests
- web
- search
4. 다음 중 웹 서버에게 cat.jpg 이미지 파일을 달라고 요청하는 코드로 맞는 것은?
- request.get(‘https://www.lx.or.kr/cat.jpg’)
- requests.get(‘https://www.lx.or.kr/cat.jpg’)
- request.get(https://www.lx.or.kr/cat.jpg)
- requests.get(https://www.lx.or.kr/cat.jpg)
5. 웹서버에 요청한 파일이 없을 때 받는 상태 코드는?
- 200
- 400
- 403
- 404
6. 웹서버로부터 다음과 같이 info.html 파일을 받아왔을 때, 이 info.html 파일의 내용을 가지고 있는 것은?
import requests
response = requests.get('https://www.lx.or.kr/info.html')
- response.html
- response.page
- response.text
- response.value
7. 다음과 같은 문자열 iu가 있을 때 ’밤 편지’만 빼내기 위한 코드는?

- iu[4:8]
- iu[4:7]
- iu[5:9]
- iu[5:8]
8. 다음과 같은 문자열 iu가 있을 때, 다음 코드를 실행한 후 i 의 값은?

i = iu.find('>')
- 0
- 1
- 2
- 3
9. 다음과 같은 문자열 iu가 있을 때, 다음 코드를 실행한 후 i 의 값은?

i = iu.find('>', 5)
- 3
- 4
- 12
- 13
10. REST에 대한 설명으로 틀린 것은?
- 웹을 통해 데이터를 배포하는 방법 중 하나이다.
- 화면을 꾸미는 요소없이 자료만 배포하기 때문에 HTML 분석 방법에 비해 훨씬 편하게 자료를 사용할 수 있다.
- 최근에는 대부분 JSON으로 자료를 배포한다.
- 모든 REST를 이용한 자료배포는 무료로 배포하기로 약속되어 있다.
파이썬을 이용한 업무자동화
1. 정해진 시간에 어떤 기능이나 프로그램이 동작하도록 만드는 것은?
- batch(배치)
- timer
- clock
- 스케쥴링
2. 스케쥴링이 동작하는 일반적인 방식이 아닌 것은?
- 1시간에 한 번씩 실행
- 매일 15:00에 실행
- 매주 수요일 10:00에 실행
- 컴퓨터가 꺼져 있으면 매일 00:00에 컴퓨터를 자동으로 켜고 실행
3. 스케쥴링을 편하게 사용할 수 있게 도와주는 라이브러리는?
- timer
- schedule
- taskmanager
- pandas
4. schedule 라이브러리를 이용해 1초에 한 번씩 job 함수를 실행하도록 만드는 코드는?
- schedule.every(1).seconds.do(job)
- schedule.seconds.every.do(job)
- schedule.every(1).hour.do(job)
- schedule.seconds.do(job)
5. schedule 라이브러리를 이용해 매일 13:00에 한 번씩 job 함수를 실행하도록 만드는 코드는?
- schedule.every.day.at(“13:00”).do(job)
- schedule.day.every.at(“13:00”).do(job)
- schedule.day.every().at(“13:00”).do(job)
- schedule.every().day.at(“13:00”).do(job)
파이썬을 이용한 오피스연동
1. 한컴오피스의 hwpx 파일에 대한 설명으로 맞는 것은?
- 확장자 hwp와 hwpx는 사실 같은 형식이다.
- 확장자 hwpx를 ’zip’으로 바꾸면 압축이 풀린다.
- 확장자 hwpx를 ’doc’로 바꾸면 MS word에서 정상적으로 열린다.
- 확장자 hwp가 표준이고 hwpx는 특별한 파일이므로 대부분의 경우 hwp 파일을 사용하면 된다.
2. 파이썬에서 엑셀 파일을 쉽게 조작하기 위해 사용하는 라이브러리는?
- excelib
- openexcellib
- openpyxl
- pythonxl
3. 다음 중 openpyxl 라이브러리를 이용해 엑셀의 B3 셀에 값을 쓰는 코드는?

- ws[B, 3] = 150
- ws[‘3, B’] = 150
- ws[B3] = 150
- ws[‘B3’] = 150
4. 위 3번과 같이 값을 적어준 후 그 B3 셀의 값을 읽는 방법으로 맞는 코드는?
- sal = ws[‘B3’]
- sal = ws[B3]
- sal = ws[‘B3’].value
- sal = ws[B3].value
5. 파이썬에서 파워포인트를 조작하기 위해 사용하는 라이브러리는?
- python-ppt
- python-pptx
- pptlib
- pptxlib
6. 파워포인트에는 다양한 레이아웃이 있다. 이 중 다음과 같은 모양을 가지는 레이아웃은?

- presentation.slide_layouts[-1]
- presentation.slide_layouts[0]
- presentation.slide_layouts[1]
- presentation.slide_layouts[2]
7. 파워포인트에는 다양한 레이아웃이 있다. 이 중 다음과 같은 모양을 가지는 레이아웃은?

- presentation.slide_layouts[-1]
- presentation.slide_layouts[0]
- presentation.slide_layouts[1]
- presentation.slide_layouts[2]
8. 파워포인트의 레이아웃 구성 요소 중 다음 부분에 대한 설명으로 맞는 것은?

- slide.head
- slide.shapes.head
- slide.title
- slide.shapes.title
9. python-pptx를 이용해 코딩할 때 파워포인트에 슬라이드를 하나도 추가하지 않고 파워포인트를 저장하면 어떻게 될까?
- 저장할 때 에러가 나면서 저장되지 않는다.
- 자동으로 슬라이드 1개가 추가되어 있는 파워포인트 파일이 생성된다.
- 슬라이드가 하나도 없는 파워포인트 파일이 생성된다.
- 에러는 나지 않지만 파일은 생성되지 않는다.
연습문제
연습문제 - 파이썬 자료형
1. “apple” 문자열의 길이를 구하는 코드를 작성하시오.
답(안) 1
a = "apple"
b = len(a)
print(b)
답(안) 2
a = "apple"
print(len(a))
답(안) 3
print(len("apple"))
2. “오늘 기온은 30도“와 같이 보여지는 코드를 작성하시오. 단 30은 숫자형임.
답(안) 1
a = "오늘 기온은 "
b = 30
c = a + str(b) + "도"
print(c)
답(안) 2
a = "오늘 기온은 {0}도".format(30)
print(a)
3. “오늘 기온은 30도, 습도는 65%“와 같이 보여지는 코드를 작성하시오. 단 30, 65는 숫자형임.
답(안) 1
a = "오늘 기온은 "
b = 30
c = "도, "
d = "습도는 "
e = 65
f = "%"
g = a + str(b) + c + d + str(e) + f
print(g)
답(안) 2
a = "오늘 기온은 {0}도, 습도는 {1}%".format(30, 65)
print(a)
4. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "불어", "수학", "과학"]
답(안)
a = ["국어", "영어", "수학", "과학"]
a[1] = "불어"
print(a)
5. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "영어", "수학", "과학", "체육"]
답(안)
a = ["국어", "영어", "수학", "과학"]
a.append("체육")
print(a)
6. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "음악", "영어", "수학", "과학"]
답(안)
a = ["국어", "영어", "수학", "과학"]
a.insert(1, "음악")
print(a)
7. a와 같은 리스트를 b와 같은 리스트로 바꾸는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ["국어", "음악", "영어", "과학"]
답(안) 1
a = ["국어", "영어", "수학", "과학"]
a.insert(1, "음악")
del a[3]
print(a)
답(안) 2
a = ["국어", "영어", "수학", "과학"]
del a[2]
a.insert(1, "음악")
print(a)
8. a와 같은 리스트를 정렬하여 b와 같은 리스트로 만드는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ['과학', '국어', '수학', '영어']
답(안)
a = ["국어", "영어", "수학", "과학"]
a.sort()
print(a)
9. a와 같은 리스트를 역순으로 바꿔서(정렬아님) b와 같은 리스트로 만드는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ['과학', '수학', '영어', '국어']
답(안)
a = ["국어", "영어", "수학", "과학"]
a.sort()
print(a)
10. a와 같은 리스트를 역순으로 정렬해서 b와 같은 리스트로 만드는 코드를 작성하시오.
a = ["국어", "영어", "수학", "과학"]
b = ['영어', '수학', '국어', '과학']
답(안)
a = ["국어", "영어", "수학", "과학"]
a.sort()
a.reverse()
print(a)
2. 파이썬의 조건문
1. 총싸움 게임에서 주인공 몸의 3D 공간상 위치 x, y, z를 player_x, player_y, player_z 라 하고, 총알의 3D 공간상 위치를 bullet_x, bullet_y, bullet_z라 할 때, 주인공의 몸과 총알의 3D 공간상 x축 상의 간격, y축 상의 간격, z축 상의 간격이 모두 10이하면 총알에 맞은 것으로 간주하는 코드 작성

x축의 예
답(안) 1
player_x = 0
player_y = 0
player_z = 0
bullet_x = 5
bullet_y = 5
bullet_z = 5
if bullet_x - player_x <= 10:
if bullet_y - player_y <= 10:
if bullet_z - player_z <= 10:
print("총알에 맞았음")
답(안) 2
player_x = 0
player_y = 0
player_z = 0
bullet_x = 5
bullet_y = 5
bullet_z = 10
if bullet_x - player_x <= 10 and bullet_y - player_y <= 10 and bullet_z - player_z <= 10:
print("총알에 맞았음")
2. 기온이 30도 이상이면 바다로 가고 미만이면 산으로 가자
답(안)
temp = 30
dest = ""
if 30 <= temp:
dest = "바다"
else:
dest = "산"
msg = "{0}(으)로 가자!".format(dest)
print(msg)
3. 남은 시간이 10분 이상이면 계속 책을 보고 미만이면 화장실에 간다.
답(안)
remain = 9
if 10 <= remain :
print("계속 책 본다.")
else:
print("화장실 다녀온다.")
4. 마트가서 우유사고 만약 아보카드 있으면 6개 사와
* 사실 이 문제는 유명한 개발자 유머임.
개발자 남편에게 위와 같이 말했는데 남편이 마트에 아보카드가 있었다면서 우유만 6개 사옴.
(어쩌면 개발자만 이해할 수 있는 유머)
답(안) 1
avocado = 1 # 또는 0
if 0 < avocado :
print("마트에 아보카드 있어서 우유 1개와 아보카드 6개 사왔어")
else:
print("마트에 아보카드 없어서 우유 1개만 사왔어")
답(안) 2
avocado = 1 # 또는 0
if 0 < avocado :
print("마트에 아보카드 있어서 우유 6개 사왔어")
else:
print("마트에 아보카드 없어서 우유 1개 사왔어")
5. 설날 삼촌이 세배돈으로 30,000원 이하로 주시면 너희들에게 떡볶이 사고, 50,000원 이하면 피자 사고, 100,000원 이하면 고기 부페 쏜다! (그 이상이면 조용히 헤드폰 바꿈)
============= RESTART: E:\TEST\test.py ============
삼촌이 20000원 주셨어. 떡볶이 쏜다!
============= RESTART: E:\TEST\test.py ============
삼촌이 50000원 주셨어. 피자 쏜다!
============= RESTART: E:\TEST\test.py ============
삼촌이 70000원 주셨어. 고기 부페 쏜다!
============= RESTART: E:\TEST\test.py ============
(200000원으로 헤드폰이나 바꾸자)
답(안)
money = 200000
dest = ""
if money <= 30000 :
dest = "떡볶이"
elif money <= 50000 :
dest = "피자"
elif money <= 100000 :
dest = "고기 부페"
else :
dest = ""
msg = ""
if dest != "" :
msg = "삼촌이 {0}원 주셨어. {1} 쏜다!".format(money, dest)
else :
msg = "({0}원으로 헤드폰이나 바꾸자)".format(money)
print(msg)
3. 파이썬의 반복문
1. 1~5까지의 정수가 출력되는 코드
============= RESTART: E:\TEST\test.py ============
1
2
3
4
5
답(안) 1: while문 사용
i = 1
while i <= 5 :
print(i)
i = i + 1
답(안) 2: for문 사용
for i in [1, 2, 3, 4, 5] :
print(i)
2. 1 ~ 100까지의 정수가 출력되는 코드
============= RESTART: E:\TEST\test.py ============
1
2
3
...
100
답(안) 1: while문 사용
i = 1
while i <= 100 :
print(i)
i = i + 1
답(안) 2: for문 사용
a = range(1, 101) # 1 ~ 100까지의 정수 리스트를 만든다. range()는 정수 리스트를 만드는 함수.
for i in a :
print(i)
3. 다음과 같이 오늘의 출근 일자를 리스트로 가져왔을 때 지각한 사람이 누구인지 출력하는 코드
morning = [ ["홍길동", "08:45"], ["나지적", "08:37"], ["박문수", "09:11"] ]
============= RESTART: E:\TEST\test.py ============
지각한 사람은 박문수
답(안) while 문
morning = [ ["홍길동", "08:45"], ["나지적", "08:37"], ["박문수", "09:11"] ]
count = len(morning)
i=0
while i < count:
item = morning[i]
if "09:00" < item[1] :
print("지각한 사람은 " + item[0])
i += 1
답(안) for 문
morning = [ ["홍길동", "08:45"], ["나지적", "08:37"], ["박문수", "09:11"] ]
for item in morning :
if "09:00" < item[1] :
print("지각한 사람은 " + item[0])
숫자도 아닌 문자열 "09:00"이 비교에 사용되는 이유
엄밀히 말하면 이 코드는 사실 틀린 코드다. 문자열을 크기 비교 하고 있으니. 그런데 이런 식의 코드는 실제로 많이 쓰이고 그만큼 오류도 없다.
왜냐하면 모든 문자열은 사실은 숫자의 나열이기 때문이다.
문자열 “ABC“는 숫자 65 66 67 의 나열이다.
“A” 문자의 코드값은 65이다. “B” 문자의 코드값은 66이다.
이런 숫자의 나열을 한글자씩 순서대로 비교하는 거다.
위 예제에서는
“09:00” 과 “08:37” 을 비교하는데,
이 둘을 비교할 때는 각 앞에서부터 한 글자씩 비교한다.
처음엔 ’0’과 ’0’을 비교한다. 같네? 그럼 다음으로 ’9’와 ’8’을 비교한다.
’0’의 코드값은 48이다.
’8’의 코드값은 56이다.
’9’의 코드값은 57이다.
그래서 파이썬은 ’8’보다 ’9’가 더 크다고 처리한다.
그래서 파이썬은 이 경우 문자열들의 2번째 글자까지만 보고 “09:00“이 “08:37” 보다 크다고 결론 내린다.
이런 식으로 처리하기 때문에 문자열도 크다 작다 비교가 가능하다.
여기서 말한 코드표를 보고 싶으면 아스키코드로 검색해 보자.
4. 구구단 프로그램
=================================== RESTART: E:\test\test.py ==================================
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
4 * 7 = 28
4 * 8 = 32
4 * 9 = 36
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63
8 * 1 = 8
8 * 2 = 16
8 * 3 = 24
8 * 4 = 32
8 * 5 = 40
8 * 6 = 48
8 * 7 = 56
8 * 8 = 64
8 * 9 = 72
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
답(안) while 문
a = 2
while a <= 9 :
b = 1
while b <= 9 :
c = a * b
msg = "{0} * {1} = {2}".format(a, b, c)
print(msg)
b = b + 1
a = a + 1
답(안) for 문
for a in range(2, 10) :
for b in range(1, 10) :
c = a * b
print(f"{a} * {b} = {c}") # 이제는 이걸 쓰자.
5. 위 구구단 프로그램에 단마다 구분하기
=================================== RESTART: E:\test\test.py ==================================
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
4 * 7 = 28
4 * 8 = 32
4 * 9 = 36
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63
8 * 1 = 8
8 * 2 = 16
8 * 3 = 24
8 * 4 = 32
8 * 5 = 40
8 * 6 = 48
8 * 7 = 56
8 * 8 = 64
8 * 9 = 72
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
답(안) while 문
a = 2
while a <= 9 :
b = 1
while b <= 9 :
c = a * b
msg = "{0} * {1} = {2}".format(a, b, c)
print(msg)
b = b + 1
a = a + 1
print("")
답(안) for 문
for a in range(2, 10) :
for b in range(1, 10) :
c = a * b
print(f"{a} * {b} = {c}") # 이제는 이걸 쓰자.
print("")
6. 좋아하는 과일로 리스트를 만들고 ’바나나’가 있으면 ‘미끄러져 조심해’ 라고 출력하고, 없으면 ‘바나나는 왜 없어’ 라고 출력하는 코드
답(안)
fruits = ['사과', '딸기', '바나나', '망고']
find_banana = False
for item in fruits :
if item == '바나나' :
find_banana = True
if find_banana == True :
print("미끄러져 조심해")
else :
print("바나나는 왜 없어")
7. 좋아하는 과일로 리스트를 만들고 ’바나나’가 있으면 ‘미끄러져 조심해’ 라고 출력하고, 더 이상 리스트를 조사하지 않는다. 바나나가 없으면 ‘바나나는 왜 없어’ 라고 출력하는 코드
답(안) 1
fruits = ['사과', '딸기', '바나나', '망고']
find_banana = False
for item in fruits :
if item == '바나나' :
find_banana = True
break
if find_banana == True :
print("미끄러져 조심해")
else :
print("바나나는 왜 없어")
답(안) 2
fruits = ['사과', '딸기', '바나나', '망고']
find_banana = False
for item in fruits :
print ("{0} 검사 중...".format(item))
if item == '바나나' :
find_banana = True
break
if find_banana == True :
print("미끄러져 조심해")
else :
print("바나나는 왜 없어")
8. 좋아하는 과일로 리스트를 만들고, 리스트의 각 아이템마다 “OOO 잼 만들기“를 출력하되 아이템이 ‘바나나’ 일 때만 그렇게 출력하지 않는 코드
답(안)
fruits = ['사과', '딸기', '바나나', '망고']
for item in fruits :
if item == '바나나' :
continue
print("{0} 잼 만들기".format(item) )
4. 함수
1. 10을 더해서 리턴하는 함수
답(안)
def plus10(a) :
return a + 10
res = plus10(5)
print(res)
2. a, b 두 수를 받아서 a의 b제곱을 리턴하는 함수 foo()
답(안)
def foo(a, b) :
c = a ** b
return c
res = foo(2, 3)
print(res)
3. a, b 두 수를 받아서 a를 b로 나눈 계산값의 나머지를 리턴하는 함수 foo()
답(안)
def foo(a, b) :
c = a % b
return c
res = foo(11, 3)
print(res)
4. a, b 두 수를 받아서 a를 b로 나눈 계산값의 몫을 리턴하는 함수 foo()
답(안)
def foo(a, b) :
c = a // b
return c
res = foo(11, 3)
print(res)
5. 파이썬입출력
1. 사용자 키보드로 이름을 받아 “안녕하세요 OOO님” 이라고 출력하는 코드
=================================== RESTART: E:\test\test.py ==================================
이름: apple
안녕하세요 apple님
답(안)
a = input("이름: ")
b = "안녕하세요 {0}님".format(a)
print(b)
2. 구구단을 gugudan.txt 파일로 출력하는 코드
답(안)
file = open("gugudan.txt", 'w')
i = 2
while i <= 9 :
j = 1
while j <= 9 :
a = "{0} * {1} = {2}\n".format(i, j, i*j)
file.write(a)
j += 1
i += 1
file.close()
3. 구구단을 아래 그림처럼 엑셀에서 읽을 수 있는 gugudan.csv 파일로 출력하는 코드

답(안)
file = open("gugudan.txt", 'w')
i = 2
while i <= 9 :
j = 1
while j <= 9 :
a = "{0} * {1} = {2}\n".format(i, j, i*j)
file.write(a)
j += 1
i += 1
file.close()
소스코드
실습: 비교연산자를 이용한 if 문
if 3 < 5 :
print ("3 < 5가 참이면 이 문장이 표시됨")
if 3 > 5 :
print ("3 > 5가 참이면 이 문장이 표시됨")
if 3 <= 5 :
print ("3 <= 5가 참이면 이 문장이 표시됨")
if 3 >= 5 :
print ("3 >= 5가 참이면 이 문장이 표시됨")
if 3 == 5 :
print ("3 == 5가 참이면 이 문장이 표시됨")
if 3 != 5 :
print ("3 != 5가 참이면 이 문장이 표시됨")
에어컨 온도조절 동작 코드
temp = 33
user_want_temp = 26
if temp <= user_want_temp :
print("에어컨을 잠시 멈춥니다.")
수박이 20,000원 미만이면 한 통 사와
water_melon = 25000
if water_melon < 20000 :
print("수박을 한 통 구입합니다")
온도가 내려가 에어컨이 멈추면 다시는 에어컨이 재가동되지 않는 문제 해결
temp = 27
user_want_temp = 26
if temp <= user_want_temp :
print("에어컨을 잠시 멈춥니다.")
else :
print("에어컨을 가동합니다.")
수박이 20,000원 미만이면 2통 사오고, 그 이상이면 1통만 사와
water_melon = 19000
if water_melon < 20000 :
print("수박을 2통 구입합니다.")
else :
print("수박을 1통 구입합니다.")
수박이 20,000원 미만이고 사이다가 1,000원 미만이면 둘 다 하나씩 사와. 그렇지 않으면 아무 것도 사오지 마.
water_melon = 19000
cider = 950
if water_melon < 20000 :
if cider < 1000 :
print("수박 1통과 사이다 1개를 구입합니다.")
수박이 20,000원 미만이고 사이다가 1,000원 미만이면 둘 다 하나씩 사와. 그렇지 않으면 아무 것도 사오지 마.
water_melon = 19000
cider = 1000
if water_melon < 20000 :
if cider < 1000 :
print("수박 1통과 사이다 1개를 구입합니다.")
else:
print("수박은 싼 데 사이다가 비싸서 아무 것도 안 사감")
else:
print("일단 수박부터 비싸서 아무 것도 안 사감")
수박이 20,000원 미만이면 3통 사오고, 20,000원 이상 ~ 25,00미만이면 2통만 사오고, 25,000원 이상이면 1통만 사와
if water_melon < 20000 :
print("수박을 3통 구입합니다.")
else :
if water_melon < 25000 :
print("수박을 2통 구입합니다.")
else :
print("수박을 1통 구입합니다.")
수박이 20,000원 미만이면 3통 사오고, 20,000원 이상 ~ 25,00미만이면 2통만 사오고, 25,000원 이상이면 1통만 사와
if water_melon < 20000 :
print("수박을 3통 구입합니다.")
elif water_melon < 25000 :
print("수박을 2통 구입합니다.")
else :
print("수박을 1통 구입합니다.")
실습: 약속에 늦은 날(elif)
message = "" # 메시지
late = 20 # 지각할 거 같은 시간(분)
if late < 5 :
message = ""
elif late < 20 :
message = "미안하다"
else:
message = "오늘 자동차가 펑크날거 같아"
if message != "":
print("친구에게 다음과 같이 메시지를 보냈습니다: ", message)
반복문 - while
a = 0
while a < 3 :
print (a)
a = a + 1
반복문 - while
a = 0
while True :
print (a)
a = a + 1
1, 3, 5, 7, 9, … 와 같이 홀수만 99까지 출력
a = 1
while a <= 99 :
print(a)
a = a + 2
반복문 - for
data = [1, 2, 3, 4, 5]
for a in data :
print (a)
1-9까지의 숫자를 list로 만들고 그 목록을 하나씩 출력
nums = [1,2,3,4,5,6,7,8,9]
for a in nums :
print (a)
좋아하는 음식을 list로 만들고 그 목록을 하나씩 출력
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
for food in food_list :
print (food)
좋아하는 음식을 list로 만들고 그 목록 중 “치킨“이 있을 때만 “치킨 찾았다!” 출력
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
for food in food_list :
if food == "치킨" :
print (food, "찾았다!")
좋아하는 음식을 list로 만들고 그 목록 중 “탕수육“이 있을 때만 “탕수육 찾았다! O번째에 있었어!” 출력
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
index = index + 1
무의미한 반복 작업 중단 - break
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
break;
index = index + 1
break 문이 없을 때
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
print(index, "번째 자료 조사 중...")
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
index = index + 1
break 문이 있을 때
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
index = 0
for food in food_list :
print(index, "번째 자료 조사 중...")
if food == "탕수육" :
print (food, "찾았다!", index, "번째에 있었어!")
break;
index = index + 1
목록 중 ‘트러플버섯’ 사달라고 조를 때
food_list = ["짜장", "회", "탕수육", "트러플버섯", "치킨"]
for food in food_list :
if food != "트러플버섯" :
continue
print (food, "사 주세요!")
반복문으로 list 값 추가하기(list comprehension)
for i in range(5):
print(i)
range() 함수 사용해 list 값 추가
a = [i for i in range(10)]
range() 함수 사용해 list 값 추가
a = [i*2 for i in range(10)]
함수 사용하기
def plus1(a) :
b = a + 1
plus1(10)
함수 결과를 사용하자 - return
def plus1(a) :
b = a + 1
return b
c = plus1(10)
print(c)
실습: 두 수를 더해서 return 하는 함수
def plus_2(a, b) :
return a + b
a = plus_2(10, 20)
print(a)
실습: 두 수를 빼서 return 하는 함수
def minus_2(a, b) :
return a - b
a = minus_2(10, 20)
print(a)
실습: 두 수 중 더 큰 수를 return 하는 함수
def get_max(a, b):
if a < b :
return b
else :
return a
res = get_max(10, 11)
print(res)
실습: 두 수 중 더 작은 수를 return 하는 함수
def get_min(a, b):
if a < b :
return a
else :
return b
res = get_min(10, 11)
print(res)
input() 함수 사용
a = input()
print(a)
화면에 메시지 출력하면서 입력하라고 안내
a = input(“입력하세요:”)
print(a)
input() 함수 사용
a = int( input("1~3중 입력하세요: ") )
print(a)
사용자 키보드로 숫자 값을 받아 1 더한 값을 보여주는 프로그램
a = int( input("숫자를 입력하세요: ") )
b = a + 1
print("결과 :" , b)
사용자 키보드로 숫자 값을 받아 1 뺀 값을 보여주는 프로그램
a = int( input("숫자를 입력하세요: ") )
b = a - 1
print("결과 :" , b)
사용자 키보드로 이름 받아 뒤에 “님 안녕하세요”를 보여주는 프로그램
a = input("이름을 입력하세요: ")
b = a + "님 안녕하세요"
print("결과 : " , b)
파일 새로 만들고 파일에 내용 쓰기
# 파일 생성하고 열기
file = open("sample.txt", 'w')
# 파일에 내용 쓰기
file.write("안녕하세요")
# 파일 닫기. 파일을 열었으면 꼭 닫아야 한다
file.close()
파일 읽기
# 파일 생성하고 열기
file = open("sample.txt", 'r')
# 파일 내용에서 맨 위 한 줄 읽어 오기
line = file.readline()
print (line)
# 파일 닫기. 파일을 열었으면 꼭 닫아야 한다
file.close()
반복문으로 여러 줄 쓰기
file = open("여러줄.txt", 'w')
index = 1
while index <= 100 :
file.write(str(index))
file.write("\n")
index = index + 1
file.close()
여러 줄 읽기
file = open("여러줄.txt", 'r')
while True:
line = file.readline()
if not line:
break;
print (line)
file.close()
여러 줄 읽기
file = open("여러줄.txt", 'r')
all_line_list = file.readlines()
for line in all_line_list :
print(line)
file.close()
sample.csv
file = open("sample.csv", 'w')
file.write ("이름,전화번호\n")
file.write ("홍길동,02-1111-1111\n")
file.write ("박길동,02-1111-2222\n")
file.write ("최길동,03-1111-3333\n")
file.close()
HTML 예제
저는 <b>치즈</b>를 좋아하는 <b>MIN</b>입니다.
hypertext
저는 <a>치즈</a>를 좋아하는 <a>MIN</a>입니다.
hypertext
저는 <a href='https://www.lx.or.kr'>치즈</a>를 좋아하는 <a>MIN</a>입니다.
hypertext
저는 <a href='https://www.lx.or.kr' target='_blank'>치즈</a>를 좋아하는 <a>MIN</a>입니다.
HTML5 전반적인 구조
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
list 태그
<ul>
<li>한식</li>
<li>
중식
<ol>
<li>짜장면</li>
<li>짬뽕</li>
</ol>
</li>
</ul>
HTML로 표 만들기
<table>
<tr>
<td>cell 1</td>
<td>cell 2</td>
</tr>
<tr>
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
HTML로 표 만들기
<table border=1>
<tr>
<td>cell 1</td>
<td>cell 2</td>
</tr>
<tr>
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
셀 합치기
<table border=1>
<tr>
<td colspan=2>cell 1</td>
</tr>
<tr>
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
셀 합치기
<table border=1>
<tr>
<td rowspan=2>cell 1</td>
<td>cell 2</td>
</tr>
<tr>
<td>cell 4</td>
</tr>
</table>
테이블에 헤더 추가
<table border=1>
<tr>
<th>cell 1</th>
<th>cell 2</th>
</tr>
<tr>
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
테이블을 색으로 꾸미기
<table border=1>
<tr>
<th>cell 1</th>
<th>cell 2</th>
</tr>
<tr style="background-color: yellow">
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
테이블을 색으로 꾸미기
<table border=1>
<tr>
<th>cell 1</th>
<th>cell 2</th>
</tr>
<tr>
<td style="background-color: red">cell 3</td>
<td>cell 4</td>
</tr>
</table>
테이블을 색으로 꾸미기
<table border=1>
<tr style="background-color: #FF0000">
<th>cell 1</th>
<th>cell 2</th>
</tr>
<tr>
<td>cell 3</td>
<td>cell 4</td>
</tr>
</table>
request를 이용한 통신
import requests
requests.get('https://www.lx.or.kr')
request를 이용한 통신
import requests
requests.get('https://www.lx.or.kr/aaaaa.hwp')
웹서버에서 가져온 html 파일(index.html)
import requests
response = requests.get('https://lxeduweb.web.app')
response
웹서버에서 가져온 html 파일 분석(1.html)
import requests
response = requests.get('https://lxeduweb.web.app/1.html')
웹서버에서 가져온 html 파일 분석(1.html)
import requests
response = requests.get('https://lxeduweb.web.app/1.html')
A = response.text.find('A전자')
start = response.text.find('<td>', A + 3)
end = response.text.find('</td>', start + 1)
price = response.text[start+4 : end]
price
웹서버에서 가져온 html 파일 분석, 정보 표시
import requests
response = requests.get('https://lxeduweb.web.app/1.html')
A = response.text.find('A전자')
start = response.text.find('<td>', A + 3)
end = response.text.find('</td>', start + 1)
price = response.text[start+4 : end]
print("A전자 현재가:", price)
python에서 JSON 사용
import json
data = '{"name": "홍길동", "year": 1999, "phone": "010-1111-1111"}'
value = json.loads(data)
print(value["phone"])
1초에 한 번씩 자동 실행
import schedule
import time
# 실행할 함수 정의
def task():
print("task 실행")
#1초에 한 번씩 실행
schedule.every(1).seconds.do(task)
while True:
schedule.run_pending()
time.sleep(1)
1분에 한 번씩 자동 실행
import schedule
import time
# 실행할 함수 정의
def task():
print("task 실행")
#1분에 한 번씩 실행
schedule.every(1).minutes.do(task)
while True:
schedule.run_pending()
time.sleep(1)
1시간에 한 번씩 자동 실행
import schedule
import time
# 실행할 함수 정의
def task():
print("task 실행")
# 1시간에 한 번씩 실행
schedule.every(1).hour.do(task)
while True:
schedule.run_pending()
time.sleep(1)
매일 00:00에 자동 실행
import schedule
import time
# 실행할 함수 정의
def task():
print("task 실행")
# 매일 00:00에 실행
schedule.every().day.at("00:00").do(task)
while True:
schedule.run_pending()
time.sleep(1)
Openpyxl 기본 사용법(쓰기)
from openpyxl import Workbook
wb = Workbook()
# 워크북(엑셀)에서 활성화된 sheet을 ws라 부름.
ws = wb.active
# A1 셀에 자료 할당
ws['A1'] = '공개값'
ws['B2'] = 42
# 파일 저장
wb.save("sample.xlsx")
Openpyxl 기본 사용법(셀 읽고 쓰기)
from openpyxl import Workbook
wb = Workbook()
# 워크북(엑셀)에서 활성화된 sheet을 ws라 부름.
ws = wb.active
# A1 셀에 자료 할당
ws['A1'] = '공개값'
ws['B2'] = 42
c = ws['B2'].value
ws['C3'] = c + 1
# 파일 저장
wb.save("sample2.xlsx")
Openpyxl 기본 사용법(파일 읽기)
from openpyxl import load_workbook
wb = load_workbook(filename = 'sample2.xlsx)
# 워크북(엑셀)에서 활성화된 sheet을 ws라 부름.
ws = wb['Sheet']
v = ws['C3'].value
print("v:", v)
python-pptx 기본 사용법
from pptx import Presentation
prs = Presentation() # 파워포인트형으로 객체 생성
slide_layout = prs.slide_layouts[1] # 레이아웃 설정
slide = prs.slides.add_slide(slide_layout) # 슬라이드 하나 추가
slide.shapes.title.text = "제목"
slide.shapes.placeholders[1].text_frame.text = '내용1'
slide.shapes.placeholders[1].text_frame.add_paragraph().text = '내용2'
prs.save('sample.pptx') # 파일 저장
QnA
1. list del
append()나 insert()는 리스트명.append() 식인데, 왜 자료 삭제는 방식이 다를까?







































