드림코딩_by엘리/유투브강의_JavaScript

드림코딩 by 엘리_ 코딩의 기본 operator, if, for loop

AngeRay 2021. 8. 30. 22:28

코딩의 기본 operator, if, for loop


variable은 메모리에 값을 읽고 쓰는것이 가능하다.

내가 ellie라고 값을 할당한 다음에 hello로 변경이 가능한 것이 바로 variable이 메모리에 읽고 쓰는 것이 가능하기 때문이다.

 

const는 읽기만 가능하다.

그래서 const를 선언함과 값을 할당한 뒤로는 

자물쇠가 생겨버려서 읽기만 가능하고 다시 다른값으로 쓰는것이 불가능하다.

 

그래서 자바스크립트 에서는 

앞으로 변수 값이 바껴야될 좋을 이유가 없다면 왠만하면 const 키워드를 이용해서 constant로 작성하는것이 더 바람직하고 좋은 습관이다.

 

메모리에 값이 저장되는 방법은 2가지가 있는데

바로 primitive 타입인지 object 타입인지에 따라서 메모리에 값이 다른 방식으로 저장된다.

primitive 타입 경우에는 value 값자체가 메모리에 저장된다.

ellie와 hello가 메모리에 바로 저장된다.

 

 

반대로 object는 너무 커서 메모리에 한번에 다 올라갈 수 가없다.

그래서 const ellie라고 선언하고 object를 할당하게되면 이 ellie가 가리키는 곳에는 reference(참조주소)가 있다.

이 reference는 실제로 object를 가리키고 있는 곳이다.

그래서 이 reference를 통해서 실제로 이 object가 담겨있는 메모리를 가리키게 되는것이다.

그래서 const ellie라고 선언하게되면 ellie가 가리키고 있는 포인터만 잠겨서

이 ellie가 다른 object로 변경이 불가능하지만

ellie의 이름과 나이는 계속 변경가능한 것도 이유 중 하나이다. 즉 key와 value 중 value값이 변경 가능하다.

 

그래서 primitive type은 value로 값이 저장되고

object는 object를 가리키는 reference(object가 있는 주소)가 메모리에 저장된다.

 

데이터 타입에는 immutable data type과 mutable data type 2가지가 있다.

immutable data type은 데이터 자체를 변경하지 못하는 것이다.

primitive types 같은 경우는 우리가 한번 ray라는 string을 정의하게 되면

ray를 통째로 메모리에 올렸다가 다른 string으로 변경이 가능하지만 ray라는 string 자체를 수정과 변경은 불가능 하다.
object 중에서도 frozen object가 있는데

이런 object도 변경이 불가능하기 때문에 이런 것들을 immutable data types 이라고 한다.

 

반대로 변경이 가능한 mutable data types 로는 바로 object 이다.

우리가 ray라는 object를 선언하고 나서 ray안에 있는 이름과 나이의 value가 변경가능 하듯이 

object는 스스로 변경이 가능하기 때문에 바로 mutable data types 이다.

 

그리고 자바스크립트 에서는 기본적으로 모든 object는 변경이 가능하다.

예를 들면 JS에서는 array 배열은 mutable data type 이다.

 

String concatenation

+ 기호를 이용해서 문자열과 문자열 합해서 새로운 문자열을 만들 수 도있고

문자열과 숫자를 합해서 문자열을 만들 수 도 있다.

그리고 `` 기호를 활용해서 string literals도 만들 수 있다.

${}이용하면 변수값을 계산해서 string으로 포함해서 문자열을 만든다.

\을 이용해서 \n 줄바꿈, \t tab키 etc 특수 문자열은 검색해서 더 알아본다. 

 

++counter

counter = counter + 1 --> preIncerment

preIncrement = counter

counter라는 변수 선언 후 

++ 기호를 변수 앞에다 붙여주게 되면 바로 Preincrement 라고 하는데 

conunter에 1을 더해서 counter에 값을 할당한 다음에

즉 counter에 값이 1증가 했으니까 바로 3이 된다.

1을 증가한 다음에 preIncrement 라는 변수에 counter값을 할당한 것이다.

 

counter++

postIncerment = counter

counter = counter + 1 --> postIncrement

반대로 postIncrement는 변수 다음에  ++기호를 붙이게 되면 

먼저 변수값을 postIncrement에 할당한 다음에 그 뒤에 counter에 값을 1증가 시킨다.

앞에 ++ / -- 가 있으면 바로 업데이트 되서 할당되고 

뒤에 ++ / -- 가 있으면 할당을 해놓고 업데이트는 그 뒤에 일어나는 것이다.

 

Assignment operators

할당하는 operators

할당이 가능하고 반복되는 x를 생략해서 x += y; 생략해서 코딩을 많이한다.

let x = 3;

let y = 6;

x += y; // x = x + y;

x -= y; // x = x - y;

x *= y; // x = x * y;

x /= y; // x = x / y;

 

logical operators

|| or연산자는 3개중 하나라도 true가 되는것이 있으면 true로 계산이 되는 연산자이다.

check()라는 함수가 있는데 이 함수는 쓸데없이 시간을 낭비하다 결국은 true를 reture하는 함수이다.

value1, value2 false 함수가 true이기 때문에 true로 리턴된다.

or연산자는 처음으로 true가 나오면 거기서 멈춘다.

or 중에 하나라도 true이면 나도 ture 이다.

 

 

연산을 많이한 함수를 호출하거나, 연산을 많이한 표현들을 제일 앞에 두게되면 안된다.

제일 심플한 value를 제일 앞에둬서 이것들이 false일때만 제일 마지막에 놓는게 좋다.

함수호출이나 expression 제일 뒤에 배치하는것이 효율적이다.

 

and는 3개의 조건이 모두 true가 되어야 true를 return한다.

그래서 value1이 false가 나오게 되면 무조건 false이다.

and도 무거운 operation 일수록 제일 뒤에서 체크하는 것이 좋다. 

 

그리고 and는 간편하게 null check 할때도 많이 사용된다.

object가 null이면 false가 되기때문에 뒤가 실행안된다.

즉 nullObject가 null이 아닐때만 object에 something 이라는 value를 받아오게 된다.

// often used to compress long if-statement

// nullableObject && nullableObject.something

//if(nullableObject != null) {

    // nullableObject.something;

//}

 

not 연산자 값을 반대로 바꿔준다.

 

equality 

== loose equality 이 말은 타입을 변경해서 검사하기 때문이다.

자바스크립트 엔진이 string 타입의 '5'를 숫자 5로 인식해서 변경해서 검사한다.

=== 는 strict equality 즉 타입을 신경써서 타입이 다르면 다른 것이라고 인식한다.

 

 

equality를 공부할때는 object를 조금 더 신경써서 공부할 필요가 있다.

 

** object는 메모리에 탑재될 때 reference 형태로 저장된다.

ellie1과 ellie2는 똑같은 data가 들어있는 object 지만

실제로 메모리에는 ellie1ellie2에는 각각 다른 reference가 들어있고 다른 reference들은 서로 다른 object를 가리키고 있다.

그리고 ellie3은 ellie1에 reference가 할당되어 있으니까 똑같은 reference를 갖게된다.

 

**Conditional operators: if(if else, if else), Ternary operator, switch

if statment는 이 문장이 true 면 그 안에 있는 block을 실행하게 된다.

if 문장이 true가 아니라면 else if문을 실행하게 된다.

if else문도 true가 아니라면 else문을 실행하게 된다.

 

if문을 조금 더 간단하게 쓸 수 있는 Ternary operator

해당 statment에다가 ?붙이면 조건문이 ture면 왼쪽에 있는 것을 실행하고

false면 : 다음으로 나오는 실행문을 실행하라는 의미이다.

값을 할당하거나 간단하게 출력할때 사용한다.

 

loop : while, do-while, for

while 같은 경우는 statement가 false 나오기 전까지 무한대로 반복해서 도는것을 말한다.

do while 은 {}을 실행한 다음에 조건이 맞는지 안맞는지를 검사한다.

즉 {} block을 먼저 실행하고 싶다면 do while을 쓰면 되고

조건문이 맞을때만 {}을 실행하고 싶다면 while을 쓰면된다.

 

for loop는 (시작하는 문장;  condition이 중간에 오고;  마지막으로 어떤 step을 밟아 나갈것인지를 명시한다.)

begin은 딱 한번만 실행된다.

i를 3으로 준비 운동을 시키고 출력하고 감소하고 

즉 begin을 딱 한번 호출하고 그담에 block을 실행 하기전에 condition이 맞는지 안맞는지 검사한담에

이 block이 다 실행이되면 step을 실행하게 된다.

condition이 안 맞을때 까지 condition과 step만 반복하게 되는 것이다.

기존에 존재하는 변수에 값을 할당할 때도 있고

for문안에서 블럭안에 지역변수를 선언해서 작성하는것도 좋다.

 

while이나 for같은 경우는 서로 nesting 해서 작성가능하다.

for문안에 for문을 작성가능 하지만 cpu에 좋지않다.

 

break & continue

loop안에서는 break나 continue 키워드를 써서 loop를 끝낼 수 있다.

break는 loop를 완전히 끝내는 것이고, 

continue는 지금것만 skip하고 다음 step으로 넘어가는것을 말한다.