본문 바로가기

분류 전체보기

(388)
<자바스크립트> 맵과 셋 1. 맵 * 기본 메서드 - 맵은 키가 있는 컬랙션을 저장한 '객체'나 순서가 있는 컬랙션을 저장한 '배열'과 다른 좀 더 현실적인 자료구조이다. - 맵에서의 기본적인 메서드와 프로퍼티는 다음과 같다. - new Map() : 맵을 만든다. - map.set(key, value) : key를 이용하여 value를 저장한다. - map.get(key) : key에 해당하는 value를 반환한다. - map.has(key) : key가 존재하는지 불리언 값을 반환한다. - map.delete(key) : key에 있는 값을 삭제한다. - map.clear() : 맵 내의 요소들을 모두 삭제한다. - map.size : 요소의 갯수를 반환한다. - 코드로써 맵을 좀 더 알아보자. let map = new Ma..
<자료구조> 트리구조 * 연결리스트의 장단점 - 연결리스트는 배열과 달리 새로운 값을 추가하면 메모리를 추가하지 않아도 되었다. - 그러나 배열과 달리 임의 접근이 불가능하다. - 위와 같은 단점은 값의 추가, 검색에서 손실을 가져온다. 추가와 검색을 위해 연결리스트의 각 node를 하나하나 이동해야하기 때문이다. - 배열의 경우에는 정렬만 되어 있다면 임의 접근이 가능하여 이진검색을 이용하면 O(log n)의 실행시간을 갖는다. 그러나 위와 같은 단점때문에 연결리스트는 O(n)이 된다. * 트리구조의 등장 - 트리는 연결리스트를 기반으로 한 새로운 데이터 구조이다. - 연결리스트에서 노드의 연결이 1차원이었다면 트리에서의 노드의 연결은 2차원이다. - 위에서 언급되었던 단점을 해결한 '이진 검색 트리' 를 살펴보자. - 가..
<리액트 기초> useReducer · useReducer * 소개 - useReducer은 리덕스의 일부 기능들을 사용하게 해준다. - 비동기 부분 처리를 위해서 리덕스를 써야하지만 reducer와 context로 일부 대체가 가능해졌다. * 사용 - 틱택토 게임을 만들기 위해서 3x3 표를 만들 것이다. const TicTacToe = () => { const [winner, setWinner] = useState(''); const [turn, setTurn ] = useState('O') ; const [tableData, setTableData] = useState([ ['','',''], ['','',''], ['','',''] ]); //... } - 표를 만들기 위해서 2차원배열을 만들었다. 현재 컴포넌트는 TicTacToe..
<자료구조> 연결리스트와 노드 * 연결리스트 소개 - 배열에선 각 인덱스 값들이 메모리 상에서 연이어 저장되어있다. 그렇다면 배열에 새로운 값을 추가하려면 어떻게 해야 할까 - 기존 배열 바로 뒤에 다른 값이 있을 수 있으므로 배열의 길이를 늘리려면 새로운 메모리를 할당해서 값을 하나하나 복사하여 옮겨야한다. - 위의 방식은 너무 번거롭다. 각 값을 메모리의 다른 곳에 저장하더라도 배열처럼 사용할 수 있다면 어떨까. 각 값에 다음 값의 메모리 주소를 기억하게 하는 것이다. 이를 연결리스트라 한다. (Linked List) - 이제 첫 값인 1은 2의 주소를 갖고, 2는 3의주소를, 3은 Null을 갖게 된다. * 노드 - 연결리스트를 C언어 코드로 구현하면 다음과 같은 구조체로 정의한다. typedef struct node { int..
<리액트 기초> useMemo & useCallback * useMemo - 지난 장에서 보았던 컴포넌트를 이어보자. function getWinNumbers() { // winNumbers라는 배열에 숫자 6개를 넣어서 반환하는 함수 } const Test0 = () => { const [winNumbers, setWinNumbers] = useState(getWinNumbers()); const [winBalls, setWinBalls] = useState([]); const [redo, setRedo] = useState(false); const timeouts = useRef([]); //... } - 여기서 개선할 사항이 하나있다. 함수형 컴포넌트는 state의 변경에 의해서 랜더링 될때마다 컴포넌트 전체가 다시실행된다. 즉 여기서는 state가 바..
<리액트 기초> useEffect * useEffect - 지난 장에서도 봤듯이 useEffect는 Hooks에서 componentDidMount, componentDidUpdate, componentWillUnmount의 역할을 한다. - 이번 장과 다음 장에서 다룰 예시는 함수로 랜덤한 숫자 6개를 배열에 담고, 그 숫자들을 1초간격으로 하나씩 보여주는 것이다. 추가로 버튼을 누르면 새로운 숫자 6개로 다시 시작한다. function getWinNumbers() { // winNumbers라는 배열에 숫자 6개를 넣어서 반환하는 함수 } const Test0 = () => { const [winNumbers, setWinNumbers] = useState(getWinNumbers()); const [winBalls, setWinBal..
<자바스크립트> 배열 (2) 반복, 탐색, 정렬 메서드 4. 반복 메서드 * forEach - forEach는 배열 요소 각각에 원하는 함수를 실행하도록 한다. - arr.forEach(function(itme, index, array) { } ); 와 같이 사용한다. let arr = ["HARRY", "IU", "SUZY"]; arr.forEach(alert); // 원소 각각의 알럿창을 보여줍니다. arr.forEach( (item, index, array) => { alert(`${item}은 ${index + 1} 번째에 있으며, ${array}에 속합니다.`); } ); // HARRY // IU // SUZY // HARRY은 1 번째에 있으며, HARRY,IU,SUZY에 속합니다. // IU은 2 번째에 있으며, HARRY,IU,SUZY에 속합..
<리액트 기초> setInterval 사용하기 1. 리액트 라이프 사이클 * 라이프 사이클 - 클래스 컴포넌트에서는 랜더링이 되는 순간, 즉 컴포넌트가 돔에 붙는 순간 특정 기능을 실행할 수 있다. 그리고 리랜더링 될 때, 컴포넌트가 제거될 때에도 특정 기능을 부여할 수 있다. - componentDidMount() : 컴포넌트가 첫 랜더링 되는 순간 실행할 함수를 선언할 수 있다. 주로 비동기 요청( ex. setInterval)을 많이 넣는다. - componentWillUnmount() : 컴포넌트가 지워지기 직전에 실행되며 주로 componentDidMount에서 정의된 동작을 정리하기 위함이다. 세트로 묶어서 작성해야한다. 대부분 부모가 현 컴포넌트를 제거할 때 실행된다. - componentDidUpdate() : 리랜더링 후에 실행되는 ..
<컴퓨터 구조> 메모리 교환, 스택, 힙 1. 메모리 교환 * 메모리 교환 - 변수 두 개의 값을 서로 바꾸는 함수를 만들어 보자. - 먼저 변수 두 개의 값을 바꾸려면 임시 변수(tmp)를 만들어서 넣어가며 바꿔야 한다. - 이를 구현하면 다음과 같을 것이다. #include void swap(int a, int b); int main(void) { int x = 1; int y = 2; printf("x is %i, y is %i\n", x, y); // x is 1, y is 2 swap(x, y); printf("x is %i, y is %i\n", x, y); // x is 1, y is 2 } void swap(int a, int b) { int tmp = a; a = b; b = tmp; } - 함수 내에서 값을 교환하는 것 같지만..
<메모리> 문자열과 메모리 1. 문자열 * 문자열 - cs50수업을 듣는 동안 string 자료형을 사용하기 위해서 cs50라이브러리를 사용했다. - 이 때의 문자열은 문자의 배열이므로 다음과 같이 메모리에 저장된다. (종단문자포함) - 실제로 c언어에는 string이라는 별도의 자료형은 존재하지 않으며, cs50라이브러리에서는 string을 다음과 같이 정의해두었다. typedef char *string - 따라서 string타입의 정의 없이 문자열을 출력하려면 다음과 같이 작성한다. #include int main(void) { char *s = "HARRY"; printf("%s\n", s); // HARRY printf("%p\n", s); // 0x402002 } - 이 때 포인터를 출력하면 문자열의 가장 첫 값인 H에 ..