배열, 객체
배열과 객체라는 개념을 통해, 수 많은 데이터를 한 번에 처리
배열과 객체는 참조 타입(reference type) 데이터
참조 타입 데이터는 이전에 학습한 원시 타입(숫자, 문자열, boolean, undefined 등) 데이터와 다른 성격을 가짐
배열 기초
학습 목표
[배열 기초]
* 용어들에 대한 이해
- index, element, length
- arr[0], push, pop
* 배열에서 특정 인덱스의 요소(element)를 조회하거나 변경
* 이중 배열: 배열의 요소가 배열
* 이중 배열의 요소를 조회, 변경
[배열의 반복]
* 배열의 요소를 반복적으로 불러오는 방법
* 배열에 각 요소에 대해 반복하는 코드 실행
- 기본적인 for문을 응용한 다양한 for문 만들기
- 반복문에 조건문을 응용하여 특정 조건에서만 코드 실행시키기
- 이중반복문
* 배열과 반복문을 활용한 실생활 문제 풀기
* 문자열과 배열의 “타입 변환”을 돕는 메소드
- 띄어쓰기(“ “)로 문자열을 구분하여 배열로 변경하기: str.split(“ “).join(“ “)
- 문자열을 요소로 가지는 배열을 띄어쓰기(“ “)로 구분한 문자열로 변경하기
[배열 기초 메소드]
* 배열의 욧소를 조회: bracket notation
* 배열을 복사, 분리: slice, splice
* 배열인지 아닌지 판별: Array.isArray
* 배열의 요소를 추가/삭제: push, unshift, pop, shift
* 배열의 길이: length
* 특정값이 배열에 포함된지 확인: indexOf, includes
배열의 기초
배열은 순서가 있는 값
순서는 인덱스(index)라고 부르며 0부터 번호를 매김. 그 인덱스의 값은 요소(element)
값은 인덱스를 이용해 접근
ex) let myNumber = [66,42,21,64,72];
myNumber[3]; //64
# 여기서 myNumber의 5번째 인덱스값은 무엇일까?
→ 위 배열은 인덱스 4번의 값까지만 존재한다. 그러므로 5번째 인덱스 값은 아직 정의되지 않았다
→ 그러므로 “undefined” // 에러가 발생하는 거는 아님!
index를 벗어나면 undefined 이다!
2차원 배열(이중 배열)
배열의 요소가 배열
ex)
let myNumber = [ [13,30], [73,8], [44,17]];
myNumber의 1번째 인덱스의 값은?
MyNumber[1]; // [73,8]
myNumber의 1번째 인덱스 값의 0번째 인덱스의 값은?
myNumber[1][0] //73
→ myNmber[x][y] 식으로 접근한다
# 이중 배열은 “행렬”의 개념으로 생각하면 된다
배열의 반복
배열과 반복문을 조합하는 경우가 많다
반복문을 이용해 배열의 요소를 한번 씩 출력하려면?
ex)
let myNum = [73, 98, 86, 61];
# 조건
console.log([myNum[n]) // 배열의 n번째 인덱스를 출력하자
let n=0; // 숫자는 0부터 시작
n< myNum.length; // 숫자를 배열의 길이보다 작을 때 까지 반복
n++; // 숫자는 1씩 증가
→
for(let n=0; n< myNum.length;n++){
console.log([myNum[n]);
}
배열 기초 메소드
Array.isArray: 특정 값이 배열인지 아닌지 판별
typeof 메소드를 쓰면 object라고 나오기 때문에 이것이 배열인지 객체인지 판별 불가
→ Array.isArray();
ex)
Array.isArray([1,2,3]); // true
Array.isArray([]); //true
Array.isArray(‘문자열’) //false
# boolean 값을 반환한다
push, pop, unshift, shift: 배열의 요소(element)를 추가 및 삭제
→ push(맨 뒤에 추가), pop()(맨 뒤에 삭제)
console.table(); 활용해 보기
ex) let arr = [‘code’, ‘states’];
console.table(arr); //index와 value가 그래피컬하게 보임
arr.push(‘pre’) // “맨 뒤”의 인덱스에 값이 추가됨
arr.pop() //”맨 뒤”의 인덱스의 값이 삭제됨
그렇다면 앞쪽에 있는 것을 추가 및 삭제하고 싶을 땐?
→ shift(맨 앞 삭제), unshift(맨 앞 추가)
ex) arr.shift() //”맨 앞”에 있는 인덱스의 값이 삭제됨
ex) arr.unshift(‘creative’) // “맨 앞”에 인덱스의 값이 추가됨
indexOf, includes: 배열의 요소 포함 여부 확인
indexOf: 없는 값을 넣으면 -1을 반환, 대소문자도 구별함
ex) let words = [‘radagast’, ‘the’, ‘brown’];
words.indexOf(‘brown’) // 2 해당 인덱스 값 출력
words.indexOf(‘없는 단어’) // -1 인덱스 값 출력
→ 없는 값을 넣으면 -1을 리턴
includes(): true, false 값을 반환
ex)
words.includes(‘brown’); // true
words.includes(‘없는것’); // false
→ includes()는 true, false 값을 반환
includes()의 치명적인 약점이 존재?
브라우저 호환성 여부: “인터넷 익스플로러(IE) 환경”에서 지원되지 않는다!
→ 반면에 indexOf는 모든 브라우저를 지원!
즉 둘 중에 굳이 하나만 써야 한다면 indexOf 를 활용하는 것이 낫다!
객체
각기 다른 값을 가질 수 있지만 입력해야 하는 데이터의 종류가 동일한 경우에 사용
→ 즉, 공통적인 속성을 가지는 경우에 사용
→ 배열과 객체의 차이점을 이해하는 것이 필요
학습 목표
* 배열과 객체의 구조를 이해
- 배열과 객체의 특징을 구분: 순서를 가진다, 의미를 가진다
* 객체의 속성(property)의 추가, 조회, 변경, 삭제하기
- tweet.content 와 tweet[‘content’]의 차이 이해
- dot notation을 이용한 객체 할당 방식 이해: obj.a=”hello”
- 객체 속성 삭제: delete 키워드
- 객체를 위한 for문: for … in 문
객체 기초
이름, 이메일, 주소 라는 변수를 가지는 다양한 사용자들의 정보를 만드는 경우를 생각?
→ 문자열로 표현할 경우? 배열로 표현할 경우?
→ 다 문제가 존재함
→ 객체를 사용한다면 이를 깔끔하게 표현 가능
ex)
let user = { // 중괄호로 객체를 생성
firstName: ‘steve’, // 키와 값 사이는 콜론(:) 으로 구분함
lastName: ‘lee’, // 여기서 [lastName]이 key 부분, [‘lee’]부분이 값(value)
email: ‘steave@code.com’, // 키-값 쌍은 쉼표로 구분
city: ‘seoul’
};
→ 객체는 키와 값의 쌍(key-value pair)으로 이루어져 있다
객체의 값을 사용하는 방법: 2가지
방법1: Dot notation
변수명.key이름; 형식으로 객체 값 사용가능
ex)
et user = {
firstName: ‘steve’,
lastName: ‘lee’,
email: ‘steave@code.com’,
city: ‘seoul’
};
user.firstName; //’Steve’
user.city; //’Seoul’
방법2: Bracket notation
[]
를 의미
→ 변수명[‘key이름’];
형식으로 사용 // “ “(쌍따옴표)나 (백틱)에 넣어도 동일!
ex)
et user = {
firstName: ‘steve’,
lastName: ‘lee’,
email: ‘steave@code.com’,
city: ‘seoul’
};
user[‘firstName’]; //’Steve’
user[‘city’]; //’Seoul’
만약에 변수명[key이름]
으로 적어서 ‘ ’를 까먹었다면 어떨까?
→ ReferenceError: key이름 is not defined를 출력!
→ key이름을 key값이 아니라 변수로 보고 있는 상태
ex)
ex)
et user = {
firstName: ‘steve’,
lastName: ‘lee’,
email: ‘steave@code.com’,
city: ‘seoul’
};
let keyname = ‘lastName’; //lastName 이라는 “문자열”을 담음 // 이 문자열은 lee를 담고있음
user[keyname] // ‘lee’ 출력
user[keyname] ===user[‘lastName’] //true 출력
user[keyname]===user.lastName //true
dot/bracket notation을 이용해 값을 “추가”
변수명.새로운key명 = value ;
변수명[‘새로운key명’] = value;
delete 키워드를 이용한 “삭제”
delete 변수명.삭제할key명;
delete 변수명[‘삭제할key명’];
in 연산자를 통한 키 존재 “확인”
‘확인할key명’ in 변수명; // 있으면 true 없으면 false
dot notation 과 bracket notation의 차이?
bracket notation을 반드시 써야 하는 경우?
→ key가 동적으로 변할 때
ex)
const person = {
name: 'Steve',
age: 16,
};
function getProperty(obj, property) {
return obj[propertyName]; // 이런식으로 key가 name, age를 오갈때
// 변수인자명[키인자명]
}
객체에서의 반복문 : for..in
객체에서 반복문을 사용할 때는 for...in 구문을 사용
→ for(let key이름 in obj인자이름) 형식으로 사용
ex)
function allKey(obj){
for(let key in obj){ // for(let key이름 in obj인자이름)
console.log(key);
}
} //객체의 모든 key를 콘솔에 출력
// 두 개의 객체를 입력받아 두 번째 객체의 속성들을 첫 번째 객체에 추가하는 함수의 경우
function extend(obj1, obj2) {
for (let key in obj2) { //for...in 구문 사용
if (!(key in obj1)) {
obj1[key] = obj2[key];
}
}
}
for...of 구문
객체에서는 사용불가
string, array, 유사배열에서 사용 가능한 반복문
for (let arr[i] of arr)가 for (let i = 0; i < arr.length; i += 1) 과 같다라고 생각하면 됨
Array.from(문자열);
문자열을 배열화시켜서 저장
→ 문자열에서만 사용가능
const str = '987654';
const fromStr = Array.from(str);
// fromStr: [ '9', '8', '7', '6', '5', '4' ]
const modifyStr = Array.from(fromStr, e => e*3);
// modifyStr: [ 27, 24, 21, 18, 15, 12 ]
// 뒤의 e => e*3 은 callback 함수입니다
// return 함수로 사용할 수 있습니다
push 사용법(배열) //배열에서 사용가능
result.push(arr[i]
); //들어갈배열.push(들어갈 값)
concat
concat() 메서드는 인자로 주어진 배열이나 값들을 기존 배열에 합쳐서 새 배열을 반환
→ 기존배열을 변경하지 않습니다.(immutable)!
→ 추가된 새로운 배열을 반환합니다
const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);
console.log(array3);
// expected output: Array ["a", "b", "c", "d", "e", "f"]
Array.prototype.slice()
slice() 메서드는 어떤 배열의 begin부터 end까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환합니다. 원본 배열은 바뀌지 않습니다.(immutable!)
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
console.log(animals.slice(2));
// expected output: Array ["camel", "duck", "elephant"]
console.log(animals.slice(2, 4));
// expected output: Array ["camel", "duck"]
console.log(animals.slice(1, 5));
// expected output: Array ["bison", "camel", "duck", "elephant"]
console.log(animals.slice(-2));
// expected output: Array ["duck", "elephant"]
console.log(animals.slice(2, -1));
// expected output: Array ["camel", "duck"]
Array.prototype.splice()
splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경
array.splice(시작인덱스, 제거할요소의수, 배열에 추가할 요소)
const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// inserts at index 1
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "June"]
months.splice(4, 1, 'May');
// replaces 1 element at index 4
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "May"]
Array.prototype.join()
join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열로 만든다
→ arr.join([separator])
const elements = ['Fire', 'Air', 'Water'];
console.log(elements.join());
// expected output: "Fire,Air,Water"
console.log(elements.join(''));
// expected output: "FireAirWater"
console.log(elements.join('-'));
// expected output: "Fire-Air-Water"
String.prototype.replace()
replace() 메서드는 어떤 패턴에 일치하는 일부또는 모든 부분이 교체된 새로운 문자열을 반환합니다. 그 패턴은 문자열이나 정규식(RegExp)이 될 수 있으며, 교체 문자열은 문자열이나 모든 매치에 대해서 호출된 함수일 수 있습니다.
→ pattern이 문자열 인 경우,첫 번째 문자열만 치환이 되며 원래 문자열은 변경되지 않습니다.
→ 새로운 문자열을 반환하고 원래 문자열은 변경되지 않으므로 immutable!
test.replce("해당문자","변경할문자") //test라는 변수에 문자 중에 해당문자에 들어가 있는 내용을 변경할 문자에 있는 형식으로 변경한다.
만약 바꾸고 싶은 문자가 다수인 경우는?
test.replace(/,/gi,"") // 이런식으로 (/바꿀문자/gi , 대체할단어 )
나를 위한 짧은 정리
블로깅 할때 어떤 문제를 풀어가는 데에 있어서
나만의 풀이 방법을 만들어서 정리하는 것이 좋다!
→ 블로그 내용은 단순한 내용 정리 보다는
도움이 될 만 한 기술 내용을 쓰는 것이 좋다
→ 지금은 내용 정리만 올리더라도 나중에라도 시간이 나면 조금씩 기술 정리하듯이 나만의 문제풀이법을 정리해서 짧게나마 올려보자...
'SE Bootcamp 내용 정리' 카테고리의 다른 글
css - 레이아웃, selector (0) | 2021.09.07 |
---|---|
js/node - 배열, 객체 checkpoint (0) | 2021.09.06 |
git 기초 (0) | 2021.09.02 |
Linux 기초 - 2 (0) | 2021.09.02 |
Linux 기초 - 1 (0) | 2021.09.01 |