250909
시티스칸
- 안 - 개인휴가
어제자 출력, 입력
(5겅구)공문 7월,8월분 어제 제목바꾼거 cmrs업로드
0201-99-199
공문접수 회람
엑셀에 분류코드 자주 쓰는것만 정리
독거미 한영키 안될때 Fn + W
자바
- 깊이우선탐색순회 ok
- 너비우선탐색순회 ok
- 시험장 나누기 마저하기 집
- 1부터 N까지 숫자 중 합이 10이 되는 조합 구하기
- 시간 남으면 길찾기 게임 내일
- 해시셋 내일
- Promise 내일 자세히
자바스크립트 - 이 정도가 있더라 ok
- 스프레드연산자 ...YourArrapy/ 레스트매개변수/심벌/클래스 ok
- 배열복사
- arr.slice()
- const copy = [...original]
- Array.from()
- shallow copy → 내부 객체 공유, 원본 변화 가능
- deep copy → 모든 단게 새 객체, 원본 변화 없음
- JSON.parse(JSON.stringify(obj))
- structuredClone(obj)
- 클래스 선언, 클래스 표현식은 호이스팅 되지 않는다. 클레스에 접근하기 전에 선언하지 않으면 ReferenceError
- static으로 선언된 메서드는 클래스 자체에서만 접근 가능
- 인스턴스에서는 접근 불가능
Promise
객체에 함수 추가
객체 속성 동적으로 정의하는법
에크마스크립트 버전
- https://skim88.tistory.com/entry/ECMAScript-%EB%B2%84%EC%A0%84%EB%B3%84-%ED%8A%B9%EC%A7%95
- https://medium.com/@potato013068/ecma-script2025-%EC%83%88%EB%A1%9C-%EC%B6%94%EA%B0%80%EB%90%9C-%EA%B8%B0%EB%8A%A5-dd07560d7a30
JSON.parse(JSON.stringfy(obj))
const original = [{a: 1}, {b: 2}];
const copy = JSON.parse(JSON.stringify(original)); // 깊은 복사
copy[0].a = 100;
console.log(original[0].a); // 1 ← 원본은 그대로
- JSON방식으로 문자열로 변환 → 다시 객체로 복원
- 원본과 복사본 완전 분리
- 깊은 복사는 함수, undefined, Symbol, 순환참조 처리X
1. 함수, undefined
const original = {
a: 1,
b: undefined,
c: function() { return 2; }
};
const copy = JSON.parse(JSON.stringify(original));
console.log(copy);
// 출력: { a: 1 }
// b와 c가 사라짐!
const sym = Symbol('id');
const original = { a: 1, [sym]: 123 };
const copy = JSON.parse(JSON.stringify(original));
console.log(copy);
// 출력: { a: 1 }
// Symbol 속성은 복사되지 않음
JSON 으로 변환할 때
- undefined 무시
- 함수 무시
- Symbol 키나 값도 JSON으로는 복사 안 됨
그래서 복사본에서는 사라짐
2. 순환 참조 (Circular Reference)
const original = { a: 1 };
original.self = original; // 자기 자신을 참조
try {
const copy = JSON.parse(JSON.stringify(original));
} catch (err) {
console.log(err.message);
}
// 출력: Converting circular structure to JSON
- JSON은 순환 참조 처리 못해서 에러 발생
- structuredClone()은 순환참조 지원
// 원본 객체
const sym = Symbol('id');
const original = {
a: 1,
b: undefined,
c: function() { return 2; },
[sym]: 123
};
// 순환 참조 추가
original.self = original;
// 깊은 복사 (structuredClone 사용)
const copy = structuredClone(original);
// 확인
console.log(copy);
// 테스트
console.log(copy.a); // 1
console.log(copy.b); // undefined
console.log(typeof copy.c); // function
console.log(copy.self === copy); // true, 순환 참조 유지
console.log(copy[sym]); // 123
심볼쓰는이유
객체 속성을 외부에서 안전하게 숨기고, 다른 코드와 충돌 없이 고유하게 관리하기 위해
const INTERNAL_KEY = Symbol('internal');
class MyClass {
constructor() {
this[INTERNAL_KEY] = 42; // 외부에서 접근 어렵다
}
}
1. 고유키 생성
- INTERNAL_KEY는 Symbol('internal')로 만들어졌기 때문에 다른 어떤 코드에서도 같은 키를 생성할 수 없음
- 만약에 문자열 키 'internal'이었으면 다른 코드에서 실수로 덮어쓸 수 있음
2. 외부에서 직접 접근 어렵게 하려고
const obj = new MyClass();
console.log(obj.INTERNAL_KEY); // undefined
console.log(obj[INTERNAL_KEY]); // 42, 내부에서만 참조 가능
외부에서 'INTERNAL_KEY' 문자열로 접근 안되고, 오직 내부에서 만든 Symbol로만 접근 가능
3. 충돌 방지
라이브러리나 모듈에서 다른 사람이 같은 속성명 써도 절대 겹치지 않음 예를 들면 다른 라이브러리에서 obj.internal = 100을 해도 Symbol속성은 안전하다.
오호..