TigerCow.Door


이번에는 지난 포스팅에 이어서 논리와 추론, 모형에 대해서 알아보도록 하겠습니다.

내용을 설명하면서 이해를 돕기 위해 웜푸스 세계에 대한 이야기를 가져오는 경우도 있으니, 웜푸스 세계에 대해서 대략적으로라도 확인하지 못하신 분들은 지난 포스팅을 참고하시길 바랍니다.


1. 논리(Logics)


이번에는 논리적 표현과 추론의 근본 개념들을 소개합니다.

지난 포스팅에서 지식 기지에 대해서 알아보았습니다. 그리고 지식 기지는 문장들로 구성된다고 하였습니다. 여기서 문장들은 표현 언어의 구문(Syntax)을 따릅니다. 표현 언어의 구문은 적격(well-formed)인 문장을 규정합니다. 쉽게 말해서 구문은, 문장을 만드는 규칙을 말합니다. 예를 들어, "x+y=1"이라는 문장은 적격이지만 "+x1y="은 적격이지 않습니다.

논리는 문장의 의미론(Semantics), 즉 문장의 뜻도 함께 정의해야 합니다. 의미론은 각각의 가능한 세계(possible world)에 대한 문장의 진리(truth: 참 또는 거짓)를 정의합니다. 예를 들어 "x+y=2"라는 문장은 x가 1이고 y가 1인 세계에서 참이지만 x가 1이고 y가 0인 세계에서는 거짓입니다. 표준적인 논리에서 모든 문장은 각각의 가능한 세계에서 진리를 표현, 즉 참 또는 거짓이어야 합니다. 참도 아니고 거짓도 아닌 애매한 문장은 존재하지 않습니다. 아래의 예시들로 다시 한번 정리할 수 있습니다.


'x + 2 >= y' is a sentence; x2+y>= is not sentence

'x + 2 >= y' is true iff the number x + 2 is no less than the number y

'x + 2 >= y' is true in a world where x=7, y=1

'x + 2 >= y' is false in a world where x=0, y=6



2. 추론(Entailment)


논리적 추론에서는 위에서 알아본 문장들 사이의 논리적 함축(entailment) 관계가 관여합니다.

함축이란, 한 문장이 다른 문장을 '논리적으로 따른다(follow)'는 개념을 나타내는 용어입니다. 함축은 아래와 같은 표기법으로 나타낼 수 있습니다.

이는 모든 문장 (이후 a라고 표기)가 문장 (이후 b라고 표기)를 함축한다는 뜻 입니다.

함축이란 용어의 형식적인 정의는 다음과 같습니다. 만일 a가 참인 모든 가능한 세계에서 b 역시 참일때에만 a|=b 이다.

즉 위의 표기법에서 a가 b 보다 더 강한 문장입니다. 


이러한 함축이라는 개념을 웜푸스 세계의 예제에도 적용할 수 있습니다.



에이전트는 (1,1)의 방에서는 아무것도 감지하지 못했지만 (2,1)에서는 미풍을 감지하였습니다. 이러한 지각들과 웜푸스 세계의 규칙들에 대한 에이전트의 지식이 합쳐져서 에이전트의 지식 기지를 형성합니다. 에이전트 입장에서는 (1,2)와 (2,2), (3,1)에 구덩이가 있는지가 관심의 대상입니다. 그 세칸에는 각각 구덩이가 존재하는지 존재하지 않는지의 경우가 존재하므로 가능한 세계의 수는 2의 3승, 총 8개 입니다. 이러한 세계를 도형으로 나타내면 아래와 같습니다.




위의 그림에서 각각의 선이 의미하는 바는 다음과 같습니다.


KB = 에이전트가 가지고 있는 지식 기반

= "(1,2)에 구덩이가 없다." (이후 a1 이라고 표기)

= "(2,2)에 구덩이가 없다." (이후 a2 라고 표기)


a1이 가능한 세계들과 a2가 가능한 세계들이 위의 그림에 표현되어 있습니다.

이들로 부터 우리는 다음과 같은 사실을 알 수 있습니다.


KB가 참인 모든 가능한 세계에서 a1도 참이다.


따라서 KB|=a1 입니다. 즉 (1,2)에는 구덩이가 없습니다. 또한 다음과 같은 사실도 알 수 있습니다.


KB가 참인 가능한 세계중 a2가 거짓인 가능한 세계들이 존재한다.


따라서 KB|=a2가 아닙니다. 즉 에이전트는 (2,2)에 구덩이가 없다는 사실을 도출할 수 없습니다. 마찬가지로 (2,2)에 구덩이가 있다는 사실 또한 도출할 수 없습니다.


이러한 예시는 함축관계를 보여줄 뿐만 아니라, 함축의 정의를 이용해서 결론을 이끌어 내는 방법, 즉 논리적 추리를 수행하는 방법 또한 보여줍니다.


함축과 추리의 이해에 도움이 되기 위해 KB의 모든 결과의 집합이 건초 더미이고 a가 하나의 바늘이라고 생각하면, 함축은 건초 더미에 바늘이 존재한다는 것에 해당하고, 추리는 그 바늘을 찾는 것에 해당합니다.

이러한 구분을 형식적 표기법으로 나타낼 수 있습니다.

추리 알고리즘 i가 KB로부터 a를 도출할 수 있을 때, 이를

로 표현할 수 있습니다. 이것은 'a가 i에 의해 KB로부터 유도된다' 또는 'i는 KB로부터 a를 유도한다'로 말 합니다.


함축된 문장들만 유도하는 추리 알고리즘을 가리켜 건전한(sound) 또는 진리를 보존하는(true-preserving) 알고리즘이라고 말합니다. 반대로 생각해본다면, 건전하지 않은 추리 절차는 추리과정에서 무언가를 근거 없이 만들어 냅니다.

완결성(completencess) 역시 바람직한 속성입니다. 함축된 임의의 문장을 유도할 수 있는 추리 알고리즘은 완결적 입니다. 실제 건초 더미의 경우 지푸라기들을 체계적으로 조사한다면 그 건초 더미에 바늘이 있는지의 여부를 항상 결정할 수 있음이 명핵합니다. 그러나 지식 기지 중에는 결과들의 건초 더미가 무한한 것들이 많기 때문에 완결성이 중요한 문제가 됩니다. 다행히, 여러 지식 기지를 다루기에 충분한 표현력을 가진 완결적인 논리적 추리 절차들이 많이 있습니다.


지금까지 전제들이 참인 세계에 대해서는 결론이 반드시 참인 추론 공정을 알아보았습니다.

정리하자면, 만일 실제 세계에서 KB가 참이면, 건전한 추리 절차를 이용해서 KB로부터 유도한 임의의 문장 a도 실제 세계에서 참입니다.



3. 모형(Model)


앞서 논리에 대한 이야기를 진행하면서 '가능한 세계'라는 표현을 많이 사용하였습니다. 헌데, 좀 더 엄밀한 정의가 필요할 때 '가능한 세계'대신 '모형(Model)'이라는 용어를 사용합니다.

가능한 세계는 에이전트가 처할 수도 있고 그렇지 않을 수도 있는, 잠재적인 실제 환경이라고 생각할 수 있는 반면, 모형은 수학적인 추상입니다. 각각의 모형은 그냥 모든 유관한 문장의 참 또는 거짓을 고정시킨 것입니다. 

문장 a가 모형 m에서 참일 떄, 이를 'm이 a를 만족한다'라고 말할 수 있습니다. 때에 따라서는 'm이 a의 모형이다'라고 말할 수도 있습니다. 또한 a의 모든 모형의 집합을 M(a)로 표기합니다.


다음 포스팅에서는 명제논리라는 것에 대해서 알아보겠습니다.

명제논리의 구문과 그 의미론을 설명하고 그런 다음 어떤 문장이 다른 어떤 문장을 따른다는 함축 관계를 살펴보도록 하겠습니다.

내용에 대한 피드백이나 궁금한 점은 언제든지 댓글을 이용해주세요 :)

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


최근 인공지능에 대해서 기본적인 이론과 개념을 공부중에 있습니다.

따라서 공부하면서 내용을 정리해서 포스팅을 진행하려 합니다.

'인공지능:현대적 접근' 이라는 책을 기반으로 학습 중이며 내용 중간중간 있는 사진과 도표 및 수도코드의 출처는 해당 책임을 밝힙니다.

내용에 대한 피드백이나 궁금한 점은 언제든지 댓글을 통해 말씀해주시면 감사하겠습니다.


이번 포스팅에서는 논리적 에이전트와 웜푸스 세계에 대해서 알아보도록 하겠습니다.

그리고 이어지는 내용인 논리와 추론, 명제에 대한 내용은 다음 포스팅에서 정리하고 명제 논리에 대해서는 그 다음에 살펴보도록 하겠습니다..


1. 논리적 에이전트(Logical Agents)


사람은 여러가지의 지식을 가지고 있습니다. 그리고 그러한 지식을 표현(representation)할때 문장(sentence)를 사용합니다. 당연히 그러한 문장은 무의미하지 않습니다. 즉, 인간은 무언가에 대한 반응으로 단순한 반사작용의 메커니즘이 아니라 자신이 가지고 있는 지식의 내부 표현들에 작용하는 추론(reasoning) 공정들로 달성됩니다.

인공지능에서는 지식 기반 에이전트(knowledge-based agent)라는 것은 지능에 대한 위와 같은 접근방식을 포함하는 것을 말합니다.


부분 관찰 가능 환경(partially observable)에서 에이전트가 현재 상태에 관해 아는 것을 표현하는 유일한 방식은, 모든 가능한 구체적 상태들을 단순하게 나열하는 것일 뿐입니다. 커다란 환경에서는, 실제 환경에서는 그러한 표현 방식이 비현실적일 확률이 아주 높습니다.

따라서 '논리적 에이전트'에서는 복잡한 세계의 표현을 형성할 수 있고 추리 공정을 이용해서 세계에 대한 새로운 표현들을 유도할 수 있으며 그러한 새 표현들을 이용해서 다음에 할 일을 연역할 수 있는 에이전트를 설계할 수 있도록 공부합니다.

즉, 논리(logic)를 지식 기반 에이전트가 가능한 표현들의 일반적 부류(class)로 취급하고 그러한 에이전트는 정보를 다양한 목적에 맞게 조합 및 재조합할 수 있게 됩니다.

따라서 이러한 지식 기반 에이전트는 명시적으로 서술된 목표의 형태로 새 과제들을 받을 수 있으며, 환경에 대한 새로운 지식을 제공받거나 스스로 습득하고 환경의 변화에 적응하거나 유관한 지식을 갱신할 수 있습니다.


우선 처음에 '지식 기반 에이전트'에 대한 전반적인 설계를 살펴보고, 간단하지만 새로운 환경인 웜푸스 세계를 소개하고 지식 기반 에이전트의 작동 방식을 기술적인 세부사항 없이 알아보겠습니다. 그리고 다음 포스팅 부터 논리의 일반적인 원리들을 살펴보고 이후 좀 더 구체적인 명제 논리의 원리들을 살펴보겠습니다.


2. 지식 기반 에이전트(Knowledge-based agent)


지식 기반 에이전트의 핵심 구성요소는 기본의 지식 베이스, 지식 기지(knowledge base)라고 불리는 것 입니다.

이러한 지식 기지는 문장들의 집합입니다. (Knowledge base is set of sentences in a formal language)

여기서 '문장'이라는 것은 기술 용어입니다. 영어나 한국어 등의 문장과 관련이 있기는 하지만 같은 것은 아니므로 혼동되지 않도록 천천히 이해하시길 바랍니다.


기본적으로 지식 기지라는 것에 새로운 문장, 즉 새로운 지식을 추가하는 방법과 지식 기지에 있는 문장을 질의하는 방법이 필요합니다. 이때, 새로운 문장을 추가하는 방법을 TELL이라 말하며 지식 기지에 있는 문장을 질의하는 방법을 ASK라고 합니다. 그리고 두 연산의 과정 속에는 추리(inference), 즉 기존의 문장들에서 새로운 문장을 이끌어 내는 공정이 존재합니다.

추리라는 것은 누군가가 ASK 연산을 수행했을때 그에 대한 답이 반드시 과거에 지식 기지에 TELL 연산을 통해 추가된 어떠한 지식(문장)에서 도출되어야 한다는 요구조건을 만족해야 합니다. 다시 말해 추리의 공정이 근거 없이 말을 꾸며내는 것이 되면안된다는 것 입니다.


아래의 사진은 지식 기반 에이전트 프로그램의 기본적인 큰 틀입니다. 해당 에이전트는 지각 하나를 입력받고 동작 하나를 반환합니다. 그리고 에이전트는 지식 기지(KB)를 유지하고 있습니다. 그리고 에이전트는 사전에 자신의 지식 기지에 일정한 배경 지식(background knowledge)를 가지고 있을 수 있습니다.



TELL(KB, MAKE-PERCEPT-SENTENCE(percept, t)) 에서는 주변의 환경을 지각하여(percept) 지식 기지(KB)에 알려주는 TELL연산을 수행합니다. 그리고 지식 기지에 행동(action)을 요청하는 ASK 연산을 수행하고 자신이 선택한 행동을 다시 지식 기지에 알려주는 TELL연산을 수행한 후에 행동을 반환합니다.


위에서 알아본 TELL과 ASK 연산의 정의를 생각해본다면 지식 기반 에이전트는 단순히 특정 동작들을 계산을 통해 도출해내는 프로그램이 아닙니다. 지식 기반 에이전트는 지식 수준(knowledge level)에서의 서술, 정의를 준수합니다. 위에서 언급했듯이 특정한 지식을 통한 근거있는 행동만을 반환하는 것 입니다.

이러한 수준에서 개발자는 에이전트가 현재 알고 있는 것과 에이전트의 목표를 결정해준다면 에이전트의 행동을 바로잡고 예측할 수 있습니다.

예를 들어서 A장소에서 B장소로 가는 것이 목표인 에이전트가 있는데 두 장소를 연결하는 유일한 경로 p라는 것을 에이전트가 알고 있다고 가정하겠습니다. 그렇다면 개발자는 에이전트가 p라는 경로를 통해 움직일 것을 충분히 예상할 수 있습니다. 그것이 에이전트 자신이 목표를 달성하는 유일한 방법임을 자신의 지식 기지에서 도출해 낼 수 있기 때문입니다.


개발자는 에이전트가 알아야 할, 가져야 할 지식을 단순히 TELL연산으로 알려주는 방법으로 하여금 프로그램을 설계할 수 있습니다. 즉 에어전트의 지식 기지가 비어있는 상태에서 에이전트가 주어진 환경에서 적절하게 행동을 반환할 수 있을 때 까지 문장(지식)들을 TELL 연산으로 하나씩 주입할 수 있는 것 입니다. 그리고 이것을 선언적(Declarative) 시스템 구축 접근방식이라고 부릅니다. 또한, 이와 다르게 절차적(procedural) 시스템 구축 접근방식이 존재합니다. 절차적 접근방식은 바람직한 행동을 프로그램 코드에 직접 입력합니다.

그리고 현재에 있어서는 성공적인 에이전트의 설계에 선언적 요소와 절차적 요소가 모두 들어 있는 경우가 많다는 점과 선언적 지식을 좀 더 효율적인 절차적 코드 안에 조합해 넣을 수 있는 경우가 많다는 점이 알려져 있습니다.



3. 웜푸스 세계(Wumpus world)


이번엔 위에서 학습한 내용들을 바탕으로, 지식 기반 에이전트의 가치를 볼 수 있는 웜푸스 세계(Wumpus world)라는 환경을 살펴보겠습니다.



위와 같은 웜푸스 세계에 대해 간략히 설명한다면, 웜푸스 세계는 여러 개의 방이 통로로 연결된 동굴입니다. 동굴 어딘가에는 거대한 괴물인 웜푸스가 존재합니다. 그림을 보면 1열 3행에 존재함을 알 수 있습니다. 웜푸스를 만나면 에이전트는 사망하게 됩니다. 에이전트는 웜푸스를 화살로 쏴서 죽일 수 있지만 화살은 딱 하나만 존재합니다. 그리고 특정 방에는 바닥이 없는 구덩이(pit)이 존재합니다. 구덩이가 존재하는 방에 들어가면 마찬가지로 에이전트가 죽게됩니다. 그리고 금 더미가 놓인 방이 있습니다. 이를 정리해 보면 웜푸스 세계에 존재하는 요소는 웜푸스, 구덩이, 금으로 총 3가지 입니다. 

각각의 요소는 특징을 가지고 있습니다. 그림을 보면 확인 할 수 있듯이 웜푸스가 존재하는 방에 인접한 방은 악취(stench)가 존재하고, 구덩이가 존재하는 방에 인접한 방은 미풍(breeze)이 존재하며, 금이 존재하는 방에는 반짝임(glitter)이 존재합니다.


이러한 환경에 처한 에이전트의 주된 난제는, 초기에 환경의 구성에 대해 전혀 무지하다는 것 입니다. 이러한 무지를 극복하기 위해서는 에이전트에게 추론이 필요합니다. 그럼 에이전트가 웜푸스 세계의 환경을 헤쳐나가는 과정을 확인해보도록 하겠습니다.


먼저, 에이전트의 초기 지식 기지에는 위에서 서술한 환경의 규칙들이 들어있습니다. 먼저 에이전트는 현재 자신이 존재하는 방, (1,1)의 방에 안전함(OK)과 현재 에이전트 자신이 존재하는 곳임을 알리는 A를 기록합니다. 즉, 에이전트 자신은 현재 (1,1)에 존재하며 (1,1)에서는 악취, 미풍 및 반짝임이 존재하지 않습니다. 따라서 (1,1)에는 안전함이 기록되어 있으므로 이러한 지식 기지를 통해 에이전트는 (1,2) 또는 (2,1)의 방이 안전함을 추리할 수 있습니다. 즉 (1,2)와 (2,1)에 안전함을 기록합니다.

에이전트는 오직 안전함이 기록된 곳으로만 이동할 것입니다. 그렇지 않으면 자신이 죽을 수도 있는, 즉 목표를 이루지 못하한다는 것을 알 수 있기 때문입니다. 

이후 에이전트는 (2,1)에서 미풍을 감지하게 됩니다. 따라서 에이전트는 (2,1)에 미풍을 감지했다는 B를 기록합니다. 이로 인해 (2,2)와 (3,1)은 아직 에이전트에게 위험한, 미지의 방입니다. 에이전트가 존재하는 (2,1)의 방에서 이웃한 방은 (1,1), (2,2), (3,1)로 총 세개인데 (1,1)의 방은 안전함이 기록되어 있으므로 (2,2)와 (3,1)의 방에 구덩이가 존재할 수도 있다는 P? 를 기록합니다.

그리고 에이전트는 안전함이 기록되어 있는 또 다른 방 (1,2)로 이동합니다. 그리고 (1,2)에서는 악취를 감지하므로 S를 기록합니다.  또한 같은 방식으로 (1,3)과 (2,2)의 방에 웜푸스가 존재할 수도 있다는 W?를 기록해야 합니다. 하지만 만약 (2,2)에 웜푸스가 존재했다면 (2,1)에서 또한 악취를 감지했어야 합니다. 따라서 웜푸스는 (1,3)에 존재한다는 것을 추리를 통해 알 수 있습니다. 그렇기 때문에 에이전트는 (1,3)에 웜푸스가 존재한다는 W를 기록합니다. 그리고 현재 (2,2)에 구덩이가 존재할 수도 있다는 P? 가 기록되어 있는데 (2,2)에 구덩이가 정말로 존재한다면 (1,2)의 방에서도 미풍을 감지해야 합니다. 하지만 (1,2)의 방에서는 미풍이 감지되지 않으므로 (2,2)에는 구덩이가 존재하지 않음을 알 수 있기에 P? 기록을 지우고 안전함을 기록합니다. 동시에 (3,1)에 구덩이가 존재한다는 P를 기록합니다. 

위와 같은 방식을 통해 에이전트는 (2,3)으로 이동합니다. 해당방에서 에이전트는 반짝임을 감지합니다. 따라서 금을 획득하게 되고 다시 안전함으로 기록되어 있는 방들을 통해 시작지점으로 돌아가게 됩니다.


웜푸스 세계를 통한 에이전트의 행동 및 추리를 보았습니다. 에이전트가 주어진 정보(배경 지식 또는 지식 기지)로 부터 어떠한 결론(행동)을 이끌어 낼 때마다, 만일 주어진 정보가 정확하다면 그 결론 역시 정확함을 보장한다는 것에 주목하시길 바랍니다. 이러한 것은 우리가 처음에 알아 본 것과 같이 추리, 논리적 추론의 근본적인 속성입니다. 




이제 이러한 웜푸스 세계는 잠시 내려두고, 다음 포스팅에서 부터는 논리와 추론, 모델에 대해서 알아 보겠습니다. 논리와 명제 논리에 대해 알아보면서 웜푸스 세계에 대한 내용을 바탕으로 서술되는 부분들이 있으니 꼭 웜푸스 세계에 대한 전체적인 과정을 확인하시길 바랍니다.


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


안녕하세요.

지난 포스팅에 이어서, 이번엔 파이썬의 숫자형과 문자열 자료형에 대해서 알아보겠습니다.

참고 서적은 박응용씨의 '점프 투 파이썬'입니다.

또한 이번 포스팅부터 실습을 진행할텐데

제가 사용하는 파이썬 버전은 Python 3.6.2 이며 에디터는 서브라임텍스트3를 사용합니다.


1. 숫자형


숫자형이란 말 그대로 숫자로 된 자료형을 말합니다. 

숫자에는 어떤 것들이 있을까요? 잘 아시다시피 정수, 실수, 복소수 그리고 8진수와 16진수 등이 있습니다.

C 언어를 예를 들면 정수형을 표현하는데 Int형을 사용하죠. 파이썬과의 차이점을 보자면, C언어의 Int형은 대략 +21억~-21억의 범위를 가집니다. 하지만 파이썬에서는 숫자형의 범위가 존재하지 않습니다.



그럼 숫자형에서 각각의 숫자들은 어떤식으로 사용이 될까요? 하나씩 간단히 확인해보도록 하겠습니다.



1-1. 정수형(Integer)


정수형은 정수를 뜻하는 자료형을 말합니다. 다음 사진을 통해 정수형을 어떤식으로 사용하는지 볼 수 있습니다.




1-2. 실수형(Floating-point)


실수형은 정수형과 달리 소수점이 포함된 숫자들입니다. 다음 사진을 통해 실수형이 저장되고 사용되는 예시를 볼 수 있습니다.




1-3. 복소수(Complex number)


복소수는 허수를 표현하는 i와 정수 및 실수가 합쳐진 숫자입니다. 이때 파이썬에서는 i를 사용하지 않고 j 또는 J를 사용합니다.



추가적으로 파이썬에서는 복소수와 관련된 내장함수를 제공하고 있습니다.



(복소수).real

복소수의 실수부분만 반환합니다.


(복소수).imag

복소수의 허수부분만 반환합니다.


(복소수).conjugate()

복소수의 켤레복소수를 반환합니다.


abs(복소수)

복소수의 절대 값을 반환합니다.



1-4. 8진수와 16진수


8진수와 16진수를 사용할때는 숫자의 앞에 몇 진수인지 표시해주는 것이 필요합니다.

8진수의 경우, 숫자가 0o(숫자 0 + 알파벳 소문자 o) 또는 0O(숫자 0 + 알파벳 대문자 O)로 시작하면 됩니다.



16진수의 경우, 숫자가 0x(숫자 0 + 알파벳 x)로 시작하면됩니다.




2. 연산자


위에서 알아본 숫자형들을 연산할때 사용하는 연산자가 있습니다.

기본적으로 사칙연산자, 제곱을 나타내는 연산자, 나머지를 반환하는 연산자, 몫을 반환하는 연산자를 알아보도록 하겠습니다.


2-1. 사칙연산자


많은이들이 알다시피 사칙연산은 더하기(+), 빼기(-), 나누기(/), 곱하기(*)를 말합니다.

파이썬에서도 역시 사칙연산을 지원하고 사용 예시는 아래 사진과 같습니다.




2-2. 제곱을 나타내는 연산자


흔히들 제곱을 나타낼 때는 ^ 기호를 쓰죠. 예를 들면 2의 3승을 나타낼때는 2^3 이런식으로 말이죠.

파이썬에서는 조금 다르게 ^ 기호 대신 **를 사용합니다. 아래의 사진을 보고 어떻게 사용하는지 확인하세요.




2-3. 나머지를 반환하는 연산자


파이썬에서 나머지를 반환하는 연산자는 %를 사용합니다.

나머지를 반환하는 연산자란, 나눗셈의 결과에서 나머지만을 반환하는 연산자를 말합니다.

예를 들어 17이란 숫자를 5로 나누면 몫은 3이고 나머지는 2입니다.

즉, 17 % 5 = 2 입니다.




2-4. 몫을 반환하는 연산자


파이썬에서 몫을 반환하는 연산자는 //를 사용합니다.

몫을 반환하는 연산자는 말 그대로 나눗셈을 진행하고 결과에서 몫만을 반환하는 연산자를 말합니다.

예를 들어, 17이란 숫자를 5로 나누면 몫은 3이고 나머지는 2입니다.

즉, 17 // 5 = 3 입니다.





3. 문자열 자료형


문자열(String) 자료형이란 문자, 단어, 숫자 등으로 구성된 모든 문자들의 집합을 말합니다.

문자열은 따옴표로만 둘러 쌓여 있으면 됩니다. 문자열을 구성하는 방법은 아래에서 자세히 확인하도록 하겠습니다.

이전에 문자열의 예시를 보면 아래 사진과 같습니다.




3-1. 문자열 만들기


그럼, 이러한 문자열 자료형은 어떻게 만들까요?

총 4가지의 방법이 있습니다. 왜 4가지 씩이나 있는지에 대해서는 아래에서 설명드리겠습니다.


단일 큰따옴표 사용하기


단일 작은따옴표 사용하기


큰따옴표 3개연속 사용하기


작은따옴표 3개연속 사용하기




3-2. 문자열 만들기 방법이 4가지인 이유


3-1에서 문자열을 만드는 4가지 방법에 대해서 알아보았습니다.

헌데 왜 4가지 씩이나 있을까요?

여러가지 이유가 있겠지만, 저자는 아래의 두가지 이유를 설명합니다.


1. 문자열 안에 따옴표를 포함시키고 싶을 때

2. 여러줄일 문자열을 변수에 대입하고 싶을 때


첫 번째 이유, '문자열 안에 따옴표를 포함시키고 싶을 때'에 대해서 보겠습니다.

만약, 'Hello, what's your name?' 을 문자열에 저장하려면 어떻게 해야할까요?

또는, "I said, "beomwoo"."를 문자열에 저장하려면 어떻게 해야할까요?

일단 한번 시도해보면 아래와 같은 오류가 뜨게 됩니다.


왜 오류가 뜰까요?

바로, 첫 번째 문장에서 작은따옴표로 문자열을 만들었는데 문자열 중간에 작은따옴표가 존재하기 때문이며

같은 이유로 두번째 문장에서는 큰따옴표로 문자열을 만들었는데 문자열 중간에 큰따옴표가 있기 때문입니다.

즉, 문자열 중간에 작은따옴표 또는 큰따옴표를 입력하기 위해 각각의 방법이 존재합니다.

그렇다면 위에서 저장하려던 문자열을 오류없이 저장하려면 어떠한 방법이 있을까요?

 'Hello, what's your name?'  대신,

"Hello, what's your name?" 및 '''Hello, what's your name?''' 및 """Hello, what's your name?""" 이 존재하고

"I said, "beomwoo"." 대신,

'I said, "beomwoo".' 및 '''I said, "beomwoo".''' 및 """I said, "beomwoo".""" 이 존재할 것입니다.


물론 추가적으로 따옴표를 사용하기 위해서 이스케이프를 이용하는 방법도 존재합니다.

이스케이프에 대해서는 두번째 이유를 확인하고 설명드리겠습니다.


두번째 이유, '여러줄인 문자열을 변수에 대입하고 싶을 때'를 보겠습니다.

문자열이 항상 한 줄으로만 존재하지는 않습니다. 예를 들어,

Hello, world!

Nice to meet you!

와 같은 문자열을 변수에 저장해야 할 수도 있습니다.

이럴땐 어떻게 할까요?

이럴 경우 작은따옴표 및 큰따옴표를 단일로 사용할 경우 오류가 발생합니다.



이럴땐 위의 사진과 같이 큰따옴표 3개 또는 작은따옴표 3개를 이용해서 문자열을 만들어야 합니다.

그런데 위의 사진에서 성공적으로 출력된 결과를 보면,

'Hello, world!\nNice to meet you!'

임을 확인할 수 있습니다.

나는 분명히 엔터를 입력해서 두 줄의 문자열을 저장했는데 출력결과는 한줄이고 가운데에 이상한 문자, \n가 삽입되어있네요?

여기서 \n가 바로 이스케이프 코드 입니다.



3-3. 이스케이프 코드


이스케이프 코드란 프로그래밍을 할 때 프로그래머가 편히 사용할 수 있도록 미리 정의해 놓은 문자의 조합입니다.

즉, 작은따옴표는 문자열을 만들때 사용될 수 있으니까 너가 작은따옴표를 문자열 안에서 사용하려면 그냥 ' 이걸로 사용하지말고 \' 이렇게 사용해. 라는 식으로 정의해둔 것 입니다.

그렇다면 위에서 확인한 \n는 어떠한 의미를 가진 이스케이프 코드일까요?

예상하신 것 처럼 enter를 의미하는 이스케이프 코드입니다.

각각의 이스케이프 코드와 그 의미를를 아래의 표로 정리하였습니다.

 코드

설명 

\n

개행(줄바꿈)

\t

수평 탭

\\

문자 "\"

\'

단일 인용부호( ' )

\"

이중 인용부호( " )

\r

캐리지 리턴

\f

폼 피드

\a

벨 소리

\b

백 스페이스

\000

널 문자



4. 문자열 연산하기


파이썬에서 볼 수 있는 또 다른 특징 중에 하나입니다.

파이썬은 다른 언어와 달리 문자열 자체를 더하거나 곱하는 연산이 가능합니다.


4-1. 문자열 더하기

문자열에서 더한다는 의미는, 두개 이상의 문자열을 이어서 붙인다는 의미로 받아들이시면 됩니다.

아래 예제를 보시면 바로 이해하실 것 입니다.



4-2. 문자열 곱하기

그렇다면 문자열 곱하기는 어떤 의미를 가질까요?

예를 들어 3 * 5 라는 연산은 3을 5번 더하는 즉, 3 + 3 + 3 + 3 + 3 으로 생각할 수 있습니다.

어느정도 이해가 되시나요? 아래 예제를 통해 바로 확인해보겠습니다.




이러한 문자열 더하기와 곱하기는 추후 에디터를 이용하면서 많이 사용될 수 있으니 간단하지만 꼭 익혀두시기를 바랍니다.



이렇게 해서 파이썬의 숫자형과 문자열 자료형의 기본적인 내용을 알아보았습니다.

다음 포스팅에서는 문자열에서 자주 사용되는, 문자열 인덱싱과 슬라이싱에 대해서 공부해보겠습니다.

내용에 대한 피드백이나 궁금한 점은 댓글을 이용해주세요 :)

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요