Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

파이썬 기초 및 활용

학습자료

python

복습문제

파이썬의 개요

1. 파이썬이라는 이름에 대한 설명 중 틀린 것은?

  1. 비단뱀이라는 뜻도 있다.
  2. 고대 신화에 나오는 큰 뱀 이라는 뜻도 있다.
  3. 제작자가 좋아하는 코미디에서 따온 이름이다.
  4. 제작자의 이름이다.

2. 파이썬의 특징이 아닌 것은?

  1. 언어 자체는 쉽지만 아직 라이브러리가 많지 않아 일일이 개발해야 하는 어려움이 있다.
  2. 문법이 비교적 간결하다.
  3. 배우려고 마음만 먹으면 도움이 될 참고자료들이 넘쳐난다.
  4. 무료로 사용할 수 있다.

3. 파이썬으로 만들면 문제가 생길 만한 프로그램 종류는?

  1. 웹사이트
  2. AI 프로그램
  3. 데이터 분석 프로그램
  4. real time을 요하는 실시간 처리가 중요한 프로그램

4. 파이썬의 언어적 특징이 아닌 것은?

  1. 인터프리터 언어이다.
  2. 대화형 언어이다.
  3. 실행파일(exe 파일)이 생성된다.
  4. 질문하면 대답하는 형식으로 프로그램이 진행된다.

5. 다음 중 파이썬의 프롬프트는?

  1. ###
  2. >>>
  3. <<<
  4. ***

파이썬 자료형

1. 한 변수에 -3, -2, -1, 이렇게 3개 값만 들어간다. 이 경우 파이썬은 이 변수의 자료형을 무엇이라 판단할까?

  1. 문자열
  2. 정수형(integer)
  3. 실수형(float)
  4. 참/거짓형(boolean)

2. 다음 코드를 실행한 후 메모리의 모습으로 맞는 것은?

>>> a = 5
>>> b = 10
>>> a = 7

3. 다음 코드의 결과는?

>>> a = 1
>>> b = a + 0.1
>>> print (b)
  1. 1 + 0.1
  2. 1.01
  3. 10.1
  4. 1.1

4. 다음 코드에서 변수 b의 자료형은?

>>> a = 1
>>> b = a + 0.1
  1. 문자열
  2. 정수형(integer)
  3. 실수형(float)
  4. 참/거짓형(boolean)

5. 다음 코드의 결과는?

>>> 5 // 3
  1. 1
  2. 1.6666666666666667
  3. 2
  4. 3

6. 다음 코드의 결과는?

>>> 5 % 3
  1. 1
  2. 1.6666666666666667
  3. 2
  4. 3

7. 다음 코드의 결과는?

>>> 3 ** 3
  1. 9
  2. 33
  3. 27
  4. 45

8. 다음 코드의 결과는?

>>> a = "올해 연도 : "
>>> b = 2024
>>> c = a + b
  1. 에러가 발생한다.
  2. ‘올해 연도 : 2024’
  3. ‘올해 연도 :’
  4. ‘2024’

9. 바로 위 문제에서 에러가 발생했다면 이를 해결하기 위한 방법은?

  1. 문제없이 실행된다.
  2. c = a + b 를 c = a + len(b)로 수정한다.
  3. c = a + b 를 c = str(a) + b로 수정한다.
  4. c = a + b 를 c = a + str(b)로 수정한다.

10. 다음 코드의 결과는?

>>> a = 2024
>>> b = "올해 연도 : {0}".format(a)
>>> b
  1. 에러가 발생한다.
  2. ‘올해 연도 : 2024’
  3. ‘올해 연도 :’
  4. ‘2024’

11. 다음 코드의 결과는?

>>> a = "올해 연도 : {0}"
>>> b = 2024
>>> c =  a.format(b)
>>> c
  1. 에러가 발생한다.
  2. ‘올해 연도 : 2024’
  3. ‘올해 연도 :’
  4. ‘2024’

12. list를 사용하는 이유가 아닌 것은?

  1. 변수 하나로 많은 양의 자료를 관리할 수 있다.
  2. 파이썬은 사용할 수 있는 변수의 갯수가 128개로 정해져 있다.
  3. 자료마다 변수를 생성하는 것은 매우 불편하고 사실상 그렇게는 개발이 불가능하기 때문
  4. 개발의 편리함때문

13. 다음 list에서 하나의 요소를 읽어오는 코드의 결과는?

>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2]
  1. ‘짜장’
  2. ‘짬뽕’
  3. ‘탕수육’
  4. ‘회’

14. list에서 하나의 요소를 바꾼 코드의 결과는?

>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2] = '깐풍기'
>>> a
  1. [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
  2. [‘짜장’, ‘짬뽕’, ‘깐풍기’, ‘회’]
  3. ‘깐풍기’
  4. 에러가 발생하고 값을 바꿀 수 없다.

15. list에 하나의 요소를 추가한 코드의 결과는?

>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a.append("육회")
>>> a
  1. [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
  2. [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’, ‘육회’]
  3. ‘육회’
  4. 에러가 발생하고 값을 바꿀 수 없다.

16. list에 하나의 요소를 특정 위치에 추가하기 위해, ??? 부분에 작성해야 하는 코드는?

>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '짬뽕', '깐풍기', '탕수육', '회']
  1. a.insert(0, ‘깐풍기’)
  2. a.insert(1, ‘깐풍기’)
  3. a.insert(2, ‘깐풍기’)
  4. a.insert(3, ‘깐풍기’)

17. list에 하나의 요소를 삭제하기 위해, ??? 부분에 작성해야 하는 코드는?

>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '탕수육', '회']
  1. del a[0]
  2. a.del[0]
  3. del a[1]
  4. a.del[1]

18. 다음 코드의 결과를 순서대로 표시한 것은?

>>> 2 < 5
???
>>> 5 < 2
???
  1. True, True
  2. True, False
  3. False, True
  4. False, False

파이썬 조건문

1. 파이썬에서 제공하는 제어문 2가지는?

  1. 조건문, 입출력
  2. 입출력, 라이브러리
  3. 조건문, 반복문
  4. 반복문, 입출력

2. 조건식이 참인 경우에만 실행되는 제어문은?

  1. 입출력
  2. 라이브러리
  3. 반복문
  4. 조건문

3. 다음 코드에서 실행되는 내용은?

if 3 < 5 :
    a = 1 ⓐ 
    b = 2 ⓑ 
    c = 3 ⓒ 
d = 4 ⓓ
  1. ⓐ ⓑ
  2. ⓐ ⓑ ⓒ
  3. ⓐ ⓑ ⓒ ⓓ

4. 다음 조건문에서 실행되는 내용은?

if 3 > 5 :
    a = 1 ⓐ 
    b = 2 ⓑ 
    c = 3 ⓒ 
d = 4 ⓓ
  1. ⓐ ⓑ
  2. ⓐ ⓑ ⓒ

5. 다음 조건문의 실행 결과는?

if 3 == 5 :
    print("a")
print("b")
  1. 에러가 난다.
  2. ‘a’
  3. ‘b’
  4. ‘a’
    ‘b’

6. 다음 조건문의 실행 결과는?

if 3 != 5 :
    print("a")
print("b")
  1. 에러가 난다.
  2. ‘a’
  3. ‘b’
  4. ‘a’
    ‘b’

7. 조건식이 참이 아닐 경우 실행하는 부분은?

  1. iif
  2. then
  3. print()
  4. else

8. 다음 조건문 코드의 실행 결과는?

a = 10

if a < 3 :
    print ("apple")
else:
    print ("banana")
  1. 에러가 발생한다.
  2. ‘apple’
  3. ‘banana’
  4. ‘apple’
    ‘banana’

9. 다음 조건문 코드의 실행 결과는?

a = 3

if a < 7 :
    print ("apple")
elif a < 5 :
    print ("kiwi")
else:
    print ("banana")
  1. 에러가 발생한다.
  2. ‘apple’
  3. ‘kiwi’
  4. ‘banana’

10. 다음 조건문 코드의 실행 결과는?

a = 9

if a < 7 :
    print ("apple")
elif 8 <= a :
    print ("kiwi")
else:
    print ("banana")
  1. 에러가 발생한다.
  2. ‘apple’
  3. ‘kiwi’
  4. ‘banana’

11. 다음 조건문 코드의 실행 결과는?

a = 11

if a < 7 :
    print ("apple")
elif a < 4 :
    print ("kiwi")
else:
    print ("banana")
  1. 에러가 발생한다.
  2. ‘apple’
  3. ‘kiwi’
  4. ‘banana’

12. 다음 조건문 코드의 실행 결과는?

a = 6

if a < 7 :
    print ("apple")
    
    if 5 <= a :
        print ("mango")
elif a < 4 :
    print ("kiwi")
else:
    print ("banana")
  1. ‘apple’
    ‘mango’
  2. ‘apple’
  3. ‘mango’
  4. ‘banana’
  5. ‘kiwi’

파이썬 반복문

1. “~하는 동안에” 라는 뜻으로 조건식이 참인 경우에만 반복 처리하는 반복문은 ?

  1. for
  2. during
  3. whale
  4. while

2. 주로 리스트의 모든 요소들을 하나씩 꺼내서 처리하는 방식의 반복문은?

  1. for
  2. during
  3. whale
  4. while

3. 다음 코드의 실행 결과는?

while True:
  print("apple")
  1. 에러가 난다.
  2. 아무 것도 실행되지 않는 것처럼 보인다.
  3. “apple”
  4. “apple“이 무한히 출력된다.

4. 다음 코드의 실행 결과는?

a = 3

while a < 5 :
    print(a)
  1. 에러가 난다.
  2. 아무 것도 실행되지 않는 것처럼 보인다.
  3. “3 4 5”
  4. “3“이 무한히 출력된다.

5. 다음 코드의 실행 결과는?

a = 3

while a < 5 :
    print (a)
    a = a + 1
  1. 에러가 난다.
  2. “3“이 무한히 출력된다.
  3. 3
    4
  4. 3
    4
    5

6. 다음 코드의 실행 결과는?

a = 3

while a < 5 :
    print (a)
a = a + 1
  1. 에러가 난다.
  2. “3“이 무한히 출력된다.
  3. 3
    4
  4. 3
    4
    5

7. 다음 코드의 실행 결과는?

a = [1, 2, 3]

for item in a :
    print(a)
  1. [1, 2, 3]
  2. 1
    2
    3
  3. [1, 2, 3]
    [1, 2, 3]
    [1, 2, 3]
  4. 1 2 3

8. 다음 코드의 실행 결과는?

a = [1, 2, 3]

for item in a :
    print(item)
  1. [1, 2, 3]
  2. 1
    2
    3
  3. [1, 2, 3]
    [1, 2, 3]
    [1, 2, 3]
  4. 1 2 3

9. 다음 코드의 실행 결과는?

a = [1, 2, 3]

for item in a :
    if item = 2 :
        break
    
    print(item)
  1. 에러가 발생한다.
  2. 1
    2
    3
  3. [1, 2, 3]
    [1, 2, 3]
    [1, 2, 3]
  4. 1e

10. 다음 코드의 실행 결과는?

a = [1, 2, 3]

for item in a :
    if item == 2 :
        break
    
    print(item)
  1. 에러가 발생한다.
  2. 1
    2
    3
  3. [1, 2, 3]
    [1, 2, 3]
    [1, 2, 3]
  4. 1

11. 다음 코드의 실행 결과는?

a = [1, 2, 3]

for item in a :
    if item == 2 :
        continue
    
    print(item)
  1. 1
    2
  2. 1
    2
    3
  3. 2
  4. 1
    3

12. 다음 코드의 실행 결과는?

for i in range(3):
    print (i)
  1. 1
    2
    3
  2. 3
  3. 2
  4. 0
    1
    2

13. 다음 코드의 실행 결과는?

a = [i*3 for i in range(3)]
print (a)
  1. [1, 2, 3]
  2. [1, 3, 6]
  3. 6
  4. [0, 3, 6]

파이썬 자료형 II

1. list의 고정형 버전으로 각 항목들을 [] 으로 감싸는 list와 달리 ()으로 감싸는 파이썬 자료형은?

  1. boolean
  2. float
  3. tuple
  4. map

2. tuple에 대한 설명으로 옳은 것은?

  1. []나 ()로 항목들을 감싼다.
  2. 한 번 넣어둔 항목들은 바꿀 수 없다.
  3. 항목을 나중에 추가할 수 있다.
  4. tuple 안에 들어가는 하나의 항목으로 tuple을 사용할 수 없다.

3. tuple에 입력된 가장 첫 번째 항목을 사용하는 바른 코드는?

  1. a = tup[0]
  2. a = tup[1]
  3. a = tup.0
  4. a = tup.1

4. “apple” = “애플“과 같이 key와 value의 짝으로 이루어진 파이썬 자료형은?

  1. map
  2. float
  3. tuple
  4. dictionary

5. “apple” = “애플“과 같이 key와 value의 짝으로 이루어진 자료형에서 key가 “apple“인 자료를 가져오는 코드는 ?

  1. di[‘apple’]
  2. di.apple
  3. di.‘apple’
  4. di(‘apple’)

함수

1. 영어로는 function으로 번역되며, 프로그램 내에서 어떤 기능을 하도록 미리 만들어 놓은 것은?

  1. 라이브러리
  2. 제어문
  3. 비교문
  4. 함수

2. 다음 중 파이썬 내장 함수가 아닌 것은?

  1. print()
  2. len()
  3. get_temp()
  4. str()

3. 다음과 같이 사용자 정의 함수를 호출할 경우 실행되는, 함수의 몸체 부분은?

def plus1(a) :
    b = 1 ⓐ
    c = 2 ⓑ
    d = 3 ⓒ
e = 4 ⓓ

plus1(5)
  1. ⓐ ⓑ
  2. ⓐ ⓑ ⓒ
  3. ⓐ ⓑ ⓒ ⓓ

4. 다음 코드는 결과가 나오지 않는다. 그 이유는?

def plus1(a) :
    b = a + 1

res = plus1(3)
print (res)
  1. 파이썬이 이해 못하는 심각한 오류가 있다.
  2. 함수 정의할 때 들여쓰기를 잘못 했다.
  3. res 는 예약어라 변수명으로 사용하면 안된다.
  4. plus1() 함수는 결과값을 리턴하지 않고 있다.

5. 다음 코드의 결과는?

def plus1(a) :
    b = a + 1
    return b

res = plus1(3)
print (res)
  1. 1
  2. 2
  3. 3
  4. 4

6. 다음 코드는 에러를 발생시킨다. 그 이유는?

def plus1(a) :
    b = a + 1
    return b

res = plus1(3)
print (b)
  1. plus1() 함수 내에 심각한 오류가 있다.
  2. b는 plus1() 함수 내에서만 사용하는 지역변수다
  3. res 는 예약어라 변수명으로 사용하면 안된다.
  4. 아무런 에러없이 잘 실행된다.

파이썬 입출력

1. 입력의 옳은 예가 아닌 것은?

  1. 키보드로부터 입력
  2. 파일로부터 입력
  3. 모니터로부터 입력
  4. 마우스로부터 입력

2. 출력의 옳은 예가 아닌 것은?

  1. 파일로 출력
  2. 스피커로 출력
  3. 프린터로 출력
  4. 마이크로 출력

3. 키보드로 문자를 입력받을 때 사용하는 함수는?

  1. keyboard()
  2. str()
  3. input()
  4. print()

4. 키보드로 숫자를 입력받을 때 사용하는 함수 조합은?

  1. int( input() )
  2. input( int() )
  3. str( input() )
  4. input( str() )

5. 파일을 새로 만들고 그 안에 내용을 쓰려 한다. 잘못된 부분은?

file = open("data.txt", 'r') ⓐ
file.write("내 이름은 별똥별") ⓑ
file.close() ⓒ
  1. 잘못된 부분 없음

6. 다음 코드는 파일에서 내용을 읽어오는 코드이다. data.txt 파일의 내용이 다음과 같을 때 이 코드의 실행 결과는?

file = open("data.txt", 'r')
line = file.readline()
print (line)
file.close()
  1. 역삼역
  2. 기러기
  3. 역삼역
    기러기
  4. 아무 것도 표시되지 않는다.

7. 다음 코드는 파일에서 내용을 읽어오는 코드이다. data.txt 파일의 내용이 다음과 같을 때, 파일의 전체 내용을 다 가져오려 하는 경우 ??? 부분에 맞는 것은?

file = open("data.txt", 'r')
lines = file.readlines()
for line ??? lines :
    print (line)
file.close()
  1. as
  2. in
  3. all
  4. 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()
  1. 확장자를 csv가 아닌 xlsx 로 바꿔서 생성한다.
  2. 각 줄의 끝에 “,“를 추가한다.
  3. 각 줄의 끝에 개행문자인 “\n“을 추가한다.
  4. 각 줄의 앞에 “,“를 추가한다.

HTML

1. HTML은 무엇의 약자인가?

  1. High Text Markup Language
  2. Hyper Text Military Language
  3. Higher Text Military Language
  4. Hyper Text Markup Language

2. 주로 태그를 이용해 문서에 정보를 추가해 색이나 굵기 등을 바꾸라는 정보 등 추가 정보를 저장하는 것을 무엇이라 하는가?

  1. Markup
  2. MarkDown
  3. MakeUp
  4. MakeDown

3. HTML에서 <b> 태그의 기능은?

  1. 이탤릭체로 보여주라는 신호를 웹브라우저에게 준다.
  2. 시작 부분에 동그라미 같은 bullet을 보여주라는 신호를 웹브라우저에게 준다.
  3. 굵은 글씨체로 보여주라는 신호를 웹브라우저에게 준다.
  4. 취소선을 보여주라는 신호를 웹브라우저에게 준다.

4. 링크를 거는 태그와 속성은?

  1. <a>태그, link 속성
  2. <a>태그, href 속성
  3. <l>태그, link 속성
  4. <l>태그, href 속성

5. 태그에 대한 틀린 말은?

  1. 열었으면 반드시 닫아야 한다.
  2. 속성이 여러 개 올 수 있다.
  3. <태그명> 의 형태를 가진다.
  4. 닫는 태그는 </태그명>의 형태를 가진다.

6. HTML5 문서의 맨 위에 적어야 하는 문구는?

  1. <!DOCTYPE html5>
  2. <DOCTYPE='html5'>
  3. <!DOCTYPE html>
  4. <!DOCTYPE='html'>

7. 해당 HTML 문서에 대한 다양한 메타 정보들을 적거나 javascript를 적는 태그는?

  1. <html>
  2. <!DOCTYPE>
  3. <!title>
  4. <head>

8. 아래 그림과 같이 브라우저 탭에 내가 원하는 문구를 넣으려면 어떤 태그를 이용해야 하는가?

  1. 태그를 사용하는 게 아니라 해당 HTML 파일의 파일명이 자동으로 표시된다.
  2. <subject>
  3. <tab>
  4. <title>

9. HTML 태그와 CSS, JavaScript를 이해하고 해석해서 보여주는 프로그램은?

  1. CPU
  2. 인터넷
  3. 웹브라우저
  4. HTML

10. 다음 중 가장 큰 글씨를 넣을 수 있는 태그는?

  1. <h1>
  2. <title>
  3. <h6>
  4. <title6>

11. 다음 중 수평선을 그어 내용을 구분하거나 분위기를 전환하는데 사용하는 태그는?

  1. <line>
  2. <split>
  3. <hr>
  4. <section>

12. 다음 HTML 코드가 브라우저에서 보여지는 결과는?

<body>
	1번줄
	2번줄
</body>


13. 위 문제와 같이 보여지는 현상에 대한 설명이 아닌 것은?

  1. HTML은 원래 자동 줄 나누기의 개념이 없다.
  2. 줄 나누기를 위한 태그가 따로 있다.
  3. 줄 나누기를 하려면 \n을 해야 한다.
  4. 브라우저에 따라 다르게 보일 수 있다.

14. 글자를 기울여 보이도록 해주는데 사용되는 태그는?

  1. <i>
  2. <s>
  3. <a>
  4. <c>

15. <strong> 태그에 대한 설명으로 틀린 것은?

  1. <b> 태그와 거의 같은 기능을 한다.
  2. 이제는 쓰지 않는 태그이다.
  3. 두꺼운 글씨체로 보여줘 강조한다.
  4. 닫아야 하는 태그이다.

16. 오른쪽과 같이 보여지도록 하기 위해 각 1, 2, 3에 넣어야 하는 태그로 맞는 것은?

  1. ul, ol, li
  2. li, ol, ul
  3. ol, li, ul
  4. ul, li, ol
  5. li, ul, ol
  6. ol, ui, li

17. HTML로 테이블을 만들 때, 한 줄을 표현하는 태그와 셀 하나를 표현하는 태그가 순서대로 짝지어진 것은?

  1. <td><tr>
  2. <cell><td>
  3. <tr><td>
  4. <td><cell>

18. 다음과 같은 테이블을 만들기 위해 1과 2에 들어갈 속성이 순서대로 짝지어진 것은?

alt text

  1. colspan=2, rowspan=3
  2. colspan=2, rowspan=2
  3. rowspan=2, colspan=2
  4. rowspan=2, colspan=3

19. 테이블에 헤더를 추가하는데 사용되는 태그는?

  1. <tr>
  2. <header>
  3. <head>
  4. <th>

20. HTML에서 색을 표현하는 방법으로 #FF0000과 같은 방식을 사용할 수 있다. 다음 중 이 방식으로 표현한 색과 그 색을 부르는 이름의 짝이 맞는 것은?

  1. #000000: 하얀색
  2. #FFFFFF: 노란색
  3. #00FF00: 초록색
  4. #0000FF: 빨간색

21. 전 세계적으로 약속된 파일로, 특정 파일명을 명시하지 않았을 때, 웹서버에서 제일 먼저 찾아 보여주는 파일명은?

  1. front.html
  2. firstdoor.html
  3. index.html
  4. first.html

파이썬을 이용한 스크래핑

1. 웹의 정보를 긁어 내가 만들고 있는 프로그램 안으로 가져 오는 것은?

  1. scrapping
  2. scraping
  3. hacking
  4. API

2. 웹페이지의 파일 확장자는?

  1. hwp
  2. web
  3. page
  4. html

3. 스크래핑할 때 서버에 자료를 요청하고 받아올 때 사용하는 라이브러리는?

  1. response
  2. requests
  3. web
  4. search

4. 다음 중 웹 서버에게 cat.jpg 이미지 파일을 달라고 요청하는 코드로 맞는 것은?

  1. request.get(‘https://www.lx.or.kr/cat.jpg’)
  2. requests.get(‘https://www.lx.or.kr/cat.jpg’)
  3. request.get(https://www.lx.or.kr/cat.jpg)
  4. requests.get(https://www.lx.or.kr/cat.jpg)

5. 웹서버에 요청한 파일이 없을 때 받는 상태 코드는?

  1. 200
  2. 400
  3. 403
  4. 404

6. 웹서버로부터 다음과 같이 info.html 파일을 받아왔을 때, 이 info.html 파일의 내용을 가지고 있는 것은?

import requests
response = requests.get('https://www.lx.or.kr/info.html')
  1. response.html
  2. response.page
  3. response.text
  4. response.value

7. 다음과 같은 문자열 iu가 있을 때 ’밤 편지’만 빼내기 위한 코드는?

  1. iu[4:8]
  2. iu[4:7]
  3. iu[5:9]
  4. iu[5:8]

8. 다음과 같은 문자열 iu가 있을 때, 다음 코드를 실행한 후 i 의 값은?

i = iu.find('>')
  1. 0
  2. 1
  3. 2
  4. 3

9. 다음과 같은 문자열 iu가 있을 때, 다음 코드를 실행한 후 i 의 값은?

i = iu.find('>', 5)
  1. 3
  2. 4
  3. 12
  4. 13

10. REST에 대한 설명으로 틀린 것은?

  1. 웹을 통해 데이터를 배포하는 방법 중 하나이다.
  2. 화면을 꾸미는 요소없이 자료만 배포하기 때문에 HTML 분석 방법에 비해 훨씬 편하게 자료를 사용할 수 있다.
  3. 최근에는 대부분 JSON으로 자료를 배포한다.
  4. 모든 REST를 이용한 자료배포는 무료로 배포하기로 약속되어 있다.

파이썬을 이용한 업무자동화

1. 정해진 시간에 어떤 기능이나 프로그램이 동작하도록 만드는 것은?

  1. batch(배치)
  2. timer
  3. clock
  4. 스케쥴링

2. 스케쥴링이 동작하는 일반적인 방식이 아닌 것은?

  1. 1시간에 한 번씩 실행
  2. 매일 15:00에 실행
  3. 매주 수요일 10:00에 실행
  4. 컴퓨터가 꺼져 있으면 매일 00:00에 컴퓨터를 자동으로 켜고 실행

3. 스케쥴링을 편하게 사용할 수 있게 도와주는 라이브러리는?

  1. timer
  2. schedule
  3. taskmanager
  4. pandas

4. schedule 라이브러리를 이용해 1초에 한 번씩 job 함수를 실행하도록 만드는 코드는?

  1. schedule.every(1).seconds.do(job)
  2. schedule.seconds.every.do(job)
  3. schedule.every(1).hour.do(job)
  4. schedule.seconds.do(job)

5. schedule 라이브러리를 이용해 매일 13:00에 한 번씩 job 함수를 실행하도록 만드는 코드는?

  1. schedule.every.day.at(“13:00”).do(job)
  2. schedule.day.every.at(“13:00”).do(job)
  3. schedule.day.every().at(“13:00”).do(job)
  4. schedule.every().day.at(“13:00”).do(job)

파이썬을 이용한 오피스연동

1. 한컴오피스의 hwpx 파일에 대한 설명으로 맞는 것은?

  1. 확장자 hwp와 hwpx는 사실 같은 형식이다.
  2. 확장자 hwpx를 ’zip’으로 바꾸면 압축이 풀린다.
  3. 확장자 hwpx를 ’doc’로 바꾸면 MS word에서 정상적으로 열린다.
  4. 확장자 hwp가 표준이고 hwpx는 특별한 파일이므로 대부분의 경우 hwp 파일을 사용하면 된다.

2. 파이썬에서 엑셀 파일을 쉽게 조작하기 위해 사용하는 라이브러리는?

  1. excelib
  2. openexcellib
  3. openpyxl
  4. pythonxl

3. 다음 중 openpyxl 라이브러리를 이용해 엑셀의 B3 셀에 값을 쓰는 코드는?

  1. ws[B, 3] = 150
  2. ws[‘3, B’] = 150
  3. ws[B3] = 150
  4. ws[‘B3’] = 150

4. 위 3번과 같이 값을 적어준 후 그 B3 셀의 값을 읽는 방법으로 맞는 코드는?

  1. sal = ws[‘B3’]
  2. sal = ws[B3]
  3. sal = ws[‘B3’].value
  4. sal = ws[B3].value

5. 파이썬에서 파워포인트를 조작하기 위해 사용하는 라이브러리는?

  1. python-ppt
  2. python-pptx
  3. pptlib
  4. pptxlib

6. 파워포인트에는 다양한 레이아웃이 있다. 이 중 다음과 같은 모양을 가지는 레이아웃은?

  1. presentation.slide_layouts[-1]
  2. presentation.slide_layouts[0]
  3. presentation.slide_layouts[1]
  4. presentation.slide_layouts[2]

7. 파워포인트에는 다양한 레이아웃이 있다. 이 중 다음과 같은 모양을 가지는 레이아웃은?

  1. presentation.slide_layouts[-1]
  2. presentation.slide_layouts[0]
  3. presentation.slide_layouts[1]
  4. presentation.slide_layouts[2]

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

  1. slide.head
  2. slide.shapes.head
  3. slide.title
  4. slide.shapes.title

9. python-pptx를 이용해 코딩할 때 파워포인트에 슬라이드를 하나도 추가하지 않고 파워포인트를 저장하면 어떻게 될까?

  1. 저장할 때 에러가 나면서 저장되지 않는다.
  2. 자동으로 슬라이드 1개가 추가되어 있는 파워포인트 파일이 생성된다.
  3. 슬라이드가 하나도 없는 파워포인트 파일이 생성된다.
  4. 에러는 나지 않지만 파일은 생성되지 않는다.

연습문제

연습문제 - 파이썬 자료형

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)

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

append()나 insert()는 리스트명.append() 식인데, 왜 자료 삭제는 방식이 다를까?

영업전문가 양성 과정

자료

  1. 자료 1

  2. OREO 실습 양식지 다운로드

  3. 캠핑카 RFP

  4. 캠핑카 제안서

복습문제

1. 제안요청서에 대해 틀린 설명은?

  1. 요구사항을 적는다
  2. 제안 업체가 작성한다.
  3. 제안서를 작성하는 방법에 대해서도 적혀있다.
  4. RFP라고도 부른다.

2. 선정된 업체가 사업수행을 할 때 필요한 사업 관련 세부 사항을 적는 것은?

  1. 제안요청서
  2. 제안서
  3. RFP
  4. 과업지시서

3. RFP에 적힌 발주처의 요구사항을 나름의 기술과 아이디어로 해결할 방법을 제안하는 문서로, 사업에 참여하고 싶은 업체가 작성하는 문서는?

  1. 제안요청서
  2. 제안서
  3. RFP
  4. 과업지시서

4. 제안서 전체를 관통하는 가장 중요한 가치이며, 사업 수행을 할 때 가장 중요하게 고려해야 할 한 가지는?

  1. 제안요청서
  2. 제안서
  3. 고객 요구사항
  4. 과업지시서

5. 검수 단계에 대한 설명 중 틀린 것은?

  1. RFP에 적힌 요구사항 목록을 펴 놓고 완료 여부를 하나하나 확인한다.
  2. 관련 분야 전문가와 감사실 직원이 참여한다.
  3. RFP에 적힌 산출물 목록을 펴 놓고 제출 여부를 하나하나 확인한다.
  4. 검수를 통과하지 못해도 법적으로 사업 수행 대금을 지불해야 한다.

6. 사업 진행 중 법적 분쟁이 발생할 경우 판단의 기준이 되는 것들로만 묶은 것은?

  1. RFP, 작업인원 명세서
  2. 제안서, 제안사 일반현황
  3. 작업인원 명세서, 제안서
  4. RFP, 제안서

7. 민법 제2조에 명시된 모든 계약의 근간이며, 사업 진행의 기본 원칙은?

  1. RFP
  2. 납세의 원칙
  3. 신의성실의 원칙
  4. 제안서

8. 하버드대에서 가르치는 글쓰기 방식이라 알려지며 유명해진 글쓰기 기법은?

  1. COOKIE 기법
  2. ICE 기법
  3. CREAM 기법
  4. OREO 기법

9. 입찰 전에 실시하며 조달청 등에 미리 등록해 이해 관계자의 의견을 수집하는 절차는?

  1. 공개입찰
  2. 투찰
  3. 사전규격공개
  4. 발주계획

10. 제안평가위원이 제안평가에서 좋은 점수를 주는 이유가 아닌 것은?

  1. RFP의 요구 사항이 제안서에 잘 드러나 있어서
  2. RFP의 사업 목적이 제안서에 잘 드러나 있어서
  3. 제안사의 단점을 잘 숨겨서
  4. 문제해결을 위한 창의적인 아이디어를 제시해서

11. 제안서의 마스킹에 대해 잘못 설명한 것은?

  1. 일반적으로 제안평가위원이 제안 업체의 이름을 알 수 없도록 마스킹한다.
  2. 일반적으로 제안서의 개인정보, 주소 정보 등은 마스킹해야 한다.
  3. 일반적으로 제안서에 추가하는 서류는 평가를 위해 제안 업체 이름이 잘 드러나도록 한다.
  4. 제안서에 제안 업체의 회사 로고가 노출되면 탈락될 수도 있다.

12. 제안의 궁극적인 목적은?

  1. RFP의 모든 요구사항 만족
  2. 발주처가 우리(제안사)가 원하는 방향으로 의사결정하도록 만드는 것
  3. 공정한 입찰 참여
  4. 비즈니스 기회 창출

스피드 퀴즈

공간정보 웹서비스 개발

학습자료

postgreSQL

postGIS

pgAdmin

복습문제

복습문제

1. 다음 중 데이터베이스의 특징이 아닌 것은?

  1. 자료를 체계적으로 저장한다.
  2. 자료를 저장하기 쉽고 읽기 쉽게 관리한다.
  3. 자료를 모아 놓은 것은 모두 데이터베이스이다.
  4. 회사 ERP가 데이터베이스의 한 예이다.

2. DBMS의 약자로 맞는 것은?

  1. DataBase Management System
  2. DB Manager System
  3. DB Management System
  4. DataBase Manager System

3. postgreSQL에 대한 설명 중 틀린 것은?

  1. open source로 개발된다.
  2. 개인은 무료, 공공기관은 비용을 지불해야 한다.
  3. 공간정보에 특화된 기능을 제공한다.
  4. 포스트그레스큐엘이라고 읽는다.

4. 다음 중 DBMS가 아닌 것은?

  1. postgreSQL
  2. MS SQLServer
  3. MySQL
  4. DBeaver

5. 다음 중 공간정보 데이터베이스에서 지원하는 기능이 아닌 것은?

  1. 다양한 좌표계 지원
  2. 3차원 스캐닝 기능 지원
  3. 공간정보 자료(점, 선, 면)을 자유롭게 저장
  4. 공간정보 계산 기능 지원

6. 다음 중 EPSG에 대한 설명으로 틀린 것은?

  1. 석유 산업계에서 탐사를 위해 표준화된 좌표 체계가 필요해 정리한 코드들이다.
  2. EPSG의 원 뜻은 유럽 석유 조사 그룹이다.
  3. 각 좌표계 코드 표현식은 EPSG-4326 과 같은 식이다.
  4. 한국의 좌표 체계도 포함되어 있다.

복습문제

1. postgreSQL 설치에 대한 설명 중 틀린 것은?

  1. 공식 홈페이지에는 설치 프로그램이 업로드되어 있지 않아 다른 사이트에 가서 받아야 한다.
  2. postgreSQL을 설치하면 postGIS도 자동으로 설치된다.
  3. 기본으로 설치되는 postgreSQL 관리자 ID는 ‘postgres’ 이다.
  4. postgreSQL과 접속하는 기본 프로그램으로 pgAdmin이 같이 설치된다.

2. DB 구성의 한 요소로 엑셀과 같이 2차원의 표 형태로 자료를 관리하는 것은?

  1. DBMS
  2. 함수
  3. sheet
  4. table

3. 엑셀과 달리 DB 테이블은 각 항목에 숫자를 적을지 문자를 적을지를 미리 정해야 한다. 그 이유를 2개 고르시오

  1. 빠른 처리를 위해
  2. 해킹 등 재난에 대비하기 위해
  3. 전기 사용량을 줄이기 위해
  4. 효율적이고 정확하게 자료를 기록하기 위해

4. postgreSQL에서 member 라는 이름의 테이블을 만드는 방법으로 맞는 것은?

  1. create table member (name varchar(10));
  2. create member (name char);
  3. create table member (name 문자)
  4. create table member (name varchar(10))

5. postgreSQL의 주요 데이터 유형에 대해 올바르게 설명한 것은?

  1. Integer: 약 -900경 ~ + 900경 사이의 정수를 다룰 수 있다.
  2. BigInt: 약 -21억 ~ + 21억 사이의 정수를 다룰 수 있다.
  3. boolean: 참 또는 거짓을 기록할 수 있다.
  4. varchar: 사번처럼 그 길이가 정해진 문자만 입력할 수 있다.

6. pgAdmin에 대한 설명으로 틀린 것은?

  1. postgreSQL에 접속하기 위한 클라이언트 프로그램이다.
  2. DBMS에 sql문을 보내 실행할 수 있다.
  3. table을 생성하는 기능도 제공한다.
  4. 그래픽 UI가 아닌 텍스트 기반의 클라이언트 프로그램이다.

7. psql에 대한 바른 설명은?

  1. postgreSQL에 접속해 postgreSQL을 관리하거나 SQL문을 실행하는 데 사용하는 텍스트 기반의 클라이언트 프로그램
  2. sql문 만을 실행할 수 있다.
  3. 유료 버전을 구입하면 그래픽 UI도 사용할 수 있다.
  4. 관리자 전용 프로그램이다.

8. pgAdmin에서 psql을 실행하는 아이콘은?

복습문제

1. SQL에 대해 맞는 설명은?

  1. DBMS에서만 사용하는 언어이다.
  2. 자료를 DB에 입력, 수정, 삭제, 검색할 때 사용한다.
  3. DB관리자만 사용할 수 있다.
  4. 유료 버전에서만 사용할 수 있다.

2. 자료를 입력하기 위해 사용하는 SQL 명령어는?

  1. insert into 테이블명
  2. input 테이블명
  3. input into 테이블명
  4. insert 테이블명

3. 자료를 검색하기 위해 사용하는 SQL 명령어는?

  1. get from
  2. query from
  3. find from
  4. select from

4. member 테이블의 모든 자료를 가져오는 SQL 명령어는?

  1. get all from member;
  2. select * from member;
  3. select % from member;
  4. query from member;

복습문제

1. postgis에 대해 맞는 설명은?

  1. postgreSQL을 설치하면 자동으로 같이 설치된다.
  2. postgreSQL에서 옵션으로 기능을 켜고 끌 수 있다.
  3. postgreSQL 설치 후 별도 설치해야 한다.
  4. pgAdmin을 통해서만 설치할 수 있다.

2. 1개의 점을 저장할 때 맞는 테이터 유형은?

  1. geometry
  2. geometry(Point)
  3. geom(Point)
  4. geom(Point, 4326)

3. 1개의 점을 저장하되, 좌표계를 EPSG:4326으로 정할 때 맞는 데이터 유형은?

  1. geometry(EPSG, 4326)
  2. geometry(Point, 4326)
  3. geom(Point, 4326)
  4. geom(4326, Point)

4. 한 번에 1개 이상의 점을 저장할 수 있는 데이터 유형은?

  1. geometry(MultiPoint)
  2. geometry(4326)
  3. geom(Points)
  4. geom(4326, MultiPoint)

5. 1개의 선을 저장할 수 있는 데이터 유형은?

  1. geometry(Line)
  2. geometry(OneLine)
  3. geometry(Line1)
  4. geometry(LineString)

6. 한 번에 1개 이상의 선을 저장할 수 있는 데이터 유형은?

  1. geometry(Lines)
  2. geometry(MoreLine)
  3. geometry(LineStrings)
  4. geometry(MultiLineString)

7. 1개의 면을 저장할 수 있는 데이터 유형은?

  1. geometry(Box)
  2. geometry(Polygon)
  3. geometry(Poly)
  4. geometry(2DBox)

8. 한 번에 1개 이상의 면을 저장할 수 있는 데이터 유형은?

  1. geometry(Area)
  2. geometry(Polygons)
  3. geometry(MultiPolygon)
  4. geometry(MultiArea)

9. geometry 형식에 입력된 자료는 열어 보아도 값이 매우 복잡해 사람이 이해하기 어렵다. 이를 X, Y 좌표값으로 변환해 보여주는 함수의 짝으로 맞는 것은?

  1. ST_getXY()
  2. ST_getX(), ST_getY()
  3. ST_X(), ST_Y()
  4. ST_convX(), ST_convY()

10. 좌표계 간 변환하는 함수는?

  1. ST_Transaction()
  2. ST_Conversion()
  3. ST_Convert()
  4. ST_Transform()

11. 현재 데이터베이스에 EPSG:4326으로 설계되어 있는 테이블이 있고 필드명은 location이다. 이 테이블의 값을 EPSG:3857로 변환해 사용해야 하는 경우 맞는 SQL문은?

  1. select st_transform(4326, 3857) from 테이블명
  2. select st_transform(location, 4326, 3857) from 테이블명
  3. select st_transform(location, EPSG:3857) from 테이블명
  4. select st_transform(location, 3857) from 테이블명

12. 위 11번 문제와 같이 좌표계 값을 변환해 사용할 경우 틀린 것은?

  1. 좌표계 변환할 때 약간의 오차가 있을 수 있다.
  2. 위 11번 문제의 답과 같이 select 문을 사용하면 원래 테이블의 값 자체가 변환된 EPSG:3857의 값으로 변한다.
  3. st_transform( ) 괄호 안의 값 중 숫자는 EPSG 코드를 뜻한다.
  4. 최종적으로 변환될 좌표계의 코드만 적어줘도 된다.

13. ST_DistanceSphere() 함수를 사용해 곡률을 반영한 점간 거리를 계산하는 경우, 이 계산 결과의 단위는?

  1. mm
  2. cm
  3. m
  4. km

14. 공간정보 자료를 설명하는 문자열을 이용해 geometry 값을 만들 때 사용하는 함수는?

  1. ST_GISDataFromText() 함수
  2. ST_GeometryFromText() 함수
  3. ST_GeomText() 함수
  4. ST_GeomFromText() 함수

15. 점이 면 안에 포함되어 있는지 여부를 판단하기 위해 만든 SQL 문의 일부이다. 다음 중 감싸고 있는 자료와 안에 있는 자료를 순서대로 적은 것은 ?

ST_Contains(A, B)
  1. A, B
  2. B, A
  3. 순서는 상관없다.

연습문제

공간데이터베이스 연습문제

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. 다음과 같이 점이 지도에 표시되도록 자료 입력

alt text

A.

insert into point_test (location, name) values 
('point( 5 4 )', '금 묻은 곳');

Q. 다음과 같이 점이 지도에 표시되도록 자료 입력

alt text

A.

insert into point_test (location, name) values 
('point( -5 -4 )', '은 묻은 곳');

Q. 다음과 같이 점들이 지도에 표시되도록 1개의 자료 입력

alt text

A.

insert into multi_point_test (location, name) values 
('multipoint( -5 -4, 5 4 )', '해상 공원');

Q. 다음과 같이 점들이 지도에 표시되도록 1개의 자료 입력

alt text

A.

insert into multi_point_test (location, name) values 
('multipoint( -10 -11.5, 10 3 )', '석유 매장 추정지');

Q. 다음과 같이 선이 지도에 표시되도록 1개의 자료 입력

alt text

A.

insert into line_test (location, name) values 
('lineString(-10 12.7, 10 11.5  )', '이동 최단거리');

Q. 다음과 같이 선이 지도에 표시되도록 1개의 자료 입력

alt text

A.

insert into line_test (location, name) values 
('lineString(-20 -12.7, -10 -11.5, 5 3.7  )', '이동 최단거리');

Q. 다음과 같이 여러 선이 지도에 표시되도록 1개의 자료 입력

alt text

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개의 자료 입력

alt text

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개의 자료 입력

alt text

A.

insert into polygon_test (location, name) values 
('polygon( (3 4, 3 5, 4 6, 3 4 ) )', '어장1');

Q. 다음과 같이 면이 지도에 표시되도록 1개의 자료 입력

alt text

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개의 자료 입력

alt text

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개의 자료 입력

alt text

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

postGIS

pgAdmin


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. 공간정보를 다운로드 받을 수 있는 곳이 아닌 것은?

  1. 공공데이터포털(data.go.kr)
  2. 브이월드(vworld.kr)
  3. 국토정보플랫폼
  4. LX 홈페이지

2. “콤마로 구분된 값들“이라는 뜻으로 엑셀 자료를 text 형식으로 공유하는데 사용하는 파일 포맷은?

  1. txt
  2. xls
  3. xlsx
  4. csv

3. 다운로드받은 공간정보를 전처리하는 방법의 예로 옳지 않은 것은?

  1. 10개의 항목 중 어느 한 항목의 값이 없으면 그 데이터 한 줄은 지운다
  2. 10개의 항목 중 어느 한 항목의 값이 없으면 그 칸에는 그 항목의 평균값으로 채워 넣는다.
  3. 10개의 항목 중 어느 한 항목의 값이 이상할 정도로 너무 크면 그 데이터 한 줄은 지운다.
  4. 값이 이상해도 지우거나 다른 값으로 대체하면 안된다.

4. 공간정보가 포함된 csv 파일을 DBMS에 입력하는 방법으로 가장 올바른 것은?

  1. hwp 파일로 변환한 후 DBMS에서 불러온다.
  2. QGIS에서 읽어온 후 DBMS로 내보낸다.
  3. 엑셀 파일로 변환한 후 DBMS에서 불러온다.
  4. 모든 DBMS가 공간정보 csv 파일을 불러올 수 있으니 그냥 사용하면 된다.

5. geoserver에서 입력으로 받을 수 있는 데이터 유형이 아닌 것은?

  1. shp 파일
  2. postgreSQL등 공간정보 데이터베이스 연결
  3. hwp 파일
  4. jpg 파일

6. geoserver에서 출력된 정보는 지도 앱에서 어떤 용도로 사용할 수 있나?

  1. 도형의 모양을 정의
  2. 주제도를 위한 레이어
  3. 축척과 방위 표시
  4. 범례 표시

7. openLayers에서 geoserver의 정보를 사용하는 방법은?

  1. geoserver에서 보내주는 정보를 이용해 지도의 축척을 계산한다
  2. geoserver에서 보내주는 정보를 이용해 지도의 크기와 방위를 계산한다
  3. geoserver에서 보내주는 정보를 이용해 레이어를 생성한다.
  4. geoserver에서 보내주는 정보를 이용해 범례를 생성한다.

8. openLayers에서 사용하는 프로그래밍 언어는?

  1. c/c++
  2. java
  3. javascript
  4. sql

9. postGIS와 연동해 공간정보를 잘 다룰 수 있는 무료/오픈소스 DBMS는?

  1. oracle
  2. mysql
  3. sqlServer
  4. postgreSQL

10. openLayers의 역할은?

  1. 본격적인 지도 앱 생성
  2. 공간정보 자료 관리
  3. 다양한 공간정보 자료를 이용한 레이어 생성
  4. 인터넷 앱을 사용자에게 보여주는 범용 뷰어

11. geoserver가 csv 등 다양한 곳에서 값을 받을 수 있는데도 더 복잡하게 postgreSQL같은 DBMS로 부터 값을 받도록 구성하는 이유는?

  1. postgreSQL은 무료니까
  2. DBMS로부터 실시간으로 입력되는 정보를 실시간으로 지도에 반영하기 위해서
  3. csv는 믿을 수 없어서
  4. geoserver는 DBMS로부터만 값을 받을 수 있기 때문

복습문제 2

1. node.js에 대해 틀린 설명은?

  1. 웹브라우저에서만 실행된다.
  2. javascript용이다.
  3. 윈도우, macos, 리눅스 등 다양한 OS에서 실행된다.
  4. 개발 환경이다.

2. node.js가 개발된 이유로 가장 큰 것은?

  1. javascript가 너무 느려서 보완하기 위해
  2. javascript의 보안이 너무 떨어져서 보완하기 위해
  3. javascript의 부족한 기능을 추가한 것이 node.js이다.
  4. javascript를 웹 브라우저에서먼아 아닌 범용 목적으로 사용하기 위해

3. node.js를 이용해 주로 개발하는 분야에 대해 잘못 설명한 것은?

  1. DB 프로그램
  2. GIS 프로그램
  3. AI 프로그램
  4. 군사용 프로그램

4. 자바스크립트는 원래 웹브라우저에서만 실행되었다. 이 문제를 해결해 윈도우용 프로그램을 자바스크립트로도 만들기 위해 개발된 것은?

  1. tomcat
  2. node.js
  3. geoserver
  4. openLayers

5. openLayers 프로젝트를 생성하는 명령어로 올바른 것은?

  1. npm create
  2. npm create ol-app
  3. create npm
  4. create npm ol-app

6. openLayers 프로젝트를 실행해 웹브라우저에서 지도가 나타나도록 하는 명령어는?

  1. npm start
  2. npm ol-app
  3. start npm
  4. start ol-app

7. OGC 표준 중 하나로, 지도 데이터 이미지를 png, jpg와 같은 래스터 형태로 제공하는 기술은?

  1. WMS
  2. WFS
  3. WMTS
  4. WCS

8. OGC 표준 중 하나로, 지도에 표현할 데이터를 벡터 형태로 제공하는 기술은 ?

  1. WMS
  2. WFS
  3. WMTS
  4. WCS

9. OGC 표준 중 하나로, 지도를 통짜로 제공하는 것이 아닌 작은 타일 형태로 잘라 제공하는 기술은 ?

  1. WMS
  2. WFS
  3. WMTS
  4. WCS

복습문제 3

1. javascript에 대해 틀린 설명은?

  1. 줄여서 java 라고도 부른다.
  2. 웹브라우저에서 다양한 기능을 할 수 있도록 해준다.
  3. 다양한 분야의 프로그램을 개발할 수 있다.
  4. 웹브라우저 종류마다 각각 다르게 동작하기도 한다.

2. 다음 자바스크립트의 결과로 맞는 것은?

a = 10
b = 20
c = a + b
console.log(c)
  1. 10
  2. 20
  3. 30
  4. 40

3. 자바스크립트의 함수에 대한 설명으로 가장 맞는 것은?

  1. 사칙연산을 담당한다
  2. 문자열 관련 처리를 한다
  3. 기능을 정의한다
  4. 메모리 관련 처리를 한다.

4. 다음 자바스크립트 코드에서 괄호 안의 a나 b를 부르는 용어는?

function sum(a, b)
{
  c = a + b
  return c
}
  1. 자료
  2. value
  3. 파라미터
  4. 상수

5. 자바스크립트에서 버튼이 눌리거나 마우스가 움직이는 등 사용자의 행동에 의해 발생하는 것을 통틀어 무엇이라 부르나?

  1. 클릭
  2. 함수
  3. move
  4. 이벤트

연습문제 답안

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

복습문제

1. 파이썬의 개요

1. 파이썬이라는 이름에 대한 설명 중 틀린 것은?

  1. 비단뱀이라는 뜻도 있다.
  2. 고대 신화에 나오는 큰 뱀 이라는 뜻도 있다.
  3. 제작자가 좋아하는 코미디에서 따온 이름이다.
  4. 제작자의 이름이다.

2. 파이썬의 특징이 아닌 것은?

  1. 언어 자체는 쉽지만 아직 라이브러리가 많지 않아 일일이 개발해야 하는 어려움이 있다.
  2. 문법이 비교적 간결하다.
  3. 배우려고 마음만 먹으면 도움이 될 참고자료들이 넘쳐난다.
  4. 무료로 사용할 수 있다.

3. 파이썬으로 만들면 문제가 생길 만한 프로그램 종류는?

  1. 웹사이트
  2. AI 프로그램
  3. 데이터 분석 프로그램
  4. real time을 요하는 실시간 처리가 중요한 프로그램

4. 파이썬의 언어적 특징이 아닌 것은?

  1. 인터프리터 언어이다.
  2. 대화형 언어이다.
  3. 실행파일(exe 파일)이 생성된다.
  4. 질문하면 대답하는 형식으로 프로그램이 진행된다.

5. 다음 중 파이썬의 프롬프트는?

  1. ###
  2. >>>
  3. <<<
  4. ***

2. 파이썬 자료형

1. 한 변수에 -3, -2, -1, 이렇게 3개 값만 들어간다. 이 경우 파이썬은 이 변수의 자료형을 무엇이라 판단할까?

  1. 문자열
  2. 정수형(integer)
  3. 실수형(float)
  4. 참/거짓형(boolean)

2. 다음 코드를 실행한 후 메모리의 모습으로 맞는 것은?

>>> a = 5
>>> b = 10
>>> a = 7

3. 다음 코드의 결과는?

>>> a = 1
>>> b = a + 0.1
>>> print (b)
  1. 1 + 0.1
  2. 1.01
  3. 10.1
  4. 1.1

4. 다음 코드에서 변수 b의 자료형은?

>>> a = 1
>>> b = a + 0.1
  1. 문자열
  2. 정수형(integer)
  3. 실수형(float)
  4. 참/거짓형(boolean)

5. 다음 코드의 결과는?

>>> 5 // 3
  1. 1
  2. 1.6666666666666667
  3. 2
  4. 3

6. 다음 코드의 결과는?

>>> 5 % 3
  1. 1
  2. 1.6666666666666667
  3. 2
  4. 3

7. 다음 코드의 결과는?

>>> 3 ** 3
  1. 9
  2. 33
  3. 27
  4. 45

8. 다음 코드의 결과는?

>>> a = "올해 연도 : "
>>> b = 2024
>>> c = a + b
  1. 에러가 발생한다.
  2. ‘올해 연도 : 2024’
  3. ‘올해 연도 :’
  4. ‘2024’

9. 바로 위 문제에서 에러가 발생했다면 이를 해결하기 위한 방법은?

  1. 문제없이 실행된다.
  2. c = a + b 를 c = a + len(b)로 수정한다.
  3. c = a + b 를 c = str(a) + b로 수정한다.
  4. c = a + b 를 c = a + str(b)로 수정한다.

10. 다음 코드의 결과는?

>>> a = 2024
>>> b = "올해 연도 : {0}".format(a)
>>> b
  1. 에러가 발생한다.
  2. ‘올해 연도 : 2024’
  3. ‘올해 연도 :’
  4. ‘2024’

11. 다음 코드의 결과는?

>>> a = "올해 연도 : {0}"
>>> b = 2024
>>> c =  a.format(b)
>>> c
  1. 에러가 발생한다.
  2. ‘올해 연도 : 2024’
  3. ‘올해 연도 :’
  4. ‘2024’

12. list를 사용하는 이유가 아닌 것은?

  1. 변수 하나로 많은 양의 자료를 관리할 수 있다.
  2. 파이썬은 사용할 수 있는 변수의 갯수가 128개로 정해져 있다.
  3. 자료마다 변수를 생성하는 것은 매우 불편하고 사실상 그렇게는 개발이 불가능하기 때문
  4. 개발의 편리함때문

13. 다음 list에서 하나의 요소를 읽어오는 코드의 결과는?

>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2]
  1. ‘짜장’
  2. ‘짬뽕’
  3. ‘탕수육’
  4. ‘회’

14. list에서 하나의 요소를 바꾼 코드의 결과는?

>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a[2] = '깐풍기'
>>> a
  1. [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
  2. [‘짜장’, ‘짬뽕’, ‘깐풍기’, ‘회’]
  3. ‘깐풍기’
  4. 에러가 발생하고 값을 바꿀 수 없다.

15. list에 하나의 요소를 추가한 코드의 결과는?

>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> a.append("육회")
>>> a
  1. [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’]
  2. [‘짜장’, ‘짬뽕’, ‘탕수육’, ‘회’, ‘육회’]
  3. ‘육회’
  4. 에러가 발생하고 값을 바꿀 수 없다.

16. list에 하나의 요소를 특정 위치에 추가하기 위해, ??? 부분에 작성해야 하는 코드는?

>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '짬뽕', '깐풍기', '탕수육', '회']
  1. a.insert(0, ‘깐풍기’)
  2. a.insert(1, ‘깐풍기’)
  3. a.insert(2, ‘깐풍기’)
  4. a.insert(3, ‘깐풍기’)

17. list에 하나의 요소를 삭제하기 위해, ??? 부분에 작성해야 하는 코드는?

>>> a = ['짜장', '짬뽕', '탕수육', '회']
>>> ???
>>> a
['짜장', '탕수육', '회']
  1. del a[0]
  2. a.del[0]
  3. del a[1]
  4. a.del[1]

18. 다음 코드의 결과를 순서대로 표시한 것은?

>>> 2 < 5
???
>>> 5 < 2
???
  1. True, True
  2. True, False
  3. False, True
  4. False, False

3. 파이썬 제어문

1. 파이썬에서 제공하는 제어문 2가지는?

  1. 조건문, 입출력
  2. 입출력, 라이브러리
  3. 조건문, 반복문
  4. 반복문, 입출력

2. 조건식이 참인 경우에만 실행되는 제어문은?

  1. 입출력
  2. 라이브러리
  3. 반복문
  4. 조건문

3. 다음 조건문에서 실행되는 내용은?

if 3 < 5 :
    a = 1 ⓐ 
    b = 2 ⓑ 
    c = 3 ⓒ 
d = 4 ⓓ
  1. ⓐ ⓑ
  2. ⓐ ⓑ ⓒ

4. 다음 조건문에서 실행되는 내용은?

if 3 > 5 :
    a = 1 ⓐ 
    b = 2 ⓑ 
    c = 3 ⓒ 
d = 4 ⓓ
  1. ⓐ ⓑ
  2. ⓐ ⓑ ⓒ

5. 다음 조건문의 실행 결과는?

if 3 == 5 :
    print("a")
print("b")
  1. 에러가 난다.
  2. ‘a’
  3. ‘b’
  4. ‘a’
    ‘b’

6. 다음 조건문의 실행 결과는?

if 3 != 5 :
    print("a")
print("b")
  1. 에러가 난다.
  2. ‘a’
  3. ‘b’
  4. ‘a’
    ‘b’

7. 조건식이 참이 아닐 경우 실행하는 부분은?

  1. iif
  2. then
  3. print()
  4. else

8. 다음 조건문 코드의 실행 결과는?

a = 10

if a < 3 :
    print ("apple")
else:
    print ("banana")
  1. 에러가 발생한다.
  2. ‘apple’
  3. ‘banana’
  4. ‘apple’
    ‘banana’

9. 다음 조건문 코드의 실행 결과는?

a = 3

if a < 7 :
    print ("apple")
elif a < 5 :
    print ("kiwi")
else:
    print ("banana")
  1. 에러가 발생한다.
  2. ‘apple’
  3. ‘kiwi’
  4. ‘banana’

10. 다음 조건문 코드의 실행 결과는?

a = 9

if a < 7 :
    print ("apple")
elif 8 <= a :
    print ("kiwi")
else:
    print ("banana")
  1. 에러가 발생한다.
  2. ‘apple’
  3. ‘kiwi’
  4. ‘banana’

11. 다음 조건문 코드의 실행 결과는?

a = 11

if a < 7 :
    print ("apple")
elif a < 4 :
    print ("kiwi")
else:
    print ("banana")
  1. 에러가 발생한다.
  2. ‘apple’
  3. ‘kiwi’
  4. ‘banana’

12. 다음 조건문 코드의 실행 결과는?

a = 6

if a < 7 :
    print ("apple")
    
    if 5 <= a :
        print ("mango")
elif a < 4 :
    print ("kiwi")
else:
    print ("banana")
  1. ‘apple’
    ‘mango’
  2. ‘apple’
  3. ‘mango’
  4. ‘banana’
  5. ‘kiwi’

4. 파이썬 반복문

1. “~하는 동안에” 라는 뜻으로 조건식이 참인 경우에만 반복 처리하는 반복문은 ?

  1. for
  2. during
  3. whale
  4. while

2. 주로 리스트의 모든 요소들을 하나씩 꺼내서 처리하는 방식의 반복문은?

  1. for
  2. during
  3. whale
  4. while

3. 다음 코드의 실행 결과는?

while True:
  print("apple")
  1. 에러가 난다.
  2. 아무 것도 실행되지 않는 것처럼 보인다.
  3. “apple”
  4. “apple“이 무한히 출력된다.

4. 다음 코드의 실행 결과는?

a = 3

while a < 5 :
    print(a)
  1. 에러가 난다.
  2. 아무 것도 실행되지 않는 것처럼 보인다.
  3. “3 4 5”
  4. “3“이 무한히 출력된다.

5. 다음 코드의 실행 결과는?

a = 3

while a < 5 :
    print (a)
    a = a + 1
  1. 에러가 난다.
  2. “3“이 무한히 출력된다.
  3. 3
    4
  4. 3
    4
    5

6. 다음 코드의 실행 결과는?

a = 3

while a < 5 :
    print (a)
a = a + 1
  1. 에러가 난다.
  2. “3“이 무한히 출력된다.
  3. 3
    4
  4. 3
    4
    5

7. 다음 코드의 실행 결과는?

a = [1, 2, 3]

for item in a :
    print(a)
  1. [1, 2, 3]
  2. 1
    2
    3
  3. [1, 2, 3]
    [1, 2, 3]
    [1, 2, 3]
  4. 1 2 3

8. 다음 코드의 실행 결과는?

a = [1, 2, 3]

for item in a :
    print(item)
  1. [1, 2, 3]
  2. 1
    2
    3
  3. [1, 2, 3]
    [1, 2, 3]
    [1, 2, 3]
  4. 1 2 3

9. 다음 코드의 실행 결과는?

a = [1, 2, 3]

for item in a :
    if item = 2 :
        break
    
    print(item)
  1. 에러가 발생한다.
  2. 1
    2
    3
  3. [1, 2, 3]
    [1, 2, 3]
    [1, 2, 3]
  4. 1e

10. 다음 코드의 실행 결과는?

a = [1, 2, 3]

for item in a :
    if item == 2 :
        break
    
    print(item)
  1. 에러가 발생한다.
  2. 1
    2
    3
  3. [1, 2, 3]
    [1, 2, 3]
    [1, 2, 3]
  4. 1

11. 다음 코드의 실행 결과는?

a = [1, 2, 3]

for item in a :
    if item == 2 :
        continue
    
    print(item)
  1. 1
    2
  2. 1
    2
    3
  3. 2
  4. 1
    3

12. 다음 코드의 실행 결과는?

for i in range(3):
    print (i)
  1. 1
    2
    3
  2. 3
  3. 2
  4. 0
    1
    2

13. 다음 코드의 실행 결과는?

a = [i*3 for i in range(3)]
print (a)
  1. [1, 2, 3]
  2. [1, 3, 6]
  3. 6
  4. [0, 3, 6]

5. 파이썬 자료형 II

1. list의 고정형 버전으로 각 항목들을 [] 으로 감싸는 list와 달리 ()으로 감싸는 파이썬 자료형은?

  1. boolean
  2. float
  3. tuple
  4. map

2. tuple에 대한 설명으로 옳은 것은?

  1. []나 ()로 항목들을 감싼다.
  2. 한 번 넣어둔 항목들은 바꿀 수 없다.
  3. 항목을 나중에 추가할 수 있다.
  4. tuple 안에 들어가는 하나의 항목으로 tuple을 사용할 수 없다.

3. tuple에 입력된 가장 첫 번째 항목을 사용하는 바른 코드는?

  1. a = tup[0]
  2. a = tup[1]
  3. a = tup.0
  4. a = tup.1

4. “apple” = “애플“과 같이 key와 value의 짝으로 이루어진 파이썬 자료형은?

  1. map
  2. float
  3. tuple
  4. dictionary

5. “apple” = “애플“과 같이 key와 value의 짝으로 이루어진 자료형에서 key가 “apple“인 자료를 가져오는 코드는 ?

  1. di[‘apple’]
  2. di.apple
  3. di.‘apple’
  4. di(‘apple’)

6. 함수

1. 영어로는 function으로 번역되며, 프로그램 내에서 어떤 기능을 하도록 미리 만들어 놓은 것은?

  1. 라이브러리
  2. 제어문
  3. 비교문
  4. 함수

2. 다음 중 파이썬 내장 함수가 아닌 것은?

  1. print()
  2. len()
  3. get_temp()
  4. str()

3. 다음과 같이 사용자 정의 함수를 호출할 경우 실행되는, 함수의 몸체 부분은?

def plus1(a) :
    b = 1 ⓐ
    c = 2 ⓑ
    d = 3 ⓒ
e = 4 ⓓ

plus1(5)
  1. ⓐ ⓑ
  2. ⓐ ⓑ ⓒ
  3. ⓐ ⓑ ⓒ ⓓ

4. 다음 코드는 결과가 나오지 않는다. 그 이유는?

def plus1(a) :
    b = a + 1

res = plus1(3)
print (res)
  1. 파이썬이 이해 못하는 심각한 오류가 있다.
  2. 함수 정의할 때 들여쓰기를 잘못 했다.
  3. res 는 예약어라 변수명으로 사용하면 안된다.
  4. plus1() 함수는 결과값을 리턴하지 않고 있다.

5. 다음 코드의 결과는?

def plus1(a) :
    b = a + 1
    return b

res = plus1(3)
print (res)
  1. 1
  2. 2
  3. 3
  4. 4

6. 다음 코드는 에러를 발생시킨다. 그 이유는?

def plus1(a) :
    b = a + 1
    return b

res = plus1(3)
print (b)
  1. plus1() 함수 내에 심각한 오류가 있다.
  2. b는 plus1() 함수 내에서만 사용하는 지역변수다
  3. res 는 예약어라 변수명으로 사용하면 안된다.
  4. 아무런 에러없이 잘 실행된다.

7. 정규표현식

1. 정규표현식에 대한 설명으로 틀린 것은?

  1. 주어진 문자열이 어떤 패턴에 맞는지를 검사한다.
  2. 정규표현식의 표현 방법은 모든 개발 언어나 프로그램마다 다 똑같다.
  3. 파이썬은 기본적으로 정규표현식을 지원한다.
  4. 패턴의 문자열이 앞에 시작하는지 뒤에서 시작하는지 정할 수 있다.

2. 윈도우 탐색기 프로그램에서 ‘LX’ 라는 문자가 포함된 모든 파일을 찾으려 할 때 사용하는 정규표현식은?

  1. LX
  2. LX.*
  3. *LX*
  4. *.LX

3. 윈도우 탐색기 프로그램에서 ‘LX’ 라는 문자열로 시작하는 모든 파일을 찾으려 할 때 사용하는 정규표현식은?

  1. LX
  2. LX*
  3. *LX*
  4. *LX

4. 파이썬 정규표현식에서 ‘LX’ 라는 문자열로 시작하는 모든 파일을 찾으려 할 때 사용하는 정규표현식은?

  1. ‘LX*’
  2. ‘*LX’
  3. ‘^LX’
  4. ‘LX^’

5. 다음 파이썬 정규표현식 코드의 결과는?

>>> import re
>>> pattern = re.compile('배움')
>>> title = '나라배움터'
>>> m = pattern.search(title)
>>> m
  1. 찾을 수 없다고 나온다.
  2. 한글은 정규표현식으로 찾을 수 없다.
  3. 파이썬은 기본적으로 정규표현식을 지원하지 않는다.
  4. 찾았다고 나온다.

8. 파이썬 입출력

1. 입력의 옳은 예가 아닌 것은?

  1. 키보드로부터 입력
  2. 파일로부터 입력
  3. 모니터로부터 입력
  4. 마우스로부터 입력

2. 출력의 옳은 예가 아닌 것은?

  1. 파일로 출력
  2. 스피커로 출력
  3. 프린터로 출력
  4. 마이크로 출력

3. 키보드로 문자를 입력받을 때 사용하는 함수는?

  1. keyboard()
  2. str()
  3. input()
  4. print()

4. 키보드로 숫자를 입력받을 때 사용하는 함수 조합은?

  1. int( input() )
  2. input( int() )
  3. str( input() )
  4. input( str() )

5. 파일을 새로 만들고 그 안에 내용을 쓰려 한다. 잘못된 부분은?

file = open("data.txt", 'r') ⓐ
file.write("내 이름은 별똥별") ⓑ
file.close() ⓒ
  1. 잘못된 부분 없음

6. 다음 코드는 파일에서 내용을 읽어오는 코드이다. data.txt 파일의 내용이 다음과 같을 때 이 코드의 실행 결과는?

file = open("data.txt", 'r')
line = file.readline()
print (line)
file.close()
  1. 역삼역
  2. 기러기
  3. 역삼역
    기러기
  4. 아무 것도 표시되지 않는다.

7. 다음 코드는 파일에서 내용을 읽어오는 코드이다. data.txt 파일의 내용이 다음과 같을 때, 파일의 전체 내용을 다 가져오려 하는 경우 ??? 부분에 맞는 것은?

file = open("data.txt", 'r')
lines = file.readlines()
for line ??? lines :
    print (line)
file.close()
  1. as
  2. in
  3. all
  4. 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()
  1. 확장자를 csv가 아닌 xlsx 로 바꿔서 생성한다.
  2. 각 줄의 끝에 “,“를 추가한다.
  3. 각 줄의 끝에 개행문자인 “\n“을 추가한다.
  4. 각 줄의 앞에 “,“를 추가한다.

9. 파이썬 라이브러리

1. 파이썬에서 제공하는 math 라이브러리의 기능 중 올림 기능(예: 3.1 => 4)을 제공하는 함수는?

  1. ceil()
  2. floor()
  3. gcd()
  4. print()

2. 파이썬에서 제공하는 math 라이브러리의 기능 중 내림 기능(예: 3.1 => 3)을 제공하는 함수는?

  1. ceil()
  2. floor()
  3. gcd()
  4. print()

3. 임의의 수(난수)를 만들어 주는 기능을 제공하는 파이썬 표준 라이브러리는?

  1. math
  2. random
  3. string
  4. AI

4. 다음 코드의 실행 결과는?

import random

a = random.randint(1, 7)
print(a)
  1. 0
  2. 5
  3. 10
  4. 15

5. 다음 중 파이썬의 AI 관련 외부 라이브러리가 아닌 것은?

  1. TensorFlow
  2. PyTorch
  3. Scikit Learn
  4. pip

6. 다음 중 파이썬의 데이터 시각화 라이브러리는?

  1. TensorFlow
  2. Matplotlib
  3. pip
  4. anaconda

7. 다음 중 파이썬의 라이브러리 관리 프로그램은?

  1. TensorFlow
  2. Matplotlib
  3. pip
  4. anaconda

8. 다음 중 파이썬의 라이브러리를 효율적으로 관리하기 위해 가상환경을 만들어 각 가상환경마다 각기 다른 라이브러리 버전을 설치할 수 있도록 해 주는 프로그램은?

  1. TensorFlow
  2. Matplotlib
  3. pip
  4. anaconda

9. 다음 중 아나콘다에 대한 설명 중 틀린 것은?

  1. 오픈소스로 누구나 무료로 사용할 수 있다.
  2. 파이썬이 실행되는 가상환경을 만들어 주는 프로그램이다.
  3. 라이브러리 버전 문제가 발생하는 경우 좋은 해결책이다.
  4. 각 가상환경마다 파이썬 버전을 달리 설정할 수 있다.

10. 다음 중 엑셀과 같이 2차원 표형식으로 데이터를 처리하는 라이브러리는?

  1. pandas
  2. Matplotlib
  3. moviepy
  4. 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차원 공간정보 서비스 구현

logo

샘플: 웹 3D 지도

블렌더 활용실습

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에 대한 설명으로 틀린 것은?

  1. 공사 규모에서는 유료로 구입해야 한다.
  2. 오픈소스로 개발되고 있다.
  3. 직관적인 UI로 큰 인기를 모으고 있다.
  4. 다양한 시스템들과 co-work하고 있다.

2. blender에 대한 설명으로 맞는 것은?

  1. 사진과 같은 품질을 제작할 수 있다.
  2. 동영상은 만들 수 없다.
  3. 플러그인을 사용할 수 없어 활용도가 낮다.
  4. 유료 구입하면 특수 기능을 사용할 수 있다.

3. x, y, z라고 축의 이름이 붙어 있지 않은 경우라도 어떤 축이 각각 x, y, z 축임을 알 수 있는 방법은?

  1. ABC
  2. GOD
  3. YOU
  4. RGB

4. 빨간색 축은 x, y, z 중 어떤 축인가?

  1. X
  2. Y
  3. Z
  4. 아무런 축도 나타내지 않는다.

5. 파란색 축은 x, y, z, 중 어떤 축인가?

  1. X
  2. Y
  3. Z
  4. 아무런 축도 나타내지 않는다.

6. 2D에 비해 3D의 특징은?

  1. 더 많은 색을 표현할 수 있다.
  2. 더 촘촘하게 간격을 구분할 수 있다.
  3. 높이 개념이 있다.
  4. 데이터의 양이 더 적다.

7. 다음 그림에서 빨간 점의 좌표값은?

alt text

  1. (5, 4, 0)
  2. (0, 4, 5)
  3. (5, 0, 4)
  4. (4, 5, 0)

2. 블렌더 기초 실습(2)

1. LMB는 무엇의 약자인가?

  1. Large Mouse Button
  2. Left Mouse Button
  3. Left Move Button
  4. Light Move Button

2. MMB를 누르라고 적혀 있으면 마우스의 어떤 부분을 눌러야 하나?

  1. 왼쪽 버튼
  2. 왼쪽 버튼과 오른쪽 버튼을 동시에
  3. 마우스 휠
  4. 오른쪽 버튼

3. cube가 하나 있는 경우 이 큐브를 확인하기 위해 궤도식 회전(orbit)을 하려 한다. 가장 좋은 방법은?

  1. 왼쪽 버튼으로 화면을 눌러 돌린다.
  2. shift + 왼쪽 버튼으로 화면을 눌러 돌린다.
  3. 오른쪽 버튼으로 화면을 눌러 돌린다.
  4. 마우스 휠로 화면을 눌러 돌린다.

4. 궤도식 회전(orbit)을 하면 어느 한 점을 중심으로 카메라가 일정거리를 두고 회전하게 된다. 이 때 회전 중점을 바꾸고 싶다면 어떻게 해야 하나?

  1. 원하는 중점에 마우스를 위치하고 MMB를 누른다.
  2. 원하는 중점에 마우스를 위치하고 Alt + MMB를 누른다.
  3. 원하는 중점에 마우스를 위치하고 LMB를 누른다.
  4. 원하는 중점에 마우스를 위치하고 Alt + LMB를 누른다.

5. 현재 화면에서 오른쪽에 반만 보이는 object를 화면 가운데에 보이도록 하고 싶으면 panning을 해야 한다. 패닝하는 방법은?

  1. MMB를 누른 채로 마우스를 움직인다.
  2. LMB를 누른 채로 마우스를 움직인다.
  3. Shift를 누른 상태에서 MMB를 꾹 누르고 (떼지않고) 마우스를 움직인다.
  4. Shift를 누른 상태에서 LMB를 꾹 누르고 (떼지않고) 마우스를 움직인다.

6. zoom in / zoom out 하는 방법으로 틀린 것은?

  1. 마우스 휠을 돌린다.
  2. 숫자 키패드에서 + 키나 - 키를 누른다.
  3. 마우스 휠을 누르고 움직인다.
  4. Ctrl + MMB를 하고 마우스를 위아래로 움직인다.

7. 작업하다 보니 많은 수의 mesh들을 만들게 되었다. 이 mesh들과 카메라, 조명까지 모두 한 화면에 표시되도록 zoom out 하는 가장 빠르고 쉬운 방법은?

  1. / 키를 누른다.
  2. . 키를 누른다.
  3. * 키를 누른다.
  4. home 키를 누른다.

8. 작업하면서 zoom in / out 을 여러 번 하다보니 어느 순간부터 zoom in 이 제대로 안되었다. 이 문제를 가장 빠르게 해결하는 방법은 ?

  1. zoom in하고 싶은 mesh를 선택하고 / 키를 누른다.
  2. zoom in하고 싶은 mesh를 선택하고 . 키를 누른다.
  3. zoom in하고 싶은 mesh를 선택하고 * 키를 누른다.
  4. zoom in하고 싶은 mesh를 선택하고 home 키를 누른다.

9. viewpoint를 설정하는 방법으로 틀린 것은 ?

  1. Top view: 숫자키패드 7
  2. Front view: 숫자키패드 5
  3. Right view: 숫자키패드 3
  4. Bottom view: Ctrl + 숫자키패드 7

10. Top view로 보고 있다가 반대쪽인 bottom view로 바꾸고 싶거나, Left view로 보고 있다가 반대쪽인 right view로 바꾸고 싶거나, Front view로 보고 있다가 back view로 바꾸고 싶을 때 모든 경우에 한 번에 바꾸는 방법은 ?

  1. 숫자키패드 5를 누른다.
  2. 숫자키패드 9를 누른다.
  3. 숫자키패드 .을 누른다.
  4. 숫자키패드 -를 누른다.

11. 다음과 같이 quad view로 전환하는 방법은 ?

  1. ctrl + alt + q를 누른다.
  2. ctrl + alt + v를 누른다.
  3. ctrl + alt + 4를 누른다.
  4. ctrl + alt + /를 누른다.

3. 블렌더 기초 실습(3)

1. 다음 줄 틀린 말은 ?

  1. perspective: 입체적인 표현을 한다.
  2. orthographic: 직교투영으로 표현한다.
  3. perspective: top view, front view, right view에서 사용한다.
  4. orthographic: 거리와 상관없이 물체의 크기를 똑같이 보여준다.

2. 오브젝트를 이동할 때 사용하는 키는 ?

  1. G
  2. R
  3. A
  4. S

3. 오브젝트를 이동할 때 y축으로만 이동하려 한다. 이 경우 눌러야 하는 키는 ?

  1. G
  2. X
  3. Y
  4. Z

4. 오브젝트를 이동할 때 x, y축으로만 이동하고 z축으로의 이동은 제한하려 한다. 이 경우 눌러야 하는 키는 ?

  1. Ctrl + Z
  2. Z
  3. Alt + Z
  4. Shift + Z

5. 아래 그림과 같이 cube가 회전되어 있을 때 바닥과 평형을 이루도록 하는 방법은 ?

  1. G키를 눌러 회전시킨다.
  2. R키를 눌러 회전시킨다.
  3. B키를 눌러 회전시킨다.
  4. A키를 눌러 회전시킨다.

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

  1. X키를 눌러 X축을 기준으로 회전시킨다.
  2. Y키를 눌러 Y축을 기준으로 회전시킨다.
  3. Z키를 눌러 Z축을 기준으로 회전시킨다.
  4. blender는 무료 프로그램이라 이런 문제는 해결할 수 없다.

7. 아래와 같이 눈사람을 만들었는데 아래에 있는 sphere(구)를 좀 더 크게 해주고 싶을 때 사용할 수 있는 방법은 ?

  1. 아래에 있는 sphere를 선택하고 G키를 눌러 약간 키워준다.
  2. 아래에 있는 sphere를 선택하고 R키를 눌러 약간 키워준다.
  3. 아래에 있는 sphere를 선택하고 S키를 눌러 약간 키워준다.
  4. 아래에 있는 sphere를 선택하고 A키를 눌러 약간 키워준다.

8. 아래와 같이 어느 한 점의 위치를 변경하려 할 때 제일 처음 할 일은 ?

  1. e키를 눌러 edit 모드로 들어간다.
  2. ctrl키를 눌러 edit 모드로 들어간다.
  3. m키를 눌러 edit 모드로 들어간다.
  4. tab키를 눌러 edit 모드로 들어간다.

9. edit 모드 진입 후 아래와 같이 어느 한 점(vertex)의 위치를 변경하려 할 때 할 일은 ?

  1. p키를 눌러 점편집 모드로 변경한다.
  2. 1키를 눌러 edit 모드로 변경한다.
  3. 2키를 눌러 edit 모드로 변경한다.
  4. 3키를 눌러 edit 모드로 변경한다.

10. edit 모드 진입 후 아래와 같이 어느 한 선(edge)의 위치를 변경하려 할 때 할 일은 ?

  1. L키를 눌러 선편집 모드로 변경한다.
  2. 1키를 눌러 선편집 모드로 변경한다.
  3. 2키를 눌러 선편집 모드로 변경한다.
  4. 3키를 눌러 선편집 모드로 변경한다.

11. edit 모드 진입 후 아래와 같이 어느 한 면(face)의 크기를 변경하려 할 때 할 일은 ?

  1. f키를 눌러 면편집 모드로 변경한다.
  2. 1키를 눌러 면편집 모드로 변경한다.
  3. 2키를 눌러 면편집 모드로 변경한다.
  4. 3키를 눌러 면편집 모드로 변경한다.

12. 다음과 같이 작업했을 때 결과물은 ?

1. cube를 선택한다.
2. tab 키를 눌러 edit 모드로 들어간다.
3. 1키를 누른다.
4. 어느 한 점을 선택한다.
5. G키를 누른다.
6. X키를 누른다.
7. 마우스를 움직인다.


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

  • cube를 선택한다.

  • tab키를 눌러 편집 모드로 들어간다.

  1. 3키를 눌러 면편집 모드로 변경한다.

  2. r키를 눌러 회전 기능을 활성화한다.

  3. ctrl + z키를 눌러 z축 회전으로 설정한다.

  4. 마우스를 움직여 선택된 면을 회전한다.


14. 다음 그림과 같은 편집과 방법을 올바르게 짝지은 것은?

  1. 모따기, ctrl + v
  2. 모깎기, ctrl + v
  3. 모따기, ctrl + b
  4. 모깎기, ctrl + b

15. 다음 그림과 같은 편집과 방법을 올바르게 짝지은 것은?

  1. 모따기, 모깎기 후 마우스 휠
  2. 모깎기, 모따기 후 마우스 휠
  3. 모따기, 모깎기 후 마우스 휠
  4. 모깎기, 모따기 후 마우스 휠

16. 다음 그림과 같이 면을 도출(extrude)할 떄 사용하는 키는?

  1. e
  2. x
  3. t
  4. r

17. 면을 도출(extrude)시킨 직후 이 작업을 취소하려면 ctrl + z 키를 누른다. 그런데 이 때, ctrl + z 키를 2번 이상 눌러 그 면을 선택한 것까지 취소해야 한다. 그 이유는(답 2개)?

  1. extrude는 메모리를 많이 차지하는 연산이므로
  2. extrude는 CPU를 많이 차지하는 연산이라 정확하게 제거하지 않으면 앞으로 CPU를 더 많이 사용하기 때문
  3. extrude는 면을 하나 더 생성하는 거라 나중에 이 면이 반드시 문제가 되기 때문에 완벽하게 제거하려고.
  4. extrude하면 바로 그 자리에 똑같은 면이 하나 더 생성되기 때문에 면이 하나 더 있는지 알아보기 어렵기 때문

18. fbx는 무엇의 약자인가?

  1. 약자가 아니다.
  2. FaceBook eXtension
  3. FilmBook eXtension
  4. FilmBoX

4. 블렌더 활용 실습

1. 다음과 같이 건물 모델의 벽에 붙인 그림을 3D에서는 특별히 무엇이라 부르는가?

alt text

  1. pic
  2. texture
  3. uv
  4. jpg

2. 건물 모델의 벽에 texture를 붙이기 위해 생성한 전개도를 부르는 말은?

  1. pic
  2. texture
  3. uv map
  4. jpg

3. 하나의 mesh로 책상을 만들기 위해 다리를 뽑아내는 경우 mesh를 여러 개로 나누기 위해 사용하는 기술과 단축키로 옳은 것은?

  1. loop cut, ctrl + L
  2. knife, ctrl + L
  3. loop cut, ctrl + R
  4. knife, ctrl + K

4. 하나의 mesh object에 여러 개의 재질을 사용하려 한다. 새 재질을 추가하기 위해 눌러야 하는 버튼은?

  1. 1
  2. 2
  3. 3
  4. 4

5. mesh의 크기를 조절한 후 ctrl + A키를 눌러 apply - scale로 scale을 재설정하는 이유는?

  1. 크기가 변경되었다고 조명에 알려준다.
  2. 크기가 변경되었다고 카메라에 알려준다.
  3. UV맵을 펼 때 크기가 변경된 사항이 적용되도록 하기 위해
  4. blender에서 발생하는 오류를 막기 위해

6. 창문 등을 위해 벽에 구멍을 뚫을 때 사용하는 기능은?

  1. merge(합치기)
  2. loop cut
  3. extrude
  4. boolean

7. 다음 그림과 같이 연결된 면을 한 번에 선택하는 기능의 용어는?

  1. select all
  2. loop cut
  3. select loop
  4. boolean

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

  1. ctrl 키를 누른 채로 LMB로 면을 누른다.
  2. alt 키를 누른 채로 LMB로 면을 누른다.
  3. shift 키를 누른 채로 LMB로 면을 누른다.
  4. 면을 더블클릭한다.

9. 다음 그림과 같이 연결된 면을 한 번에 선택하는 select loop 기능을 사용하려 할 때 정확하게 눌러야 하는 곳은?

  1. 1
  2. 2
  3. 3

10. select loop 기능을 쓰기 어려워 면을 하나하나 선택하려 한다. 이 때 한 면을 선택하고 이 면이 계속 선택되게 만들면서 다른 면도 선택에 포함하려 할 때 LMB와 같이 눌러야 하는 키는?

  1. ctrl
  2. alt
  3. shift
  4. ctrl + alt

5. 세슘 기초 실습(1)

1. 세슘의 특징이 아닌 것은?

  1. 무료이며 누구나 사용할 수 있다.
  2. 사용자가 추가한 asset들을 3D 형태로 보여준다.
  3. 나만의 3D 맵을 만들 수 있다.
  4. 내가 올린 3D asset들은 기본적으로 나한테만 보인다.

2. blender에서 만든 3D 모델을 세슘에 asset으로 등록할 때 사용하는 파일 포맷은?

  1. .blender
  2. .fbx
  3. .blend
  4. .asset

3. blender에서 만든 3D 모델을 fbx 파일로 내보내기 할 때 틀린 것은?

  1. 특정 모델만 fbx 파일에 추가되게 설정할 수 있다.
  2. File / Export / FBX(.fbx) 메뉴를 선택한다.
  3. export 하기 전에 export할 모델을 선택해 놓아야 한다.
  4. 기본 설정으로 texture가 자동 포함된다.

4. blender로 만든 3D 모델을 세슘에 asset으로 등록한 후에 할 일은?

  1. 정합을 확인한다.
  2. texture를 변경한다
  3. ID를 확인한다.
  4. 좌표를 설정한다.

5. 세슘을 무료로 사용할 수 있는 경우는?

  1. 비상업적인 개인적인 프로젝트
  2. 국가 SOC 사업
  3. 공공기관의 업무
  4. 대학의 상업적인 프로젝트

6. 세슘에 등록한 3D asset의 좌표를 잘못 등록할 것을 알게 되었다. 현재 asset 관리 창에 있을 때 이 문제를 해결하기 위해 눌러야 하는 것은?

  1. 1
  2. 2
  3. 3
  4. 4

7. 세슘 제품군 중 사용자의 3D asset 들을 등록 등 관리하고, 3D 맵을 만들기 위한 자료를 제공하는 것은?

  1. cesium ion
  2. cesium js
  3. cesium for unreal
  4. cesium for unity

6. 세슘 기초 실습(2)

1. 세슘이 제공하는 기능으로 3D 지도를 기반으로 한 프레젠테이션 기능을 제공하는 것은?

  1. cesium ion
  2. cesium stories
  3. cesium assets
  4. cesium js

2. 세슘 스토리에서 새 슬라이드를 추가하는 방법은?

  1. ctrl + + 키를 누른다.
  2. alt + n 키를 누른다.
  3. [new page] 버튼을 누른다.
  4. [new slide] 버튼을 누른다.

3. 세슘 스토리에서, 내가 올린 3D asset을 추가할 때 맞는 것은?

  1. 내가 올린 3D asset들의 목록이 나타나서 선택할 수 있다.
  2. 스토리에 보여주기 위해서는 새로 asset을 추가해야 한다.
  3. 내가 올린 asset들은 보여줄 수 없고 공용 asset 들만 보여줄 수 있다.
  4. 유료 버전은 가능하지만 무료 버전은 내가 올린 asset들을 볼 수 없다.

4. 세슘 스토리에서 슬라이드에 보여줄 모습을 확정하기 위해 누르는 버튼은?

  1. OK good
  2. Good position
  3. confirm
  4. capture view

7. 세슘 활용 실습

1. 세슘은 기본적으로 대용량의 3D 지도 자료를 한 번에 전송하지 않고 잘게 쪼개서 전송한다. 이러한 기술을 무엇이라 하는가?

  1. 스트리밍
  2. down bit
  3. 분할 전송
  4. 3D Tiles

2. 세슘은 모든 현재 보여줘야 하는 모든 파일이 다 다운로드 될 때 까지 한참 기다린 후 화면에 짠 하고 한꺼번에 나타나는 것이 아닌, 조금씩이라도 다운로드받은 내용을 지속적으로 화면에 보여주는 방식을 사용한다. 이런 기술을 무엇이라 하는가?

  1. 스트리밍
  2. down bit
  3. 분할 전송
  4. 3D Tiles

3. 세슘이 기본 제공하는 기능이 아닌 것은?

  1. Cesium World Terrain(전 세계의 3차원 지도)
  2. Imagery(위성 영상)
  3. OSM 건물
  4. 네이버지도

4. 세슘에 저장한 자료를 java script 언어로 프로그래밍해 볼 수 있게 해주는 cesium 의 구성 요소는?

  1. cesium ion
  2. cesium for unity
  3. cesium js
  4. cesium for o3de

5. 세슘에 저장한 자료를 이용해 전 세계 지도가 3D형태로 보여지고 내가 만들어 올린 3D asset 들이 3D 지도 위에 정확하게 위치하는 3D 게임을 만들고 싶을 때 사용하는 cesium 구성 요소는?

  1. cesium ion
  2. cesium for unreal
  3. cesium js
  4. cesium

6. 세슘을 이용해 디지털트윈 웹버전을 만들려고 한다. 이 때 사용하는 세슘의 구성 요소는?

  1. cesium ion
  2. cesium for unity
  3. cesium js
  4. cesium for o3de

7. 세슘을 이용해 디지털트윈 웹버전을 만들려고 개발환경을 구축하려 한다. 이 때 설치하는 프로그램으로 자바스크립트를 웹브라우저가 아닌 곳에서 실행할 수 있도록 만들어 주는 프로그램은?

  1. visual studio code
  2. node.js
  3. express.js
  4. cesium js

8. node.js를 기반으로 실행되는 프로그램으로 내 PC를 웹서버로 만들어 주는 프로그램은?

  1. visual studio code
  2. node.js
  3. express.js
  4. cesium js

9. 다음 중 heading에 대해 설명한 그림은?


10. 세슘을 이용해 디지털트윈 웹버전을 만들기 위해 cisium js를 사용해 프로그램을 만들었다. 다음과 같은 코드에서 AAAA 부분에 실제로 넣어야 하는 값은?

Cesium.Ion.defaultAccessToken = "AAAA"
  1. cesium ion에 로그인할 때 사용하는 user ID
  2. cesium ion에 로그인할 때 사용하는 password
  3. cesium ion에서 제공하는 토큰
  4. cesium ion에서 제공하는 asset ID

8. 공간정보 웹서비스 구현

1. 대부분 건물의 경우 최소 5장의 이미지가 필요한데, 일반적으로 3D에서는 텍스처 파일 하나에 5장의 이미지를 모두 저장해 사용하는 이유는?

  1. 하나의 모델에 이미지 파일을 여러 장 사용하면 보여질 때 실행속도가 느려지기 때문.
  2. 대부분의 3D 프로그램들이 여러 개의 텍스처를 허용하지 않기 때문
  3. 아무런 상관없으나 관례이다.
  4. 색감을 고정하기 위해

2. GIMP의 기능 중 “층“이라는 뜻을 가지고 있으며, 각 층마다 순서대로 덮어쓰며 그려지는 기능을 제공하는 것은”?

  1. brush
  2. alpha
  3. layer
  4. layout

3. 텍스처 파일을 만들기 위해 사진촬영을 할 때 광각으로 촬영하는 것은 가급적 피해야 하는 이유는?

  1. 사진 중앙부가 왜곡되기 때문
  2. 사진 주변부가 왜곡되기 때문
  3. 구조적으로 화질이 나빠지기 때문
  4. 가로세로 비율을 정확하게 맞출 수 없기 때문

4. gimp에 대해 틀린 설명은?

  1. 오픈소스에 무료이다.
  2. 상업적인 사용을 할 때는 요금을 지불해야 한다.
  3. layer 기능을 제공한다.
  4. uv map을 편집하기에 적절한 기능을 제공한다.

세슘기반 디지털트윈 구현

cesium 관련 자료 다운로드

건물

asset 등록 안내 영상

복습문제

1. 세슘 기초 실습(1)

1. 세슘의 특징이 아닌 것은?

  1. 무료이며 누구나 사용할 수 있다.
  2. 사용자가 추가한 asset들을 3D 형태로 보여준다.
  3. 나만의 3D 맵을 만들 수 있다.
  4. 내가 올린 3D asset들은 기본적으로 나한테만 보인다.

2. blender에서 만든 3D 모델을 세슘에 asset으로 등록할 때 사용하는 파일 포맷은?

  1. .blender
  2. .fbx
  3. .blend
  4. .asset

3. blender에서 만든 3D 모델을 fbx 파일로 내보내기 할 때 틀린 것은?

  1. 특정 모델만 fbx 파일에 추가되게 설정할 수 있다.
  2. File / Export / FBX(.fbx) 메뉴를 선택한다.
  3. export 하기 전에 export할 모델을 선택해 놓아야 한다.
  4. 기본 설정으로 texture가 자동 포함된다.

4. blender로 만든 3D 모델을 세슘에 asset으로 등록한 후에 할 일은?

  1. 정합을 확인한다.
  2. texture를 변경한다
  3. ID를 확인한다.
  4. 좌표를 설정한다.

5. 세슘을 무료로 사용할 수 있는 경우는?

  1. 비상업적인 개인적인 프로젝트
  2. 국가 SOC 사업
  3. 공공기관의 업무
  4. 대학의 상업적인 프로젝트

6. 세슘에 등록한 3D asset의 좌표를 잘못 등록할 것을 알게 되었다. 현재 asset 관리 창에 있을 때 이 문제를 해결하기 위해 눌러야 하는 것은?

  1. 1
  2. 2
  3. 3
  4. 4

7. 세슘 제품군 중 사용자의 3D asset 들을 등록 등 관리하고, 3D 맵을 만들기 위한 자료를 제공하는 것은?

  1. cesium ion
  2. cesium js
  3. cesium for unreal
  4. cesium for unity

2. 세슘 기초 실습(2)

1. 세슘이 제공하는 기능으로 3D 지도를 기반으로 한 프레젠테이션 기능을 제공하는 것은?

  1. cesium ion
  2. cesium stories
  3. cesium assets
  4. cesium js

2. 세슘 스토리에서 새 슬라이드를 추가하는 방법은?

  1. ctrl + + 키를 누른다.
  2. alt + n 키를 누른다.
  3. [new page] 버튼을 누른다.
  4. [new slide] 버튼을 누른다.

3. 세슘 스토리에서, 내가 올린 3D asset을 추가할 때 맞는 것은?

  1. 내가 올린 3D asset들의 목록이 나타나서 선택할 수 있다.
  2. 스토리에 보여주기 위해서는 새로 asset을 추가해야 한다.
  3. 내가 올린 asset들은 보여줄 수 없고 공용 asset 들만 보여줄 수 있다.
  4. 유료 버전은 가능하지만 무료 버전은 내가 올린 asset들을 볼 수 없다.

4. 세슘 스토리에서 슬라이드에 보여줄 모습을 확정하기 위해 누르는 버튼은?

  1. OK good
  2. Good position
  3. confirm
  4. capture view

3. 세슘 활용 실습

1. 세슘은 기본적으로 대용량의 3D 지도 자료를 한 번에 전송하지 않고 잘게 쪼개서 전송한다. 이러한 기술을 무엇이라 하는가?

  1. 스트리밍
  2. down bit
  3. 분할 전송
  4. 3D Tiles

2. 세슘은 모든 현재 보여줘야 하는 모든 파일이 다 다운로드 될 때 까지 한참 기다린 후 화면에 짠 하고 한꺼번에 나타나는 것이 아닌, 조금씩이라도 다운로드받은 내용을 지속적으로 화면에 보여주는 방식을 사용한다. 이런 기술을 무엇이라 하는가?

  1. 스트리밍
  2. down bit
  3. 분할 전송
  4. 3D Tiles

3. 세슘이 기본 제공하는 기능이 아닌 것은?

  1. Cesium World Terrain(전 세계의 3차원 지도)
  2. Imagery(위성 영상)
  3. OSM 건물
  4. 네이버지도

4. 세슘에 저장한 자료를 java script 언어로 프로그래밍해 볼 수 있게 해주는 cesium 의 구성 요소는?

  1. cesium ion
  2. cesium for unity
  3. cesium js
  4. cesium for o3de

5. 세슘에 저장한 자료를 이용해 전 세계 지도가 3D형태로 보여지고 내가 만들어 올린 3D asset 들이 3D 지도 위에 정확하게 위치하는 3D 게임을 만들고 싶을 때 사용하는 cesium 구성 요소는?

  1. cesium ion
  2. cesium for unreal
  3. cesium js
  4. cesium

6. 세슘을 이용해 디지털트윈 웹버전을 만들려고 한다. 이 때 사용하는 세슘의 구성 요소는?

  1. cesium ion
  2. cesium for unity
  3. cesium js
  4. cesium for o3de

7. 세슘을 이용해 디지털트윈 웹버전을 만들려고 개발환경을 구축하려 한다. 이 때 설치하는 프로그램으로 자바스크립트를 웹브라우저가 아닌 곳에서 실행할 수 있도록 만들어 주는 프로그램은?

  1. visual studio code
  2. node.js
  3. express.js
  4. cesium js

8. node.js를 기반으로 실행되는 프로그램으로 내 PC를 웹서버로 만들어 주는 프로그램은?

  1. visual studio code
  2. node.js
  3. express.js
  4. cesium js

9. 다음 중 heading에 대해 설명한 그림은?


10. 세슘을 이용해 디지털트윈 웹버전을 만들기 위해 cisium js를 사용해 프로그램을 만들었다. 다음과 같은 코드에서 AAAA 부분에 실제로 넣어야 하는 값은?

Cesium.Ion.defaultAccessToken = "AAAA"
  1. cesium ion에 로그인할 때 사용하는 user ID
  2. cesium ion에 로그인할 때 사용하는 password
  3. cesium ion에서 제공하는 토큰
  4. 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-&amp;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&amp;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&amp;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-&amp;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&amp;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&amp;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에 출근 체크 했었구나~” 하고 바로 알 수 있다.

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에서 vwViewport 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는 각 레이어의 좌표체계가 달라도 실시간으로 투영하여 렌더링하기 때문에 각 레이어간의 위치가 정확하게 맞춰진다.

작업 순서

  1. OSM 레이어를 추가한다.(EPSG:3857)
  2. 새 Shape File 레이어를 추가한다. EPSG:4326
  3. 원하는 위치에 대략의 모양으로 건물의 모양을 잡는다.
  4. 편집 모드를 켠다
  5. 꼭짓점 도구를 켠다.
  6. 건물 각 꼭짓점의 위치를 오른쪽 클릭한다.
  7. 꼭짓점 편집기에서 5개의 꼭짓점 모두 정확한 GPS 입력값으로 변경한다.

2. 건물의 면적 구하기

작업 순서

  1. 필드계산기를 연다.
  2. 가상필드를 추가한다.
  3. 계산식으로 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에 대한 설명으로 틀린 것은?

  1. 공사 규모에서는 유료로 구입해야 한다.
  2. 오픈소스로 개발되고 있다.
  3. 직관적인 UI로 큰 인기를 모으고 있다.
  4. 다양한 시스템들과 co-work하고 있다.

2. blender에 대한 설명으로 맞는 것은?

  1. 사진과 같은 품질을 제작할 수 있다.
  2. 동영상은 만들 수 없다.
  3. 플러그인을 사용할 수 없어 활용도가 낮다.
  4. 유료 구입하면 특수 기능을 사용할 수 있다.

3. x, y, z라고 축의 이름이 붙어 있지 않은 경우라도 어떤 축이 각각 x, y, z 축임을 알 수 있는 방법은?

  1. ABC
  2. GOD
  3. YOU
  4. RGB

4. 빨간색 축은 x, y, z 중 어떤 축인가?

  1. X
  2. Y
  3. Z
  4. 아무런 축도 나타내지 않는다.

5. 파란색 축은 x, y, z, 중 어떤 축인가?

  1. X
  2. Y
  3. Z
  4. 아무런 축도 나타내지 않는다.

6. 2D에 비해 3D의 특징은?

  1. 더 많은 색을 표현할 수 있다.
  2. 더 촘촘하게 간격을 구분할 수 있다.
  3. 높이 개념이 있다.
  4. 데이터의 양이 더 적다.

7. 다음 그림에서 빨간 점의 (x, y, z) 좌표값은?

alt text

  1. (5, 4, 0)
  2. (0, 4, 5)
  3. (5, 0, 4)
  4. (4, 5, 0)

blender 실습 1

1. LMB는 무엇의 약자인가?

  1. Large Mouse Button
  2. Left Mouse Button
  3. Left Move Button
  4. Light Move Button

2. MMB를 누르라고 적혀 있으면 마우스의 어떤 부분을 눌러야 하나?

  1. 왼쪽 버튼
  2. 왼쪽 버튼과 오른쪽 버튼을 동시에
  3. 마우스 휠
  4. 오른쪽 버튼

3. cube가 하나 있는 경우 이 큐브를 확인하기 위해 궤도식 회전(orbit)을 하려 한다. 가장 좋은 방법은?

  1. 왼쪽 버튼으로 화면을 눌러 돌린다.
  2. shift + 왼쪽 버튼으로 화면을 눌러 돌린다.
  3. 오른쪽 버튼으로 화면을 눌러 돌린다.
  4. 마우스 휠로 화면을 눌러 돌린다.

4. 궤도식 회전(orbit)을 하면 어느 한 점을 중심으로 카메라가 일정거리를 두고 회전하게 된다. 이 때 회전 중점을 바꾸고 싶다면 어떻게 해야 하나?

  1. 원하는 중점에 마우스를 위치하고 MMB를 누른다.
  2. 원하는 중점에 마우스를 위치하고 Alt + MMB를 누른다.
  3. 원하는 중점에 마우스를 위치하고 LMB를 누른다.
  4. 원하는 중점에 마우스를 위치하고 Alt + LMB를 누른다.

5. 현재 화면에서 오른쪽에 반만 보이는 object를 화면 가운데에 보이도록 하고 싶으면 panning을 해야 한다. 패닝하는 방법은?

  1. MMB를 누른 채로 마우스를 움직인다.
  2. LMB를 누른 채로 마우스를 움직인다.
  3. Shift를 누른 상태에서 MMB를 꾹 누르고 (떼지않고) 마우스를 움직인다.
  4. Shift를 누른 상태에서 LMB를 꾹 누르고 (떼지않고) 마우스를 움직인다.

6. zoom in / zoom out 하는 방법으로 틀린 것은?

  1. 마우스 휠을 돌린다.
  2. 숫자 키패드에서 + 키나 - 키를 누른다.
  3. 마우스 휠을 누르고 움직인다.
  4. Ctrl + MMB를 하고 마우스를 위아래로 움직인다.

7. 작업하다 보니 많은 수의 mesh들을 만들게 되었다. 이 mesh들과 카메라, 조명까지 모두 한 화면에 표시되도록 zoom out 하는 가장 빠르고 쉬운 방법은?

  1. / 키를 누른다.
  2. . 키를 누른다.
  3. * 키를 누른다.
  4. home 키를 누른다.

8. 작업하면서 zoom in / out 을 여러 번 하다보니 어느 순간부터 zoom in 이 제대로 안되었다. 이 문제를 가장 빠르게 해결하는 방법은 ?

  1. zoom in하고 싶은 mesh를 선택하고 / 키를 누른다.
  2. zoom in하고 싶은 mesh를 선택하고 . 키를 누른다.
  3. zoom in하고 싶은 mesh를 선택하고 * 키를 누른다.
  4. zoom in하고 싶은 mesh를 선택하고 home 키를 누른다.

9. viewpoint를 설정하는 방법으로 틀린 것은 ?

  1. Top view: 숫자키패드 7
  2. Front view: 숫자키패드 5
  3. Right view: 숫자키패드 3
  4. Bottom view: Ctrl + 숫자키패드 7

10. Top view로 보고 있다가 반대쪽인 bottom view로 바꾸고 싶거나, Left view로 보고 있다가 반대쪽인 right view로 바꾸고 싶거나, Front view로 보고 있다가 back view로 바꾸고 싶을 때 모든 경우에 한 번에 바꾸는 방법은 ?

  1. 숫자키패드 5를 누른다.
  2. 숫자키패드 9를 누른다.
  3. 숫자키패드 .을 누른다.
  4. 숫자키패드 -를 누른다.

11. 다음과 같이 quad view로 전환하는 방법은 ?

  1. ctrl + alt + q를 누른다.
  2. ctrl + alt + v를 누른다.
  3. ctrl + alt + 4를 누른다.
  4. ctrl + alt + /를 누른다.

12. 다음 줄 틀린 말은 ?

  1. perspective: 입체적인 표현을 한다.
  2. orthographic: 직교투영으로 표현한다.
  3. perspective: top view, front view, right view에서 사용한다.
  4. orthographic: 거리와 상관없이 물체의 크기를 똑같이 보여준다.

13. 오브젝트를 이동할 때 사용하는 키는 ?

  1. G
  2. R
  3. A
  4. S

14. 오브젝트를 이동할 때 y축으로만 이동하려 한다. 이 경우 눌러야 하는 키는 ?

  1. G
  2. X
  3. Y
  4. Z

15. 오브젝트를 이동할 때 x, y축으로만 이동하고 z축으로의 이동은 제한하려 한다. 이 경우 눌러야 하는 키는 ?

  1. Ctrl + Z
  2. Z
  3. Alt + Z
  4. Shift + Z

16. 아래 그림과 같이 cube가 회전되어 있을 때 바닥과 평형을 이루도록 하는 방법은 ?

  1. G키를 눌러 회전시킨다.
  2. R키를 눌러 회전시킨다.
  3. B키를 눌러 회전시킨다.
  4. A키를 눌러 회전시킨다.

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

  1. X키를 눌러 X축을 기준으로 회전시킨다.
  2. Y키를 눌러 Y축을 기준으로 회전시킨다.
  3. Z키를 눌러 Z축을 기준으로 회전시킨다.
  4. blender는 무료 프로그램이라 이런 문제는 해결할 수 없다.

18. 아래와 같이 눈사람을 만들었는데 아래에 있는 sphere(구)를 좀 더 크게 해주고 싶을 때 사용할 수 있는 방법은 ?

  1. 아래에 있는 sphere를 선택하고 G키를 눌러 약간 키워준다.
  2. 아래에 있는 sphere를 선택하고 R키를 눌러 약간 키워준다.
  3. 아래에 있는 sphere를 선택하고 S키를 눌러 약간 키워준다.
  4. 아래에 있는 sphere를 선택하고 A키를 눌러 약간 키워준다.

19. 아래와 같이 어느 한 점의 위치를 변경하려 할 때 제일 처음 할 일은 ?

  1. e키를 눌러 edit 모드로 들어간다.
  2. ctrl키를 눌러 edit 모드로 들어간다.
  3. m키를 눌러 edit 모드로 들어간다.
  4. tab키를 눌러 edit 모드로 들어간다.

20. edit 모드 진입 후 아래와 같이 어느 한 점(vertex)의 위치를 변경하려 할 때 할 일은 ?

  1. p키를 눌러 점편집 모드로 변경한다.
  2. 1키를 눌러 점편집 모드로 변경한다.
  3. 2키를 눌러 점편집 모드로 변경한다.
  4. 3키를 눌러 점편집 모드로 변경한다.

21. edit 모드 진입 후 아래와 같이 어느 한 선(edge)의 위치를 변경하려 할 때 할 일은 ?

  1. L키를 눌러 선편집 모드로 변경한다.
  2. 1키를 눌러 선편집 모드로 변경한다.
  3. 2키를 눌러 선편집 모드로 변경한다.
  4. 3키를 눌러 선편집 모드로 변경한다.

22. edit 모드 진입 후 아래와 같이 어느 한 면(face)의 크기를 변경하려 할 때 할 일은 ?

  1. f키를 눌러 면편집 모드로 변경한다.
  2. 1키를 눌러 면편집 모드로 변경한다.
  3. 2키를 눌러 면편집 모드로 변경한다.
  4. 3키를 눌러 면편집 모드로 변경한다.

23. 다음과 같이 작업했을 때 결과물은 ?

1. cube를 선택한다.
2. tab 키를 눌러 edit 모드로 들어간다.
3. 1키를 누른다.
4. 어느 한 점을 선택한다.
5. G키를 누른다.
6. X키를 누른다.
7. 마우스를 움직인다.


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

  • cube를 선택한다.

  • tab키를 눌러 편집 모드로 들어간다.

  1. 3키를 눌러 면편집 모드로 변경한다.

  2. r키를 눌러 회전 기능을 활성화한다.

  3. ctrl + z키를 눌러 z축 회전으로 설정한다.

  4. 마우스를 움직여 선택된 면을 회전한다.


25. 다음 그림과 같은 편집과 방법을 올바르게 짝지은 것은?

  1. 모따기, ctrl + v
  2. 모깎기, ctrl + v
  3. 모따기, ctrl + b
  4. 모깎기, ctrl + b

26. 다음 그림과 같은 편집과 방법을 올바르게 짝지은 것은?

  1. 모따기, 모깎기 후 마우스 휠
  2. 모깎기, 모따기 후 마우스 휠
  3. 모따기, 모깎기 후 마우스 휠
  4. 모깎기, 모따기 후 마우스 휠

27. 다음 그림과 같이 면을 도출(extrude)할 떄 사용하는 키는?

  1. e
  2. x
  3. t
  4. r

28. 면을 도출(extrude)시킨 직후 이 작업을 취소하려면 ctrl + z 키를 누른다. 그런데 이 때, ctrl + z 키를 2번 이상 눌러 그 면을 선택한 것까지 취소해야 한다. 그 이유는(답 2개)?

  1. extrude는 메모리를 많이 차지하는 연산이므로
  2. extrude는 CPU를 많이 차지하는 연산이라 정확하게 제거하지 않으면 앞으로 CPU를 더 많이 사용하기 때문
  3. extrude는 면을 하나 더 생성하는 거라 나중에 이 면이 반드시 문제가 되기 때문에 완벽하게 제거하려고.
  4. extrude하면 바로 그 자리에 똑같은 면이 하나 더 생성되기 때문에 면이 하나 더 있는지 알아보기 어렵기 때문

29. fbx는 무엇의 약자인가?

  1. 약자가 아니다.
  2. FaceBook eXtension
  3. FilmBook eXtension
  4. FilmBoX

blendr 실습 2

1. 평면도 모델링을 위해 blender에 평면도를 올려놓는 메뉴는?

  1. Add > Image > panel
  2. Add > Image > Reference
  3. Add > Image > Back
  4. Add > Reference > Image

2. 평면도 모델링을 위해 벽을 세울 때 사용하는 기술은?

  1. loop cut
  2. extrude
  3. array
  4. boolean

3. extrude할 때 영향받는 방향을 x축 방향으로 고정하기 위해 사용하는 방법으로 옳은 것은?

  1. e 키를 눌러 extrude를 시작하고 x 키를 누른다.
  2. x 키를 눌러 extrude를 시작하고 x 키를 누른다.
  3. e 키를 눌러 extrude를 시작하고 ctrl + x 키를 누른다.
  4. x 키를 눌러 extrude를 시작하고 ctrl + x 키를 누른다.

4. blender에서 벽에 창문 구멍을 내기 위해 사용하는 기술은?

  1. loop cut
  2. select
  3. array
  4. boolean

5. 디즈니에서 처음 상업화해 사용한 기술로, 재질을 시각화하기 위해 물리적인 속성을 이용하는 통일된 표현법은?

  1. material
  2. PBR
  3. metalic
  4. physical

6. 다음 중 PBR의 주요 속성이 아닌 것은?

  1. base color
  2. roughness
  3. metalic
  4. glossy

7. 다음 중 PBR의 속성에 대한 설명 중 틀린 것은?

  1. base color: 물체 고유색 표현
  2. roughness: 표면의 거친 정도
  3. metalic: 금속의 느낌인 정도
  4. round: 표면의 둥근 정도

8. model의 겉면에 붙이는 이미지를 무엇이라 부르나?

  1. texture
  2. picture
  3. outer
  4. uv

9. 육면체 모델의 경우, 각 면을 하나씩 전개도처럼 펴서 각각의 면에 이미지를 그린 후 다시 입히는 기법은?

  1. texture
  2. picture
  3. outer
  4. uv

10. 모델의 겉면에 자잘한 상처나 결이 있는 경우, 이걸 모델에 전부 다 반영하면 처리 속도가 너무 느려져, 이를 막고자 그런 자잘한 상처나 결을 그림자로 표현해 입체감을 주는 방법으로 실사 느낌을 주는 효과적인 기법은?

  1. roughness
  2. material
  3. normal map
  4. uv

11. light 중 전구와 같은 효과의 조명이며, 있는 곳에서 멀어질수록 점점 어두워지는 조명은?

  1. point
  2. sun
  3. spot
  4. area

12. light 중 공연장의 스포트라이트 느낌을 주는 조명은?

  1. point
  2. sun
  3. spot
  4. area

13. light 중 멀리 있는 태양과 같이 위치는 전혀 상관없고 각도만 중요하며 화면 전체에 일정한 밝기를 제공하는 조명은?

  1. point
  2. sun
  3. spot
  4. area

14. light 중 창문을 통해 빛이 들어오거나 TV나 모니터에서 퍼져나오는 빛을 표현할 때 사용하는 조명은?

  1. point
  2. sun
  3. spot
  4. area

15. blender에서 light를 모두 없애면 완전히 검은색으로만 렌더링된다?

  1. O
  2. X

16. blender에서 면을 나누는 기술 중 하나는?

  1. loop cut
  2. uv
  3. area
  4. spot

blender 실습 3

1. 3D 그래픽에서 모델링 후 실제와 똑같이 텍스처를 입혀도 실사와 동떨어진 3D 그래픽이라는 느낌이 드는데 그 이유는 겉표면이 아주 매끈하고 흠집, 결 등이 없기 때문이다. 실제 모델에 흠집, 결 등을 추가하지 않아도, 흠집, 결 등으로부터 생기는 사소한 그림자를 만들어 작은 요철, 흠집, 결 등을 표현해 실사같은 느낌을 주는 기술은?

  1. render
  2. material
  3. spot
  4. normal map

2. blender 에서 제공하는 렌더링 엔진 중 반사, 그림자 처리 등에 실제 물리와 비슷한 처리를 하기보다는 최대한 빨리 최대한 비슷하게 처리하는데 중점을 둔 렌더 엔진은?

  1. defalut 엔진
  2. eevee
  3. cycles
  4. v-ray

3. blender 에서 기본 제공하는 렌더링 엔진 중 반사, 그림자 처리 등에 실제 물리와 비슷한 처리를 해 시간은 매우 오래 걸리지만 실사와 비슷한 결과물을 만들어 주는 렌더 엔진은?

  1. defalut 엔진
  2. eevee
  3. cycles
  4. v-ray

4. blender에서 특정 영역에 안개같은 입자들이 차 있는 느낌을 주고 싶을 때 사용하는 기술은?

  1. area
  2. space
  3. fog
  4. volume

5. 3D 그래픽 관련 기술 중, 실제 물리 현상과 같이 빛 입자(포톤)를 쏘아 포톤들이 오브젝트들에 반사되는 경로를 추적해 실제와 유사한 그림자와 밝기를 가지도록 결과물을 만들어 주는 기술은?

  1. uv mapping
  2. normal map
  3. photon cannon
  4. ray tracing

AI를 이용한 드론 운용

자료

LM Studio와 엑셀의 연동

사용법

  1. 파일 다운로드: 엑셀 파일

  2. 압축풀고 ai_excel.xlsm 파일을 실행한다. 파일 열리는 데 한참 걸림(1분. 열릴 때까지 기다리자)

  3. ALT + F11을 눌러 VBA 모드로 들어간다.

  4. 도구 > 참조 메뉴로 들어간다.

  5. Microsoft Scripting Runtime을 체크한다.

  6. VBA-JSON을 설치한다.

  1. 엑셀 파일에서 AI에 질의한다. 예) =toAI(A1 & “ 의 뜻 번역해줘“)

국토정보 프로그래밍_파이썬

복습문제

1. 파이썬 환경 이해

2. 파이썬 자료구조

3. 파이썬 조건문

4. 파이썬 반복문

공간정보플랫폼 기술융합

자료 영상

복습문제

1. 공간정보 코딩 기초

2. 공간정보 서비스 개발

3. 공간정보 시각화

4. 공간정보 매시업