Coding/Today I Learned (148)

05
29

1. 객체의 배열의 배열

  • 이게 무슨 소리인가 싶지만 나는 obj [str [i]] 이러한 객체를 말하고 싶었다.
  • 만약, 배열에 있는 스트링 혹은 숫자들을 하나씩 사용해야 할 때 사용할 수 있다.
  • 결국, obj[str[i]]는 obj의 key로 str [i]라는 배열의 요소들을 다 사용하는 것이다.
  • obj [str [i]]은 반환하면 값이 나온다.

2. key 와 value의 차이와 구분

  • key는 배열안의 정말 값을 연결하는 'key'와 같다.
  • value는 키로 연결된 담겨있는 정보이다.
  • 반복문과 if 사이에서 충분히 헷갈리는 것을 주의하자. 무엇을 반환하면 키가 나오고, 어떤 것을 반환하면 값이 나오는지 잘 구분해야 한다.

Object.key(obj)는 키, Object.values(obj)는 값, Object.entries(obj)는 둘 다, 배열로 반환이 가능하다!

조금 쉬어가는 날이 되었다. 잠을 너무 안 자서 건강을 챙기는 날이 되었다.
아직 배열부분이 조금 헷갈린다. 용어 정리와 코드를 보기 좋게 작성하는 법을 마저 정리하고, 배열 부분을 조금 더 보면 될 것 같다.
스코프와 클로저의 관계를 생각보다 빨리 알았다. 천천히 따져보면 우리는 계속 그 둘을 구분해서 잘 사용하고
있었다!

'Coding > Today I Learned' 카테고리의 다른 글

2021.05.31(Mon.)  (0) 2021.06.01
2021.05.30(Sun.) <깨끗한 코드>  (0) 2021.05.30
2021.05.28(Fri.) <스코프와 클로저>  (0) 2021.05.28
2021.05.27(Thu.) <CSS로 틀 만들기, Flex>  (0) 2021.05.27
2021.05.26(Wed.) <Break, Continue)  (0) 2021.05.26
COMMENT
 
05
28

1. 원시자료형(Primitive)과 참조 자료형(reference)

  • 원시 자료형 : number, string, boolean, null, undefined처럼 박스의 이름을 선언하고,
      이름을 호출 하면 안에 담긴 내용이 나온다.
  • 참조 자료형 : array, object처럼 박스의 이름을 정하는 것이 아닌, ''박스들이 모여있는 창고'의 '주소' (heap)을 적어놓고,
     호출 시 그 창고의 주소를 찾아가서, 안의 박스의 내용물을 꺼낸다.
    • 뭐가 다르죠? : 원시타입은 '하나의 덩어리'로, 저장해서 불러오기 한다. 하지만 참조 타입은
       자료 자체가 하나의 덩어리가 아닌, 각각의 자료들로 저장되기 때문에, 자료의 길이나 종류가 많아지면 저장공간이 너무 늘어나고, 자료를 따로 수정하기가 곤란하다.
       그래서 큰 창고에 박스들에 자료를 담아두고, 그 창고 주소만을 불러오게 된다!
    • 그게 왜 중요하죠? : 각 자료들을 복사했을 때, 원시 자료형은 기존의 자료와 복사본은 별개로 움직인다.
       각각 다른 것들이 된다. 하지만, 참조 자료형은 복사한 자료의 '주소'를 복사했기 때문에 자료를 수정하면 주소 안의 원래 자료도 수정된다!! : 그래서 우리는 resullt를 string이나 number로 선언 해 놓고,
       result = result + '계산 한 값'을 제할 당 하여 result를 반환한 것이다!
    •  ! : 그래서 우리는 slice로 잠깐! 배열이나 객체를 복사해 수정한 후, 반환할 수 있다!
      원본 배열이나 객체는 바뀌지 않았다!

2. 스코프

  • 내가 보는 범위를 정해준다!
  • 즉, 스코프는 괄호(if나 for나, function) 안의 범위를 말한다. 그 밖으로 가면 그 안에 선언된 변수 등은 접근이 불가능하다.
  • 반대로 스코프 밖에서 선언된 것들은 계속 사용이 가능하다!
  • 그러므로 스코프들에서 선언된 변수들은 스코프를 울타리로 만들어서 계속 쌓여간다. 울타리 안으로 올 수록 더 높은 우선순위가 된다
    • 전역 스코프 : 가장 밖의 울타리
    • 지역 스코프 : 전역 스코프의 안쪽에 있는 스코프 들
      • 선언을 함수 안에서 하면, 함수 안에서만 작동하는 변수가 되고,
      • 선언이 밖에서 된 체로 들어와 함수 안에서 제할 당 되면 함수를 빠져나오고 나서도 계속 제할당 된 체로 살아간다.
    • - 주의! : 함수 밖에서 선언된 것이, 함수 안으로 들어와 다시 할당되는 경우

3. 스코프의 종류

  • block scope : 중괄호를 사용해 범위를 정해줌 (if 나 for)
  • function scope : 말 그대로, 함수 스코프. 함수의 범위를 정해준다.
    • '화살표 함수'는 블록 스코프가 된다.
      • 화살표 함수..? : function 빼고 식별자 선언해 주고 소괄호와 중괄호 사이에 넣어서 함수를 만든 것.
    • 'var' 키워드를 사용하면 블록 스코프 안에 선언된 변수를 블럭 스코프 밖에서도 사용할 수 있다. 하지만, 헷갈리니까 'let'을 사용하자.
      • let은 매우 안전한 키워드다. 변수가 재선 언 되는 경우를 막아주기 때문이다.
      • 사실 브라우저에서는 'window'라는 객체를 가지고 있다. var은 window에 속한다.
  • 'const' 키워드를 사용하면 변수의 값을 변하지 않게 할 수 있다.
    • let과 마찬가지로 재선언을 막아주며, 재할당 까지 막아버려 값의 변화를 최소화시켜 안전한 프로그램을 만들 수 있다.
  • 전역 변수에 너무 많은 것들을 넣지 말자. 예측할 수 없는 문제들이 발생하고, 헷갈린다. 심지어 여러 명이 작업했다면 더더욱... 전역 변수를 줄이는 활동을 side effect라고 한다.
    - Strict Mode : 브라우저에서는 'use strict'; 를 첫 번째 줄에 적어서 선언이 없는 변수를 오류로 보게 할 수 있다!

4. 클로저

클로저를 알기 위해서는 먼저, 어휘적 환경을 알아야 한다.

  • 어휘적 환경( Lexical Environment) : 함수가 선언되면 그 함수의 스코프 안에서 변수를 찾아 사용한다. 하지만 그 스코프 안에 변수를 찾을 수 없다면, 그 스코프의 밖의 스코프로 가서 다시 변수를 찾는다. 이렇게 전역 스코프까지 가서 변수를 찾게 된다. 이때, 우리는 그 환경을 어휘적 환경이라고 한다.
  • 클로저 : 아래의 예시로 함수가 두 개인 경우를 보면 알 수 있다.
const adder = function (x) { // 변수 x를 먼저 선언 하면서 외부 함수를 만듬.
    return function (y) { // 그 안에 또 다른 함수를 반환.
        return x + y;    // 이때, 내부 함수 안에 y는 있지만, x를 외부에서 가져옴.
    }                    // 내부의 y는 외부에서 사용할 수 없지만, 외부에서 선언한
}                        // x는 사용가능! 이때 x가 클로저 함수가 됨.
  • 왜 클로저를 사용합니까? : 외부 함수의 실행이 끝나 값을 반환해도, 또다시 외부 함수의 변수를 사용할 수 있기 때문!
    • 선언한 변수와 함수를 꽁꽁 숨겨서 프로그램이 다른 프로그래머들이 보수했을 때도 오류를 발생하지 않게 한다. 일명, 정보의 '캡슐화'로 전역 변수를 최대한 줄인다.
    • 특정한 데이터를 스코프로 가두어서 계속 사용할 수 도 있다! 하나의 함수를 계속 사용해서 효율적으로 데이터와 메서드를 다룬다. 일명, '모듈화'

간단하게 말하면, 외부 함수의 변수에 접근할 수 있는 내부 함수...
 의 특징을 가지고 있는데 이렇게 말해도 된단다.

여담 : 내 생각에 클로저는 함수 자체를 변수로 선언해서, 그 함수가 끝나도 다시 변수가 된 함수를 가져와서 계속 쓰는 것 같다. 그래서 'Closure' 일명, 닫친 거 즉, 범위를 정해준 느낌이 든다. 함수는 자신의 스코프가 닫치면 더 이상 선언된 것들을 사용하지 못한다. 그래서 그 닫은 범위를 들고 다니면서 다음에도 사용할 수 있도록 만들어 주는 느낌? 이 든다. 사실 뭔가 시원하지가 않다. 더 알아봐야 할 것 같다.

COMMENT
 
05
27

1. CSS의 셀렉터

  • , (쉼표)는 각 태그들을 구분하여 전부 선택한다.
  • id와 class를 선택할 때는 각각 # 과. (온점)을 사용하고 다른 기호들로 연결되지 않아 있으면 두 개를 동시에 만족시키는 부분을 선택한다.
  • 띄어쓰기로 구분된 엘리먼드들은 '후손'을 말한다.
  • +는 같은 계층일 때 뒤에 올 + 해준 태그의 요소 하나만을 선택한다.
  • ~는 같은 계층일때 뒤에 올 ~ 해준 태그의 요소 전부를 선택한다.
  • 엘리먼트[속성]를 넣어서 특정 태그들 중에 속성이 동일한 것만 선택할 수 있다.
  • p와 자식 엘리먼트(2n + 1)를 쓰면 '홀수'번 째 자식 엘리멘트만 선택할 수 있다.
    • 나머지 응용도 가능하다! 후손을 쓴다던지 말이다.
  • nth-last-child는 모든 자식 요소들 중에 앞에서부터 n번째 위치한 자식 요소를 말한다.

2. 후손 셀렉터와 자식 셀렉터

  • 후손 셀렉터 : 태그의 아래에 있는 모든 아래의 요소들을 선택한다. (가장 포괄적 요소 아래의 '공백 있어욧!' 이 요소를 선택한다.')
  • 자식 셀렉터 : 태그 바로 아래 오는 태그. (부모가 될 요소 > 자식이 되는 이 요소를 선택한다.')

3. Flex

  • 자식 박스의 방향과 크기를 정해줄 수 있는 유동적인 방식으로 레이아웃을 잡는 방법.
  • flex는 '자손' 셀렉터만 적용된다! (자식은 바로 직계고, 후손은 그냥 그 아래 쭉인데,
     자식은 누군지 알지만, 후손은 모르는 것처럼 flex는 자식 한태만 영향을 준다)
  • flex-direction 속성은 자식에 적자.
  • 왼쪽부터 차례대로 수평으로 자식 박스를 배치한다.
    • 원래는 수평(row) 방향이다. 하지만, column으로 수직방향으로도 정렬이 가능하다.
  • flex: 0 1 auto;로 기본값이 설정되고, 따로 지정해 줄 수 있다.

4. grow(팽창 지수), shrink(수축 지수), basis(기본 크기)

  • flex를 기본값으로 잡았다면,
     이 각 속성들도 flex: <grow>(0) <shink> (1)<basis>(auto)와 같으며 마찬가지로, 따로 지정도 가능하다.
  • 이들은 상대 크기를 가지고 있어서 자식 박스들의 비율에 따라 크기가 달라진다!
  • 즉, 하나만 바꿔도 모든 자식 박스가 다 바뀐다는 말씀.
     하지만 상대적인 비율은 넘을 수 없기 때문에, 정렬에 용의 하다!
    ! 주의 : grow와 shrink를 함께 수정하지는 않는다. 비율로 크기를 지정하기 때문에,
     grow를 변경하고 나면, shrink로 다시 줄인다? 그럼 결과가 뭐가 나올지 잘 예측이 안 되기 때문이다!

5. basis(기본 크기)의 자세한 설명

  • grow와 shrink로 조절하려고 하는 기본적인 전체 박스의 레이아웃의 크기를 말한다.
  • width보다 먼저 적용된다.
  • 만약 자식 박스에 콘텐츠를 추가되는 기능이 있어서 엄청나게 많아지면? width로 설정 시, 겹쳐진다던지 원하는 그림이 나오지 않을 것이다.
     이때, flex-basis로 비율을 계속 유지한 채로 추가할 수 있다!

6. 콘텐츠 정렬

  • flex-direction: column; : 위에서 아래로(-reverse 밑으로 내려서 가능, column 없으면 기본값으로 row)
  • justify-content : 중심값을 기준으로 정렬(일명, 수평 정렬)
    • flex-start; : 맨 앞(왼쪽)으로 정렬
    • center; : 중앙으로 정렬(수평 기준)
    • space-between; : 자식 박스의 수평을 맞춰놓고 사이 간격을 띄어서 정렬
    • flex-end; : 맨 뒤(오른쪽)로 정렬
    • space-around : 같은 길이로 띄어줌
  • align-items : 중심값을 반대 기준으로 정렬(일명, 수직정렬)
    • start; : 맨 앞(최상단)으로 정렬
    • center; : 중앙으로 정렬(수직기준)
    • stretch; : 수평으로 가득 차게 정렬
    • end; : 맨 뒤(최하단)로 정렬
    • baseline : 중심점을 잡아준다. 그곳을 기준으로 잡아준다.

7. CSS에 유용한 메서드

  • flex-nowrap : 줄 넘어가도 밑으로 안 내려가고 계속 나온다!
  • (클래스나 id) hover : 마우스 올렸을 때 뭔가 된다.

CSS에 사용하는 메서드나 태그들을 좀 외워도 좋을 것 같다. 찾아 쓰면 되지만 조금 아쉽다.
Gti 사용법을 조금 더 숙지하면 좋을것 같다. 할 수는 있지만, 아직 조금 두렵다ㅋㅋ

COMMENT
 
05
26

1. 빈 배열의 특성

  • '주소 값이 다르다'라는 말은 한 개의 배열 칸을 벗어나서, 다른 배열에 있다고 생각하면 된다.
     그래서 빈 배열을 더해주면 다른 배열이 된다!
    • 그래서 대부분 간단하게 length를 통해 빈 배열인지 확인하게 된다. 가장 간단하기 때문에!
  • 배열은 순서가 중요하다!

2. 우리가 많이 쓰는 slice에 대한 고찰

  • 슬라이스는 복사 하는 느낌이 강하다. 왜? 원본은 변하지 않고, 자른 것만 반환하기 때문이다.
  • 시작점(이상)부터 끝점(미만) 까지를 말한다.

3. 어려운 객체를 다시 생각해 보자

  • '키'와 '벨류'는 항상 함께 하자.
    - 객체는 의미가 중요하다!

4. for문 안의 in과 of

  • for문안의 모든 key 값들을 전부 훍는다.(for...in은 객체, for... of는 배열)
    • 이때, key의 벨류를 호출 하려면 key값의 이름[key] 하면 다 나온다!
      • 브래킷 노테이션만 벨류를 가져올 수 있다는 것을 이용하면 알 수 있다

5. 배열의 판단

  • arr.length === 0
  • ! arr.length (0은 falsey값이기 때문에 가능!)

6. break

  • 반복문을 작성 후 원하는 조건을 달성한 후에 그 부분까지 끊어 버린다.

7. continue

  • 조건을 만족 하면서 진행될 때, 원하는 조건을 만족시킨 부분은 넘어서고 나서 다시 진행된다.
 굳이, 나온 결과를 컴퓨터 힘들게 괴롭히지 말자.
멈춰주거나 필요없을 때는 건너뛰어서 인간미를 보여주자
COMMENT