함수란 -입력을 받아 출력을 하는 과정을 말한다. 

 

함수의 구성 - 함수이름, 매개변수, 함수몸체, 반환값, 인수로 구성된다.

 

함수의 생성과 실행 - 생성은 정의를 통해 이루어지고 실행은 호출로 이루어진다.

 

함수를 쓰는 이유 - 함수는 재사용하기 매우 편리하다. 그런 측면에서 신뢰성이 높아진다.

함수는 객체이므로 식별자로 표현하고, 식별자 덕분에 의미를 알기 쉽다.

 

함수 리터럴 - 함수이름은 식별자 명명법을 따라야한다 그리고 생략가능하다, 함수 선언문 제외

함수이름은 함수 몸체 내에서만 참조 가능하다.

매개변수 역시 식별자 명명법을 따라야 한다 그리고 매개변수도 없어도 상관없다

 

함수 정의 방법 4가지

 

함수 선언문

함수 표현식 

생성자 함수

화살표 함수

 

함수 선언문의 특징 

 

1. 함수이름과 식별자 - 함수이름은 함수내에서만 참조 가능하다. 그런데 호출이 가능한 이유는

언어차원에서 암묵적으로 함수이름으로 식별자를 만들기 때문이다. 그렇기 때문에 다른 정의법과 다르게

선언문은 이름을 생략해선 안된다.

 

2.문맥에 따라 선언문과, 표현문으로 분별한다. 

선언문은 변수에 할당되지 않지만 표현문을 보면 아닌 것 같다. 그 이유는 JS가 문맥에 따라 다르게 이해하기 때문이다.

선언문이 만약 피연산자가 된다면 표현문으로 본다. 피연산자는 값이어야 가능하므로

 

함수 표현식의 특징

 

1.일급객체이다. 일급 객체는 값으로 표현되는 객체이다. 함수는 값이자 객체이므로 일급객체다

 

2. 선언문과 표현식의 호이스팅 차이 

선언문은 호이스팅 돼서 선언 전에 호출 되더라도 값이 나온다. 표현식 역시 호스팅 되지만 var 변수 호스팅과 같이

undefined로 먼저 호이스팅 되고 표현식을 만나 객체가 할당되므로 차이가 있다.

 

다른 정의문 생성자 함수와 화살표 함수는 뒤에가서 자세히 배운다.

 

함수 인수

 

1. 함수 인수 숫자를 다르게 넣었을 때 

함수 인수를 많이 넣는다면 초과분은 무시하고 적게 넣는다면 add(2, undefined) NaN을 출력한다.

 

2.인수 확인 작업 

JS의 선언 키워드는 타입 가리지 않고 받을 수 있다. 그래서 함수의 기대와 다른 타입을 받을 수 있으므로 확인작업이

필요하다.

 

3.인수를 받는 매개변수 역시 변수다.

인수를 받기 전 호이스팅 되어 undefined를 받고, 함수스코프이다. 

 

return 반환문

 

1.문을 끝내고 값을 반환하는 특징을 가졌다.

 

2. 생략가능하다. 다만 undefine값이 출력된다.

 

 

여러가지 함수

 

1. 즉시 실행 함수 

 

그룹연산자로 묶어서 만든다. 함수리터럴이 되어서 식별자가 없다. 1회 실행된 뒤 호출 불가능이다.

함수이름이 없는 것이 일반적이다. 그룹연산자가 없다면 함수이름이 없어서 에러가 나고, 이름이 있다면

선언문이 되어 자동으로 } 끝에 세미클론이 생겨 () 그룹연산자에 값이 없어 에러가 난다.

일반적으로 그룹연산자로 만드는데 함수리터럴로 평가해서 함수객체를 만들수만 있다면 다른식으로도 가능하다

 

2.재귀함수 

 

함수가 자신을 호출하는 형태 작성자가 원하는 만큼 반복하고 싶을 때 쓴다.

 

3. 고차함수, 콜백함수 

 

함수가 다른 함수를 인수로 받는 경우다. 외부에서 다른 함수를 전달받는 함수를 고차함수,

인수로 다른 함수에 전달되는 함수를 콜백함수라 부른다. 콜백함수가 고차함수에서만 호출된다면 

즉시 실행함수로 일반적으로 구성한다.

 

4.순수, 비순수함수

 

순수함수는 외부환경에 의존하거나 변경하지도 않는 불변성을 지는 함수를 말한다.

비순수 함수는 외부환경에 의존하고 변경되는 함수를 말한다.

 

5. 중첩함수 

 

함수 내부에 정의된 함수로 중첩함수 또는 내부함수로 부른다. 일반적으로 내부함수는 외부함수를 돕는

헬퍼 함수이다. 

 

 

 

 

제어문

 

코드블록 {}은 세미콜론 안 붙힘

 

if(조건){

 

}

 

삼항 비교 연산자?

 

조건 ? 참일 때 출력 값 : 겆시일 때 출력 값

 

활용

 

num = 0;

num ? : (num > 0 ? '양수' : '음수';) : '영';

 

switch case

 

num = 3;

switch(num){

 

case 1:  내용

break;

case 2:  내용

break;

case 3:  내용

break;

default: 내용

break;

 

}

break 없으면 참이 나왔을 때 부터 아래 case 다 참으로 만족해서 실행함

 

 

for(var i=0; i < 5; i++){

 

}

while(조건){

 

 

}

 

do{

 

}while(조건)

무조건 한번은 실행

 

break는 반복문이나 이름붙히는 거...있었는데 뭐였더라  아무튼 이 두곳에서 사용 가능

이름 붙히면 좋은점 이중 삼중 반복문일 때 하나하나 break; 안걸고 이름 붙힌 곳으로 바로 이동해서 빠져나갈 수 있음

 

명시적 타입변환과 암묵적 타입변환

 

명시적 타입변환 문자열 String(), ().toString 

숫자열 Num(), parseInt(), parseFloat()   

불리언 Bolean()    

 

암묵적 타입변환 

 

1 + '' = '1'

1 + '20' = '120'

1 * '20' = 20

1 - '20' = -19

1 / '1'  = 1

 

불리언 

 

0 false

1  true

'0' true

'' false

'-0' true

NaN false

undefined false

null false

 

단축평가

 

'Dog' && 'Cat'   -> 'Cat' 출력

'Dog' || 'Cat'   -> 'Dog' 출력

  

논리곱에서 좌항이 참이면 우항까지 참이여야 참이다. 이걸 출력하면 결과를 결정하는 우항이 출력된다.

논리합에서 좌항이 참이면 우항까지 볼 필요 없이 참이다. 이걸 출력하면 결과를 결정하는 좌항이 출력된다.

 

null && 'Cat' -> null 출력

null || 'Cat'  -> Cat 출력

 

논리곱에서 좌항이 거짓이면 우항까지 볼 필요 없이 거짓이다. 이걸 출력하면 결과를 결정하는 좌항이 출력된다.

논리합에서 좌항이 거짓이더라도 우항이 참이여야 참이다. 이걸 출력하면 결과를 결정하는 우항이 출력된다.

 

falsy값 검사할 때 유용

 

이름 기억 안남

사용법 ?. 

좌항이 falsy값이면 undefine 출력 아니면 우항 출력이었나?

 

이름 기억 안남

 

사용법 ??

undefine, null  구별가능, 맞으면 우항 출력이었나? 찾아봐야겠다.

undefine, null 아닌 falsy값은 그대로 좌항이 나온다 

 

객체 

 

객체이름 {

키: 키값 

};

객체 {}는 코드블록아님 ; 붙여야함

키랑 키값을 합쳐 프로퍼티라 한다.

객체이름이나 키 값도 식별자 명명법에 따라야함

함수도 키값으로 받을 수 있다.

값은 다 프로퍼티에 들어 갈 수 있다.

키값은 명명법 안따르면 객체접근방식이 객체이름.키 방식과 객체이름.['키'] 방식 중

두번째 방식으로만 접근가능

 

수정과 동적생성

 

추가방식과 수정은 코드에 객체이름.키 = 키값 쓰면 된다.

안에 키값이 있으면 키값을 수정할 것이고 없으면 새로 생성된다.

 

축약방식

 

var x  =  1;

var y  =  2;

 

temp{

 

x : x  // 1

y : y  //  2

};

 

var x  =  1;

var y  =  2;

 

temp{

 

x   // 1

y   //  2

};

 

 

 var i = 0;

temp{

 

class + '-' + i++ : i;

class + '-' + i++ : i;

class + '-' + i++ : i;  

};

이런 방식도 가능 

temp{

 

 pluse : function(x, y){

return = x + y 

};

 

temp{

 

plus(x, y){

return = x + y 

};

이건 좀 헷갈리네 함수 줄여서 프로퍼티 만들 수 있음

 

원시값과 객체

 

원시값은 불변임 변수에 넣은 값이 달라진다 할 수 있는데 그건 변수가 새로운 메모리에 다시 값을 담은 거임

메모리에 들어간 원시값은 변하지 않는다. 

 

상수와 문자열이 있다.

 

문자열이 배열을 닮아서 상수같은 원시값이랑 차이가 있었는데 기억이 안난다 

일단 배열처럼 인덱스로 접근가능한데 수정은 불가능임

 

객체는 수정가능하다.  원시값은 변수에 담으면 임의의 메모리에 값을 담지만 

객체는 임의의 메모리에 메모리주소를 담는다. 

그 주소를  따라가면 객체가 나옴

 

이 차이는 원시값은  var y =1; var x = y;  y= 50; 을 해도 x값은 변하지 않는다.

y = 1; x = 1; y = 50; 다 다른 메모리에 담긴다. 하나를 수정해도 다른 값에 영향이 없음

 

객체는 값 대신 메모리 주소를 담기 때문에  객체 y선언 x = y; 상태일 때 둘다 다른 메모리주소에 담기지만

추적해보면 둘다 같은 객체가 담긴 메모리주소에 접근하게 된다. 그래서 하나를 수정하면 다른 하나 역시 변한다.

원시값이 확실히 안정성이 높지만 객체는 워낙 자원을 많이 차지하기에 새로 담기엔 부담스럽다 그래서 이런 방식을 씀

 

 

 

 

 

'진행중 > 백지쓰기[복습]' 카테고리의 다른 글

백지쓰기 6일차  (0) 2022.09.04
백지쓰기 5일차  (0) 2022.08.23
백지쓰기 3일차  (0) 2022.08.20
백지쓰기 2일차  (0) 2022.08.19
백지쓰기 1일차  (0) 2022.08.18

원시값은 불변이다. 원시값은 상수, 문자열이 있는데 문자열은 배열과 비슷하다. 

그래서 배열처럼 인덱스로 접근할수 있지만 그렇다고 인덱스 값을 변경할 수 있는 것은 아니다.

변수에 할당된 상수를 다른 값을 넣으면 바뀐다 할 수 있겠지만 틀린 말이다.

 

변수에 원시값을 할당하면 매번 새로운 메모리에 담긴다. 변수가 가르키는 메모리 주소가 바뀌는 것이지

메모리에든 상수값은 변하지 않는다.

 

객체는 그럼 어떻게 될까? 변수에 객체를 할당하면 할당된 메모리에 값이 아닌 객체의 주소를 담는다.

변수의 메모리 주소 -> 객체의 값이 담긴 주소 -> 값이 나온다. 

 

원시값의 불변성은 어떤 변수에 원시값을 담고 다른 변수에 그 변수를 할당했을 때 

어떠한 변수의 값을 바꾼다고 해도 다른 값에 영향을 주지 않는다. 그저 새로운 메모리에 담기 때문이다.

 

객체는 아니다. 변수에 객체를 담고 그 변수를 다른 변수에 할당한다고 생각해보자 

두 변수는 값이 아닌 하나의 주소를 공유한다. 원시값과 달리 주소를 따라가 보면 둘다 같은 메모리 주소가 

나오게 되므로 둘 중 하나가 값을 변경하면 다른쪽 변수 역시 값이 달라지게 된다. 

'진행중 > 모던 JS - 1회독 공부기록' 카테고리의 다른 글

공부기록 - 프로퍼티 어트리뷰트  (0) 2022.08.23
공부 기록 - 함수  (0) 2022.08.22
공부기록 - 객체  (0) 2022.08.20
공부기록 - 변환과 단축 평가  (0) 2022.08.20
공부기록 - 제어문  (0) 2022.08.20

자바스크립트는 원시값과 객체로 나뉘는데 자바스크립트는 객체 언어인 만큼 대부분이 객체임

원시값은 값이 변경이 안되지만 객체는 여러개를 둘수 있고 바꿀 수 있음

 

자바스크립트는 프로트타입 기반 객체언어로 객체 생성 방법이 다양함 

 

대표적으로 객체 리터럴인데 변수 선언하듯이 선언하고 {}를 붙이면 된다.

객체의 구성은 프로퍼티로 키와 값으로 구성된다 키 : 값

객체 안이 비어있어도 에러는 안남, 객체는 값은 모두 프로퍼티로 삼을 수 있음

객체의{}는 코드블록이 아님 그래서 세미클론 붙여야함 

프로퍼티에 키를 넣을 때 이름을 식별자 명명규칙을 따른다면 문자에 ''를 쓸 필요 없음

따르지 않는다면 ''를 꼭 붙여야 함 아니면 에러난다. 그리고 키와 값에 숫자형을 넣을 수 있음

다만 객체에 들어가면 문자형으로 바뀌는 걸 주의해야함 

마지막으로 중복선언해도 에러는 안나고 마지막 선언으로 값이 바뀌므로 주의가 필요함

 

메서드  -객체의 키의 값에 들어간 함수 일반 함수랑 구별하기 위해 메서드라 부른다.

객체 접근법- 마침표와 대괄호표기법이 있다. 마침표는 객체이름.키 로 구성된다.

대괄호는 객체이름.['키'] 로 구성된다. 키가 식별자 명명법에 따르지 않은 경우 마침표법은 불가능하고

무조건 대괄호 접근법을 이용해야 한다.  단, 키가 숫자형으로 이루어져 있다면 생략 가능하다. 

 

프로퍼티 값 갱신과 동적 생성

 

객체이름.키 = 값 을 사용하면 값을 갱신할 수 있다. 만약 키가 없다면 객체 안에 프로퍼티 생성까지 가능하다.

 

프로퍼티 삭제

 

deleate 연산자를 사용한다. deleate 객체.키 

삭제할 객체가 없어도 에러는 나지 않는다. 

 

프로퍼티 축약 표현

 

var x = 1; , y = 2;

var obj { 

x: x

y: y

}

키의 값에 변수에 할당된 값이 들어간다.

 

var x = 1; , y = 2;

var obj { 

x

y

}

 

x, y가 키 1, 2가 값이 된다. 

 

 

 

명시적 타입변환

 

var x = 10;

var str = x.toString();

console.log(typeof str, str);
 

암묵적 타입변환

var x = 10;
var str = x + '20'; //문자열로 변환
var num = x * '20';  //숫자형으로 변환

console.log(typeof str, str);
console.log(typeof num, num);
 
숫자타입 변환 
 
1 - '1' // 0
 
1 * '10' // 10
1 / 'one' // NaN
 
 
피연산자만 문자열로 바뀌는 것이 아니라 템플릿 리터럴의 삽입 역시 문맥에 맞게
암문적 타입 변환이 수행된다. 
 
var str =`1 + 1 = ${1 + 1}`; // "1 + 1 = 2"
 
 
'1' > 0 // true
 
비교 연산자의 역할은 불리언 값을 만드는 것으로 피연산자는 코드 문맥상 숫자타입이어야 한다.
비교를 위해 피연사자는 숫자타입으로 암묵적 타입 변환시킨다.
 
true를 반환하는 Truthy 값
 
'0' // 빈 문자열이 아니면 문자열은 참이다.
{}
[]
 
false를 반환하는 Falsy 값
 
false
undefined
null
0, -0
NaN
''(빈 문자열)
 
명시적 타입 변환
 
문자열로 변환 시키기
 
String();
().toString();
 
숫자 타입으로 변환
 
Number();
parseInt(); //문자열만 가능
parseFloat();
 
+'0';   //단항 산술 연산자 이용하는 방법
+'-1';
+'10.53';
+true;
+false

불리언 타입으로 변환

 

Boolean();

Boolean(NaN); false

Boolean({}); true

Boolean([]); true

 

 

단축평가

 

논리연산자를 사용한 단축평가

 

'Cat' && 'Dog' // -> Dog

 

빈 문자열만 아니면 문자열은 true로 둘다 true다. 논리곱 연산자는 좌항, 우항을 둘다 평가해야 값을 평가할 수 있으므로

먼저 'Cat'이 true임을 확인하고 우항인 'Dog'를 확인하고 그대로 'Dog'를 반환한다.

 

'Cat' || 'Dog' // -> Cat

 

논리합 연산자는 좌항만 ture만 나와도 우항을 평가할 필요가 없다.

이때 논리합 연산자는 문자열 'Cat'을 그대로 반환한다.

 

논리곱, 논리합 연산자는 논리연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환한다.

이를 단축평가라고 한다. 단축평가는 평가결과가 확정된 경우 나머지 평가를 생략하는 것을 말한다.

 

'Cat' || 'Dog' // 'Cat'

false || 'Dog' // 'Dog'

 

논리연산자 단축평가는 객체 프로퍼티 null, undefined 검사 역할을 할 수도 있다.

 

var elem = null;

var value = elem && elem.value; // null

 

옵셔널 체이닝 연산자

 

옵셔널 체이닝 연산자인 ?.은 좌항의 피연산자가 undefined 또는 null이면 undefined를 반환하고 그 외에는 우항의 참조값을 반환한다.  var value = num?.value;

 

null 병합 연산자 

 

null 병합 연산자 ??는 피연산자가 null, undefine이면 우항을 반환하고 아니면 좌항을 반환한다.

주의점은 undefined, null을 제외한 Falsy값이라면 좌항을 반환한다는 것이다.

 

 

'진행중 > 모던 JS - 1회독 공부기록' 카테고리의 다른 글

공부기록 - 원시값과 객체의 비교  (0) 2022.08.20
공부기록 - 객체  (0) 2022.08.20
공부기록 - 제어문  (0) 2022.08.20
공부기록 - 데이터 타입  (0) 2022.08.19
공부기록 - 표현식과 문  (0) 2022.08.18

삼항 조건 연산자   (삼항조건연사자도 값이라 변수에 할당된다)

var num = 0;

var kind = num ? (num > 0 ? '+' : '-') : '0';
console.log(kind);
 
num이 0이면 불리언타입으로 강제변환이 돼서 부정값으로 바뀐다.
그래서 최종적으로 거짓값인 '0'을 출력함
 
num이 양수나 음수라면? 실험해보니 양수, 음수는 불리언타입으로 바뀌면 참이 되더라
그래서 진실값을 고르게 되고 앞선 조건의 '+'나 '-'가 나온다.
 
 
switch문
 
var num = 5;
var month;

switch(num){
    case 1:month ='1'
    case 2:month ='2'
    case 3:month ='3'
    case 4:month ='4'
    case 5:month ='5'
    case 6:month ='6'
    case 7:month ='7'
    case 8:month ='8'
    case 9:month ='9'
    case 10:month ='10'
    case 11:month ='11'
    case 12:month ='12'
    default: month ='invail'
}
console.log(`${month} month`);

출력값: invail month 

case 11 값을 만족한 뒤 참으로 바뀐다.

이때 탈출하는 break문이 없으면 밑의 case문도 참으로 인정해서 마지막 할당인 default값을 출력했다.

 

레이블문을 쓰는 이유

 

반복문에도 break;를 쓸수 있음에도 레이블에 break를 쓴다는 게 장점이라고 한다.

이유를 찾아보니 만약 2중, 3중 반복문이 있다면 가장 안쪽 반복문에서 조건을 충족해서 break;를 걸어도 그 밖의 반복문은 돌아간다. 레이블문을 쓴다면 break 가장밖의반복문 레이블; 이런 코드를 통해 반복문을 완전히 벗어날 수 있다. 

 

 

continue 문 

 

break 문처럼 탈출하지 않고 증감식으로 실행 흐름을 이동시킨다.

var string = 'hello world';
var search = 'o';
var count = 0;

for(var i =0; i <string.length; i++){

    if(string[i] !== search) continue;
    count++;
}
console.log(count);
 
 
 
countinue를 쓰지 않는다면 if문 안에 count를 써야할 것이다. 

 

'진행중 > 모던 JS - 1회독 공부기록' 카테고리의 다른 글

공부기록 - 객체  (0) 2022.08.20
공부기록 - 변환과 단축 평가  (0) 2022.08.20
공부기록 - 데이터 타입  (0) 2022.08.19
공부기록 - 표현식과 문  (0) 2022.08.18
공부기록 - 변수  (0) 2022.08.18

자바스크립트 7가지 데이터 타입

 

1. 숫자형 - c처럼 정수,실수형 이런 거 없음 하나로 통합 숫자는 전부 실수로 표현됨

2진수, 8진수를 출력하면 10진수로 나온다.

 

2. 문자형 - '', "",``으로 표현된다.

 

3.불리언 - True, False로 나뉨 

 

4. undefined - 개발자가 아닌 언어 차원에서 자동으로 변수에 할당함, 아직 값을 넣지 않은 상태

 

5.Null - 개발자가 의도적으로 넣은 값, 값이 없음을 알림

 

6. 객체 타입 - 코드는 원시값과 객체로 나뉜다, 자바스크립트는 객체언어이고 대부분 객체로 구성되어있다.

원시값과 달리 값을 바꿔버릴 수 있음

 

7.심볼 타입- 변경 불가능 유이무이한 값을 표현할 때 쓴다.

 

탬플릿 리터럴 - ``으로 표현 문자형에서 /n/t등으로 표현했던 공백과 줄바꿈을 글쓰듯이 스페이스바 엔터로 표현가능하게 한다. 문자형에 다른 타입 삽입까지 가능캐 한다. 매우 편리한 기능

 

데이터타입이 필요한 이유 - 값을 할당하거나 꺼낼 때 데이터 타입을 알아야 작업하기 좋다. 

c언어는 정적이다. 데이터 타입이 변수선언 때 부터 정해진다. 안정성 높고 가독성 좋음

자바는 동적이다. 데이터를 할당해야 데이터 타입이 정해진다. 쓰기엔 편하나 표시를 제대로 안해두면

데이터가 무슨타입인지 알기 힘들다는 단점도 있다.

 

 

'진행중 > 백지쓰기[복습]' 카테고리의 다른 글

백지쓰기 6일차  (0) 2022.09.04
백지쓰기 5일차  (0) 2022.08.23
백지쓰기 4일차  (0) 2022.08.21
백지쓰기 2일차  (0) 2022.08.19
백지쓰기 1일차  (0) 2022.08.18

데이터 타입은 7가지 있다.

 

1. 숫자 타입 - 타입이 여러가지 있지 않다. 실수로 표현된다

출력은 10진수로

 

2.문자열 타입 - '',"",``으로 표현가능

 

3.불리언 타입 - true, false로 나타냄 

 

4.undefined 타입 - var로 선언하면 자동으로 할당됨

 

5.null 타입 - 개발자가 명시적으로 값이 없음을 나타냄

 

6. 객체 타입 - 코드는 원시값 아니면 객체다. 자바스크립트는 객체 언어로 대부분이 객체이다.

 

7. 심벌타입 - 변경 불가능한 값이 중복되지 않는 유일무이한 값을 표현할 때 씀

 

# 템플릿 리터럴 - 문자 타입에선 쉽게 하지 못했던 공백, 엔터기능 사용 가능

삽입도 훨씬 편하다. 백틱으로 표현``

 

데이터 타입이 필요한 이유 - 값을 할당하거나 참조할 때 메모리 크기를 알기 위해, 읽은 2진수를 표현방식을 위해

 

동적타입 - 변수 선언 때 타입이 정해짐, 안정성 좋음

정적타입 - 변수 할당 때 타입이 정해짐, 혼돈 가능성 있음

 

 

'진행중 > 모던 JS - 1회독 공부기록' 카테고리의 다른 글

공부기록 - 변환과 단축 평가  (0) 2022.08.20
공부기록 - 제어문  (0) 2022.08.20
공부기록 - 표현식과 문  (0) 2022.08.18
공부기록 - 변수  (0) 2022.08.18
공부기록 - 자바스크립트란?  (0) 2022.08.17

변수란 값을 저장하는 할당받은 메모리 공간 또는 그 공간을 식별하는 이름을 뜻한다. 

변수란 왜 중요한가? 예를 들어 10 + 20 을 계산해보자 10, 20, +는 임의의 메모리에 저장되고 연산은 cpu에서 수행한다 

결과값 30은 어디로 갈까? 30 역시 임의의 메모리에 저장된다.  연산을 수행했다는 말은 보통 그 값을 활용하기 위해서이다. 그런데 저 30이라는 값을 어떻게 다시 쓸까 30이 저장된 임의의 메모리에 직접 접근해야할까?

 

답은 접근 불가이다. 메모리에는 30이라는 값 말고도 운영체제의 중요한 값이 저장되어 있다. 혹여나 실수로 값을 잘못 바꾸게 된다면 치명적인 에러가 발생한다. 그렇기 때문에 자바스크립트는 개발자의 메모리 직접 접근을 허용하지 않는다.

그리고 허용해도 문제는 남아있다. 같은 코드라도 매 실행마다 메모리 상황에 따라 매번 임의의 메모리에 접근한다. 아무리 임의의 메모리를 써먹으려 해도 쓸수가 없다. 

 

이제 값의 할당을 해보자. var score = 80; score = 90; 이라는 코드는 호스팅 효과로 임의의 메모리 3곳에 undefined, 80, 90이라는 값이 담긴다. 메모리가 3군데 값이 담겼지만 최종적으로 변수가 가르키는 주소는 90이 들어있는 주소다.

나머지 값들은 쓰지 않는 값이 되어 자바스크립의 내장 기능으로 인해 자동으로 비워진다. 다만 언제 비워질지는 정확히 알수 없다. 

 

매니지드 언어, 비매니지드 언어 

매니지드 언어는 개발자가 메모리를 제어하지 않고 자바스크립트처럼 언어 차원에서 관리하는 것이다.

장점으로는 편이성과 일정이상의 성능을 제공하지만 최적화 효율을 따지자면 손색이 있다.

 

반대로 비매니지드 언어가 있다 c가 대표적인 예로 malloc(), free()등으로 개발자가 제어를 한다. 개발자 역량에 따라 좋은 효율을 보여주지만 역으로 치명적인 문제를 일으킬 수도 있다.

 

식별자- 식별자는 값이 저장된 주소를 식별하는 존재를 다 식별자라 부른다. 변수,클레스, 함수등이 전부 식별자다.

 

식별자의 명명 규칙

1. 특수문자를 제외한 문자, 숫자, $, _ 를 사용할 수 있다.  

2. 특수문자를 제와한 문자,$,_ 를 식별자 맨 처음에 쓸 수 있다. 숫자는 안됨

3. 예약어는 안된다. 예약어는 코드를 쓸때 쓰는 키워드들이다. switch, if, this, for 등등 

 

자주쓰는 명명 방식 - 두 단어 이상이 결합된 길이가 긴 식별자를 적을 때 쓰는 규칙

 

카멜 케이스 classScore 

앞단어의 첫글자는 소문자 뒷단어의 첫글자는 대문자로 쓰는 방식, 함수나 변수를 정의할 때 많이 쓴다.

스네이크 케이스 class_score

첫글자는 앞뒤 소문자로 쓰고 단어 사이에 _를 추가한 케이스

파스칼 케이스 ClassScore 

앞뒤 첫글자를 대문자로 쓰는 방식, 생성자 함수, 클레스에서 많이 쓴다.

 

변수 선언 

 

변수 선언은 메모리를 할당받아 임의의 주소에 값을 저장하는 준비 단계이다. 

변수 선언 키워드는 var, let, const 등이 있다. 

 

var은 let, const 보다 먼저 나온 키워드로 유일한 키워드였다. let, const는 var의 단점을 해결하기 위해 나온 키워드다.

var의 단점은 3가지로

 

1.중복 선언이 가능하다. 변수가 중복되어도 에러가 나오지 않는다. 대형 프로젝트에서 변수가 중복이 되었을 때 알기 어려울 것이다. 그 상태에서 실행된다면 어떻게 될까? 에러가 당연히 나올 것이다.

 

2. 호스팅 문제, 호스팅은 변수 선언을 코드 실행 런타임 전에 스코프 최상단에 올려서 먼저 처리하는 방식이다. 

이것의 문제는 가독성이다. 변수 선언이 코드 최하단에 있고 변수 참조는 최상단에 뜬금없이 나와도 에러가 나오지 않는다.

 

스코프는 변수가 사용되는 영역을 말한다.  

 

3. 전역변수 문제 앞의 호스팅 문제와 연결된다. var은 함수스코프로 함수 {}를 지역변수로 인식한다. 

그 밖의 영역의 var은 전역변수로 인식해버린다.

 

let,const는?

 

1.중복이 불가능하다. 중복은 에러 표시가 뜬다.

2.호스팅 문제도 해결했다. 호스팅은 하지만 undefined를 넣어 초기화를 하지 않는다. 선언보다 먼저 참조가 나와도

참조에러가 뜨면서 에러가 뜬다.

 3. 함수 스코프가 아닌 블록스코프로 범위가 훨씬 넓어져 전역변수의 문제를 해결했다.

 

let의 특징 재할당 가능, const 재할당 불가능(원시값 말고 객체는 변경 가능)

 

 

 

메모리는 메모리 셀로 구성되어있다. 메모리셀은 1바이트 크기로 메모리가 읽고 쓰는 단위 역시 1바이트다.

 

값 - 값은 코드실행시 평가되어 값을 생성하거나 참조하는 것을 말한다. 

 

리터럴 - 문자 혹은 약속된 기호들로 값에 해당된다.

리터럴의 종류 - 간단하다 리터를은 값이므로 변수에 들어가는 모든것은 리터럴이다. 

 

표현식 - 평가되어 값을 만드는 식

 

문- 명령문이라고도 한다. 문이 모여 코드가 만들어진다. 토큰으로 나눌 수 있다. 토큰은 더 이상 나눌 수 없는 의미를 가진 최소 문자, 문은 표현식과 표현식이 아닌 것으로 나뉨, 표현식인지 알 수 있는 방법 변수에 할당해보면 됨 변수는 값만 들어가므로 변수에 들어가면 표현식임

 

 

 

'진행중 > 백지쓰기[복습]' 카테고리의 다른 글

백지쓰기 6일차  (0) 2022.09.04
백지쓰기 5일차  (0) 2022.08.23
백지쓰기 4일차  (0) 2022.08.21
백지쓰기 3일차  (0) 2022.08.20
백지쓰기 1일차  (0) 2022.08.18

5-1 값

 

값은 식이 평가 되어 생성된 결과를 말한다. 

평가란 식을 해석해서 값을 생성하거나 참조하는 것을 의미한다.

 

예를 들어 보자

1)

10 + 20은 평가 되어 30이라는 값을 생성한다.

 

2)

var socore = 50 + 50;

score; // -> 100 식별자 참조는 값을 생성하지 않지만 참조하면 변수값으로 평가 된다.   

 

변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인

이름이라고 했다. 따라서 변수에 할당되는 것은 이다.

 

 

5-2 리터럴

 

리티럴은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법을 말한다.

리터럴은 사람이 이해할 수 있는 문자(아라비아 숫자, 알파벳, 한글 등) 또는 약속된 기호('', "", [], {}, //)로 표기된 코드다.

자바스크립트는 코드가 실행되는 시점인 런타임에 리터럴을 평가해 값을 생성한다.

 

리터럴 종류 - 정수리터럴, 부동소수점 리터럴, 2진수 리터럴, 8진수 리터럴, 16진수 리터럴, 문자열 리터럴, 불리언 리터럴, null 리터럴, undefined 리터럴, 객체 리터럴, 배열 리터럴, 함수 리터럴, 정규 표현식 리터럴 등이 있다. 

 

5-3 표현식 

 

표현식은 값으로 평가될 수 있는 문이다. 즉, 표현식이 평가되면 새로운 값을 생성하거나 기존값을 참조한다.

표현식은 리터럴, 식별자, 연산자, 함수 호출 등의 조합으로 이루어질 수 있다. 다양한 표현식이지만 값으로 평가된다는 점에서 모두 동일하다. 즉, 값으로 평가될 수 있는 문은 모두 표현식이다. 

 

리터럴 표현식 

10

'Hello'

 

식별자 표현식(선언이 이미 존재한다고 가정했을 때)

sum

person.name

arr[1]

 

연산자 표현식 

10+20 

sum = 10

 

함수/메서드 호출 표현식(선언이 이미 존재한다고 가정)

square()

person.getName()

 

 

5-4 문

 

앞으로 자바스크립트를 설명할 때 문과 표현식이라는 용어가 자주 등장할 것이다. 문과 표현식을 구별하고 해석할 수 있다면 자바 스크립트 엔진의 입장에서 코드를 읽을 수 있고 실행 결과를 예측하는데 도움이 된다. 

 

문은 프로그램을 구성하는 기본 단위이자 최소 실행 단위다. 문의 집합으로 이뤄진 것이 프로그램이며, 문을 작성하고 순서에 맞게 나열하는 것이 프로그래밍이다. 

 

문은 프로그램을 구성하는 기본 단위이자, 최소 실행 단위이다. 이런 문은 토큰으로 구성된다. 토큰이란 문법적인 의미를 가지며, 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소를 의미한다. 예를 들어, 키워드, 식별자, 리터럴, 세미콜론, 마침표 등의 특수기호는 문법적인 의미를 가지며, 더 이상 나눌 수 없는 코드의 기본요소이다.

 

문을 명령문이라고도 부른다. 즉, 문은 컴퓨터에 내리는 명령이다. 문은 선언문, 할당문, 조건문, 반복문 등으로 구분할 수 있다.

 

표현식과 표현식이 아닌 문의 구분법은 변수에 할당해 보는 것이다. 표현식은 값으로 평가되므로 변수에 할당할 수 있지만

표현식이 아닌 문은 값으로 평가가 안되기 때문에 변수에 할당이 안된다.

 

5.5 세미콜론과 세미콜론 자동 삽입 기능

 

세미콜론은 문이 종료한 위치를 파악하고 순차적으로 하나씩 문을 실행한다. 따라서 문을 끝낼 때는 세미콜론을 붙여야 한다. 단, 0개 이상의 문을 중괄호로 묶은 코드 블록{...} 뒤에는 세미콜론을 붙이지 않는다. 예를 들어 if문, for문,  함수 등의 코드 블록 뒤에는 세미콜론을 붙이지 않는다. 이런 코드 블록은 문의 종료를 의미하는 자체 종결성을 가지고 있다. 

 

 

 

 

 

'진행중 > 모던 JS - 1회독 공부기록' 카테고리의 다른 글

공부기록 - 제어문  (0) 2022.08.20
공부기록 - 데이터 타입  (0) 2022.08.19
공부기록 - 변수  (0) 2022.08.18
공부기록 - 자바스크립트란?  (0) 2022.08.17
공부기록 - 프로그래밍  (0) 2022.08.17

+ Recent posts