배움 __IL/TIL 1기

TIL : 21번째- 221227 [12-5-화] : js 시작

Mo_bi!e 2022. 12. 27. 18:32

I. INTRO : 시작하며

이때까지 백단으로했고, 이제 프론트 단으로 유용하게 가능하다.

 

 

II. Wrapper 클래스

지난시간 이어서...

1. 

 

 

2. Boxing에 사용되는 Wrapper 클래스

 

 

이제 자바스크립트로

 

 

III. JavaScript [데이터, 컬랙션] 

1. 값과 Wrapeer 클래스

(1) JS의 데이터 특징

JS는 넣는 형태가 아님 100% 참조하는 형태이다.

값변수 형식이 없어서 모든것은 객체화 되어있음

 

참조형식도 언급하지 않는다.

그래서 컴파일러에 의한 오류확인 불가능하고, 실행환경에 의한 오류를 확인할 수 있다.

 

(2) 참조변수의 기본값?

이 경우 참조가 가진 기본값은? 자바는 null / JS 는 undefined이다.

JS는 기본형이 wrapper이다.

 

undefine은 타입이다. "undefine" 로 비교가 안되고 undefine통째로 비교해야한다.

alert() 는 메시지를 띄우는 함수이다.

 

(3) 스크립트 코드 작성 영역

세곳 중 어디나 <script> 만들어서 가능

<head>
	<script>
		var  x;
		alert(x == undefined); //x 정의 되지않으면 이렇게 나옴

	</script>

<meta charset="UTF-8">
<title>Insert title here</title>
</head>

 

이 경우 JS는 구분자가 두개이다

내려쓰기, 세미콜론 선택하면된다. 다만 혼용은 지양해야한다.

그래서 자바가 좋을수 있는 이유이다. (옵션이 多)

 

(4) JS 자바 차이

Wrapper 씀으로서

정수 실수 구분 X / 문자 문자열 구분 X ( '' / "") => 기준이 모호 

 

 

2. Array 객체

(1) Array객체가 가지는 기능 4가지 (저저저저)

 

1) index 기반의 장소

-인덱스를 이용한 데이터관리 : List

 

배열의 크기를 필요한 만큼 생성이 가능하다.

즉 최초에 공간을 최소화하고 이후 필요만큼 늘릴수 있다 => 컬렉션

컬렉션은 모자라면 늘려갈수 있는 능력을 가지고있다.

 

<script>
		var  x;
		alert(x == undefined); //x 정의 되지않으면 이렇게 나옴
	
		var nums = new Array();
		
		nums[0] = 5;
		nums[1] = 1;
		nums[2] = 21;
		
		console.log(nums[0]);
		console.log(nums[1]);
		console.log(nums);
		
		var nums2 = new Array();
		nums2[3] = 5;
		
		console.log(nums2);
		
		console.log(nums2.length);
		
	</script>

num2를 해도 앞 인덱스의공간도 다 만들어진다

문제가 있지않나? 싶음

 

긍정적으로 보면 유연할수있다만, 치명적일수도있다. 배열은 연속적인 값으로 있어야하는데, 이러면 예기치않은 문제발생

 

-배열 객체 초기화

하나는 크기 / 두번째부터는 초기값으로 / 문자열도 섞어서 넣을 수 있다.

	//	var nums3 = new Array(); //초기화 
	//	var nums3 = new Array(5); //5개
	//	var nums3 = new Array(5,10,21); //각 3개의 값 생성
		var nums3 = new Array(5,10,21, 'hello'); //문자열도
		
		console.log(typeof nums3[3]);

String도 타입(typeof)이 나온다.

 

한편 배열의 배열도 넣을수있다.

마치 이러한 배열은 톱니바퀴형 배열도 가능하다.

이런경우 이차원배열로 인덱스를 해주어여야한다.

 

 

2) stack 장소 (LIFO : Last In First Out)

like 미로찾기에서 간 길을 적재했다가 돌아가면서 지우기

데이터를 쌓았다가 지우기

 

이 경우 배열은 stack처럼 쌓을 수있다.

psuh를 하는데, psuh를 하면 index가 필요없다.

var nums4 = new Array();
nums4.push(4);
console.log(nums4);

var n1 = nums4.pop();
console.log(nums4);

push하면 4가 들어가고 pop을 하면 나온다.

console.log 는 4가 있다가 없어진다.

 

 

3) queue 장소 (FIFO : First In First Out) - 버퍼링을 위한 데이터 구조

배열을 버퍼로 쓸 수있다.

 

앞을 빼는 함수는 ? : shift() 이다.

    //큐
    var nums5 = new Array();
    nums5.push(6);
    console.log(nums5);

    var num = nums5.shift();
    console.log(nums5);

 

 

 

4) Deque 장소 (Double-Ended Queue)

//디큐
    var nums6 = new Array(1,2,3,4,5);
    console.log(nums6); //12345

    nums6.push(6);
    console.log(nums6); //123456
    var pos = nums6.pop();
    console.log(nums6); //12345

    var num = nums6.shitf();
    console.log(nums6); //2345
    nums6.unshift(0);
    console.log(nums6); //02345

여기서 shift는 사기방장맵처럼 인덱스0번의 것을 바로 제거하거나 넣을수있다.

 

5) splice() (삭제와 대입)

접착이라는 뜻인데, 배열 간붙이는 것이 된다.

배열 중간에 넣을수도 있는데, 삭제여부를 선택할 수있다.

삭제만 하고 안들어갈수도있다.

 

즉 이러한 경우를 종합하면 배열조작할 떄 이용한다.

 

//접착
		var nums7 = new Array(1,2,3,4,5);
		//nums7.splice(2); //인덱스 2분부터 뒤에 전부다 
//		nums7.splice(2 ,1); //특정 인덱스 한글자만 지울 때 
//		nums7.splice(2 ,2); //두글자 지울 때 
		
//		nums7.splice(1 ,0 , 23); //두글자 지울 때 

//		nums7.splice(1,0,23,100,124); //인덱스 1번쨰에 삭제 0없이 23,100,124 넣기
		nums7.splice(1 ,2 , 23); //인덱스 1번째에 2개 삭제하고 23 대입
		console.log(nums7);

2 : 하나만 들어가면 2번째인덱스부터 모두다 삭제

2, 1 : 2번째 인덱스 부터 한글자 만 삭제

2, 2 : 2번째 인덱스 부터 두글자 만 삭제

1, 0, 23 : 1번째 인덱스에 지우지 않고 그 사이에 23대입

1,0,23,100,124 : 1번째 인덱스에 지우지 않고 그 사이에 순서대로 23,100,124 대입

1,2,23 : 1번째 인덱스에 2개의 수를 지우고 23를 대입

 

이것은 JS에 매우 무시무시한 기능이다.

 

 

2. Object 객체

(1) Object의 기능

얘는 객체를 만들고 속성, 메소드를 붙일 수 있다.

 

(2) Object객체의 Expand 특징 : ES5에서는 객체를 동적으로 생성한다.

1) 생성

    var exam = new Object(); //expand Object
    exam.kor = 30;
    exam.eng = 70;
    exam.math = 80;

    alert(exam.kor + exam.eng);

2) 주의

이 부분이 JS할 때 주의할 부분이다.

실수 할 수도있다. 이 경우 exam.kor VS exam.Kor 로 대소문자 때문에 문제생김

★JS할때 덜렁대지마

3) '-' 가능할까? 

[" - "] 로 가능하다.

// 변수명 자유롭게
    var exam2 = new Object();
    exam.kor = 20;
    alert(exam["kor"] = 50);

    alert(exam["ko-r"] = 60);

변수명으로 할수 없을 때 이렇게 가능하다.

 

4) 객체의 속성 제거하기

 

delete 는 속성을 삭제하는 것이다.

//객체의 속성 제거하기
    var exam3 = new Object();
    exam3.kor = 30;
    console.log(exam3);
    delete exam3.kor;
    console.log(exam3);

이 외에도 배열도 제거할수도있다.

var a = [1,2,3,4,5];
delete a[1];

console.log(a[1]);

1번째 배열은 undefined

 

key value를 담았다가 삭제할수도있다.

var a = {"name" : "모재" , "age" : "29" };
delete a["name"];
console.log(a["name"]);

undefined

 

 

데이터 손실 때문에 배열에 key 가 존재하지 않지만 값과

 

 

2. JSON

(1) 표기법

간단한 표기법 으로 같이 제공된다

우리는 간략한 JSON으로 쓰는것이 바람직하다.

이러한 표기법은 JS이기 때문에 가능하다. 다만 파이썬이나 자바에도 가능하다.

 

그 외에도 통계용으로 공공데이터 XML / JSON / CSV 가 있다.

데이터 구분하는 구분자로서 위 세가지를 많이쓴다.

데이터 표기할때 json이라고 하는데 JS에서 유래하였다.

 

(2) JSON의 중첩표현 : 중첩된 데이터의 구조도 쉽게 표현할 수있다.

객체 표현

바보 VS 안바보

 

객체들을 묶으면 배열이 된다.(위 notice 객체 세개 괄호로 또 묵어주는 방식)

그리고 배열 인덱스로 특정객체를 가지고올수있다.

 

(3) 데이터를 구분하기 위한 표현방법 : XML, CSV, JSON

승객많이 운전수(데이터 입력 틀) 적게 해야하는데 JSON이전에는 운전수가 많아

JSON은 깔끔하게 가능하다. (승객이 많게)

 

 

(4) JSON 파싱 : eval() evaluates 또는 executes 해주는 도구

1) 파싱 eval 

-1

eval 이란 문자열이 코드라고 가정하고 평가해서 실행 [코드안코드?]

원격으로 데이터 가져올 때 의도한것은 배열이지만, 모든것은 문자열이다.

 

//파싱
    var exam4 = "[3,5,3,2]";
    alert(exam4[2]);
    
    
    var exam4 = eval("[3,5,3,2]");
	alert(exam4[2]);

출력으로 , (3과 5사이)가 나온다.

 

아래는 3이 나온다.

 

-2

eval("var x = 3+5");
alert(x);

이 경우 출력으로 8 이 나온다.

 

-3

이는 코드 인젝션 기능이라고 불린다. 지금은 인젝션 가능하게 잘 쓰지는 않는다.

eval 은 부담이된다. 코드를 실행해주기때문에 위험하긴하다

 

문자열로 JSON왔을 때 eval 을 쓰면 효과적이다

즉 아래와 eval 을씀

var exam4 = eval("([3,5,3,2])");
alert(exam4[2]);

완전한 문장으로서 괄호 () 도 써 주어야한다.

데이터를 객체화할수 있으나 사용을 지양해야 함

 

eval 을 이용하면 보안에 위험하다

왜냐하면 클라이언트가 악의를 품고 request를 할때 소스코드로 하면은 eval은 이를 읽고 코드를 실행해서 모든 데이터를 다 가져가 버릴 수 있기 때문이다. (like SQL 인젝션)

 

2) JSON을 파싱

 

그래서 ES6는 JSON형식을 파싱하는 기능이 추가되었다. (search : mdn json parse)

" " 더블쿼테이션 사이에 문구를 파싱해준다.

var data = JSON.parse("[3,5,3,2]");
alert(data);

반대로도 가능하다.

JSON.stringify() : JSON 문자열로 변환

 

 

IV. JavaScript [연산] 

1. 산술

이중 == 와 ===차이

    var str1 = "hello";
//	var str2 = "hello";
    var str2 = new String("hello"); //JS는 모든게 객체
    console.log(str1 == str2); 
    //그래서 자바와 달리 true임
    //자바는 객체 VS 참조비교이다. 자바는 equal로 한다.
    //JS는 ==이다 (값비교용)

    //그렇다면 ===는 객체 까지 비교이다.

    console.log(str1 === str2);

2. 논리값

Truthy VS Falsy

C는 조건문에 0이 아니면 다 true 이다.

 java는 없앴다. 그러나 JS는 부활시켰다.

 

(1) OR연산

왜 부할? 논리연산자를 만나면 신기한 기능 함  (OR 연산일 때)

 

우선 순서는 피연산자를 불린형으로 변환하고

변환한 값이 true이면 원래값으로 리턴

flase이면 다음으로 넘어감

 

if('cat' || 'dog')
    console.log("real");

이 경우 real 이 출력된다.

console.log('cat' || 'dog');

이 경우 처음 만나는 true 값이 출력된다.

 

var result = null || 0 || undefined || '' || ' ' 
		console.log(result)

두번째 ' ' (띄어쓰기 있음)

부모찾기기본값 설정 때 주로 이용한다.

 

(2) &&연산

- && (처음으로 거짓이 되는 값을 찾으시오. 못찾으면 마지막값 대입)

둘다 참이면 뒤에것이 나온다.

 

이는 앞과 마찬가지로 하되, flase이면 원래값으로 반환하는것이다.

 

- 용도 : 기본값 설정

//기본값 입력에 따라 달리 하는법

    var x = null;
    var name = x || "newlec"; 
    //만약 null이 왔다면, 뒤쪽의 기본값이 있기를 원해

    console.log(name);

x에 기본값을 입력받지 못하면 newlec이 출력됨

 

(3) ?? 연산 : Nullish coalescing operator

//nullish
    var foo = null ?? 'default String';
    console.log(foo);
    //'default String' (왜?)
    

    var baz = 0 ?? 42;
    console.log(baz);
    //0

이는 || 과 유사해보일수 있다.

그러나 차이는 ||는 truthy를 반환해준다 / ?? 는 정의된 값을 반환해준다.

let height = 0;

alert(height || 100); // 100
alert(height ?? 100); // 0

 

 

(4) 숫자 산술연산 그리고 Nan (Not a Number)

1)숫자 산술연산

//숫자 산술연산
    var x = 3;
    var y = '3';
    console.log(x + y); //문자로 나옴
    console.log(x * y); //곱셈의 경우 문자가 숫자로 바뀐다

    var x = 3;
    var y = 'a';
    console.log(x * y); //Nan

 

2)NaN()

NaN은 문자를 숫자로 바꿀 때 숫자로 바꿀수 없다. (숫자가 아니여서) 

NaN은 연산자로 호출이 안된다

if(NaN === x * y )
    console.log("오류오류")

그래서 오류오류가 안 뜬다. 즉 이렇게 쓰는것이 아니고 별도의 함수가 있다

 

 

이경우 isNaN()으로 해서 물어보아야한다.

isNaN(x * y)
	console.log("오류오류")

 

V. JavaScript [제어구조]

1. 반복문

i,v,k는 규약일 뿐 연산자가 아니다. 그 외 in of가 연산자이다.

 

for - in /for - of

<배열에서>

in인덱스를 출력

of을 출력한다.

 

var ar = ["철수", "영희", "맹구", "동천"];
			
    for(i in ar)
        alert(ar[i]);

    for(v of ar)
        alert(v);

for(i in ar)

index(i) 출력

배열의 인덱스를 출력한다

 

for(v of ar)

value(값) 출력

 

 

for - in /for - of

<객체 프로퍼티의 경우>

in은 key값을 출력한다.

of는 안나오는것이 정상이다.

var record = {kor:30 , eng:40 , math:50};
  
  	for(var k in record)
        alert(k);
        
    for(var k in record)
        alert(record[k]);

    for(var v of record) //이거는 안나오는게 정상임
        alert(v); //이터레이터가 포함되어서 안되는게 정상임

 

 


1. 보충

(1) JS의 Wrapper VS JAVA의 Wrapper -X

JAVA

What (정의) : 원시형(기본형)변수를 객체로 포장해준다.

Why (존재이유)  : 메소드 인수에 객체만요구하는 경우 기본데이터를 그대로 이용할수 없기 때문이다.

How (방법) : 자동화 여부에 따라 다르다. 별도의 Integer / Character 처럼 기본 자료형을 대문자로 시작하면된다.

e.g. (예) :

Integer num = new Integer(17); // 박싱
int n = num.intValue();        // 언박싱
System.out.println(n);

Character ch = 'X'; // Character ch = new Character('X'); : 오토박싱
char c = ch;        // char c = ch.charValue();           : 오토언박싱
System.out.println(c);

 

JS

What (정의) : 

Why (존재이유)  :

How (방법) :

e.g. (예) :

 

 

 

 

(2) JSON - O
이전에 판교뚜벅쵸가 json에 대해서 언급했던것이 생각났다. 반가웠다.

 

 

(3) eval  - O

상동 -> JSON parsing이용

 

(4) JS object - X

 

 

 

(5) 이중 == 와 === - X

2. 회고 

1) 자바스크립트를 들어오는데 자바스크립트 자체에서 래퍼클래스를 언급하면서 객체화 된다고하는 지점에서 이해가 안된다.

좀 더 생각해보자

 

2) 과거에 자바에서 객체간 비교를 할때 그 내용에 대해서 상당한 시간이 지나서 그런지 기억이 잘 나지 않는다.

그러다보니 == 과 ===의 차이를 구분하기가 어렵다

 

3)  || && ?? 이거 세개가 흥미롭다

트루시 팔시와의 조화

 

 

 

 

 

'배움 __IL > TIL 1기' 카테고리의 다른 글

TIL : 23번째- 221229 [12-5-목]  (1) 2022.12.29
TIL : 22번째- 221228 [12-5-수]  (0) 2022.12.28
TIL : 20번째- 221226 [12-5-월]  (1) 2022.12.26
TIL : 19번째- 221223 [12-4-금]  (0) 2022.12.23
TIL : 18번째- 221222 [12-4-목]  (1) 2022.12.22