이날부터 코딩애플 (개발 처음하시면 코딩애플 들으세용 2번 들으세용) 강의 열심히 들음 정말정말정말 잘한 선택..b

 

TIL

으엥 CS 스터디 15분 발표할라고 6시간 준비했당.. 잘 끝났다..

역시 노오력은 배신하지않워~ 많이 연습하면 청중 앞에서도 조금만 떨리겠지?

알고리즘 문제도 거의 끝났고 더 문제만 풀기보다는 목요일까지 2문제? 정도씩만 풀고 React(코딩애플) 강의 이번주 완강을 목표로 킵고잉하자 화이팅 👊

 

알고리즘

21. 이상한 문자 만들기 -다시 풀어볼것!(https://school.programmers.co.kr/learn/courses/30/lessons/12930)

function solution(s) {
    var result = [];
    var s_split = s.split(' ');

    for (i = 0; i < s_split.length; i++) {
        var result_one = '';
        s_split[i].split('').map((val, i) => {
            if (i % 2 == 0) {
                result_one += val.toUpperCase();
            } else {
                result_one += val.toLowerCase();
            }
        })
        result.push(result_one)
    }
    return result.join(' ');
//휴 드디어 풀었다 console에 밑에부분 주석처리해버리고 위에서부터 어디까지 실했됐나~ 차근차근 눈으로 보면서 진행하니까 훨씬 수월하게 풀렸다.
포인트는 2번째 반복문 돌리기 전에 split으로 문자열을 배열로 만들어준거!
그리고 if else 구문은 이제 삼항연산자 좀 써보자~ 

22. 자연수 더하기(https://school.programmers.co.kr/learn/courses/30/lessons/12931)

function solution(n) {
    var result = 0;
    n_str = n.toString();
    arr = n_str.split('');
    result = arr.reduce((ac, v) => Number(ac) + Number(v), 0);
    return result;
} // 형태변환에서 항상 애를 먹는듯! 형태가 숫자인지 문자인지 배열인지 잘 구분하고 변환하자!
n = 123; 일때 
arr = (n+'').split(''); // ['1','2','3'] n.tostring 이나 String(n) 써도 되지만, 요정도 정규표현식은 괜찮을듯! 문자로바꿔줌

'항해99' 카테고리의 다른 글

2주차 알고리즘(6일차)  (0) 2022.11.19
2주차 알고리즘(5일차)  (0) 2022.11.19
2주차 알고리즘(3일차)  (0) 2022.11.19
2주차 알고리즘  (0) 2022.11.19
2주차 알고리즘(2일차)  (0) 2022.11.19

이때부터 항해에서 CS스터디를 시켰는데 마지막까지 취지에 부합하게 열심히했던건 우리 조 뿐이었다.. 

할 땐 프로젝트도 바쁜데 매일 CS스터디에 시간 뺐기는거 같았는데 돌아보니 매주 발표도 하고 독후감 썼던게 도움이 많이 된거 같당 

 

TIL

CS 스터디 일지가 추가됐다. 또 팀장이네..

내일부터 정해진 범위 독후감 나눠야되니 오늘은 일찍 마치고 독후감 준비 해야겠다ㅠ

 

알고리즘

20. 완주하지 못한 선수

function solution(participant, completion) {
    participant.sort();
    completion.sort();
    for (i = 0; i < participant.length; i++) {
        if (participant[i] !== completion[i]) {
            return participant[i];
        }
    }
}

23. 자연수 뒤집기(https://school.programmers.co.kr/learn/courses/30/lessons/12932)

function solution(n) {
    var n_str = n.toString();  //숫자는 for문 못돌리니까 숫자->문자 
    var answer = [];
    for (i = n_str.length - 1; i > -1; i--) {
        answer.push(Number(n_str[i])) 
    }
    return answer;
}  //요구하는 return 값이 숫자로 배열에 들어가있으므로 다시 숫자로
찾아보니까 .reverse() 배열 뒤집는 메서드 있네 이거써도 좋겠다

26. 제일 작은 수 제거하기(https://school.programmers.co.kr/learn/courses/30/lessons/12935)

function solution(arr) {
    var answer = [];
    if (arr.length == 1) {
        answer = [-1];
    } else {
        arr.map((val, i) => {
            if (val == Math.min(...arr))  //배열 가져올때 ... 주의!
                answer = arr.filter(function (a) {
                    return a > val; 
                })
        })
    }
    return answer;
} //filter로 val보다 큰 값만 가져오기!

'항해99' 카테고리의 다른 글

2주차 알고리즘(5일차)  (0) 2022.11.19
2주차 알고리즘(4일차)  (0) 2022.11.19
2주차 알고리즘  (0) 2022.11.19
2주차 알고리즘(2일차)  (0) 2022.11.19
2주차 알고리즘(1일차)  (0) 2022.11.19

일요일은 그래도 좀 쉬는(?)날 이었는데 교회가기 전에 3시간정도 끄적댔던거 같당 초반이라 의욕이 활활 타오르던 때였지..ㅎ

 

TIL

오늘은 WIL 작성 하는날!

https://fkawnltjsejdj.tistory.com/6

어째 작성은 했는데 매일 TIL 작성하는게 더 중요해보인다.

블로그도 지금은 티스토린데 좀 불편한거 같아서 갈아탈 예정!

 

GIT

main 그만 괴롭히고 연습할 develop 브랜치 생성!

$git branch develop
$git add . git commit -m ‘드디어 develop을 쓰는건가’
$git push (신병받아라!)
$git merge 는 git 레퍼지토리 가서 클릭하자!

 

알고리즘

18. 서울에서 김서방 찾기

function solution(seoul) {
    var answer = 0;
    seoul.map((val, i) => {
        if (val == 'Kim') {
            answer = i
        }
    })
    return '김서방은 ' + answer + '에 있다'
} // 이거말고 이제 배열 index 찾을때는 .indexOf('Kim') 쓰자

19. 수박수박수박수?

function solution(n) {
    var answer = '';
    var a = '수';
    var b = '박';
    if (n % 2 == 0) {
        for (i = 0; i < (n / 2 + 1); i++) {
            answer = (a + b).repeat(i)
        }
    } else {
        for (j = 0; j < ((n + 1) / 2); j++) {
            answer = a + (b + a).repeat(j)
        }
    }
    return answer;
} //좀 뻘짓함 length 진짜 댕빡침 생각보다 오타도 많이나고, 숫자일때는 length 제발 붙이지 말자!

=> 문자도 더해지는거 깜빡했다, 숫자 합할때 처럼 푸는게 좋아보인다 
		function solution(n) {
		    var sum = '';
		    
		    for(i=0; i<n; i++){
		        (i+1)%2 == 0 ? sum += '박' : sum += '수'
		    }
		    
		    return sum;
		}

'항해99' 카테고리의 다른 글

2주차 알고리즘(4일차)  (0) 2022.11.19
2주차 알고리즘(3일차)  (0) 2022.11.19
2주차 알고리즘(2일차)  (0) 2022.11.19
2주차 알고리즘(1일차)  (0) 2022.11.19
실전 프로젝트 트러블슈팅(SSE)  (0) 2022.10.31

TIL

응애~ 오류 개많이나 런타임 오류가 뭐여 대체 개빡치네

그래도 내일은 더 잘할 수 있기를..☆

알고리즘 주차에 회의감을 가진 이들이 속속 출몰한다. 분위기에 휩쓸리지 말고 할꺼합시다. 다 이유가 있어서 하겄지~

알고리즘 푸느라 Git을 못들었네 한 강의라도 얼릉 듣고와야겠다ㅠ

 

GIT

오늘의 Git 때문에 억지로 1강의 듣고왔다..! 넘나 빡센것.

오늘은~ 새로운 브랜치를 만들어서 거따가 push하고 main에다 merge를 해봤습니다~

$git branch mining $git switch mining
$git add . $git commit -m ‘비트코인 채굴풀 만들었다~’
$git push (pull 부터 하고!)

$git merge 일단 git 가서 해봤음! create a merge commit(3way & squash & rebase merge 3개 중 적당한거 택 1) 바로 머지하지말고 pull 요청을 하자!

 

알고리즘

 

9. 핸드폰 번호 가리기(https://school.programmers.co.kr/learn/courses/30/lessons/12948)

function solution(phone_number) {
    var change = phone_number.substring(0, phone_number.length - 4)
    var answer = phone_number.replace(change, '*'.repeat(change.length));

    return answer;
} // 어제 배운 substring 주워다가 썼다. repeat도 생각보다 꿀 코드넹

 

10. 행렬의 덧셈(https://school.programmers.co.kr/learn/courses/30/lessons/12950)

function solution(arr1, arr2) {
    var answer = [];
    
    for(let i=0; i<arr1.length; i++){ //[1,2][2,3]
        let sum = [];
        for(let j=0; j<arr1[i].length; j++){ 
											//arr1 안의 배열의 길이 (값 2)
            sum.push(arr1[i][j] + arr2[i][j]) 
											// 1번째 1+3, 2번째 2+4 , 3번째 2+5 4번째 3+6
        }
        answer.push(sum) // [4,6],[7,9]
    }
    return answer;
	}//어려웠음.. let sum 위치랑 for문을 2번 돌리는게 포인트!
	 //더 중요한건 arr1.length; 와 arr1[i].length; .. 어렵넹

11. 더해서 배열에 넣기(https://school.programmers.co.kr/learn/courses/30/lessons/12954)

function solution(x, n) {
    let answer = [];
    let sum = 0;
    for (i = 0; i < n; i++) {
        sum = sum + x;
        answer.push(sum)
    }
    return answer;
} //배열은 많이 나오니까 이제부터 push로 배열에 넣는거 많이 해봐야할거같음! 다른 풀이 중 sum을 빼고 push(x*i) 로 바로 넣는게 인상적이었음.

12. 부족한 금액 계산하기(https://programmers.co.kr/learn/courses/30/lessons/82612)

function solution(price, money, count) {
    let sum = 0;
    for (i = 1; i < count + 1; i++) {
        sum = sum + price * i
    }
    if (sum > money) {
        return sum - money
    } else {
        return 0
    }
} // 위에 if else 는 삼항연산자를 사용하도록 하자!
return sum > money ? sum - money : 0 이거맞나?

13. 요일 구하기 (https://school.programmers.co.kr/learn/courses/30/lessons/12901)

function solution(a, b) {
    var weekday = ['sunday', 'monday', 'tuesday', 
										'wednesday', 'thursday', 'friday', 'saturday']
    var myday = '2016-' + a + '-' + b
    var myday2 = new Date(myday); // Sat Jul 16 2022 15:20:24 
    var myday3 = myday2.getDay(); // Day를 숫자로 가져옴 ex.0~6
    var answer = weekday[myday3].substring(0, 3).toUpperCase();

    return answer
} // 문자열 중간에 변수받기 
		 var myday = `2016-${a}-${b}` (백틱 ``안에 ${변수})

14. 나누어 떨어지는 숫자배열(https://school.programmers.co.kr/learn/courses/30/lessons/12910)

function solution(arr, divisor) {
    var answer = [];
    arr.map((v, i) => {
        if (Number.isInteger(v / divisor)) {
            answer.push(v)
        } 
    })
    return answer == '' ? [-1] :
        answer.sort(function (a, b) {
            return a - b;
        });
} // Number.isInteger()메서드는 ()안에 숫자가 int이면 참
	// 삼항연산자 잘썼고~
	// js에서 .sort() 거지같은게 2랑 11 오름차순 정렬을 [11, 2] 이따구로 해줌. 그래서 sort()안에 함수 추가해서 대소 비교해야됨

15. 백터 구하기(https://school.programmers.co.kr/learn/courses/30/lessons/70128)

function solution(a, b) {
    var sum = 0;
    a.map((val, i) => {
        sum += val * b[i]
    })
    return sum
} // for랑 그만놀고 map이랑 친해지도록하자.

16. 문자열 내 p와 y의 개수(https://school.programmers.co.kr/learn/courses/30/lessons/12916#)

function solution(s) {

    if (s.match(/p/gi) == null && s.match(/y/gi) == null) {
        return true;
    } else if (s.match(/p/gi).length == s.match(/y/gi).length) {
        return true;
    } else {
        return false;
    }
} // 요렇게 푸니까 테스트 2,3번 댕같이 런타임 에러난다.. 나중엔 해결 할 수 있겠지?

--> 바꾼코드(팀원 꺼 보고 힌트얻음)

function sol(s) {
    var p = 0;
    var y = 0;
    for (i=0; i<s.length; i++) {
        if (s[i] == 'p') {
            p += 1
        } else if (s[i] == 'y') {
            y += 1
        }
    } return p == y ? true : false
} // 근데 이래도 틀림ㅎㅎ 빡치넹

17. 문자열 다루기 기본..?(https://school.programmers.co.kr/learn/courses/30/lessons/12918)

function solution(s) {
    if (s.length !== 4 && s.length !== 6) {
        return false;
    }
    if (isNaN(s)) {
        return false;
    } else if (s.includes('e')) {
        return false;
    }
    return true;
} // 진짜 어이없는게 계속 오류 나길래 뭐지.. 뭐야 하며 찾다보니까 js 문제인거같다.  e를 js가 숫자로 받아서 true값이 나오고있었다..

 

'항해99' 카테고리의 다른 글

2주차 알고리즘(3일차)  (0) 2022.11.19
2주차 알고리즘  (0) 2022.11.19
2주차 알고리즘(1일차)  (0) 2022.11.19
실전 프로젝트 트러블슈팅(SSE)  (0) 2022.10.31
1주차 프로젝트  (0) 2022.07.28

2주차는 알고리즘으로 진행이 됐다. 이때는 뭔가 JS 문제만 풀어서 현타를 느낀 칭구들도 많았던걸로 기억하는데 난 재미가 쏠쏠했단 말이지 당시 노션에 정리했던 TIL 잠깐 봤는데 거의 12시까지 공부하다가 자기 직전에 안돼 한줄이라도 써야돼... 이러면서 써서 그런지 블로그에 올리기 창피한 수준.. 이긴 한데 그냥 올린란다~  


22/7/15(금)

TIL

알고리즘 문제를 처음 풀었는데 생각보다 재미가 쏠쏠하네..

문제의 정답을 찾아가는 과정이 일단 내가 알고있는 내용에서 해결 가능한가 고민해보고 그렇게 해결이 안되면, 어떤 메서드를 사용할까 고민해보고,

그다음 그 메서드를 구글에 검색해보고 → 얻은 메서드를 통해 문제에 다시 접근해보는 것이 얻어가는게 많은것 같다. 그러고도 안되면 바로 구글링해야지모.

  • 자주 나오는 메서드는 공부해보자! (매우 편리함)
  • for 문이나 if 문 중간중간 변수 사용할때 선언 잘하자
  • 안쪽에서 선언하고 바깥쪽에서 선언할때 결과값이 완전히 다르게 나옴(중요)
var absol= [1, 2, 3, 4, 5]
var signs= [true, false, true]

function q1() {
    return absol.reduce((acc, val, i) => 
					acc + (val * (signs[i] ? 1 : -1)), 0);
}

(와 이때는 var를 썼네.. 심지어 알고리즘 내내 var만 썼던거같음)

 

GIT

급한대로 branch 생성이랑 원격 레퍼지토리 copy 하는거, pull & push 부터 속성으로 배웠다~ 1주차처럼 팀원들에게 고통을 줄 수는 없워… 기본부터 하자!

 1) 오늘 배운거 요약!

$git clone 원격저장주소
$git add . $git commit -m ‘팀원1 첫 commit~’
$git pull (바로 push 하면 충돌나서 꼭 pull 부터!)
$git push

 2) 아~주 소규모 프로젝트라면 이것만 해도 훌륭하지만 실전은 녹록치 않은법..

내일은 branch 를 접목해보자!

 

알고리즘

1. ‘*’로 사각형 만들기 (https://school.programmers.co.kr/learn/courses/30/lessons/12969)

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    let star = '*'.repeat(a)
    for (i = 0; i < b; i++) {
console.log(star)
    }
});

2. 홀수 짝수 출력 함수 만들기 (https://school.programmers.co.kr/learn/courses/30/lessons/12937)

function solution(num) {
    if (num % 2 == 0) {
        var answer = 'Even'
    } else {
        var answer = 'Odd'
    }
    return answer;
}

3. 가운데 글자 가져오기 (https://school.programmers.co.kr/learn/courses/30/lessons/12903)

function solution(s) {
    let answer = '';
    if (s.length % 2 == 1) {
        q1 = s.length / 2
        answer = s.substring(q1, q1 + 1)
    } else {
        q1 = s.length / 2 - 1
        answer = s.substring(q1, q1 + 2)
    }
    return answer;
}
// substring(가져올 str의 시작번호(포함), 끝번호(불포함))
		유사품 substr() / slice() 도 궁금하면 알아보자.

4. 두 정수 사이의 합 구하기 (https://school.programmers.co.kr/learn/courses/30/lessons/12912)

// *조건 a 와 b 는 대소관계가 정해져 있지않다, a=b 이면 아무거나 출력
function solution(a, b) {
    let answer = 0;
    if (a < b) {
        for (i = a; i < b + 1; i++) {
            answer = answer + i
        }
    } else if (a > b) {
        for (i = b; i < a + 1; i++) {
            answer = answer + i
        }
    } else {
        answer = a
    }
    return answer;
}

5. 문자열을 정수로 바꾸기 (https://school.programmers.co.kr/learn/courses/30/lessons/12925)

function solution(s) {
    var answer = Number(s)

    return answer;
}

6. 배열에 없는 숫자 더하기(https://school.programmers.co.kr/learn/courses/30/lessons/86051)

function solution(numbers) {
    var answer = 0;
    for (i = 0; i < 10; i++) {
        if (!numbers.includes(i)) {
            answer = answer + i
        }
    }
    return answer;
}
//생각보다 어려웠음! 모르는 문제는 바로 정답을 찾기보다 메서드를 중심으로 검색해보는게 훨씬 좋아보인다. [abc].includes(a) -> True; 
배열에서 a가 있는지 여부를 bool 값으로 뱉어줌! 

7. 절대값 양수음수(음양) 더하기(https://school.programmers.co.kr/learn/courses/30/lessons/76501)

function solution(absolutes, signs) {
    let answer = 0;
    absolutes.map((value, i) => {
        if (signs[i]) {
            answer = answer + value
        } else {
            answer = answer - value
        }
    })
    return answer;
} // 이 문제를 풀면서 깨달았다.. 배열의 합은 reduce를 써야하는구나..!

8. 배열 평균 구하기(https://school.programmers.co.kr/learn/courses/30/lessons/12944)

function solution(arr) {

    var answer = arr.reduce((ac, val, i) => ac + val / arr.length, 0);
    return answer
} // reduce를 주워다가 써봤다! 효과는 굉장했다!

'항해99' 카테고리의 다른 글

2주차 알고리즘  (0) 2022.11.19
2주차 알고리즘(2일차)  (0) 2022.11.19
실전 프로젝트 트러블슈팅(SSE)  (0) 2022.10.31
1주차 프로젝트  (0) 2022.07.28
스파르타 코딩클럽 <웹개발 종합반> 회고  (0) 2022.04.13

Q. var, let, const의 차이에 대해 알려주세요.

이건 전에 변수 생성 3단계랑 좀 겹치는거 같긴한데 그래도 다시 정리해봅시당

 

차이는 크게 변수 선언 방식,  스코프(Scope), 호이스팅이 있다.

 

1. 변수 선언 방식

 1) var 중복 선언 가능

var name = '이름1'
console.log(name) // 이름1

var name = '이름2'
console.log(name) // 이름2

var로 선언한 변수는 동일한 이름으로 중복 선언이 가능함.

변수를 유연하게 사용할 수 있는거 같지만 변수가 변하면 생각지 못한 오류가 발생해 이를 보완하기 위해 ES6부터 

let 과 const 변수가 추가되었습니당.

 

 2) let 중복 선언 불가능, 재할당 가능

let name = '이름1'
console.log(name) // 이름1

let name = '이름2'
console.log(name) // Uncaught SyntaxError: Identifier 'name' has already been declared

name = '이름3';
console.log(name) // 이름3

var 과 달리 대 선언 불가 but 재할당은 가능!

 

3) const 중복 선언 불가능, 재할당 불가능

const name = '이름1'
console.log(name) // 이름1

const name = '이름2'
console.log(name) // Uncaught SyntaxError: Identifier 'name' has already been declared

name = '이름3';
console.log(name) // Uncaught TypeError: Assignment to constant variable

=> let 과 const 차이점은 불변(immutable) 여부!

but. const도 재할당은 불가하지만 배열과 오브젝트 값을 변경하는 것은 가능  

 

그래서 어떤 변수 사용해?

const 를 기본으로 사용하여 불필요한 변수의 재사용을 방지하고, 재할당이 필요한 경우 let을 사용하는 것이 좋음!

(execute context 측면으로 봐도 var은 변수를 전역 변수에 할당 할 수도 있어서 최대한 지양하는것이 좋다)

 

2. 스코프 (Scope)

스코프란 유효한 참조 범위를 뜻함.

 1) var 함수 레벨 스코프

function var(x) {
	if (x) {
		var a = 1;
        console.log(a) // 1
    }
    console.log(a) // 1
}

var(); // 1
console.log(a); // ReferenceError: a is not defined

함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없음.

함수 내부에서 선언한 변수는 지역변수이고

함수 외부에서 선언한 변수는 모두 전역변수 취급!

 

 2) let, const 블록 레벨 스코프

function const(x) { // let 동일
	if (x) {
		const a = 1;
        console.log(a) // 1
    }
    console.log(a) // ReferenceError: a is not defined
}

console.log(a); // ReferenceError: a is not defined

함수, if문, for문, while문, try/catch문 등의 모든 코드 블록({ }) 내부에서 선언 된 변수는 코드 블륵 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없음. 즉, 코드 블록 내부에서 선언한 변수는 지역변수 취급

 

3. 호이스팅

함수 내부에 있는 선언들을 모두 끌어올려 해당 함수 유효 범위의 최상단에 선언하는것을 말함. (자바스크립트 parser가 함수 실행 전 해당 함수를 한번 훑는 과정에서 내부적으로 끌어올려 처리하는 것을 뜻함)

 

 1) var, 함수선언문 : 호이스팅이 발생함

//변수 호이스팅
console.log(a) // undefined

var a = 1;
console.log(a); // 1

//함수 호이스팅
var(); // 1

function var() {
	console.log(1)
}

변수 a가 선언되기 전에 참조됐는데 에러가 발생하지 않음.

=> 자바스크립트 내부에서 코드 실행 전에 미리 변수를 선언하고 undefined로 초기화함. 

     함수선언문 또한 동일하게 선언되기 전 호출됨에도 에러가 발생하지 않음.

 

 2) let, const, 함수표현식 : 호이스팅이 발생하지만, 다른 방식으로 작동됨

/* 변수 호이스팅
console.log(a) // ReferenceError: a is not defined

let a = 1;
console.log(a) // 1

/* 함수 호이스팅
함수표현식(); // error

let 함수표현식 = function() {
	console.log("함수표현식");
}

=> 변수 a가 선언되기 전에 참조하니 에러가 발생. 호이스팅은 발생했지만 변수 선언과 초기화 사이에 일시적으로 변수 값을 참조할 수 없는 구간인 TDZ(Temporal Dead Zone)에 빠졌기 때문

 

=> 함수 표현식을 사용하거나 let 또는 const로 변수를 선언하는 경우, 자바스크립트 내부에서는 코드 실행 전 변수 선언만 해둘 뿐 초기화는 코드 실행 과정에서 변수 선언문을 만났을 때 수행함. 그래서 호이스팅은 발생하지만, 값을 참조할 수 없어서 동작하지 않는것처럼 보임!

 

 

갑자기 예정에없던 강남에 왔습니당 항해99 칭구들 모여서 스터디한다길래 취업 준비 어떻게들 하고있나~ 궁금하기도 해서 갔는데 다들 열심히 하고있군..ㅎ 취업준비 진짜 빡세게 이력서 100개씩 날렸던 칭구들은 벌써 입사하고 면접 보러 댕기고있길래 조금 뒤쳐졌나 생각도 들었다. 뭐 나도 열심히 하고 있고 급하게 이력서 막 날리는 것보다 조~금 시간두면서 천천히 자소서 첨삭하고 공부 하면서 이력서 내용 보충하고있는데(아직 모아뒀던 돈이 좀 있어서 안 급한가..?) 그래도 칭구들 보면서 의욕 생겨서 좋았음

특히, 친구들 블로그 구경했는데 한명이 엄~청 내용 알차고 꾸준히 작성한거 보고 나도 좀 본격적으로 작성해야겠다, 싶었다.. 보고 내 블로그랑 비교해보니까 항해99 카테고리는 거의 노션에 작성해놔서 내용도 별로 없고 TIL 도 너무 면접 내용 + 일기인가 싶기도 하넹 그래도 기술 적인 내용은 git에 하고있긴한데, 뭐 남에꺼 좀 참고해서 더 잘 작성해봅시다~

 

 

+ 스터디 끝나고 곱도리탕에 소주 한잔하고 파했는데,

꾸역꾸역 집에 안가고 스터디카페로 왔다... 휴, 2시간만 타입스크립트 조지고 간다 화이팅...! 

 

Q. 버츄얼 돔과 리얼 돔의 차이를 설명해주세요

 

노드가 변경되어 레이아웃을 변경 할 때, DOM은 변경 될 때마다 레이아웃을 다시 구성하나,

가상 DOM은 컴포넌트가 업데이트 될 때, 레이아웃을 한번만 계산합니다. 리액트는 가상DOM의 얕은 비교와 일괄 돔 업데이트 방식을 이용해 성능을 향상시켰습니다.

 

⇒ 버츄얼 돔(가상 돔 || Virtual DOM) 이란?

가상돔은 실제 DOM에서 처리하는 방식이 아닌 가상돔과 메모리에서 미리 처리하고 저장한 후 실제DOM과 동기화하는 프로그래밍 개념입니다. 해당 DOM을 컴포넌트 단위로 쪼개 HTML 컴포넌트 조립품 처럼 다루는 개념입니다.

⇒ DOM 이란?

DOM(Document Object Model)은 웹 페이지를 이루는 태그들을 자바스크립트가 이용할 수 있게 브라우저가 트리구조로 만든 문서 객체 모델을 의미합니다.

여기서 문서 객체란 html, head, body(h1, p, ul태그 등) 과 같은 JS가 이용할 수 있는 객체를 의미합니다.

(JS는 Document 라는 전역 객체를 통해 html에 접근해 태그들을 조종합니다. Ex⇒ document.getElementById() 등)


Q. useRef 란?

특정 DOM을 가리킬 때 사용하는 Hook 함수.

(ex, 포커스 설정, 특정 엘리먼트 크기/ 색상 변경 등)

 

사용법

1) Focus

리액트에서 특정 DOM을 선택해야 하는 상황에 useRef를 사용한다.

useRef() 를 사용하여 Ref 객체를 만들고, 이 객체를 우리가 선택하고 싶은 DOM 에 ref 값으로 설정해서 사용하면 된다.

 

 2) 변수 관리

useRef 특정 DOM을 선택하는 용도 외에 Component 안에서 변수 관리하는 용도로도 사용합니다.

useRef를 이용해 변수를 업데이트하면 해당 Component가 리렌더링이 되지 않아 리렌더링이 필요없는 변수를 관리할 때 useRef 사용이 효율적입니다. (굳이 useRef사용 시 리 렌더링을 원한다면 callback ref 사용)

⇒ useRef로 변수 관리 예시

  • setTimeout, setInterval을 통해 만들어진 id
  • scroll의 위치
  • 배열에 새 항목이 추가 될 때 필요한 고유 key값
  • 외부 라이브러리를 사용해 생성된 인스턴스
import React, {useRef} from 'react'; 
import UserList from './UserList';

const App = () => { 
const users = [ 
    {id:1, name: '김채원'}, 
    {id:2, name: '푸푸'}, 
    {id:3, name: '쌈무'} 
];
const nextId = useRef(4); 
const onCreate = () => { // 배열에 항목 추가하는 부분 생략 
	nextId.current += 1; 
}; 

return <UserList users={users}/>; 
}

export default App;

 


Q. useEffect의 실행 순서

useEffect는 컴포넌트가 랜더링이 된 후에 실행되는데 하위에 있는 컴포넌트의 useEffect가 먼저 실행이 된다.

(Bottom → Top 방식으로 작동)

 

useEffect 사용법

⇒ dependency배열 x

useEffect(() ⇒ {
});		//컴포넌트 랜더링 시 마다 실행

⇒ dependency배열에 빈 값 전달

useEffect(() ⇒ {
}, []);		// 컴포넌트가 마운트될 때 한번만 실행

⇒ dependency배열에 변수 전달

useEffect(() ⇒ {
}, [value]);	// 컴포넌트가 마운트될 때 한 번 실행 + ‘value’ 값이 변경 될 때 실행

 

 

 

Q. Scope란?

자바스크립트에서 Scope는 변수에 접근할 수 있는 범위이다.

크게 global(전역)스코프, local(지역)스코프 2가지가 있다.

전역 스코프는 전역에 선언되어 있어 어느 곳에서나 해당 변수에 접근할 수 있고, 

지역 스코프는 해당 지역에서만 접근할 수 있다.

 

JS에서 함수도 지역 스코프에 해당한다.

함수를 선언하면 선언할 때 마다 새로운 스코프를 생성하고 이를 '함수 스코프' 라고도 한다.

(그냥 지역 = 함수 스코프라고 봐도 되는 부분인듯)

아래 예를보면,

var a = 1; // 전역 스코프

function print() { // 지역(함수) 스코프
 var a = 123;
 console.log(a);
}

console.log(a); // 1
print(); // 123;

  (scope를 더 정확하게 이해하려면 이전 글에 있는 실행 컨텍스트(execute context) 내용을 선행해야 하는 부분인듯)

console.log(a) 가 1 인건 동의 할 거고 

print() 가 123인건 (JS 엔진이 실행 컨텍스트에서 객체를 생성해) 변수 a를 먼저 지역 스코프에 있나 확인해보고 있으면

지역 스코프의 값 a = 123을 할당하고

변수 a를 print 함수 안에서 선언하지 않았다면(Scope Chain에 의해)

전역 스코프에 있는 a = 1;을 할당했을거다.

 

기존 var의 경우 함수 스코프를 가졌기 때문에 함수 내에서만 지역변수가 유지되는 문제가 있었는데,

ES6에서 let, const 키워드가 추가되면서 함수가 아닌 일반 블록 { var a = 123; } 에서도 지역변수를 선언할 수 있게됨 

 


추가 단어 설명!

실행 컨텍스트 란(execute context)

=> 자바스크립트 코드가 실행되고 연산되는 범위를 나타내는 추상적인 개념

 우리가 코드를 작성하고 실행한다면 실행 컨텍스트 내부에서 실행되고 있는 것. 즉, 코드들이 실행되기 위한 환경이자 하나의 박스 컨테이너라 볼 수 있음!

 

스코프 체인Scope Chain 이란

유효 범위를 나타내는 scope는 scope 프로퍼티로 각 함수 객체 내에서 연결리스트 형식으로 관릳뢰는데,

이 scope 간의 상하관계를 스코프 체인이라 한다.

 


오늘은 '다정한 것이 살아남는다' 읽을 거지롱 오늘부터 무신사 블프하넹.. 돈도 없는데 흙흙ㅠ

 

TypeScript 공부하고 면접 질문지 작성하다보니까 책 거의 못읽음~! 요새 자꾸 배나오는거 같아서 다시 헬스 열심히 가려고 한다. 저번주에 3번갔는데 너~~무 오랜만에 가서 첫날하고 3일동안 근육통이 좀 있어서 괴로웠다.. 이번주부터는 주 5일 뿌셔야지. 아니 밥먹는시간이 너무 애매해 스터디카페에서 공부하니까 집 왔다갔다 하면 1시간30분 홀랑이넹 밥차리고 설거지하고 하니까 금방이여 증말.. 그래서 당분간 저녁 스킵하고 공부하다가 바로 헬스장 가는 걸로! 여기 커피랑 후레이크 믹스 같은거 있어서 너무 좋음 최고최고b

+ Recent posts