파이썬 강좌 – 조건문 ~ 분기를 만들기

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 - 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 - 왜 파이썬인가?
    4. 파이썬 설치 - Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 - 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 - 소통하기
    2. 변수와 대입 - 기억하기
    3. 연산자 - 계산하기
    4. 조건문 - 분기를 만들기
    5. 반복문 - 비슷한 작업을 반복하기
    6. 변수와 리스트 - 비슷한 변수들을 묶기
    7. for, range - 리스트의 항목을 다루기
    8. 파이선 기초 꿀팁
      1. 함수와 메소드의 호출 - 편리한 기능 이용하기
      2. 모듈 설치와 사용 - 유용한 기능 끌어다 쓰기
      3. 문자열 - 텍스트 다루기
  4. 파이썬 중급
    1. 정규표현식 - 문자열을 검색하고 치환하기(작성중)
    2. 함수를 직접 만들기 - 자주 쓰는 기능을 묶기
    3. 딕셔너리, 튜플, 세트 - 변수를 다양한 방법으로 묶기
    4. 클래스와 객체 - 변수를 사람으로 진화시키기
    5. 상속 - 클래스를 확장하기
    6. 파이썬 중급 꿀팁
      1. 코드를 작성하는 사람의 의도(작성중)
      2. 정체성과 동질성 - 객체의 성질(작성중)
      3. 명령문, 표현식 - 문법을 이루는 것들 (작성중)
      4. 슬라이싱 - 리스트를 갖고 놀기
  5. 파이썬 고급
    1. 예외와 에러 - 예상치 못한 상황에 대응하기
    2. 특별 메소드와 연산자 - 파이썬의 내부 작동방식 이해하기
    3. 다양한 함수 인수 - 유연한 함수 만들기
    4. 시퀀스와 반복자 - 반복과 순회를 자유자재로 다루기
    5. 변수의 범위 - 이름 검색의 범위
  6. 파이썬 심화
    1. 제너레이터와 코루틴 -
    2. async와 await
    3. 데코레이터 - 함수의 기능을 강화하기
    4. 객체로서의 클래스 - 클래스를 동적으로 정의하기
  7. 실전 (파이썬 외적인 것들)
    1. 유니코드 - 컴퓨터에서 문자를 표기하는 방법
    2. html, css, 인터넷 - 자동화 첫 걸음 내딛기
    3. 네트워크 - 인터넷으로 통신하는 방법
    4. 문서 - 문맥을 읽어보기

실컷 때릴 수 있는 허수아비

지금까지 배운 방법으로는 위에서 아래로, 순차적으로 한줄 한줄 실행하는 프로그램밖에 만들지 못합니다. 이제 조건을 만들어 프로그램의 분기를 만들어 볼텐데요, 간단한 예제를 통해 보면서 진행해보도록 합시다.

슈퍼파워 게임회사는 RPG 게임을 제작하고 있습니다. 초보 모험가를 위해 실컷 때릴 수 있는 허수아비를 세워두려고 합니다. 규칙은 다음과 같습니다.

  1. 허수아비의 체력은 100입니다.
  2. 플레이어의 공격을 수치로 입력받습니다.
  3. 허수아비의 체력을 넘는 공격을 준다면 허수아비가 쓰러집니다.
  4. 허수아비 체력을 밑도는 공격을 준다면 허수아비는 쓰러지지 않습니다.
  5. 공격력이 10 정도로 모자라다면 지나가던 개가 "아쉽네"라고 말합니다.

일단 실행 코드와 결과를 봅시다. 코드의 ##1##을 클릭하면 설명으로 바로 이동합니다.

실행 코드

health = 100 ##a_1##
attack = int(input()) ##a_2##
if attack >= health: ##a_3##
    print("털썩! 허수아비가 쓰러졌습니다!") ##a_4##
else: ##a_5##
    print("허수아비가 쓰러지지 않았네요.") ##a_6##
    if attack >= health - 10: ##a_7##
        print("지나가던 개 : 아쉽네") ##a_8##

결과

-----첫번째 실행-----
200
털썩! 허수아비가 쓰러졌습니다!
-----두번째 실행-----
70
허수아비가 쓰러지지 않았네요.
-----세번째 실행-----
95
허수아비가 쓰러지지 않았네요.
지나가던 개 : 아쉽네

이제 설명의 차례입니다. 천천히 한 문장 한 문장 음미하며 읽도록 합시다.

a_1(1.) 설명

health = 100

허수아비의 체력을 담는 health 라는 변수를 정의하여, 초깃값 100으로 두었습니다. 이 변수의 값은 이후에 입력받은 값을 비교하는 데 쓰이고 프로그램 내에서 다시 변하지는 않습니다.

a_2(2.) 설명

attack = int(input())

int(input())이라는 요상한 모양이 등장했습니다. int라는 것이 정확히 어떤 역할인지는 모르나, 우리는 변수의 종류를 배울 때 int라는 정수형이 존재한다는 것을 배웠습니다. 여기서 int소괄호 안의 값을 정수형으로 변환하겠다! 라는 뜻으로 쓰입니다. 쓰는 방법은 print 와 같은 함수처럼 소괄호를 이용합니다. 일반적인 사용법은 내장 함수를 참조해주시고, 좀 더 정확하고 심화적인 내용은 클래스를 참조하세요.

우선 두 개로 분리하여 생각합시다. 바깥쪽을 감싸고 있는 int( ... )와, 내부의 input()입니다. 소괄호가 여러 개 등장한다면 안의 것 부터 작동한다고 생각하세요. 즉 input()이 먼저 작동하고 그 결과값이 int( ... )에 적용합니다. 그러니까 attack = int(input())은, 우선 사용자로부터 입력을 받고, 그 값을 정수형으로 변환하도록 하고, 그 값을 attack이라는 새로운 변수를 정의하면서 초기값으로 넣는다는 뜻입니다.

input()의 결과값은 무조건 문자열(str)이기 때문에 숫자를 입력받는다 해도 '200'과 같은 문자열을 받게 됩니다. 앞서 배웠던 산술 연산자를 이용하기 위해서는 이 값을 숫자로 변환하여야 하기 때문에 이 같은 과정은 필수입니다.

a_3(3.) 설명

if attack >= health:

새로운 if 라는 키워드가 등장했습니다. >= 라는 비교 연산자(Comparison Operator) 가 등장하였고 콜론(:)도 눈에 띄네요.

if는 앞으로 if문, 혹은 조건문이라고도 불리우는 문법의 핵심 키워드입니다. 우리는 if와 그 바로 뒤에 따라오는 조건을 통해 프로그램의 흐름을 제어할 수 있습니다. 여기서는 attack >= health라는 게 조건입니다. 엑셀의 if 함수를 써본 경험이 있다면 이해가 빠를 수도 있겠습니다.

attack >= healthattack이 health보다 크거나 같은가?라는 뜻이며, 이 조건을 충족한다면 뒤따라오는 블록(block)으로 진행하도록 하고, 충족하지 않다면 그 블록은 아예 건너뛰도록 합니다.

콜론(:)은 새로운 블록을 시작하라는 뜻입니다. 블록 내부에서부터 들여쓰기가 시작되고, 블록을 끝내려면 들여쓰기를 원상복귀하면 됩니다. 들여쓰기는 띄어쓰기 4개를 원칙으로 합니다. 콜론을 쓰지 않고서는 새로운 블록을 시작할 수 없습니다. 블록 안에는 또 다른 블록이 포함될 수 있으며, 들여쓰기를 그만큼 더 추가합니다.

a_4(4.) 설명

    print("털썩! 허수아비가 쓰러졌습니다!")

새로운 블록으로 시작했으니 들여쓰기가 띄어쓰기 4개로 이루어졌습니다. 바로 앞 조건문에서 조건이 충족된다면 이 블록이 실행이 됩니다. 결과의 첫번째 실행에서는 100보다 높은 200을 입력하였고, 조건을 충족하여 print 함수가 호출됩니다. 하지만 두번째 실행에서 70을 입력하였고, 조건을 충족하지 못해 이 블록은 건너뛰게 됩니다.

a_5(5.) 설명

else:

새로운 키워드가 등장했으나, 그 전에 다시 들여쓰기가 원상복귀 되었다는 점을 유념해주세요. 즉 앞선 블록이 끝났다는 뜻입니다.

여기서는 else라는 키워드가 등장합니다. 조건문에서 elseif와 마찬가지로 아주 중요한 키워드입니다. else는 홀로 등장할 수 없습니다. 반드시 앞쪽의 if와 짝지어집니다.

기억을 더듬어볼까요, 앞선 조건은 attack >= health 이었고, 우리가 attack을 입력받고 health100으로 두었었죠. else의 뜻은 if의 조건이 충족되지 않으면 다음 블록을 실행하라입니다. 200을 입력받았을 때에는 조건에 충족되기 때문에 if가 지니고 있는 블록이 실행되며, else는 실행되지 않습니다. 하지만 7095와 같은 경우는 앞선 조건이 충족되지 않으므로 if의 블록은 건너뛰되, else가 가지고 있는 블록이 즉시 실행됩니다.

else는 특별한 조건을 받지 않습니다. 곧 바로 콜론(:)이 등장하여 새 블록을 엽니다.

a_6(6.) 설명

    print("허수아비가 쓰러지지 않았네요.")

새로운 블록이 시작했으니 다시 들여쓰기가 적용되었습니다.

a_7(7.) 설명

    if attack < 10:

들여쓰기가 계속 유지되고 있습니다. 그러므로 여기서의 if문은 else의 블록 안에 포함된다고 말할 수 있습니다. 이 if 문 또한 바깥의 if와 완전히 동일한 메커니즘을 가지고 있습니다. 조건이 충족되면 바로 뒤따라오는 블록을 실행시킨다는 것이죠.

여기서 조건은 attack >= health - 10입니다. 비교 연산자는 산술 연산자보다 나중에 처리됩니다. 즉 health – 10이 먼저 처리되고, 그 결과값인 90을 이용해 attack >= 90과 같은 형태가 만들어집니다. 70은 충족하지 못하고 95는 충족하게 되겠네요.

콜론(:)으로 새로운 블록을 시작합니다.

a_8(8.) 설명

        print("지나가던 개 : 아쉽네")

새로운 블록이 시작되어 들여쓰기가 이중 적용되었습니다. 왼쪽으로부터 코드가 점점 더 동떨어지고 있네요.

결과적으로 이 print 함수는 attack이 90 ~ 99의 범위에 있을 때 실행됩니다. 왜 그럴까요? ifelse가 중첩으로 하여 존재하기 때문입니다. 조건만 생각하여 순서를 상기해보면 다음과 같습니다.

  1. attack >= health 가 충족하지 않을 때 (즉 attack < health 일 때)
  2. attack >= health - 10 이 충족할 때

1번 조건이 첫번째 if 문에서 갈렸던 분기이고, 2번 조건이 두번째 if문에서의 조건입니다. 1번과 2번이 동시에 충족해야 지나가던 개가 "아쉽다"며 오지랖을 부릴 수 있게 됩니다.


핵심 개념 정리

위 예제를 통해 새롭게 알게 된 사실을 정리해봅시다.

  • if 는 조건을 이용하여 프로그램의 분기를 만들때 쓰는 키워드입니다.
  • else 는 짝지어진 if의 조건에 충족하기 못할 때 실행됩니다. else를 반드시 사용할 필요는 없습니다.
  • 비교 연산자(Comparison Operator) 란 주로 조건에 쓰는 연산자입니다.
  • ifelse는 실행 범위를 바로 뒤따라오는 블록(block) 으로 제한합니다.
  • 블록은 콜론(:)으로 시작할 수 있으며, 동일한 들여쓰기(공백 4칸) 동안 블록을 유지할 수 있고, 블록을 끝내려면 들여쓰기를 원상복귀 하면 됩니다. 블록은 중첩될 수 있습니다.
  • if, else, 조건, 실행 블록을 통틀어 조건문(if statement) 이라고 말합니다.

그리고 앞서 배웠던 상식은 다소 금이 갔습니다.

  • 명령은 무조건 위에서 아래로 차례대로 실행된다? 기본적으로는 그렇지만 조건에 따라 건너뛸 수도 있다!

비교 연산자(Comparison Operator)

우리는 앞서 대입 연산자(=), 각종 산술 연산자(+, - 등)를 배웠습니다. 이번에는 새로운 비교 연산자입니다. 비교 연산자의 특징은 불리언(boolean) 값을 결과로 내놓는다는 점입니다. 앞서 변수의 종류를 논할 때 우리는 불리언을 짧게나마 소개하고 지나갔습니다. 하지만 다시 꺼내 봅시다.

  • bool : 불리언(boolean)입니다. True 혹은 False 값 밖에 가지지 못합니다.

True란 참이고, False는 거짓입니다. 이분법적인 사고를 현대사회에서는 지양하라고는 하지만 컴퓨터의 세계에서는 흔한 논리입니다. if에서 조건을 충족하는지, 그렇지 않은지 판단할 때는 이 불리언 값을 활용합니다.

if 100 > 200:
    print("100은 200보다 크다는 건 참이다.")
else:
    print("100은 200보다 크다는 건 거짓이다.")

위 예제에서 100 > 200False 값을 내놓습니다. 즉 if False: 로 작동한다는 것입니다. if는 조건이 False 이므로 조건에 충족되지 않았다고 판단하고 else 블록을 찾아 실행시킵니다.

100은 200보다 크다는 건 거짓이다.

하지만 다음 예제와 같이 조건을 참으로 만들면 if 블록이 실행되겠지요.

if 300 > 200:
    print("300은 200보다 크다는 건 참이다.")
else:
    print("300은 200보다 크다는 건 거짓이다.")
300은 200보다 크다는 건 참이다.

bool 형은 물론 숫자나 문자열 같은 변수이기 때문에 대입할 수 있습니다.

condition = 300 > 20
if condition:
    print("300은 200보다 크다는 건 참이다.")
else:
    print("300은 200보다 크다는 건 거짓이다.")
300은 200보다 크다는 건 참이다.

비교 연산자의 종류

비교 연산자 설명
a == b ab가 같다
a != b ab가 다르다
a > b ab보다 크다
a < b ab보다 작다
a >= b ab보다 크거나 같다
a <= b ab보다 작거나 같다

논리 연산자 (Logical Operator)

여러 개의 비교 연산자를 동시에 사용하고 싶다고 가정합시다. 앞서 허수아비를 거의 쓰러뜨렸지만 아쉽게 그러지 못했던 상황을 기억하시나요? 90 ~ 99의 공격력으로 때린 것만 조건으로서 활용하고 싶습니다. health 변수는 조건을 좀 더 명확하게 보기 위해 삭제하도록 하겠습니다. 다음 코드를 실행해 보세요.

attack = int(input()) 
if attack >= 90: 
    if attack < 100:
        print("지나가던 개 : 아쉽구려")
95
지나가던 개 : 아쉽구려

조건문을 중첩으로 두어 조건 2개가 둘다 만족해야 print 되도록 코드를 짰습니다. 하지만 파이썬에서는 논리 연산자를 이용해 두 비교 연산자를 결합할 수 있습니다. 다음 코드를 보세요.

attack = int(input()) 
if attack >= 90 and attack < 100: 
    print("지나가던 개 : 아쉽구려")
95
지나가던 개 : 아쉽구려

결과는 동일합니다. and 라는 새로운 키워드가 등장했습니다. 아주 쉽고 간편하게 나타낼 수 있지 않나요? 논리 연산자는 피연산자와 결과값 모두 boolean 형을 활용하는 연산자입니다. 논리 연산자의 종류는 3가지가 있고, 설명은 다음과 같습니다.


논리 연산자의 종류

연산자 설명
x or y xy 중 하나라도 True이면, True이다
x and y xy 모두 True이어야 True이다
not x xFalse이면 True이다

논리 연산자 결과 표

x y x or y x and y not x
False False False False True
True False True False False
False True True False True
True True True True False

여러 개의 분기를 한꺼번에 만들기 (elif)

지나가던 개가 오지랖을 오질나게 부린다고 가정합시다. 너무 맥없이 때리면 젊은이가 힘이 없다 혀를 차고, 너무 세게 때리면 다 부술 일 있냐며 화내는 등 반응을 추가하여 봅시다. 이번 예제에서도 health 변수를 삭제했습니다.

attack = int(input()) 
if attack >= 200: 
    print("지나가던 개 : 전부 다 부실 일 있나?? 왜 이렇게 세게 치누")
else:
    if attack >= 100:
         print("지나가던 개 : 오, 허수아비를 쓰러뜨렸군.")
    else:
        if attack >= 90:
            print("지나가던 개 : 아깝소")
        else: 
            if attack >= 10:
                print("지나가던 개 : 힘좀 더 쓰지 그래..?")
            else:
                print("지나가던 개 : 요새 젊은이들은 힘이 없어.. 쯧쯧...")

200, 100, 90, 10의 기준점을 새롭게 만들어서 다른 메시지를 출력할 수 있도록 했습니다. 결과는 다음과 같습니다.

----- 1번째 실행 -----
300
지나가던 개 : 전부 다 부실 일 있나?? 왜 이렇게 세게 치누
----- 2번째 실행 -----
150
지나가던 개 : 오, 허수아비를 쓰러뜨렸군.
----- 3번째 실행 -----
95
지나가던 개 : 아깝소
----- 4번째 실행 -----
50
지나가던 개 : 힘좀 더 쓰지 그래..?
----- 5번째 실행 -----
5
지나가던 개 : 요새 젊은이들은 힘이 없어.. 쯧쯧...

뭔가 석연찮습니다. 흐름을 제어하기 위해 계속해서 else 블록 안에 if를 중첨해서 사용하고 있습니다. 이대로 계속 가다간 블록이 끝도 없이 늘어날 것 같습니다. 이러한 상황을 해결하기 위해 elif라는 새로운 키워드를 활용하여 흐름을 제어해봅시다.

attack = int(input()) 
if attack >= 200: 
    print("지나가던 개 : 전부 다 부실 일 있나?? 왜 이렇게 세게 치누")
elif attack >= 100:
    print("지나가던 개 : 오, 허수아비를 쓰러뜨렸군.")
elif attack >= 90:
    print("지나가던 개 : 아깝소")
elif attack >= 10:
    print("지나가던 개 : 힘좀 더 쓰지 그래..?")
else:
    print("지나가던 개 : 요새 젊은이들은 힘이 없어.. 쯧쯧...")

오! 보기에 깔끔해졌습니다!

elif는 바로 앞서 실행된 조건에 대해서 충족하지 않으면 다른 조건을 적용하여 흐름을 제어합니다. elifif 다음부터 존재할 수 있습니다. elif는 하나도 없어도 되고, 아주 많은 수가 있어도 됩니다. 조건과 실행 블록을 활용하는 법은 if와 동일합니다. else는 항상 마지막에 단 하나만 등장합니다. else는 없어도 상관없습니다.

앞서 ifelse의 구문을 포함하여 조건문이라고 했는데요, 여기에 elif도 포함시킵시다.

  • if, elif, else, 그 조건과 실행 블록을 모두 포함하여 조건문 이라고 합니다.

유의사항

if는 무조건 조건을 검사합니다.

아래와 같은 코드를 봅시다.

attack = int(input()) 
if attack >= 200: 
    print("지나가던 개 : 전부 다 부실 일 있나?? 왜 이렇게 세게 치누")
if attack >= 100:
    print("지나가던 개 : 오, 허수아비를 쓰러뜨렸군.")
if attack >= 90:
    print("지나가던 개 : 아깝소")
if attack >= 10:
    print("지나가던 개 : 힘좀 더 쓰지 그래..?")
250
지나가던 개 : 전부 다 부실 일 있나?? 왜 이렇게 세게 치누
지나가던 개 : 오, 허수아비를 쓰러뜨렸군.
지나가던 개 : 아깝소
지나가던 개 : 힘좀 더 쓰지 그래..?

여기서는 앞서 살펴보았던 예제와 달리 elif가 아닌 if가 독립적으로 쓰였습니다. 이 때에는 모든 조건을 차례로 검사하게 되므로 200 이상이라면 모든 print가 동작하게 될 것입니다.

비교 연산자의 양쪽에는 무조건 값이 있어야 합니다.

if num >= 0 and <= 1000: 같은 형태는 에러입니다. if num < 0 or num > 1000 처럼 써야 올바른 형태입니다.

블록을 마음대로 시작하면 에러가 발생합니다.

연산자와 변수 사이의 공백은 들어가도 되고 들어가지 않아도 되지만, 코드의 들여쓰기(공백 4칸)는 엄연한 문법이므로 잘 지켜야 합니다. 다른 프로그래밍 언어에서는 중괄호({})로 블록을 구분하기 때문에 들여쓰기가 의무사항은 아니지만, 파이썬에서는 의무사항입니다!

같은지 판단할 때 대입 연산자를 사용하지 마세요.

대입 연산자(=)는 대입하는 동작을 뜻할 뿐이지 같다고 비교하지 않습니다. 같은지 비교하는 연산자는 == 입니다. if의 조건에는 거의 웬만하면 ==가 들어간다고 보시면 되겠습니다.

else, elif는 같은 블록에 있는 if와 짝지어집니다.

중첩된 if에서 유의해주시면 되겠습니다.


더 나아가기

truthy value와 falsy value (추가 예정)

연습 문제

  • if는 무슨 역할인가?
  • 비교 연산자의 종류 여섯 가지는 무엇인가?
  • 논리 연산자의 종류 세 가지는 무엇인가?
  • if의 조건에는 주로 어떤 연산자가 들어가는가?
  • :의 역할은 무엇인가?
  • 블록을 계속 유지시키려면 어떻게 해야 하는가?
  • 블록을 끝내려면 어떻게 해야 하는가?
  • 블록 안에 블록을 포함되는 것이 가능한가?
  • else는 무슨 역할인가?
  • elif는 무슨 역할인가?
  • else에는 조건이 들어갈 수 없는가?
  • else는 조건문에서 가장 마지막에만 와야 하는가?

프로그래밍 문제

  1. 하나의 숫자를 입력받습니다. 0 미만이거나 1000을 초과하는 숫자가 입력되었을 경우 범위를 벗어났습니다라고 출력합니다.

  2. 하나의 점수를 입력받습니다. 100점이면 A+, 90~99점이면 A, 80~89점이면 B, 70~79점이면 C, 69점 이하면 F를 출력합니다.

  3. 0~200 범위의 숫자를 입력받습니다. 범위를 벗어나면 범위를 벗어났습니다라고 출력합니다. 숫자가 한 자리수면 한자리 수, 두 자리수면 두자리 수, 세 자리수면 세자리 수라고 출력합니다.

  4. 작은 수와 큰 수를 먼저 입력받습니다. 다음 마지막 수를 입력받는데요, 이 마지막 수가 두 수의 범위 밖에 있다면 범위를 벗어났습니다라고 출력하고, 두 수의 범위 내에 있다면, 가까이 있는 수를 출력하면서 그 수와 가깝습니다라고 출력하고, 두 수간의 차이가 같다면 중간값입니다라고 출력합니다.

예 : 2050이라고 입력한 후, 마지막 숫자에 따른 출력은 다음과 같습니다.

  • 10범위를 벗어났습니다
  • 3020과 가깝습니다
  • 4550과 가깝습니다
  • 35중간값입니다

프로그래밍 문제 정답

  1. 코드입니다.

    num = int(input())
    if num < 0 or num > 1000:
        print("범위를 벗어났습니다.")
    
  2. 코드입니다.

    score = int(input())
    if score == 100:
        print("A+")
    elif score >= 90:
        print("A")
    elif score >= 80:
        print("B")
    elif score >= 70:
        print("C")
    else:
        print("F")
    
  3. 코드입니다.

    num = int(input())
    if num < 0 or num > 200:
        print("범위를 벗어났습니다.")
    elif num // 100 > 0:
        print("세자리 수")
    elif num // 10 > 0:
        print("두자리 수")
    else:
        print("한자리 수")
    
  4. 코드입니다.

    small = int(input("작은 수를 입력하세요 >> "))
    big = int(input("큰 수를 입력하세요 >> "))
    last = int(input("마지막 수를 입력하세요 >> "))
    
    if small > last or big < last:
        print("범위를 벗어났습니다")
    else:
        small_dif = last - small
        big_diff = big - last
    
        if small_dif < big_diff:
            print(small, "과 가깝습니다")
        elif big_diff < small_dif:
            print(big, "과 가깝습니다")
        else:
            print("중간값입니다")
    

One thought on “파이썬 강좌 – 조건문 ~ 분기를 만들기

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

Scroll to top