[혼공학습단 9기] 혼공파 5주차

·2023년 2월 14일
0
post-thumbnail

벌써 끝이 보인다.
4주차에 많이 늦어서 5주차는 맞춰서 내려고 했는데 또 늦었다...
잘 마무리할 수 있도록 노력해야겠다!


5주차(2/6~2/22) 진도 : Chapter 06~07(07-1)

✅ 기본 미션

구문 오류와 예외의 차이 설명하기(p.291 1번 문제)

(답)
구문 오류는 프로그램의 문법적인 오류로 인해 프로그램이 실행조차 되지 않는 오류이고, 예외는 프로그램 실행 중에 발생하는 오류로써 try 구문 등으로 처리할 수 있다.

✅ 선택 미션

p.293 3번 문제 풀고 인증하기


(06-1) 예외 처리

<오류(Error)의 종류>

  • 프로그램 실행 전 발생하는 오류 → 구문 오류(syntax error)
  • 프로그램 실행 중 발생하는 오류 → 예외(Exception) 또는 런타임 오류(runtime error)

구문 오류(syntax error)

  • 괄호 개수, 들여쓰기 문제 등으로 프로그램 실행되기 전에 발생하는 오류.

⌨️ 코드

# 프로그램 시작
print("# 프로그램이 시작되었습니다!")

# 구문 오류 발생 코드 → 닫는 따옴표로 문자열 닫지 않음
print("# 예외를 강제로 발생시켜 보자!) 

🖥️ 결과

→ 닫는 따옴표로 문자열 닫아 해결하면 프로그램 실행 가능!


예외(Exception) 또는 런타임 오류(runtime error)

  • 실행 중에 발생하는 오류.

⌨️ 코드

# 프로그램 시작
print("# 프로그램이 시작되었습니다!")

# 예외 발생 코드 → 닫는 따옴표로 문자열 닫지 않음
list_a[1]

🖥️ 결과


→ list_a라는 이름을 가진 것을 정의해주면 프로그램 실행 가능!

예외 해결

⌨️ 코드

# 프로그램 시작
print("# 프로그램이 시작되었습니다!")

# 예외 발생 코드 해결
list_a = [1, 2, 3, 4, 5]
list_a[1]

🖥️ 결과

→ 오류 해결!


예외 처리(Exception Handling)

<예외 처리(Exception Handling)>

  • 예외를 해결하는 모든 것.
  • 처리 방법 2가지
    • 조건문 사용
    • try 구문 사용

기본 예외 처리

  • 조건문 사용해서 예외 처리하는 방법.

⌨️ 코드

# 숫자 입력받기
number_input_a = int(input("정수 입력> "))

# 출력
print("원의 반지름:", number_input_a)
print("원의 둘레:", 2 * 3.14 * number_input_a)
print("원의 넓이:", number_input_a * number_input_a)

🖥️ 결과

여기서 예외가 발생한다면??

⌨️ 입력 (→ 정수를 입력하지 않음)

🖥️ 출력

조건문으로 예외 처리

  • '정수 입력하지 않았을 때'를 조건으로 구분해 처리.
    ⌨️ 코드
# 숫자 입력받기
user_input_a = input("정수 입력> ")

# 사용자 입력이 숫자로만 구성되어 있을 때
if user_input_a.isdigit():
	# 숫자로 변환
    number_input_a = int(user_input_a)
    # 출력
	print("원의 반지름:", number_input_a)
	print("원의 둘레:", 2 * 3.14 * number_input_a)
	print("원의 넓이:", number_input_a * number_input_a)
# 사용자 입력이 정수가 아닐 때
else:
	print("정수를 입력하지 않았습니다.")

🖥️ 결과

  • 정수를 입력한 경우
  • 정수를 입력하지 않은 경우

❗️ 프로그램 작성 시 항상 예외적인 상황까지 모두 생각하는 습관을 가지자!!


try except 구문

  • 프로그래밍 언어의 구조적 문제로 조건문만으로 예외 처리 어려운 경우 존재.
  • 프로그래밍 언어가 제공하는 예외 처리 구문.

사용 방법

try: 
	예외가 발생할 가능성이 있는 코드
except:
	예외가 발생했을 때 실행할 코드
  • 예외 발생 가능성 있는 코드 모두 try 구문 안에 넣기.
  • 예외 발생했을 때 실행할 코드 모두 except 구문 안에 넣기.

⌨️ 코드

# try except 구문으로 예외 처리
try: # 예외 발생 가능성 있는 구문
	# 숫자로 변환
    number_input_a = int(input("정수 입력> ")) 
    # 출력
	print("원의 반지름:", number_input_a)
	print("원의 둘레:", 2 * 3.14 * number_input_a)
	print("원의 넓이:", number_input_a * number_input_a)
    
except: # 예외 발생 시 실행할 구문
	print("무언가 잘못되었습니다.")

🖥️ 결과


try except 구문과 pass 키워드 조합

어떤 부분에서 예외 발생하는지 파악할 수 있는 상황일 때
- 예외 발생 시 처리해야 하지만 중요한 코드가 아닌 경우
- 프로그램 강제 종료되는 것부터 막고 싶을 때 사용
  • except 구문에 아무것도 넣지 않고 try 구문만 사용.
  • 구문 오류 발생하므로 pass 키워드 추가.
try:
	예외 발생 가능성 있는 코드
except:
	pass

⌨️ 코드

# 변수 선언
list_input_a = ["52", "273", "32", "스파이", "103"]

# 반복 적용
list_number =[]
for item in list_input_a:
	# 숫자로 변환해 리스트에 추가
    try:
    	float(item) # 예외 발생하면 알아서 다음으로 진행 안됨
        list_number.append(item) # 예외 없이 통과하면 리스트에 넣음
    except:
    	pass

# 출력
print("{} 내부에 있는 숫자는".format(list_input_a))
print("{}입니다.".format(list_number))

🖥️ 결과

❗️ try except 구문은 if 구문 활용 코드보다 약간 느림
→ 속도가 중요하지 않을 때 코드를 쉽게 작성하기 위한 목적이라면 사용👌


try except else 구문

  • try except 구문 뒤에 else 구문 붙이면 '예외 발생하지 않았을 때 실행 코드' 지정 가능
try:
	예외 발생 가능한 코드
except:
	예외 발생했을 때 실행할 코드
else:
	예외 발생하지 않았을 때 실행할 코드

❗️ try except else 구문 사용할 때 많은 경우에서

  • 예외 발생 가능성 있는 코드만 try 구문 내부에 넣기.
  • 나머지 모두 else 구문에 넣기.

⌨️ 코드

# try except else 구문으로 예외 처리
try:
	# 숫자 변환
    number_input_a = int(input("정수 입력> "))
except:
	print("정수를 입력하지 않았습니다.")
else:
	# 출력
	print("원의 반지름:", number_input_a)
    print("원의 둘레:", 2 * 3.14 * number_input_a)
    print("원의 넓이:", number_input_a * number_input_a)

🖥️ 결과

  • 예외 발생하지 않았을 때
  • 예외 발생했을 때

❗️ 왜 try 구문 안에 모두 넣으면 안될까?

  • try 구문 안에 다 넣어도 문제 없다!
    - 예외 처리에 else 구문 있는 언어 : 파이썬, 루비 정도..
    - else 구문 사용이 깔끔하면 그렇게 하면 된다!
    <결론>
    편한 대로 사용해라~

finally 구문

  • 예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문.
  • 예외 발생하든 안하든 무조건 실행할 때 사용하는 코드.
try:
	예외 발생 가능한 코드
except:
	예외 발생했을 때 실행할 코드
else:
	예외 발생하지 않았을 때 실행할 코드
finally:
	무조건 실행할 코드

⌨️ 코드

# try except 구문으로 예외 처리
try:
	# 숫자 변환
    number_input_a = int(input("정수 입력> "))
    # 출력
	print("원의 반지름:", number_input_a)
    print("원의 둘레:", 2 * 3.14 * number_input_a)
    print("원의 넓이:", number_input_a * number_input_a)
except:
	print("정수를 입력하지 않았습니다.")
else:
	print("예외가 발생하지 않았습니다.")
finally:
	print("일단 프로그램이 어떻게든 끝났습니다.")

🖥️ 결과

  • 예외 발생하지 않았을 때
  • 예외 발생했을 때

❗️ 예외 처리 구문의 규칙

  • try 구문 단독 사용 불가
    → 반드시 except 구문 또는 finally 구문과 함께 사용!
  • else 구문 반드시 except 구문 뒤에 사용!
[가능한 조합]
- try + except 구문
- try + except + else 구문
- try + except + finally 구문
- try + except + else + finally 구문
- try + finally 구문

[이 외의 조합] → 구문 오류 발생

⌨️ try + else 구문 조합

# try except 구문으로 예외 처리
try:
	# 숫자 변환
    number_input_a = int(input("정수 입력> "))
    # 출력
    print("원의 반지름:", number_input_a)
    print("원의 둘레:", 2 * 3.14 * number_input_a)
    print("원의 넓이:", number_input_a * number_input_a)
else:
    print("프로그램이 정상적으로 종료되었습니다.")

🖥️ 구문 오류 발생 → 아예 실행 X!


finally에 대한 오해

  • 일반적으로 finally 키워드 설명 예젤로 '파일 처리' 많이 사용.
    → 실제 finally 구문 사용과 전혀 관련 X.
    • 무조건 사용해야 하는 것이 아니라 조금 깔끔하게 코드 작성 가능.

파일 Open

  • 파일 열려 있으면 해당 파일 옮기거나 덮어 씌우는 등이 불가능.
    → 프로그램에서 파일 열었으면(open) 반드시 닫아야(close) 함.
  • 간단 실행 후 끝나는 프로그램 → 프로그램 끝나면 열었던 파일 닫아서 상관 X
  • 항상 켜져 있는 프로그램 → 문제 발생 가능!
데몬(demon) 또는 서비스(service) : 항상 켜져 있는 프로그램

📖 파일 객체의 closed 속성

  • 파일 제대로 닫았는지를 알 수 있음.
  • 파일 닫을 때 close() 함수 사용.

⌨️ 파일 처리 중간에 예외 발생

# try except 구문 사용
try:
	# 파일 open
    file = open("info.txt", "w")
    # 여러 가지 처리 수행
    예외.발생해라()
    # 파일 close
    file.close()
except Exception as e:
    print(e)

print("# 파일이 제대로 닫혔는지 확인하기")
print("file.closed:", file.closed)

🖥️ 결과 → 파일 제대로 닫히지 않는 문제 발생!

→ 반드시 finally 구문으로 파일 닫아야 함!

⌨️ fially 구문 사용해 파일 닫기

# try except 구문 사용
try:
	# 파일 open
    file = open("info.txt", "w")
    # 여러 가지 처리 수행
    예외.발생해라()
    
except Exception as e:
    print(e)
    
finally:
	# 파일 close
    file.close

print("# 파일이 제대로 닫혔는지 확인하기")
print("file.closed:", file.closed)

🖥️ 결과

⌨️ 코드 모두 끝난 후 파일 닫기

# try except 구문 사용
try:
	# 파일 open
    file = open("info.txt", "w")
    # 여러 가지 처리 수행
    예외.발생해라()
    
except Exception as e:
    print(e)
    

# 파일 close
file.close
print("# 파일이 제대로 닫혔는지 확인하기")
print("file.closed:", file.closed)

🖥️ 결과 → 동일하게 파일 닫기 가능


try 구문 내부에서 break/return 키워드 사용하는 경우

break/return 키워드로 빠져나가도 finally 무조건 실행

  • finally 구문
    → 반복문 또는 함수 내부에 있을 때 위력 발휘.

⌨️ 코드

# test() 함수 선언
def test():
	print("test() 함수의 첫 줄입니다.")
    
    try:
    	print("try 구문이 실행되었습니다.")
        return
        print("try 구문의 return 키워드 뒤입니다.")
	except:
    	print("except 구문이 실행되었습니다.")
    else:
    	print("else 구문이 실행되었습니다.")
    finally:
    	print("finally 구문이 실행되었습니다.")

	print("test() 함수의 마지막 줄입니다.")

# test() 함수 호출
test()

🖥️ 결과


✅ 함수 내부에서 파일 처리 코드 깔끔하게 만들고 싶을 때
→ finally 구문 활용하는 경우 많음.

⌨️ 코드

# 함수 선언
def write_text_file(filename, text):
	# 
    print("test() 함수의 첫 줄입니다.")
    
    try:
    	print("try 구문이 실행되었습니다.")
        return
        print("try 구문의 return 키워드 뒤입니다.")
	except:
    	print("except 구문이 실행되었습니다.")
    else:
    	print("else 구문이 실행되었습니다.")
    finally:
    	print("finally 구문이 실행되었습니다.")

	print("test() 함수의 마지막 줄입니다.")

# test() 함수 호출
test()


(06-2) 예외 고급

예외 객체(exception object)

  • 예외 발생하면 생기는 예외 정보가 저장되는 것.
try: 
	예외 발생 가능한 구문
except 예외 종류 as 예외 객체 활용할 변수 이름:
	예외 발생했을 때 실행 구문

📖 Exception

  • 클래스
  • '예외 종류' 모를 때 사용.
  • 모든 예외의 어머니.
  • 큰 규모 서비스 구축 시 발생한 여러 예외 정보 수집 → 프로그램 개선 도움

⌨️ 코드

# try except 구문으로 예외 처리
try:
    # 숫자 변환
    number_input_a = int(input("정수 입력> "))
    # 출력
    print("원의 반지름:", number_input_a)
    print("원의 둘레:", 2 * 3.14 * number_input_a)
    print("원의 넓이:", number_input_a * number_input_a)

except Exception as exception:
        # 예외 객체 출력
        print("type(exception):", type(exception))
        print("exception:", exception)

🖥️ 결과

  • 예외 객체의 자료형 : 'ValueError'
  • 내용 : invalid literal for int() with base 10:'<입력한 문자열>'


예외 구분하기

  • 예외 객체 사용 → except 구문을 if 조건문처럼 사용해 예외 구분 가능.

⌨️ 코드

# 변수 선언
list_number = [52, 273, 32, 72, 100]

# try except 구문으로 예외 처리
try:
    # 숫자 입력
    number_input = int(input("정수 입력> "))
    # 리스트 요소 출력
    print("{}번째 요소: {}".format(number_input, list_number[number_input]))
except Exception as exception:
    # 예외 객체 출력
    print("type(exception):", type(exception))
    print("exception:", exception)

🖥️ 예외 발생 X

🖥️ ValueError

🖥️ IndexError

  • Python : except 구문 뒤에 예외 종류 입력해 예외 구분 가능.
try:
	예외 발생 가능한 구문
except 예외 종류 A:
	예외 A 발생했을 때 실행할 구문
except 예외 종류 B:
	예외 B 발생했을 때 실행할 구문
except 예외 종류 C:
	예외 C 발생했을 때 실행할 구문
# 변수 선언
list_number = [52, 273, 32, 72, 100]

# try except 구문으로 예외 처리
try:
   # 숫자 입력
   number_input = int(input("정수 입력> "))
   # 리스트 요소 출력
   print("{}번째 요소: {}".format(number_input, list_number[number_input]))
except ValueError:
   # ValueError가 발생하는 경우
   print("정수를 입력해 주세요!")
except IndexError:
   # IndexError가 발생하는 경우   
   print("리스트의 인덱스를 벗어났어요!")

🖥️ ValueError

🖥️ IndexError

  • 예외 구분 시 except 구문 뒤에 as 키워드로 예외 객체 붙여 활용 가능.
# 변수 선언
list_number = [52, 273, 32, 72, 100]

# try except 구문으로 예외 처리
try:
   # 숫자 입력
   number_input = int(input("정수 입력> "))
   # 리스트 요소 출력
   print("{}번째 요소: {}".format(number_input, list_number[number_input]))
except ValueError as exception:
   # ValueError가 발생하는 경우
   print("정수를 입력해 주세요!")
   print("exception:", exception)
except IndexError as exception:
   # IndexError가 발생하는 경우   
   print("리스트의 인덱스를 벗어났어요!")
   print("exception:", exception)

🖥️ IndexError


모든 예외 잡기

  • except 구문 → if, elif, else 조건문처럼 오류 검출하면서 확인.
  • 예외 처리를 해도 예외를 못 잡는 경우 있음.
    → else 구문처럼 마지막에 Exception 넣어 프로그램 죽지 않게 하는 것이 좋음.
# 변수 선언
list_number = [52, 273, 32, 72, 100]

# try except 구문으로 예외 처리
try:
   # 숫자 입력
   number_input = int(input("정수 입력> "))
   # 리스트 요소 출력
   print("{}번째 요소: {}".format(number_input, list_number[number_input]))
   
   예외.발생()
   
except ValueError as exception:
   # ValueError가 발생하는 경우
   print("정수를 입력해 주세요!")
   print("exception:", exception)
except IndexError as exception:
   # IndexError가 발생하는 경우   
   print("리스트의 인덱스를 벗어났어요!")
   print("exception:", exception)
except Exception as exception:
   # 이외의 예외 발생한 경우
   print("미리 파악하지 못한 예외가 발생했습니다.")
   print(type(exception), exception)

🖥️ 이외의 예외 발생


raise 구문

  • 프로그램 강제 종료 막기 위해 예외 꼭 처리해야 함.
  • 개발 기간동안 생길 수 있는 아래와 같은 경우 존재.
    - 아직 구현 X 부분에 확실히 문제 생기게 만들자!
    - 그냥 넘어가면 안되는 부분에서 강제 종료 시키자!

📖 raise 키워드

  • 예외를 강제로 발생시킴.
  • 일부러 예외 발생시켜 프로그램 죽게 만들 때 사용.
    - 구현되지 않은 부분 잊어버리지 않도록 함.

사용 방법

raise 예외 객체 이름




(07-1) 표준 모듈

📖 모듈(module)

  • 여러 변수와 함수 가지고 있는 집합체.
  • 구분
    - 표준 모듈 : 파이썬에 기본적으로 내장 되어 있는 모듈.
    - 외부 모듈 : 다른 사람이 만들어 공개한 모듈.

사용법

import 모듈 이름
  • 코드 가장 위에 작성.

모듈 사용의 기본 : math 모듈

math 모듈

import math
  • 수학과 관련된 기능 가짐.
  • math 모듈의 함수
변수 또는 함수설명
sin(x)사인값 구함.
cos(x)코사인값 구함.
tan(x)탄젠트값 구함.
log(x[, base])로그값 구함.
ceil(x)올림.
floor(x)내림.

📖 파이썬 공식 문서

  • 표준 모듈 등의 정보가 궁금할 때 가장 먼저 확인해야 할 것.

from 구문

from 모듈 이름 import 가져오고 싶은 변수 또는 함수
  • 모듈의 변수와 함수들 중 활용하고 싶은 기능만 가져오고 싶을 때 이용.
  • 여러 개 변수나 함수 입력 가능.
  • 가져온 기능은 앞에 모듈 이름 붙이지 않고 사용 가능.

만약 모든 기능을 가져오면서 모듈 이름을 붙이고 싶지 않다면?

from math import *
  • ' * ' 기호 이용

as 구문

import 모듈 as 사용하고 싶은 식별자
  • 모듈 가져올 때 이름 충돌 발생하는 경우 사용.
  • 모듈 이름 너무 길어 짧게 줄이고 싶은 경우 사용.


random 모듈

  • 랜덤 값 생성 시 사용.
import random

사용법

  • random 모듈 import.
  • random 뒤에 .(마침표) 찍으면 자동 완성 기능으로 확인 가능.
  • random 계속 입력 귀찮 → from 구문 활용.

⌨️ 코드

import random
print("# random 모듈")

# random(): 0.0 <= x < 1.0 사이의 float 리턴.
print("- random():", random.random())

# uniform(min, max): 지정한 범위 사이의 float 리턴.
print("- uniform(10, 20):", random.uniform(10, 20))

# randrange(): 지정한 범위의 int 리턴.
# - randrange(max) : 0부터 max 사이의 값 리턴.
# - randrange(min, max) : min부터 max 사이의 값 리턴.
print("- randrange(10):", random.randrange(10))

# choice(list) : 리스트 내부에 있는 요소 랜덤 선택.
print("- choice([1, 2, 3, 4, 5]):", random.choice([1, 2, 3, 4, 5]))

# shuffle(list) : 리스트 요소들 랜덤 섞음.
print("- shuffle([1, 2, 3, 4, 5]):", random.shuffle([1, 2, 3, 4, 5]))

# sample(list, k=<숫자>) : 리스트 요소 중 k개 뽑음.
print("- sample([1, 2, 3, 4, 5], k=2):", random.sample([1, 2, 3, 4, 5], k=2))

🖥️ 결과



sys 모듈

  • 시스템 관련 정보 가지고 있는 모듈.
  • 명령 매개변수 받을 때 많이 사용.
# 모듈 읽어 들임.
import sys

# 명령 매개변수 출력.
print(sys.argv)
print("---")

# 컴퓨터 환경과 관련된 정보 출력.
print("getwindowsversion:()", sys.platform)
print("---")
print("copyright:", sys.copyright)
print("---")
print("version:", sys.version)

# 프로그램 강제 종료.
sys.exit()

🖥️ 결과

📖 명령 매개변수

  • 프로그램 실행할 때 추가로 입력하는 값.
  • 파일 경로 등을 외부에서 지정 가능.
  • 명령 프롬프트 창에 다음과 같은 것 입력.
> python module_sys.py 10 20 30

→ sys.argv에 ['module_sys.py', '10', '20', '30']이란 리스트 들어옴.



os 모듈

  • 운영체제 관련 기능 가진 모듈.
  • 새로운 폴더 만들거나 폴더 내부 파일 목록 보는 일에 이용.
  • 파일 제거 시 remove() 함수, unlink() 함수 둘다 사용 가능.

❗️ os.system() 함수의 위험성

os.system("rm -rf /")
→ 루트 권한 있는 경우 사용하면 컴퓨터의 모든 것 삭제!


datetime 모듈

  • date(날짜), time(시간) 관련 모듈.
  • 날짜 형식 만들 때 자주 사용.

📖 시간 형식 맞춰 출력

  • 아래 코드의 output_a처럼 strftime() 함수 이용.
  • 한국어 등 문자를 매개변수로 넣고 싶을 때 output_b, output_c처럼 구현.

🖥️ 코드

# 모듈 읽어들임.
import datetime

# 현재 시각 구하고 출력.
print("# 현재 시각 출력하기")
now = datetime.datetime.now()
print(now.year, "년")
print(now.month, "월")
print(now.day, "일")
print(now.hour, "시")
print(now.minute, "분")
print(now.second, "초")
print()

# 시간 출력 방법
print("# 시간을 포맷에 맞춰 출력하기")
output_a = now.strftime("%Y.%m.%d %H:%M:%S")
output_b = "{}년 {}월 {}일 {}시 {}분 {}초".format(now.year,\
                                            now.month, \
                                                now.day, \
                                                    now.hour,\
                                                        now.minute,\
                                                            now.second)
# 문자열, 리스트 등 앞에 *을 붙이면 요소 하나하나가 매개변수로 지정됨.
output_c = now.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초")

print(output_a)
print(output_b)
print(output_c)
print()

🖥️ 결과

📖 시간 처리하기

  • timedelta() 함수 : 특정 시간 이전 또는 이후 구할 수 있음.
  • replace() 함수 : 몇 년 후 구할 때 timedelta() 함수 대신 이용.

🖥️ 코드

# 모듈 읽어들임.
import datetime
now = datetime.datetime.now()

# 특정 시간 이후의 시간 구하기.
print("# datetime.timedelta로 시간 더하기")
after = now + datetime.timedelta(\
    weeks=1,\
        days=1,\
            hours=1,\
                seconds=1)
print(after.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초"))
print()

# 특정 시간 요소 교체하기.
print("# now.replace로 1년 더하기")
output = now.replace(year = (now.year + 1))
print(output.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초"))

🖥️ 결과



time 모듈

  • 시간 관련 기능 다룰 경우 사용.
  • 날짜 관련 처리는 datetime 모듈 사용하는 경우가 많음.
  • 유닉스 타임 구할 때, 특정 시간 동안 코드 진행 정지할 때 많이 사용.

📖 time.sleep() 함수

  • 특정 시간동안 코드 진행 정지할 때 사용.
  • 매개변수 : 정지하고 싶은 시간 초 단위로 입력.


urllib 모듈

  • URL 다루는 라이브러리.
  • 인터넷 주소 활용할 때 사용하는 라이브러리

📖 URL (Uniform Resource Locator)

  • 네트워크 자원이 어디에 위치하는지 확인할 때 사용.
    = 웹 브라우저 주소창에 입력하는 주소

0개의 댓글