아이들의 소중한 이야기를 만나보세요
202023년 04월 28일 게임교육
2023년 04월 28일 금요일 게임교육
이번 시간에는 조건문에 관하여 공부해보는 시간이었는데, 본격적으로 조건문에 들어가기 전에, 저번 시간에 했던 내용을 간략하게 요약하고, 그 저번 시간의 내용이 앞으로 어떻게 확장되어 갈지에 관하여 설명을 하는 시간을 가졌는데, 우선 저번 시간에 자료형이라는 것을 중점적으로 공부를 했는데, 그 자료형이라는 것은 자료의 형태와 그 형태의 자료가 할 수 있는 연산까지 포함하는 넓은 개념이라는 것을 알아보았고, 그러한 것을 바탕으로 해서 저번 시간에는 여러 가지 자료의 형태를 알아보고 각 형태의 자료가 할 수 있는 여러 연산들을 알아보는 시간을 가졌다. 그리고 이제 그러한 자료의 형태와 연산들을 공부했으니, 여러 자료의 처리를 구현할 수 있게 되었는데, 앞으로는 그러한 처리에 관하여 조건에 따라 어떠한 단위의 코드 묶음을 실행하거나 또는 생략하거나(조건문), 어떠한 단위의 코드 묶음 즉 처리를 반복하거나(반복문), 여러 연산을 묶어서 하나의 모듈로 선언하고 사용하거나(함수) 등을 공부해 볼 것이라고 설명했다. 그렇게 앞으로의 큰 그림을 그려본 후 조건문에 본격적으로 들어가기 전 우선 제어문(control statement)에 관하여 간략하게 설명을 했다. 이 제어문이라는 것은 코드의 실행흐름을 제어하는 문장이라고 설명하고, 그 제어의 종류에는 방금 큰 그림을 그리면서 설명한 것들, 즉 조건에 따라 어떠한 코드 묶음, 즉 실행 단위를 실행하거나 또는 생략하거나, 그리고 코드 진행 중에 어떠한 레이블로 점프를 하거나, 또는 현재 코드의 실행단위를 실행하는 중간에 그 실행단위를 빠져나가거나, 또는 현재 코드의 실행단위를 반복하거나 등의 제어를 할 수 있다고 알려주었는데, 이러한 설명을 할 때 이 코드의 묶음, 실행 단위 등의 단어를 강조했는데, 그 이유는 나중에 복합문(compound statement)에 관한 것을 설명할 것이기 때문에 이러한 것들을 미리 강조를 했다. 그렇게 제어문에 관하여 간단하게 설명을 한 후 본격적으로 조건문에 들어갔고, 우선 저자의 유튜브 영상 강의를 시청했다. 시청을 하다가 if 조건문의 기본 형태에 관한 설명에서 추가적인 설명으로 불 값이 true일 때 실행되는 문장이 한 줄이면 중괄호를 생략할 수 있고, 여러 줄일 경우 생략할 수 없다는 설명이 나왔는데, 이 설명 부분에서 잠시 멈추고 복합문(compound statement)에 관하여 잠시 설명을 진행했다. 우선 아이들에게 책의 불 값이 true일 때 실행되는 문장이 한 줄이면 중괄호를 생략할 수 있고, 여러 줄일 경우 생략할 수 없다는 그 설명을 읽고 이러한 중괄호를 어떤 역할을 할 것 같은지 추측을 해보자고 했는데, 아이들은 갈피를 잘 못 잡는 모습이었고, 아이들에게 일단 직관적으로 생각해서 뭔가 코드를 묶어줄 것 같지 않냐고 간략하게 일러주었다. 그런 뒤 1강에서 배웠던 개념을 확장해가며 복합문에 관하여 알아보는 시간을 가졌는데, 우선 1상에서 값의 관점에서 표현식(expression)은 값을 만들어내는 코드이고, 실행의 관점에서 문장(statement)는 코드의 실행 단위라고 배웠다. 그리고 이번에는 이러한 것에서 조금 더 확장해서 문장에는 단일 문장과 복합문(compound statement)가 있다고 설명을 했는데, 우선 단일문이란 말 그대로 그냥 하나의 문장이고, 복합문은 구성요소로 되어있는 여러 문을 구문 규칙에 의하여 하나의 묶음으로 한 것이라고 알려주었고, 그렇기에 이러한 복합문은 일련의 코드 그룹을 단일 문장으로 취급한다고 설명을 했다. 이에 관하여 저번 시간에 배운 문장(statement)이라는 것의 정의를 빌려 단일 문장으로 취급된다는 것을 다시 일련의 코드 그룹을 하나의 실행단위로 취급한다고 설명을 했다. 아이들이 감을 잘 잡지 못하는 모습을 보이자 옛날 언어 중에서 algol60의 복합문 구문 규칙을 알려주었는데, algol60의 복합문 구문인 begin-end문을 보여주니 아이들이 시작지점부터 끝지점까지 하나로 묶는다는 그러한 개념을 조금 더 잘 이해하는 모습을 보였다. 그렇게해서 이해도를 높이고 계속해서 가는데, 방금 중괄호 안의 코드 그룹을 하나의 실행단위, 즉 단일문장으로 취급한다고 했는데, 이러한 복합문에 관하여 지금 알아보는 이유를 설명하길 앞에서 제어문의 종류를 설명할 때 잠시 언급했듯이, 이 코드의 실행흐름을 제어하는 여러 문법에 있어서 이 묶여진 코드그룹, 즉 복합문 단위로 움직이는 경우가 많기 때문이라고 알려주고 이에 관하여 조금 더 상세한 예시를 들어주었는데, 우선 지금 배우고 있는 조건문에 관하여 조건이 참일 때에는 그 뒤의 중괄호 내부의 코드 그룹 전체가 실행이 이루어지는 단위가 되고, 반대로 조건이 거짓일 경우 중괄호 내부의 코드 그룹 전체가 생략이 되는 단위가 된다는 설명을 했다. 계속해서 앞으로 배울 반복문의 경우도 조건을 만족할 때 중괄호 내부의 코드 그룹 전체 단위로 반복을 수행한다고 설명했고, 또 나중에 switch 조건문이나 반복문에서 배울 break 키워도 또한 현재 실행중인 코드의 중괄호 그룹 안을 빠져나가는 것이라고 미리 알려주었다. 그러한 설명을 통해 결론적으로 코드의 실행흐름을 제어하는 여러 가지 문법들이 이렇게 복합문 단위로 이루어지는 경우가 아주 많기 때문에 미리 복합문에 관한 개념을 심어 주었다.
그렇게 복합문에 관하여 알아본 후, 책과 영상을 따라 if조건문을 공부하는데, 책에서 조건으로 날짜나 시간을 이용하는 예제가 나오면서, 이를 위해 객체를 사용하는 예시가 제시 되었다. 나중에 클래스와 객체에 관하여 배우긴 할 것이지만, 우리가 장기적으로 볼 때 zepscript 프레임워크도 객체지향 패러다임으로 프로그래밍이 진행될 것이고, 또 책에 나온 객체를 생성하는 형태와, 여러 가지 get***()형태의 getter 메소드도 굉장히 자주 볼 형태이기 때문에 이러한 것에 관하여 미리 간략하게 설명하는 시간을 가졌다. 우선 const date = new Date()라는 문장에 관하여 정확한 설명이 될 수는 없겠지만 아이들의 이해를 돕기 위해, 이 코드에서 객체가 어떻게 만들어지고 어떻게 동작되는지에 관하여 사람에 비유하여 설명을 진행했다. 우선 스택 영역과 힙 영역, 그리고 일반 변수와 참조형 변수에 관하여 설명하는데, 먼저 스택 영역은 메모리 할당을 조금만 받아서 상자 같은 것만 보관될 수 있는 작은 공간이라고 가정하고, 힙 영역은 할당 받은 메모리 공간이 많아서, 즉 공간이 커서 부피가 큰 여러 가지가 들어갈 수 있는 공간이라고 가정을 했다. 그런 뒤, 객체의 생성을 설명하기 전에 우선 일반 변수와 참조형 변수에 관하여 설명을 했는데, 먼저 일반 변수는 우리가 2장에서 했듯이 let a =1하면 박스에 정수 1값이 들어가는 것이고, 참조형 변수라고 하면 1이라는 커다란 객체가 생성되고, 이것은 힙 영역에 존재하며 우리가 생성한 a라는 박스는 스택에 존재하는데 그 박스 안에는 방금 생성된 객체가 존재하는 주소값이 담겨져 있고, 이후 이 a라는 박스를 호출하면 a라는 박스 안에서 해당 객체가 존재하는 주소값을 참조하여 그 주소를 찾아가 객체를 활용하는 방식이라고 설명을 했다. 그런 뒤 본격적으로 사람에 비유해 객체를 생성하는 코드를 설명했는데, const 사람이름 = new 사람()이라는 코드를 통해 설명을 진행하길 먼저 사람()이라는 것을 통해 어떤 사람 종의 생명체가 하나 만들어지고 그 앞에 있는 new라는 연산자를 통해 이 사람이라는 생명체 종의 틀을 만들 때 미리 지정해놓은 DNA, 머리카락 색, 쌍커풀유무, 혈액형 등의 기본적인 속성값이 갖춰지게 된다(객체의 초기화)고 알려주었다. 그런데 그렇게 해서 사람 생명체가 생긴 것은 좋은데, 아이들에게 알려주길 이 사람이 박스에서 살기에는(스택 영역) 너무 커서 불편하지 않은가라고 설명하며, 그렇기에 이 사람은 큰 공간(힙 영역)에 살게 하고, 작은 공간에 보관된 박스에는 그 사람 객체가 위치한 주소를 넣어두는데, 이때 위의 코드에서 그 주소를 반환하는 역할을 하는 것이 new 연산자라고 알려주었다. 그렇게 그 사람이름이 붙여진 박스에는 그 사람 객체가 살고 있는 주소를 넣어두고, 그 사람 객체를 사용해야 할 때에는 박스에서 주소를 보고, 그 주소를 참조하여 그 사람 객체를 찾아가서 사용을 한다(참조형 변수)고 설명을 했다. 그렇게 객체를 생성하는 것에 관하여 간략하게 설명을 한 후 책의 getFullYear(), getMonth() 등의 Getter 메소드에 의거하여 Getter와 Setter 메소드를 설명하는데, 우선 아직 클래스와 객체를 배우지 않았음에도 이 부분을 먼저 설명한 이유는 장기적으로 볼 때 우리가 사용할 zepscript 프레임워크도 객체지향 패러다임으로 프로그래밍을 진행함으로 대부분 객체를 이용한 프로그래밍을 할 것이고, 그렇게 객체를 이용하게 되면 많은 부분에 있어서 일반적으로 변수에서 값을 확인하고, 변수에 값을 할당하는 형태보다는 Getter 메소드와 Setter 메소드를 이용하여 속성 값을 확인하고, 변경하는 형태를 사용하게 될 것이기에, 그 형태와 원리에 미리 익숙해지라는 차원에서 간략하게 알아보는 시간을 가졌다. 우선 개론적인 부분을 설명하는데, 객체의 속성을 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨질 수 있기 때문에 객체 지향 패러다임에서는 외부에서의 직접적인 필드 접근을 막고, 대신 메소드를 통해 필드에 접근하는 것을 선호한다고 설명했고, 이러한 메소드 사용을 통해서 데이터를 검증하여 유효한 값만 속성에 저장할 수 있다고 알려주었는데, 이러한 역할을 하는 메소드가 setter이며 그 형태는 set속성명()의 형태가 된다고 알려주었다. 그런 다음 이러한 것에 관하여 구체적인 예시를 통해 설명하길, 예를 들어 어떤 사람 객체가 존재하고 이에 관하여 그 사람의 나이가 속성으로 존재할 때, 이 나이에 관한 속성값으로 음수가 할당되면 안 된다고 가정하는데, 만약 이것을 그냥 단순하게 사람.나이 = 음수와 같은 형태로 단순히 변수에 값을 할당하는 방식으로는 이러한 논리적 오류를 걸러내지 못 할 가능성이 높다고 설명하면서, 이와 비교하여 이러한 값의 변경을 메소드 형태로서 진행하게 된다면 set나이()라는 메소드를 선언하고 그 동작 속에서 나이 값에 음수가 할당되려고 할 때 그것을 수행하지 않는 코드를 넣음으로서, 단순한 할당문과는 반대로 값의 유효성을 검증할 수 있다고 알려주었다. 거기에 더해 사람.나이 = 음수와 같은 형태로 외부에서 무분별하게 값을 변경하는 것을 막기 위해 Private속성을 사용한다는 예고를 먼저 해 두었다. 그렇게 Setter 메소드에 관하여 간략한 설명을 한 후, 책의 예제에 나온 getMonth(), getFullYear() 등에 근거하여 Getter 메소드에 관하여 간략한 설명을 하는데, 외부에서 객체의 속성을 읽을 때에 메소드가 필요한 경우가 있는데, 어떤 경우냐 하면 속성값이 객체 외부에서 사용하기에 부적절한 경우 메소드로 적절한 값으로 변환해서 리턴할 수 있다고 알려주었다. 이에 관해서도 예시를 들어주길 현재 잔액을 확인하는 코드를 짠다고 할 때 돈 관리는 달러로 되는데, 한국인에게 원화로 보여주어야 한다면, 단순히 잔액이라는 변수를 부르는 것 만으로는 그러한 것이 불가능하다고 설명하며 이와 비교하여 get잔액()이라는 메소드를 선언하고 그 동작 속에서 달러 값이 들어있는 잔액 변수를 원화로 계산하여 반환하는 코드를 작성한 후, 앞으로 잔액을 확인할 때, get()잔액 메소드를 사용한다면 아까 불가능 했던 것이 가능해진다고 설명을 했다. 이렇게 Getter와 Setter에 관하여 간략한 설명을 한 후 추가로 하나 더 설명하길 get속성명(), set속성명() 형태의 Getter와 Setter 메소드는 정해진 문법은 아니고, 그냥 개발자끼리의 약속이라고 알려주며, 굳이 이러한 것을 정의하지 않는다고 해서 문법적으로 오류가 발생하는 것은 아니지만, 되도록 이렇게 하는 것이 오류를 줄이는 것에 있어서도 좋고, 또 많은 사람이 이렇게 코드를 작성하기 때문에, 이러한 형태를 익혀두는 것이, 다른 사람의 코드를 읽을 때에도 좋다고 알려주었다. 또 하나 추가로 언급한 것은 책에 나온 getFullYear()를 예시로 하여, 이러한 Getter 메소드가 있다면 그 객체에는 fullYear라는 속성이 있는 것이라고 알려주었다. 그렇게 해서 Getter와 Setter에 관한 간략한 설명을 최종적으로 마치고, 본격적으로 책에 나온 시간과 날짜를 구하는 예제를 살펴본 후, 계속해서 그러한 것과 if 조건문을 이용하여 오전과 오후를 구분하는 프로그램 만들기 실습을 책과 영상을 보며 진행을 했다. 그렇게해서 if조건문에 관한 부분을 마치고 다음으로 if-else 조건문으로 넘어갔다. 우선 책과 영상을 보면서 기본적인 문법에 관한 학습을 한 후, 조금 더 추가적인 설명을 했는데, 우선 아이들이 이해하기 좋도록 먼저 한글로 설명을 해주길 {비가 오면 우산을 쓴다, 비가 오지 않으면 우산을 쓰지 않는다.}라는 문장을 보여준 후, 이에 관하여 이 비가 오면이라는 조건이 있을 때 그에 관하여 이 비가 오지 않으면이라는 조건을 간단하게 표현하면 어떻게 할 수 있을지에 관하여 생각을 해보자고 했다. 잠시 생각해보는 시간을 가진 후 아이들의 답변을 듣고나서 다시 설명하길 비가 오는 것에 관하여 비가 오지 않는 것은 배타적인 것으로, 즉 비가 오면, 비가 오지 않는 것은 일어날 수 없고, 반대로 비가 오지 않는데 동시에 비가 온다는 것이 일어날 수 없으니 비가 오면이라는 조건에 관하여 비가 오지 않는다는 것을 간략하게 “아니면”이라는 단어로 정리할 수 있다고 알려주었고, 이를 아까의 문장에 대입하여 {비가 오면 우산을 쓴다, 아니면 우산을 쓰지 않는다.}라고 바꿀 수 있다고 알려주었다. 그리고 이러한 것을 코드로 표현해보면 if(hour < 12) {compound statement} if(hour >= 12) {compound statement}라는 코드에 관하여 hour < 12라는 조건과 hour >= 12라는 조건은 아까 말한 것처럼 서로 배타적인 조건, 즉 이거 아니면 반드시 저거이기 때문에 if(hour < 12) {compound statement} else {compound statement}로 바꿀 수 있다고 알려주었다. 추가로 실행 속도 부분에서도 설명하길 if(hour < 12) {compound statement} if(hour >= 12) {compound statement}라고 코드를 기술하면 인터프리터가 처음에 hour < 12가 참인지 연산을 하고, 그 결과에 관계없이 hour >= 12가 참인지 또 연산을 하는데, 아까 말했듯이 둘은 배타적인 조건이기 때문에 하나가 참이면 하나는 반드시 거짓이 되기 때문에 하나만 연산을 해도 되는데, 둘 다 연산을 하는 것은 효율적이지 못하다고 하며 이러한 것을 if(hour < 12) {compound statement} else {compound statement}로 연산하면 hour < 12에서 한 번만 연산을 하여 그 조건이 참이면 if절의 복합문을, 거짓이면 else절의 복합문을 실행하는 식으로 조건 비교 연산을 한 번만 하면 됨으로 훨씬 효율적인 코드가 된다고 알려주었다. 이러한 것은 책과 영상의 내용을 기반으로 추가적인 설명을 덧붙인 것이었고, 여기에 조금 더 추가적인 내용을 설명하는데, 나중에 if-else-if문의 유도 과정을 설명하기 위해 필요한 내용을 미리 알려주길, 이 if-else문의 구조에서 우선 아까 설명한 한글 예시부터 다시 살펴보았는데, {비가 오면 우산을 쓴다, 아니면 우산을 쓰지 않는다.}라는 코드에서 이 “아니면”이라는 것의 정확한 의미는 비가 오지 않는다, 즉 비가 온다라는 조건이 거짓이 되는 나머지 모든 경우를 의미하기에 만약 앞에 비가 온다라는 조건이 없다면 이 “아니면”이라는 것의 의미는 정의될 수 없다고 알려주며, 즉 이 아니면이라는 것은 앞에 무언가 조건이 왔을 때 그 조건에 관하여 배타적인 조건으로서 의미가 정해짐으로, 아니면이라는 것은 앞의 조건에 종속적이라는 것을 설명했는데, 이에 관하여 설명한 이유는 그렇게 종속적이기에 아니면이라는 것은 앞의 조건과 반드시 한 세트라는 것을 설명하기 위해서이었다. 이러한 것을 코드에 적용하여 알려주길 if(hour < 12){compound statement} else{compound statement}라는 코드에서 else의 의미는 hour < 12라는 조건에 의하여 그러한 조건에 배타적인 의미로서 그 의미가 정해지기 때문에, 이 else는 반드시 if와 반드시 함께 사용될 수 밖에 없다, 즉 else는 if와 반드시 한 묶음이라는 것을 알려주었다. 이러한 것을 알려준 후 책과 영상에 나오는 if-eles 조건문의 예제를 실습해보았고, 다음으로 중첩 조건문으로 넘어갔다. 중첩조건문은 책과 영상을 통해 간략하게 살펴보고 그 예제를 실습해보았다.
그런 뒤에 if-else-if 조건문으로 넘어가는데, 아까 if-else 조건문에서 부가적인 설명으로 else는 if와 반드시 한 묶음이라는 것을 설명했는데, 이 if-else-if 조건문에서는 그러한 사실을 이용해 if-else-if 조건문을 유도하는 과정을 알아보는 시간을 가졌다. 먼저 하나 전제를 하길 아까 else가 if와 한 묶음임을 설명했는데, 이에 관하여 또 이번 시간의 초반에 중괄호의 역할이 본래 한 묶음이 아닌 코드들을 한 묶음으로서 취급할 수 있도록 해주는 것이라고 설명한 것을 떠올리며, 이러한 것들을 이용하여 결론을 도출해내길, 본래부터 else는 if와 한 묶음이니, 중첩조건문에서 이것들을 반드시 중괄호로 묶을 필요가 없음을 근거로 하여 다음과 같은 중첩 조건문에서 생략 가능한 중괄호를 생략하고, 코드를 정리하여 if-else-if 조건문을 유도해보는 시간을 가졌다.
if(expression) {
} else {
if(expression) {
} else {
}
}
다음과 같은 중첩 조건문에서 바깥쪽 else절 안에 있는 if-else 조건문은 본래부터 하나의 실행단위이니 이것을 중괄호로 묶을 필요가 없기에 이를 감싸고 있는 중괄호를 생략하여 우선 다음과 같은 코드가 도출되었다.
if(expression) {
} else
if(expression) {
} else {
}
그리고 이렇게 도출된 코드를 다시 예쁘게 정리를 해보면
if(expression) {
} else if(expression) {
} else {
}
다음과 같은 if-else-if 조건문이 유도가 된다. 이렇게 기본 유도 과정을 해본 후, 더 복잡한 중첩 조건문을 if-else-if 조건문으로 유도해보는 시간을 통해 if-else-if 조건문에서 else if절이 여러 개가 들어갈 수 있음도 알아보았다. 이렇게해서 if-else-if의 기본 원리를 알아본 후, 책과 영상에 나온 예제를 해보고 3.1장 수업은 마무리가 되었고, 뒤의 확인 문제를 풀어본 후 3.1장을 최종적으로 마쳤다.
그런 뒤 3.2장에 들어갔는데, 3.2장에서는 switch 조건문과 그 외에 조건부 연산자를 활용한 조건분기, 논리연산자를 활용한 조건분기에 관한 내용들이 제시되었다. 먼저 switch문에 관한 내용이 나왔고, 책과 영상을 보며 그 내용을 공부하고 예제를 실습해보았다. 그렇게 switch문에 관한 기본적인 내용을 익힌 뒤에 switch문에서 사용되는 break 키워드와 default 키워드에 관하여 조금 더 자세히 알아보는 시간을 가졌는데, 이러한 것을 자세히 알아보기 위해 우선 switch의 실행에 관하여 조금 더 자세히 알아보는 시간을 가졌다. switch문의 실행 순서는 switch(data)에서의 data값과, 중괄호 속의 case에 딸린 값들을 기술해놓은 순서대로 해서 차례대로 비교한다는 것을 인지한 후, 그 상태에서 하나의 개념을 더 확장을 해 나갔는데, 여기서 확장한 개념은 default에 관한 것이었다. 처음 defalt 키워드를 공부할 때 switch(data)에서 data의 값이 case를 사용해 열거한 조건들과 일치하는 조건이 없는 경우 수행할 명령을 적는 절이라고 공부했는데, 이 두 가지 조건을 이용하여 추가로 설명하길 비록 switch문에서 중괄호 내부의 코드는 switch(data)에서의 data값과, 중괄호 속의 case에 딸린 값들을 기술해놓은 순서대로 해서 차례대로 비교한다고 했지만, default의 경우 case와 case절 사이에 기술한다 하더라도, default 키워드 자체가 모든 case절에 일치하지 않을 때 실행될 것들을 적어놓는 곳이기 때문에 항상 실행순서에서 제일 마지막이 됨을 알려주었다. 그리고 추가로 default는 if-else 조건문 또는 if-else-if 조건문의 마지막 else와 같은 역할을 한다고 알려주면서, 그와 연계하여 if-else 조건문 또는 if-else-if 조건문에서 마지막 else가 생략 가능하듯이 switch 조건문에서도 default는 생략이 가능함을 알려주었다. 그리고나서 break 키워드와 방금 공부한 것들을 연계하여 추가적인 내용을 공부하는데, 우선 switch문에서 각 case절에 break 키워드를 사용하지 않을 경우 조건에 해당하는 case절부터 해서 break를 만날 때까지 모든 코드가 실행된다고 알려주며, 이때 조건에 해당하는 case절을 만나면 그다음 case절부터는 조건 자체를 비교하지 않음까지 알게 되었다. 그리고나서 이러한 개념에 아까 공부했던 case절과 case절 사이에 default 키워드를 쓴 경우를 연계하여 다음과 같은 코드 예제를 보여주며 추가적인 공부를 진행했다.
const a = 5
switch(a) {
case 1:
alert('1')
break
default:
alert('5')
case 2:
alert('2')
case 3:
alert('3')
break
case 4:
alert('4')
}
위의 코드를 실행시키면 어떠한 결과가 나올지 먼저 아이들에게 예측해볼 시간을 준 후 코드를 실행시키고 결과를 보여주었는데, 그 결과 5가 나오는 경고창이 나오고, 다음에 2가 나오는 경고창이 나오고, 다음에 3이 나오는 경고창이 나오는데 이러한 결과를 통해서 설명하길 현재 코드에서 상황이 a의 값은 5로 해당하는 case절이 없기에 마지막으로 default절에 걸려 alert(‘5’)가 실행되는데, 이후 case 2:와 case 3:의 조건은 해당이 되지 않음에도 불구하고, default에서 이미 조건이 걸렸으니 아래 절들은 비교하지 않고 break 키워드를 만날때까지 계속 내려가면서 실행함을 설명했다. 그리고 이를 통해서 설명하길 보통 가독성을 위해 default를 마지막 절에 쓰는 게 일반적이기에, 책에서는 default 절의 break는 보통 생략하는 것이 일반적이라고 나와있는데, 정확히 말하면 default를 마지막 절에 쓸 경우 그 뒤에 실행할 코드가 따로 없기 때문에 break가 생략가능함을 언급하고, switch문의 실행 원리 상 default가 만약 중간에 위치하면 break 키워드를 반드시 써야함을 당부했다. 그리고 이에 조금 더 하여 위의 코드에서 case 4: 절에는 break가 없는데 이렇게 반드시 default절이 나이더라도 마지막 절의 경우 그 뒤에 실행할 코드가 따로 없기 때문에 break 키워드가 생략 가능함도 알려주었다. 그렇게 switch문에 관한 추가적인 내용들을 공부한 후 책에 나오는 switch문의 예제들을 실습해보는데, 145쪽에 나오는 case 절에 리터럴 값이 아닌 조건 표현식을 넣는 부분에서 조금 추가적인 설명을 했다. 영상에서 단순하게 그런 코드를 쓰면 이상하게 생각한다고만 설명했는데, 이에 관해서 조금 부가 설명을 하길 switch문 자체가 리터럴 값과 직접적으로 비교하는 조건 형식에 유리한 문법구조이고, 그렇기에 다른 언어들 중에서는 case절에 리터럴 값만 넣을 수 있는 언어들도 많다고 설명했으며, 비록 자바스크립트는 표현식을 넣을 수 있지만, 그렇게 쓰는 것 보다는 리터럴 값을 비교하는 형식일 때 if문에 비해 내부적으로 연산이 더 적고 간결한 형식으로 나열되어 더 좋은 기계어 코드로 번역되기 때문에 효율적일 수 있으나, 145쪽의 예제코드와 같은 경우는 차라리 if문을 쓰는 것이 더 낫다고 알려주었다. 여기에 더해 비교 표현식을 상수 리터럴로 바꿔 switch문을 사용하는 방법을 몇 가지 알려주었는데, 여기서 알려준 방법들은 먼저 두 수가 같은지 비교할 경우 switch(data)에서 data에 비교할 두 수를 뺄셈 연산한 표현식을 넣고 case 0: 절은 두 수가 같다는 뜻이며 default는 두 수가 다르다는 식으로 처리가 가능하고, 또 하나 가능한 것은 홀짝 구분할 때, switch(변수 % 2)를 한 다음 case 1: 하면 홀수이고, default하면 짝수가 되는 식으로 해도 되며, 또 하나 점수에 따라 등급을 매길 때는 switch(Math.floor(변수 / 10)을 하고 case 10:은 100점, case 9:는 90점 이상, case 8:은 80점 이상 해서 이런 식으로 조건 비교를 리터럴 값으로 바꿔서 최적화를 할 수 있음을 알려주었다. 그리고 이렇게 알려준 것들로 추가적인 실습을 조금 더 해본 뒤 switch문을 최종적으로 마치고 조건부 연산자로 넘어갔다.우선 책과 영상을 보며 조건부 연산자에 관하여 공부를 하는데, 영상과 책대로 공부를 한 후 추가적으로 하나 설명하길 이 조건부 연산자에서 연산자라는 단어에 포커스를 맞추고 그 올바른 사용법을 설명했다. 조건부 연산자는 연산자로 이를 사용한 코드는 곧 연산 수식이 된다고 설명을 했고, 그렇기에 조건문과는 다르게 조건부 연산자는 연산을 처리하고 나면 결과값을 반환하는 형태로 되어있음을 강조했으며, 그래서 조건부 연산자를 올바르게 사용하려면 결과값을 반환받아 그 값을 활용하는 형태로 사용되어야 함을 설명했다. 그렇게 이론적인 부분을 설명하고 이에 관하여 조금 더 자세히 예시를 보여주었는데, 책 146쪽의 조건부 연산자를 사용하는 예제에서 const result = (number >= 0) ? ‘0이상의 숫자입니다.’ : ‘0보다 작은 숫자입니다.’; alert(result);의 형태로 예제가 제시되어 있었는데, 이에 관하여 이런 형태가 올바른 형태라고 먼저 알려준 후, 올바르지 않은 형태에 관해서 알려주었는데, 만약 책처럼 안 하고, 그냥 number >= 0 ? alert(‘0이상’) : alert(‘0이하’)라고 했을 때 alert가 실행은 되는데, 이는 반환 값을 활용하는 것이 아님으로 좋은 사용이 아니라고 알려주며 이에 더해 방금의 그 문장을 check = number >= 0 ? alert(‘0이상’) : alert(‘0이하’); alert(check)해서 check에 반환되는 값이 undefined임을 보여주며 이렇게 우리가 반환 받아야 할 값은 0이상인지 이하인지에 관한 문자열 값인데, undefined를 반환받는 연산 수식을 구성했음으로 이것이 좋지 못한 사용이라는 것을 설명했다. 그렇게해서 조건부 연산자에 관한 설명을 마친 뒤, 마지막으로 짧은 조건문이라고 해서 논리 연산자의 특성을 이용해 조건 수식을 구성하는 Short Circut Evaluation(단락 평가)에 관하여 간략하게 설명한 후, 이론적인 부분을 최종적으로 마쳤고, 이후 책에 나와 있는 여러 응용 예제와 연습 문제들을 책과 영상을 이용해 실습하고 공부해본 후 이번 3장 조건문을 최종적으로 마쳤다.
사단법인 함께꿈을그리다 목양비젼지역아동센터 | 경상남도 김해시 진영산복로 201 2층 [지도보기] Tel : 055-343-0391 Fax : 055-343-0392 E-mail : san0191@naver.com