letlyrics = "[재석]너에게 나 하고 싶었던 말 고마워 미안해 함께 있어서 할 수 있어서 웃을 수 있어[준하] 정말 고마웠어 내 손을 놓지 않아줘서 힘을 내볼게 함께 있다면 두렵지 않아[홍철] 내가 늘 웃으니까 내가 우습나 봐 하지만 웃을 거야 날 보고 웃는 너 좋아[명수] 자꾸만 도망치고 싶은데 저 화려한 큰 무대 위에 설 수 있을까? 자신 없어..[하하] 지금까지 걸어온 이 길을 의심하지는 마 잘못 든 길이 때론 지도를 만들었잖아[형돈] 혼자 걷는 이 길이 막막하겠지만 느리게 걷는 거야 천천히 도착해도 돼[길] 술 한 잔 하자는 친구의 말도 의미 없는 인사처럼 슬프게 들릴 때 날 찾아와";
lethyungdon = null;
startIndex = lyrics.indexOf('[형돈]');
// 형돈 파트 시작 부분
lastIndex = lyrics.indexOf('[길]')
// 형돈 파트 끝 부분 (길 시작 직전까지)
hyungdon = lyrics.slice(startIndex, lastIndex)
// 주의할 점은 slice(start, end)에서 end의 직전까지 출력함.
// ex. slice(200, 300)이면 인덱스 200에서 299까지 출력되는 것임.
// -> indexOf에서 '[길]'을 입력해야 그 직전까지 출력되는 것임.
console.log(hyungdon)
// [형돈] 혼자 걷는 이 길이 막막하겠지만 느리게 걷는 거야 천천히 도착해도 돼
// 멤버별 파트를 한 줄씩 띄워서 씀
letlyrics =
"[재석]너에게 나 하고 싶었던 말 고마워 미안해 함께 있어서 할 수 있어서 웃을 수 있어\n" +
"[준하] 정말 고마웠어 내 손을 놓지 않아줘서 힘을 내볼게 함께 있다면 두렵지 않아\n" +
"[홍철] 내가 늘 웃으니까 내가 우습나 봐 하지만 웃을 거야 날 보고 웃는 너 좋아\n" +
"[명수] 자꾸만 도망치고 싶은데 저 화려한 큰 무대 위에 설 수 있을까? 자신 없어..\n" +
"[하하] 지금까지 걸어온 이 길을 의심하지는 마 잘못 든 길이 때론 지도를 만들었잖아\n" +
"[형돈] 혼자 걷는 이 길이 막막하겠지만 느리게 걷는 거야 천천히 도착해도 돼\n" +
"[길] 술 한 잔 하자는 친구의 말도 의미 없는 인사처럼 슬프게 들릴 때 날 찾아와\n";
// 객체로 만들어서 응용해 봄
// 멤버 입력을 입력하면 그에 맞는 가사를 출력하는 것임.
letMoodo = {
'재석':'너에게 나 하고 싶었던 말 고마워 미안해 함께 있어서 할 수 있어서 웃을 수 있어',
'준하':'정말 고마웠어 내 손을 놓지 않아줘서 힘을 내볼게 함께 있다면 두렵지 않아',
'홍철':'내가 늘 웃으니까 내가 우습나 봐 하지만 웃을 거야 날 보고 웃는 너 좋아',
'명수':'자꾸만 도망치고 싶은데 저 화려한 큰 무대 위에 설 수 있을까? 자신 없어..',
'하하':'지금까지 걸어온 이 길을 의심하지는 마 잘못 든 길이 때론 지도를 만들었잖아',
JavaScript에서 객체는 참조(reference) 형식으로 할당됨. y = x와 같이 객체를 변수에 할당할 때는 실제로는 객체의 값이 아닌, 메모리상에서 객체를 참조하는 주소(reference)가 변수에 할당됨. y.birth = 2017과 같이 y 객체에 새로운 프로퍼티를 추가하는 경우 :
- x 변수가 참조하는 객체와 y 변수가 참조하는 객체가 동일함.
- x 변수를 출력해도 동일한 객체가 출력되며, x 변수에도 새로운 프로퍼티가 추가되어 있는 것임.
// 배열의 경우
letx = [1, 2, 3];
lety = x;
console.log(x); // [1, 2, 3]
console.log(y); // [1, 2, 3]
y[2] = 4; // y의 세번째 원소를 4로 수정
console.log(x); // [1, 2, 4]
console.log(y); // [1, 2, 4]
// 배열도 마찬가지로 변수 X에 주소값이 할당되므로
// X변수가 참조하는 객체와 Y변수가 참조하는 객체가 같음
letx = {
numbers: [1, 2, 3, 4],
title:'Codeit',
};
/*
2개의 프로퍼티를 가진 객체가 변수 x에 할당됨
객체는 참조형 값
--> 변수 x에 주소값이 저장됨
*/
lety = x.numbers;
// numbers 프로퍼티 값이 배열(참조형)
// --> 배열의 주소값이 y에 할당됨
letz = x.title;
// title 프로퍼티 값이 문자열(기본형)
// --> 변수 z에 문자열 값이 그대로 복사됨.
// --> x.title과 z는 독립적인 변수!!!!
/* x.numbers를 변경하면 y가 변경되나,
x.title을 변경해도 z는 변경되지 않음. */
x.numbers.unshift(5);
// x.numbers에 배열의 첫요소로 5를 넣음
// -> y에도 5가 추가됨
x.title = 'Hello';
// 객체 x의 title 값이 'Hello'로 바뀜
// -> z는 변함없이 'Codeit'을 유지함
console.log(y); // [5, 1, 2, 3, 4]
console.log(z); // Codeit
참조형 복사하기
// 참조형 복사하기 (Reference Type Copy)
letnumbers1 = [1, 2, 3];
letnumbers2 = numbers1;
numbers2.push(4);
// [1, 2, 3, 4]
console.log(numbers1);
console.log(numbers2);
// [1, 2, 3, 4]
/*
상황에 따라서는 참조형 값을 그대로 복사하고 싶을 수 있음
number2만 변경하고 싶을 때
---> slice를 활용함
*/
// 참조형 복사하기 (Reference Type Copy)
letnumbers1 = [1, 2, 3];
letnumbers2 = numbers1.slice();
// 배열을 복사하는 것 같은 효과가 있음
numbers2.push(4);
// [1, 2, 3, 4]
console.log(numbers1);
// [1, 2, 3]
console.log(numbers2);
// [1, 2, 3, 4]
// 참조형 복사하기 (Reference Type Copy)
// 배열의 경우
letcourse1 = {
title:'파이썬 프로그래밍 기초',
language:'Python'
};
letcourse2 = course1;
course2.title = '알고리즘의 정석';
console.log(course1);
console.log(course2);
// {title: '알고리즘의 정석', language: 'Python'}
// 객체에는 slice 메소드가 없음
// --> Object.assign({}, course1)
Object.assign(target, sources) 활용하기
// 참조형 복사하기 (Reference Type Copy)
// 배열의 경우
/*
Object.assign(target, sources)
"target 객체에" 하나 이상의 소스 객체의
모든 열거 가능한 프로퍼티를 "복사"하는데 사용
target : 복사될 대상 객체
sources : 복사할 소스 객체
*/
letcourse1 = {
title:'파이썬 프로그래밍 기초',
language:'Python'
};
letcourse2 = Object.assign({}, course1);
// 빈 객체 {}에 course1 객체의 프로퍼티를 복사하여
// course2 객체를 생성하는 코드
course2.title = '알고리즘의 정석';
// course1의 객체는 변경되지 않는다
console.log(course1);
// {title: '파이썬 프로그래밍 기초', language: 'Python'}
console.log(course2);
// {title: '알고리즘의 정석', language: 'Python'}
// 참조형 복사하기 (Reference Type Copy)
// 객체체의 경우
// for-in문 활용하기
letcourse1 = {
title:'파이썬 프로그래밍 기초',
language:'Python'
};
letcourse2 = {};
for (letkeyincourse1) {
course2[key] = course1[key];
}
// course1의 원소를 course2에 하나씩 넣어준다
// --> 서로 독립적인 변수
course2.title = '알고리즘의 정석';
// course2만 변경됨
console.log(course1);
// {title: '파이썬 프로그래밍 기초', language: 'Python'}
console.log(course2);
// {title: '알고리즘의 정석', language: 'Python'}
for-in문은 course1과 course2에만 해당되어 한정적으로만 사용됨.
→ course3, course4가 생긴다면 어떻게 할까? (함수 활용)
// 참조형 복사하기 (Reference Type Copy)
// 객체의 경우
// for-in문 활용한 "함수"
functioncloneO(object) {
lettemp = {} // 빈 객체를 temp에 할당
for (letkeyinobject) {
temp[key] = object[key]; //object의 원소를 하나씩 temp에 할당
}
returntemp;
}
letcourse1 = {
title:'파이썬 프로그래밍 기초',
language:'Python'
};
letcourse2 = cloneO(course1);
// cloneO 함수를 통해 course1의 프로퍼티가 course2에 복사됨.
course2.title = '자료구조';
// course2만 변경됨
console.log(course1);
// {title: '파이썬 프로그래밍 기초', language: 'Python'}
console.log(course2);
// {title: '자료구조', language: 'Python'}
// 참조형 복사하기 (Reference Type Copy)
// for-in문 활용한 "함수"
functioncloneO(object) {
lettemp = {}
for (letkeyinobject) {
temp[key] = object[key];
}
returntemp;
}
// course1에 prerequisite(선수과목) 추가
letcourse1 = {
title:'파이썬 프로그래밍 기초',
language:'Python',
prerequisite: [] // 배열
};
letcourse2 = cloneO(course1);
course2.title = '자료구조';
course2.prerequisite.push('파이썬 프로그래밍 기초');
console.log(course1);
// {title: '파이썬 프로그래밍 기초', language: 'Python', prerequisite: Array(1)}