본문 바로가기

code-states

[code-states][we-win] 4일차 - math method, data type & type casting, array & array method, etc

 



않되!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

하... 일단 깔끔하게 11시 출첵으로 시작했다

 

늦잠을 자거나 한 건 아닌데

출석 체크 하는 걸 먹었다 ㅡㅡ;

 

08시 04분에 저의 pair 와 연락도 하고 있었습니다 제발 믿어주세요

 

그래서 오늘은 블로그 리뷰를 적기 전에

이거에 대한 대책부터 먼저 세우고 출발하려고 한다

 

 

본인에 대한 점철된 불신이 드러나는 알람 목록

 

 

나같은 경우 현재 사이다뱅크에서 하는 일당백 챌린지와

YES24 E BOOK 심야퀴즈를 매일마다 하고있고

그걸 이제 잊지 않게끔 알람을 매일 맞춰놓고 있다

이건 철저히 나를 못 믿으니까 한 건데

이제 거기에 두 개를 더 추가해야 할 수밖에 없을 거 같다

 

본인에 대한 점철된 불신이 더더욱 드러나는 알람 목록

 

이렇게 두 개

생각난 김에 바로 추가했다

 

이런 상황이 다음주도 지속된다면... 안 되겠지?

 

 

수료가 늦어지는 초유의 상황은 방지해야 한다 !!

 

여담이 너무 길었다

이제 진짜 오늘 공부일지 시작


오늘 배운 것들은 다음과 같다

 

- math method

- data type & type casting

- array & array method

- for & while loop

 

 

오늘부터 시작한 일은

전날이나 당일 아침 짬을 내서

당일 진도를 뺴야 할 부분의 자료/문제들을 미리 보고

간단하게 표로 요약을 하는 것

 

예시를 들 겸, Google docs 에 적은 내용을 한 번 그대로 가져와 봤다


 

오늘 필요할 개념들은 무엇인가?

 

오전 : 수학, 타입

오후 : 반복문, 배열, 배열의 반복

 

 

 

[ 오전에 필요한 개념들 (문제 기준) ]

 

 

유형

번호

문제이름

필요개념

추가개념

수학

1

01_computeAreaOfATriangle

-

-

2

02_computePower

제곱

-

3

03_computePerimeterOfACircle

-

-

타입

1

01_convertToString

형변환

string 으로의 형변환

2

02_convertToNumber

형변환

integer 으로의 형변환

3

03_isFalsy

형변환

boolean 으로의 형변환

 

 

 

[ 오전에 필요한 개념들을 찾아볼 수 있을 것 같은 출처 ]

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math

MDN 의 math method 문서

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Values,_variables,_and_literals

MDN 의 문법과 자료형 문서

 


[ 오후에 필요한 개념들 (문제 기준) ]

 

유형

번호

문제이름

필요개념

추가개념

반복문

1

01_sum

for loop

 

2

02_repeatString

for loop

변수의 활용

3

03_countCharacter

for loop

혹은 while loop

문자열 

배열기초

& 타입

1

01_getType

typeOf

배열과 객체 구분

배열기초

1

01_getFirstElement

array

 

2

02_getLastElement

array

 

3

03_getNthElement

array

array slicing in js

배열반복

1

01_computeSumOfAllElements

for loop + array

 

2

02_getAllLetters

array slicing

for loop



[ 오후에 필요한 개념들을 찾아볼 수 있을 것 같은 출처 ]

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Loops_and_iteration

MDN 의 루프와 반복 문서

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/typeof

MDN 의 typeof 문서

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array

MDN 의 array 문서

 


오늘 pair programming 을 같이 할 분께서

본인이 완전 초보라고 먼저 Slack 으로 말씀을 걸어주시길래

'혹시 내가 조금 더 체계적으로 공부하면, 이 분에게 도움을 줄 수 있지 않을까' 해서

시작해 보게 된 습관인데

꽤 괜찮은 거 같아서 이건 계속 할 거 같다

 

무엇보다도, 아직 기초적인 단계를 배워서 그러는 것도 있지만

그걸 감안하더라도 이 과정이 생각보다 그렇게 오래 걸리지도 않았을 뿐더러

(0730i 쯤 시작해서 슥 훑어보고, 0805i 즈음에 오전에 할 부분을 마무리 짓고 pair 에게 연락을 하였음)

 

무작정 정신없이 '열심히', '최선을 다해' 라는 그런 방향성 부족한 과잉된 열정보다는

'오늘 배우는 부분은 이것이고, 오늘 풀 문제는 이것이니,

대략 이 정도 분야의 공부를 어느 정도의 비중으로 하면 되겠군'

 

이라고 대략 계획을 짜 놓고 그 정도로만 깔끔하게 달리는 게 내겐 더 맞기도 하니깐

 


1. Math method

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math

 

Math

Math는 수학적인 상수와 함수를 위한 속성과 메서드를 가진 내장 객체입니다.

developer.mozilla.org

사실 Math method 는 너무나도 많다

이 글을 작성하며 공부를 빠르게 쳐 나갈 때부터

pair programming 을 들어가기 전까지 남은 시간은 약 2시간 남짓

 

절대로 이 모든 것을 다 할 순 없었다

 

math method 의 극히 일부분

 

그렇기에 일단 문제에 나오는 것과,

왜인지 모르게 자주 쓸 거 같은 method 위주로 공부를 하였는데

 

그렇게 추려진 method 는 약 세 개

PI, Power, 그리고 Square Root 이다

 

이들의 예시를 코드로 또 각각 나타내 보자면 다음과 같다

 

* 아 그리고 이제 앞으로 google docs 에서 만든 code block 들도 그대로 가져올 예정이다

네이버에서 굳이 소스코드를 바꿔주는 과정을 하나하나 해 주는 건

정말이지 너~무 귀찮다

 

 

 

원주율(PI) :

 

Math.PI;
//3.141592653589793

console.log(Math.PI);
//3.141592653589793

let yummy_pi = Math.PI;
console.log(yummy_pi);
//3.141592653589793

당연한 이야기이겠지만

yummy_pi 라는 변수를 만들고

그 곳에 math method 값인 Math.PI 를 넣어도 잘 된다


제곱(Power):

Math.pow(10, 2);
//100

Power = Math.pow(10, 2);
Power;
//100

pow 또한 선언한 변수에 할당해 주는 것이 가능하며


제곱근(Square Root) :

 

Math.sqrt(100);
//10

squareRoot = Math.sqrt(100);

squareRoot;

//10

sqrt 도 마찬가지이다

 


Math method 중 이번 문제를 풀 만한 method 는 대략 이 정도이다만

나중에 조금 더 효율적인 계산이나, 고차원적인 수치 연산을 위해 필요하다면

해당 document 는 두 팔 걷어 붙이고 찾아봐야 할 문서이니 잊지 말도록 하자

 

 

꼭!

 


2. Data Type & Casting

2-1. Data Type

https://developer.mozilla.org/ko/docs/Web/JavaScript/Data_structures

 

자바스크립트의 자료형

모든 프로그래밍 언어는 내장 자료형이 있지만, 종종 이러한 내장 자료형은 언어마다 다르다. 이 문서에서는 자바스크립트의 내장 자료형과, 내장 자료형에서 사용할 수 있는 속성들에 대해 알아본다. 이로써 내장 자료형들로 더 복잡한 자료형을 만드는데 사용할 수 있을 것이다. 가능하다면 다른 언어와도 비교해보자.

developer.mozilla.org

 

 

https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/Using_js-ctypes/Type_conversion

 

Type conversion

In js-ctypes, data could be converted implicitly when passing to or returning from a FunctionType call, or setting pointer content, an array element or a struct field.

developer.mozilla.org

math method 같은 경우는

'나중에 필요한 거 조금 더 찾아봐야지' 정도로 끝낼 수 있지만

이 두 개는 다르다

 

오늘 정리도 어느정도 하고, 주말에는 단단히, 각을 잡고 정리해야 할 부분이다

 

 

그래도 한정된 시간 안에 모든 것을 다 할 순 없다

진도와 풀어야 하는 문제를 기준으로 우선순위를 추려

일단 오늘 그 중에서도 중점적으로 학습한 method 는

 

typeof, Array.isArray, parseInt, parseFloat, 그리고 isNaN

이렇게 다섯 개이다

 

이번에도 하나하나 예제 코드를 통해서 알아보자

 


 

typeof

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/typeof

 

typeof

typeof 연산자는 피연산자의 평가 전 자료형을 나타내는 문자열을 반환합니다.

developer.mozilla.org

typeof 에 대해 설명한 MDN 의 문서이다

 


 

[ 예제 코드 ]

// Numbers
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // Despite being "Not-A-Number"
typeof Number(1) === 'number'; // but never use this form!

typeof 42n === 'bigint';


// Strings
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof always returns a string
typeof String("abc") === 'string'; // but never use this form!


// Booleans
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // but never use this form!


// Symbols
typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'


// Undefined
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined'; 


// Objects
typeof {a:1} === 'object';

// use Array.isArray or Object.prototype.toString.call
// to differentiate regular objects from arrays
typeof [1, 2, 4] === 'object';

typeof new Date() === 'object';


// The following is confusing. Don't use!
typeof new Boolean(true) === 'object'; 
typeof new Number(1) === 'object'; 
typeof new String("abc") === 'object';


// Functions
typeof function(){} === 'function';
typeof class C {} === 'function';
typeof Math.sin === 'function';

 

판별하는 data type 이 꽤 많은 관계로

일단 모든 type 을 판별한 MDN 의 code 를 그대로 긁어왔다

 

여기서 판별할 수 있는 data type 은

Undefined, Null, Boolean, Number, BigInt, String, Symbol, 호스트 객체, fuction, 그리고 다른 모든 객체(object)

 

판별할 수 있는 게 상당히 많으나

정확한 판별이 안 되는 게일단 대표적으로 한 가지 있다

 

 

 

바로 Array data type 이다

let animal = ['dog', 'cat', 'cow'];
typeof animal;
//"object"

 

예제 코드를 통해 array variable 을 하나 선언하고

그 variable 의 data type 이 무엇인지

typeof 으로 검산을 해 본 결과이다

 

그러나 이것이 틀린 것은 또 절대 아니다

 

MDN 의 기준으로, arrays 는 '일련의 값들을 표현하기 위한 object' 라고 설명이 되어있다

'object 이니 object 라고 하지!' 라고 했을 때, 이걸 보면 또 맞는 말이다

animal;
// (3) ["dog", "cat", "cow"] 

typeof null; 
// "object" 

typeof animal == typeof null; 
// true

 

이처럼 또 다른 object data type 인 null 과 array 는 일단은 같은 object data type 으로 취급이 된다

하지만 array data type 이면, array 라고 이야기 해 줄 수 있는 그런 method 는 없을까

 

 

당연하게도 존재한다, 바로 Array.isArray method 이다

 


Array.isArray()

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

 

Array.isArray()

Array.isArray() 메서드는 인자가 Array인지 판별합니다.

developer.mozilla.org

 

return 값은 boolean

Array.isArray(param) 구조의 method 인데

parameter 에 들어간 요소가 array 가 맞느냐 라는 질문에 대해

true 인지 false 인지를 boolean 형식으로 return 해 주는 method 이다

 

let number = [1, 2, 3];
// (3) [1, 2, 3]

typeof number;
// "object"

Array.isArray(number);
// true

 

 


 

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN

 

Number.isNaN()

Number.isNaN() 메서드는 주어진 값이 NaN인지 판별합니다.

developer.mozilla.org

추가로 NaN (Not-a-Number) data type 인지를 판별할 수 있는 method 도 있다

바로 Number.isNaN method

 

**

isNaN method 도 존재하나, MDN 의 isNaN method docs 에 들어가보면

ECMAScript 2015 에서 조금 더 엄격한 버전인 Number.isNaN method 를 만들었으며

해당 method 의 사용을 권장한다고 한다

그래서 isNaN 이 아니라, Number.isNaN method 페이지를 가져왔다

**

 

 

NaN 은 정말 말 그대로 Not a Number 란 의미를 담고 있지만

typeof method 를 이용하면 number 라고 return 을 해 준다

 

typeof 1;
// "number"

typeof NaN;
// "number"

typeof 1 === typeof NaN
// true

숫자와 숫자가 아닌 것들을 놓고

typeof method 로 비교하는데

'네 둘 다 숫자니깐 참이네요' 라고 대답을 듣는 이런 현상

 

 

이 떄 NaN 을 사용해보자

notANumber = NaN;
//NaN

typeof(notANumber);
//"number"

Number.isNaN(notANumber);
//true

Number.isNaN(1);
//false

 

깔끔하게 분간이 된다!

이제 진짜 number data type 과

'일단은 number 로 잡히는' NaN data type 도 분간해 낼 수 있게 되었다


2. Data Type & Type Casting

2-2. Type Casting

 

https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/Using_js-ctypes/Type_conversion

 

Type conversion

In js-ctypes, data could be converted implicitly when passing to or returning from a FunctionType call, or setting pointer content, an array element or a struct field.

developer.mozilla.org

이것도 공식 문서를 보면 머리가 뜨거워진다

언젠간 극복해야 할 또 다른 산이라고 생각하지만

지금 이 모든 것에 통째로 도전하기엔 아직 멀었으며

오늘같은 경우 형변환을 할 수 있는 대략적인 method 들 을 살펴보았다

 

parseInt, parseFloat, String 이 그것이다

 

 

일단은 parseInt 부터 가보자

 


parseInt 와 그 예제 코드

 

 

parseInt()함수는 문자열 인자의 구문을 분석해,
특정 진수(수의 진법 체계에 기준이 되는 값)의 정수를 반환합니다.
MDN - parseInt docs

 

개인적으로 생각하는 해당 method 의 포인트는 이것이다

 

1. '문자열 인자(string parameter)' 구문 분석 후

: 문자열을 input parameter 로 받으며

 

2. 특정 '진수'(2진법 부터 36진법까지 가능) 의

: 진법 변환까지도 가능하고 (이건 나중에 연습 해보도록 하자)

 

3. '정수'(Integer) 를 반환다

: 즉, 소수점 아래 자리는 버린다

 

parseInt('12.123');
//12

 

특히 3번 포인트를 감안한 이 부분이 가장 차이가 크지 싶다

parseInt, 즉 Integer 로 parse 한단 method name 에 걸맞게

소수점 밑은 과감히 버려준다

 

그러면 이 소수까지도 받아줄 수 있는 method 가 있을까?

물론 있다, 바로parseFloat 이다


parseFloat와 그 예제 코드

 

parseInt('12.123');
//12
parseFloat('12.123');
//12.123

 

'12.123' 이라는 string parameter 를 받은 경우

parseInt 는 Integer, 즉 정수형만 출력하여 12만 return 되는 반면

parseFloat 은 Float, 즉 부동소수점형까지 출력하여 12.123이 올곧이 return 된다

 


String은 저번 포스팅에서 다뤘던 기억이 있는데

String(true);
//"true"
typeof(String(true));
//"string"

String(12345);
//"12345"
typeof(String(12345));
//"string"

 

일단 오늘 중점적으로 찾아본 type casting 은 이게 전부였다

 

그 다음으론 Array and Array Method


3. Array & Array Method

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array

 

Array

JavaScript Array 전역 객체는 배열을 생성할 때 사용하는 리스트 형태의 고수준 객체입니다.

developer.mozilla.org


 

배열의 정의 :

순서가 있는 여러 개의 값을 담은 data type

 

 

- 배열의 성질

 

index

[0]

[1]

[2]

[3]

elements

12

34

56

78

 

 

 

- 배열의 예시 코드

let myNumber = [12, 34, 56, 78];

//배열의 선언



myNumber[0];

//index 를 기준으로 배열에서 해당 elements 를 호출하는 과정

//12



myNumber[0] = 100;

//배열의 해당 index 값을 재할당 해주는 과정

//100



console.log(myNumber);

//0번째 index 에 해당하는 elements 의 변경이 반영된 채로 출력됨

//[100, 34, 56, 78]





//연습문제 : 배열의 index 한계치를 초과한 곳은 호출하면 어떻게 나올까?

fruits = [

'banana',

'apple',

'pineapple'

];



console.log(fruits[3]);

// 배열을 초과하는 경우, undefined 가 출력됨, 없는 index 이면 undefined 가 찍힘


- 배열 안의 배열, 예시코드

let myNumber = [[13, 30], [73, 8], [44, 17]];

//배열 안에 배열을 품은 배열, 즉 2차원 배열을 선언함



console.log(myNumber[1]);

//myNumber의 1번째 index 값

//[73, 8]



console.log(myNumber[1][0]);

//2차원 배열의, 1번째 index 배열의, 0번째 index 값을 출력

//특이사항으론, 저렇게 myNumber[1][0] 으로만 써도 다 JS 가 알아먹어 줌

//즉, 굳이 (myNumber[1])[0] 과 같이 괄호로 둘러싸는 표기를 할 필요는 없다는 이야기임

//73

- 배열의 길이는 myNumber.length; 를 통해 알아낼 수 있음

: length method 이용

- 배열의 끝에 elements 를 추가할 수도 있음, myNumber.push(elementsWantsToAdd)

: push method 이용

- 배열의 끝 elements 를 삭제할 수도 있음, myNumber.pop();

: pop method 이용

 

오늘 배열에 대해 정리한 method 는 push 와 pop

그리고 배열의 성질에 대해 생각해 본 배열의 기능들은 indexing 정도이다

 


4. Loop

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Loops_and_iteration

 

루프와 반복

루프는 어떤 것을 반복적으로 시행할때 빠르고 간편한 방법을 제공합니다. JavaScript Guide의 이 쳅터는 JavaScript 에서 사용가능한 서로다른 반복문을 소개합니다.

developer.mozilla.org

 

 

for loop

for (let n = 2; n <=4; n = n+1 ) {
sum = sum + n
}

 

초기문, 조건문, 증감문의 구조로 실행이 되며

초기문으로부터 증감의 조건에 따라

조건문이 거짓이 되기 전까지

안의 code 를 계속 실행하는 loop 문이다

 


while loop

let n = 0;

//undefined



while (n < 10) {

console.log(n);

n = n+1;

}



/*

VM32:2 0

VM632:2 1

VM632:2 2

VM632:2 3

VM632:2 4

VM632:2 5

VM632:2 6

VM632:2 7

VM632:2 8

VM632:2 9

VM632:2 10

*/

 

그냥 while 안의 조건문이 참이기만 하면 실행되며

다시 말 해 안의 조건문이 거짓이 되는 순간 종료되는 loop 이다

 

for loop 같은 경우 전무 for() 의 parameter side 에서 해결이 가능하다

변수의 초기화를 초기문을 통해

그리고 증감식 또한 증감문을 통해서 해결이 가능한 반면

 

while 의 경우는 parameter side 에 조건문만을 넣는 형식으로 구현이 된다

그게 가장 큰 차이였던 거 같다

 


ETC

 

오늘도 마찬가지로 pair programming 의 형식으로 진행했다

아침에 보낸 pair 의 slack messenger 덕에

내가 도움이 되고 싶은 과한 열정을 불태워 너무 TMI 기질을 보이긴 했다만

그래도 우여곡절 이번에도 잘 끝냈다

 

여러모로 부족한 내 pair 가 되어 주는 사람들에게 감사하는 마음이다

 

오늘 내가 받은 pair review
오늘 내가 받은 pair review

 

 

그리고 나서 이번에도 덕분에 내가 고칠 점을 알게 되었다

 

첫 번째로, 서로간의 쉬는 시간을 합의를 했으면 지키도록 하자

 

이번엔 너무 과하게 집중한 나머지 맥이 탁 풀려버려서 (절대 좋은 게 아니라고 생각한다)

즉흥적으로 조금 더 쉬자는 이야기를 계속해서 했었는데

반성해야 할 부분이다

 

둘 째로, navigator 는 driver 에게 큰 그림을 제시해 주는 역할이다

미시적인 부분까지 사사건건 간섭하는 역할이 아니다

 

https://medium.com/qandastudy/mathpresso-%EA%B0%9C%EB%B0%9C%EB%B0%A9%EB%B2%95%EB%A1%A0-1-%ED%8E%98%EC%96%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-pair-programing-f7d07ac323d0

 

Mathpresso 개발방법론 — 1. 페어 프로그래밍(pair programming)

매스프레소에 입사한지 8개월이 지나가고 있으며 저는 서버 개발을 맡고 있습니다.

medium.com

pair programming 을 실무에서 활용한 사람이 적은 후기를 가져와 봤는데

큰 틀은 체계적으로, 작은 틀은 재량에 맡기는 식으로 진행한다

위에 적은 것과 마찬가지로 말이다

 

실제로 페어를 해보면 매우 어렵다. 옆에서 코드를 지켜보는 것보다는 빠르게 개발하고 결과를 확인하고 싶은 마음에 자꾸만 키보드에 손이 간다. 모르는 부분에 막힐때면 빨리 검색을 해서 막힌 부분을 풀고 싶어진다. 어떻게 하면 해볼 수 있을까? 페어에서 가장 중요한 부분은 코딩을 많이 하는게 아닌 팀원과 대화를 하면서 문제를 같이 풀어 나가는 것이 중요하다.
Mathpresso Team Blog

 

그래!

나도 quantity 가 아닌 quality 에 집중할 수 있도록 하자

 

4일차 개발일지, 끝!

 


후일담

 

굿모닝

 

사실 이 일지는 5/8에 포스팅 되었습니다

그러나, 작성 시작은 5/7에 했습니다

 

21시 30분부터 작성을 하던 도중

22시 30분에 임시 저장을 하고 쓰러져 자다가

다음 날 03시 30분에 기상하여 쓰게 되었네요

 

다행인 점은 두 가지입니다

1. 애매했던 수면 패턴이 이번에 뜯어 고쳐졌다는 점과

2. 복습 차원에서 하는 블로그 포스팅은 생각보다 시간을 많이 투자한단 사실을 알게됐다는 점

 

긍정적으로... 생각해보겠습니다