no image
[Javascript] 피보나치 수열 - 알고리즘
피보나치 수열이란? 수학에서 피보나치 수(영어: Fibonacci numbers)는 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다. 처음 여섯 항은 각각 1, 1, 2, 3, 5, 8이다. 편의상 0번째 항을 0으로 두기도 한다. 출처 - 위키백과 피보나치 수열 구현 피보나치 수열을 구현하는 방식은 다양하지만 여기서는 재귀 함수를 이용한 방식과 재귀 함수의 문제점을 개선한 메모이제이션(Memoization) 기법을 사용할 예정이다. 구현해야 할 것 1. 인자에 n을 넣었을 때 피보나치 수열의 n 번째 값을 return [ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ... ] 2. n = 1일때와 n = 2일 때는 1을 return 1. 재귀 함수를 이용해 ..
2022.11.03
no image
[Javascript] 형 변환
형 변환 NaN : Not a Number NaN은 다른 모든 값과 비교 했을 때에도 같지 않고, 다른 NaN과도 같지 않다. let string = "ryzen"; let num = 9; let bool = true; // 숫자형으로 형 변환 console.log(Number(string)); // NaN console.log(Number(bool)); // 1 // 문자열로 형 변환 console.log(String(num)) // 9 console.log(String(bool)) // true // 불린형으로 형 변환 console.log(Boolean(string)) // true console.log(Boolean(num)) // true 자동 형 변환 + 연산 시 자동 형 변환 + 연산은 문자..
2022.11.03
no image
[Javascript] 다양한 함수 선언 방법
함수란? 코드의 집합을 나타내는 자료형 반복되는 코드를 정의해 놓고 필요할 때마다 호출하므로 반복 작업을 피할 수 있음 기능별로 나눠 함수를 작성해 놓으면 유지보수가 쉬워짐 🌟함수도 값이다🌟 함수 선언식 (Function Declarations) 호이스팅이 일어나지만 가독성은 좋다. // 함수 선언 function 함수이름(매개변수) { // 함수 호출시 실행될 코드 } // 함수 호출 함수이름(인자) // 함수 선언 function showMessage() { console.log("Hello"); } // 함수 호출 showMessage(); // 함수의 호이스팅 showMessage(); // 함수 선언전에 호출 // 함수 선언 function showMessage() { console.log("H..
2022.11.02
no image
[Javascript] 함수
함수 함수 선언 방법 및 호출 매개변수[Parameter] : 함수 내부에서만 사용할 수 있는 변수 인자[Argument] : 함수 호출 시 매개변수에 들어갈 값 // 함수 선언 function 함수이름 (매개변수[Parameter]) { // 함수가 호출되었을 때 실행할 코드 } // 함수 호출 함수이름(인자[Argument]); // 함수 선언 시 매개변수 초기값 지정 function 함수이름 (매개변수[Parameter] = 초기값) { // 함수가 호출되었을 때 실행할 코드 } // 함수 호출 함수이름(인자[Argument]); 함수 사용 이유 중복 코드를 피하기 위함 가독성을 높여줌 // 레드벨벳 멤버 이름 출력 [함수 미 사용] let name = "주현"; console.log("이름 : "..
2022.11.01
no image
[Javascript] 변수와 상수
변수 변수 선언 변수 선언 시 초기화 // [변수 선언 예약어] [변수명] = [값] let num = 1; console.log(num); // 1 변수 선언 후 초기화 // [변수 선언 예약어] [변수명] // [변수명] = [값] let num; num = 1; console.log(num); // 1 변수 선언 및 초기화 후 재 할당 let num = 1; num = 2; console.log(num); // 2 변수 선언 및 초기화 후 재 선언 [불가능] let num = 1; let num = 2; Uncaught SyntaxError: Identifier 'num' has already been declared 상수 상수 선언 상수 선언 시 초기화 // [변수 선언 예약어] [변수명] = [..
2022.10.31
no image
[Javascript] 연산자
연산자 산술 연산자 + - * / % console.log(1 + 1); // 2 console.log(2 - 1); // 1 console.log(3 * 3); // 9 console.log(4 / 2); // 2 console.log(5 % 2); // 5를 2로 나눈후 나머지 값 1 대입 연산자 = 변수 선언이나 값 할당 시 사용한다. 대입 연산자 우측에 있는 값을 왼쪽에 넣는다고 볼 수 있다. let num = 1; const num2 = 2; 단항 산술 연산자 ++ -- // 선반영 let num = 1; console.log(++num); // 2 console.log(num); // 2 // 후반영 let num = 1; console.log(num++); // 1 console.log(nu..
2022.10.28
no image
[HTML/CSS] CSS 선택자
CSS는 HTML을 꾸미기 위해서 사용한다. HTML을 꾸미려면 특정 엘리먼트를 선택해야 하는데 이때 사용하는게 CSS 선택자이다. CSS 선택자는 크게 5종류로 나눌 수 있다. 기본 선택자 * element .(class) #(id) [attr](특성) Hello * { background: red; } /* 전체 선택 */ div { height: 300px; } /* div 요소 전체 선택 */ .header { width: 100px; } /* header라는 class를 가진 요소 선택 */ #footer { margin: 0 auto; } /* footer라는 id를 가진 요소 선택 */ input[type="radio"] { display: none; } /* input 요소 중 type 속..
2022.10.28
no image
[Javascript] Javascript란?
인터프리터 언어이다. Frontend와 Backend를 같이 할 수 있는 언어이다. 브라우저에서 동적 요소를 프로그래밍하는 언어이다. 컴파일 언어 번역기가 번역을 하듯이 내가 작성한 언어를 컴파일러가 기계어로 변환을 해줌 100줄의 코드가 한번에 변환됨 인터프리터 언어 or 스크립트 언어 기계가 알아서 코드를 해석해서 결과물까지 도출해 준다 한줄을 실행할 때마다 변환됨 Java vs Javascirpt java는 객체지향 언어 ( c++) javascript는 prototype 언어 python은 함수형 언어 Javascript 장점 타입 지정이 없음 처음 배우는 사람에게 좋음 Javascript 사용하는 방법 브라우저 자체 console 창 이용 html 파일에서 작성 html 파일에서 javascri..
2022.10.28

피보나치 수열이란?


수학에서 피보나치 수(영어: Fibonacci numbers)는 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 
수열이다. 처음 여섯 항은 각각 1, 1, 2, 3, 5, 8이다. 편의상 0번째 항을 0으로 두기도 한다.
출처 - 위키백과

피보나치 수열 구현


피보나치 수열을 구현하는 방식은 다양하지만 여기서는 재귀 함수를 이용한 방식과 재귀 함수의 문제점을 개선한 메모이제이션(Memoization) 기법을 사용할 예정이다.

구현해야 할 것
1. 인자에 n을 넣었을 때 피보나치 수열의 n 번째 값을 return [ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ... ]
2. n = 1일때와 n = 2일 때는 1을 return

1. 재귀 함수를 이용해 피보나치 수열 구현

먼저 재귀 함수를 이용해 피보나치 수열을 구현해 보자.

피보나치 수열의 n번째 항의 값은 (n-1) 번째 항과 (n-2) 번째 항의 합과 같다.

그리고 n=1일때와 n=2일 때는 값이 이다.

function fibo(n) {
  if (n === 1 || n === 2) {
    return 1;
  }
  return fibo(n - 1) + fibo(n - 2);
}

처음에는 위와 같이 코드를 작성했다.

n=1일 때와 n=2일 때는 조건문을 사용해 1을 return 해주고 그렇지 않다면 (n-1)항과 (n-2) 번째 항을 더한 값을 return 하도록 작성했다.

하지만 이 코드에는 문제가 있다.

바로 같은 계산을 또 한다는 것이다.

console.log(fibo(6));
  • fibo(1) => 1
  • fibo(2) => 1
  • fibo(3) => fibo(2) + fibo(1)
  • fibo(4) => fibo(3) + fibo(2) => fibo(2) + fibo(1) + fibo(2)
  • fibo(5) => fibo(4) + fibo(3) => fibo(3) + fibo(2) + fibo(2) + fibo(1) => fibo(2) + fibo(1) + fibo(2) + fibo(2) + fibo(1)
  • fibo(6) => fibo(5) + fibo(4) => fibo(4) + fibo(3) + fibo(3) + fibo(2) => fibo(3) + fibo(2) + fibo(2) + fibo(1) + fibo(2) + fibo(1) + fibo(2) => fibo(2) + fibo(1) + fibo(2) + fibo(2) + fibo(1) + fibo(2) + fibo(1) + fibo(2)

보이는 것과 같이 같은 계산이 반복되고 n의 값이 클 수록 반복되는 부분이 많아지고 있다.

그렇다면 이미 저장한 값은 저장해 놓으면 어떨까?

2. 메모이제이션 기법을 사용해 피보나치 수열 구현

메모이제이션(Memoization) 기법이란?
- 한 번 구한 결과를 메모리 공간에 메모해 두고 같은 식을 다시 호출하면 메모한 결과를 그대로 가져오는 기법이다.
- 다이나믹 프로그래밍을 구현하는 방법 중 한 종류

메모이제이션 기법을 사용해 반복되는 값은 저장해 놓았다가 그 값이 필요할 때 사용하면 조금 더 속도가 빨라질 것 같다.

let memo = {};

function fibo(n) {
  let result;

  if (n in memo) {
    result = memo[n];
  } else {
    if (n == 1 || n == 2) {
      result = 1;
    } else {
      result = fibo(n - 1) + fibo(n - 2);
    }
    memo[n] = result;
  }
  return result;
}

재귀 함수 코드를 다음과 같이 수정해보았다.

일단 값을 저장할 memo라는 객체를 전역으로 선언하고 함수를 선언했다.

함수를 살펴보면 이전 코드와 유사하다.

다른 점이라면 만약 객체 memo에  n이라는 속성명이 존재한다면 result에 memo 객체의 n이라는 속성명을 가진 속성 값을 대입해 준다는 점이다.

만약 속성명이 존재하지 않는다면 재귀함수 코드를 실행한 다음 결과 값을 result에 대입해준 후 memo객체의 n이라는 속성명으로 result 값을 대입해준다.

console.log(fibo(6));
console.log(memo);

메모이제이션 실행 결과

두 방식의 실행 속도 차이


두 방식의 속도가 어느정도 차이나는 지 한번 확인해 보자

n값이 클 수록 차이가 많이 난다.

console.time("피보나치 - 재귀함수");
function fibo(n) {
  if (n === 1 || n === 2) {
    return 1;
  }
  return fibo(n - 1) + fibo(n - 2);
}

fibo(50);
console.timeEnd("피보나치 - 재귀함수");

재귀함수로 피보나치 수열의 50번째 값을 구한 시간

console.time("피보나치 - 메모이제이션");
let memo = {};

function fibo(n) {
  let result;

  if (n in memo) {
    result = memo[n];
  } else {
    if (n == 1 || n == 2) {
      result = 1;
    } else {
      result = fibo(n - 1) + fibo(n - 2);
    }
    memo[n] = result;
  }
  return result;
}

fibo(50);
console.timeEnd("피보나치 - 메모이제이션");

엄청난 속도의 차이를 볼 수 있다!

마무리


 

어떤 코드가 더 좋은 코드인가는 상황에 따라 다를 수 있다.

n 값이 크지 않다면 두 코드의 속도 차이는 거의 없었다. (오히려 재귀 함수 코드가 더 빠를 때도 있었다.)

n 값이 작은 상황에서는 읽기 쉽고 이해하기 쉬운 재귀함수를 이용한 코드가 더 좋다고 생각한다.

하지만 n 값이 커지게 되면 속도 차이가 매우 벌어지는 결과를 볼 수 있듯이 n 값이 큰 상황에서는 메모이제이션 기법을 사용한 코드가 더 좋다고 생각한다.

결국 좋은 코드를 작성하려면 상황을 잘 파악해야 된다고 생각한다.

 

'Javascript' 카테고리의 다른 글

[Javascript] DOM(Document Object Model)  (0) 2022.11.08
[Javascript] 객체  (0) 2022.11.04
[Javascript] 형 변환  (0) 2022.11.03
[Javascript] 다양한 함수 선언 방법  (0) 2022.11.02
[Javascript] 함수  (0) 2022.11.01

[Javascript] 형 변환

CloudCoke
|2022. 11. 3. 15:38

형 변환

  • NaN : Not a Number
  • NaN은 다른 모든 값과 비교 했을 때에도 같지 않고, 다른 NaN과도 같지 않다.
let string = "ryzen";
let num = 9;
let bool = true;

// 숫자형으로 형 변환
console.log(Number(string)); // NaN
console.log(Number(bool)); // 1

// 문자열로 형 변환
console.log(String(num)) // 9
console.log(String(bool)) // true

// 불린형으로 형 변환
console.log(Boolean(string)) // true
console.log(Boolean(num)) // true

변수들을 형 변환해 출력한 결과

자동 형 변환

+ 연산 시 자동 형 변환

  • + 연산은 문자열을 연결하는 기능이 강함
  • 문자열 + 문자열을 제외한 데이터 타입 ⇒ 문자열로 형 변환 후 + 연산
  • 문자열을 제외한 데이터 타입 + 문자열을 제외한 데이터 타입 ⇒ 숫자형으로 형 변환 후 + 연산
  • NaN+ 연산을 하면 NaN 이 나옴
let string = "ryzen";
let num = 9;
let bool = true;

console.log(string + num); // ryzen + 9 => ryzen9
console.log(string + bool); // ryzen + true => ryzentrue
console.log(num + bool); // 9 + 1 => 10

변수들을 + 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("NaN과 + 연산");
console.log(NaN + string); // NaN + ryzen => NaNryzen
console.log(NaN + num); // NaN + 9 => NaN
console.log(NaN + bool); // NaN + 1 => NaN

변수들을 NaN과 + 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("undefined와 + 연산");
console.log(undefined + string); // undefined + ryzen => undefinedryzen
console.log(undefined + num); // NaN + 9 => NaN 
console.log(undefined + bool); // NaN + 1 => NaN

변수들을 undefined와 + 연산한 결

let string = "ryzen";
let num = 9;
let bool = true;

console.log("null과 + 연산");
console.log(null + string); // null + ryzen => nullryzen
console.log(null + num); // 0 + 9 => 9
console.log(null + bool); // 0 + 1 => 1

변수들을 null과 + 연산

- * / % **연산 시 자동 형 변환

  • 연산 되는 두 값을 모두 숫자형으로 변환한 후 연산
  • NaN- * / % **연산을 하면 NaN이 나옴

- 연산 시 자동 형 변환

// - 연산 
let string = "ryzen";
let num = 9;
let bool = true;

console.log(string - num); // NaN - 9 => NaN
console.log(string - bool); // NaN - 1 => NaN
console.log(num - bool); // 9 - 1 => 8

변수들을 - 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("NaN과 - 연산");
console.log(NaN - string); // NaN - NaN => NaN
console.log(NaN - num); // NaN - 9 => NaN
console.log(NaN - bool); // NaN - 1 => NaN

변수들을 NaN과 - 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("undefined와 - 연산");
console.log(undefined - string); // NaN - NaN => NaN
console.log(undefined - num); // NaN - 9 => NaN 
console.log(undefined - bool); // NaN - 1 => NaN

변수들을 undefined와 - 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("null과 - 연산");
console.log(null - string); // 0 - NaN => NaN
console.log(null - num); // 0 - 9 => -9
console.log(null - bool); // 0 - 1 => -1

변수들을 null과 - 연산한 결과

* 연산 시 자동 형 변환

// * 연산
let string = "ryzen";
let num = 9;
let bool = true;

console.log(string * num); // NaN * 9 => NaN
console.log(string * bool); // NaN * 1 => NaN
console.log(num * bool); // 9 * 1 => 9

변수들을 * 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("NaN과 * 연산");
console.log(NaN * string); // NaN * NaN => NaN
console.log(NaN * num); // NaN * 9 => NaN
console.log(NaN * bool); // NaN * 1 => NaN

변수들을 NaN과 * 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("undefined와 * 연산");
console.log(undefined * string); // NaN * NaN => NaN
console.log(undefined * num); // NaN * 9 => NaN 
console.log(undefined * bool); // NaN * 1 => NaN

변수들을 undefined와 * 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("null과 * 연산");
console.log(null * string); // 0 * NaN => NaN
console.log(null * num); // 0 * 9 => 0
console.log(null * bool); // 0 * 1 => 0

변수들을 null과 * 연산한 결과

/ 연산 시 자동 형 변환

// / 연산
let string = "ryzen";
let num = 9;
let bool = true;

console.log(string / num); // NaN / 9 => NaN
console.log(string / bool); // NaN / 1 => NaN
console.log(num / bool); // 9 / 1 => 9

변수들을 / 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("NaN과 / 연산");
console.log(NaN / string); // NaN / NaN => NaN
console.log(NaN / num); // NaN / 9 => NaN
console.log(NaN / bool); // NaN / 1 => NaN

변수들을 NaN과 / 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("undefined와 / 연산");
console.log(undefined / string); // NaN / NaN => NaN
console.log(undefined / num); // NaN / 9 => NaN 
console.log(undefined / bool); // NaN / 1 => NaN

변수들을 undefined와 / 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("null과 / 연산");
console.log(null / string); // 0 / NaN => NaN
console.log(null / num); // 0 / 9 => 0
console.log(null / bool); // 0 / 1 => 0

변수들을 null과 / 연산한 결과

% 연산 시 자동 형 변환

// % 연산
let string = "ryzen";
let num = 9;
let bool = true;

console.log(string % num); // NaN % 9 => NaN
console.log(string % bool); // NaN % 1 => NaN
console.log(num % bool); // 9 % 1 => 0

변수들을 % 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("NaN과 % 연산");
console.log(NaN % string); // NaN % NaN => NaN
console.log(NaN % num); // NaN % 9 => NaN
console.log(NaN % bool); // NaN % 1 => NaN

변수들을 NaN과 % 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("undefined와 % 연산");
console.log(undefined % string); // NaN % NaN => NaN
console.log(undefined % num); // NaN % 9 => NaN 
console.log(undefined % bool); // NaN % 1 => NaN

변수들을 undefined와 % 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("null과 % 연산");
console.log(null % string); // 0 % NaN => NaN
console.log(null % num); // 0 % 9 => 0
console.log(null % bool); // 0 % 1 => 0

변수들을 null과 % 연산한 결과

** 연산 시 자동 형 변환

// % 연산
let string = "ryzen";
let num = 9;
let bool = true;

console.log(string ** num); // NaN ** 9 => NaN
console.log(string ** bool); // NaN ** 1 => NaN
console.log(num ** bool); // 9 ** 1 => 9

변수들을 ** 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("NaN과 ** 연산");
console.log(NaN ** string); // NaN ** NaN => NaN
console.log(NaN ** num); // NaN ** 9 => NaN
console.log(NaN ** bool); // NaN ** 1 => NaN

변수들을 NaN과 ** 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("undefined와 ** 연산");
console.log(undefined ** string); // NaN ** NaN => NaN
console.log(undefined ** num); // NaN ** 9 => NaN 
console.log(undefined ** bool); // NaN ** 1 => NaN

변수들을 undefined와 ** 연산한 결과

let string = "ryzen";
let num = 9;
let bool = true;

console.log("null과 ** 연산");
console.log(null ** string); // 0 ** NaN => NaN
console.log(null ** num); // 0 ** 9 => 0
console.log(null ** bool); // 0 ** 1 => 0

변수들을 null과 ** 연산한 결과

비교 연산 시 자동 형 변환

관계 비교 연산 시 자동 형 변환

  • < <= > >= 연산 시 자동 형 변환
  • 특별한 경우를 제외하면 두 값 모두 숫자형으로 변환 후 연산
console.log(1 < "2") // 1 < 2 => true
console.log(2 <= true) // 2 <= 1 => false
console.log("3" > false) // 3 > 0 => true
console.log("four" >= 1) // NaN >= 1 => false

관계 비교 연산을 한 결과

같음 비교 연산 시 자동 형 변환

  • === !== == != 연산 시 자동 형 변환
  • **일치 비교(=== !==)**는 형 변환이 일어나지 않음
  • **동등 비교(== !=)**는 숫자형으로 형 변환이 일어남
// 일치 비교 (값과 타입까지 비교)
console.log(1 === 1) // 1 === 1 => true
console.log(1 === "1") // 1 === "1" => false
console.log(1 === true) // 1 === true => false
console.log(true === "1") // true === "1" => false

일치 비교 연산시 결과

// 동등 비교 (값만 비교)
console.log(1 == "1"); // 1 == 1 => true
console.log(1 == true); // 1 == 1 => true
console.log(true == "1"); // 1 == 1 => true
console.log("true" == 1); // NaN == 1 => false

동등 비교 연산시 결과

 

'Javascript' 카테고리의 다른 글

[Javascript] 객체  (0) 2022.11.04
[Javascript] 피보나치 수열 - 알고리즘  (0) 2022.11.03
[Javascript] 다양한 함수 선언 방법  (0) 2022.11.02
[Javascript] 함수  (0) 2022.11.01
[Javascript] 변수와 상수  (0) 2022.10.31

함수란?

  • 코드의 집합을 나타내는 자료형
  • 반복되는 코드를 정의해 놓고 필요할 때마다 호출하므로 반복 작업을 피할 수 있음
  • 기능별로 나눠 함수를 작성해 놓으면 유지보수가 쉬워짐

🌟함수도 값이다🌟

함수 선언식 (Function Declarations)

  • 호이스팅이 일어나지만 가독성은 좋다.
// 함수 선언
function 함수이름(매개변수) {
    // 함수 호출시 실행될 코드
}

// 함수 호출
함수이름(인자)
// 함수 선언
function showMessage() {
  console.log("Hello");
}

// 함수 호출
showMessage();

함수 선언식으로 함수 선언 후 호출

// 함수의 호이스팅
showMessage(); // 함수 선언전에 호출

// 함수 선언
function showMessage() {
  console.log("Hello");
}

함수 선언전 호출

익명 함수 (Anonymous Function)

  • 이름이 붙어 있지 않는(함수명이 없는) 함수
  • 호이스팅이 일어나지 않는다.
  • 선언 후 실행하지 않으면 에러가 난다.
  • 함수 표현식에서 사용한다.
// 익명 함수 선언
function (매개변수) {
    // 함수 호출 시 실행될 코드
}
// 익명 함수 선언만 한 경우
function (name) {
  console.log(name + "님 어서오세요!");
}

// 에러 메시지
Uncaught SyntaxError: Function statements require a function name

익명 함수를 선언만 할 경우

// 익명 함수 즉시 실행
(function (name) {
  console.log(name + "님 어서오세요!");
})("CloudCoke");

익명 함수를 즉시 실행한 경우

함수 표현식 (Function Expressions)

  • 호이스팅이 일어나지 않는다.
  • 가독성이 조금 떨어진다.
// 함수 선언과 동시에 변수 선언 및 변수 초기화
const 변수이름 = function (매개변수) {
    // 함수 호출시 실행될 코드
}

// 함수 호출
변수이름(인자)
const showMessage = function () {
  console.log("Hi");
};

// 함수도 값이다
console.log(showMessage);

// 함수 호출
showMessage();

함수 표현식으로 함수 선언 후 호출

화살표 함수 (Arrow Function)

  • 함수 표현식을 조금 더 간결한 문법으로 만드는 방법이다.
  • ES6에서 추가된 문법
// 기본적인 화살표 함수 선언
const 변수 이름 = (매개 변수) => {
    // 함수 호출 시 실행될 코드
}

// 함수 호출
변수 이름(인자)

화살표 함수 문법

// 함수 표현식으로 함수 선언시
const sum = function (a, b) {
  return a + b;
};

console.log(sum(1, 2));

함수 표현식으로 함수 선언 후 호출

// function 키워드 생략
const sum = (a, b) => {
    return a + b;
};

console.log(sum(1,2))

화살표 함수로 함수 선언 후 호출

// 함수의 유일한 문장이 return일 때 return 및 중괄호({}) 생략
const sum = (a, b) => a + b

console.log(sum(1,2))

화살표 함수 return 생략

// 만약 매개 변수가 1개일 경우에는 ()도 생략 가능(선택 사항)
// 매개 변수가 없는 함수는 () 필요!!!

// 함수 표현식
const sum = function (a) {
    return a + 1;
};

console.log(sum(1))

// 화살표 함수
const sumArrow = a => a + 1

console.log(sumArrow(1))

화살표 함수 () 생략

참고

'Javascript' 카테고리의 다른 글

[Javascript] 피보나치 수열 - 알고리즘  (0) 2022.11.03
[Javascript] 형 변환  (0) 2022.11.03
[Javascript] 함수  (0) 2022.11.01
[Javascript] 변수와 상수  (0) 2022.10.31
[Javascript] 연산자  (2) 2022.10.28

[Javascript] 함수

CloudCoke
|2022. 11. 1. 23:25

함수

함수 선언 방법 및 호출

  • 매개변수[Parameter] : 함수 내부에서만 사용할 수 있는 변수
  • 인자[Argument] : 함수 호출 시 매개변수에 들어갈 값
// 함수 선언
function 함수이름 (매개변수[Parameter]) {
    // 함수가 호출되었을 때 실행할 코드
}

// 함수 호출
함수이름(인자[Argument]);
// 함수 선언 시 매개변수 초기값 지정
function 함수이름 (매개변수[Parameter] = 초기값) {
    // 함수가 호출되었을 때 실행할 코드
}

// 함수 호출
함수이름(인자[Argument]);

함수 사용 이유

  • 중복 코드를 피하기 위함
  • 가독성을 높여줌
// 레드벨벳 멤버 이름 출력 [함수 미 사용]
let name = "주현";
console.log("이름 : " + name);
name = "슬기";
console.log("이름 : " + name);
name = "승완";
console.log("이름 : " + name);
name = "수영";
console.log("이름 : " + name);
name = "예림";
console.log("이름 : " + name);
// 레드벨벳 멤버 이름 출력 [함수 사용]
function redVelvet(name) {
  console.log("이름 : " + name);
}

redVelvet("주현");
redVelvet("슬기");
redVelvet("승완");
redVelvet("수영");
redVelvet("예림");

함수 동작 원리

  • Call Stack : 현재 실행 중인 기능을 추적하고, 계산을 수행한다.
  • LIFO(Last In First Out) 방식으로 Stack에 저장된다.
function a() {
  console.log("a 함수 호출");
  b();
  return 1;
}
function b() {
  console.log("b 함수 호출");
  c();
  return 2;
}
function c() {
  console.log("c 함수 호출");
  return 3;
}

a();

함수 실행 결과
1. Javascript가 실행되면 Global Execution Context(anonymous)가 생성되어 Call Stack에 추가된다.
2. a 함수를 호출하면 Call Stack에 a 함수를 추가하고 a 함수 호출을 콘솔에 출력한다.
3. a 함수 내부에서 b 함수를 호출한다.
4. b 함수 호출하면 Call Stack에 b 함수를 추가하고 b 함수 호출을 콘솔에 출력한다.
5. b 함수 내부에서 c함수를 호출한다.
6. c 함수를 호출하면 Call Stack에 c 함수를 추가하고 c 함수 호출을 콘솔에 출력한다.
7. return을 만나 c 함수를 종료한다.
8. c 함수가 종료되어 Call Stack에서 제거되고 다시 return을 만나 b 함수를 종료한다.
9. b 함수가 종료되어 Call Stack에서 제거되고 다시 return을 만나 a 함수를 종료한다.
10. a 함수가 종료되어 Call Stack에서 제거되고 Global Execution Context(anonymous)만 남는다.
11. 모든 실행이 완료되어 Global Execution Context(anonymous)도 Call Stack에서 제거된다.

함수의 호이스팅(Hoisting)

호이스팅(Hoisting)이란?

  • 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미한다.
  • 덕분에 함수를 호출하는 코드를 함수 선언보다 앞에 작성할 수 있다.

함수의 호이스팅(Hoisting)

showMessage();
function showMessage() {
  let text = "javascript";
  console.log("hello wolrd! " + text);
}

showMessage 함수 실행 결과
1. Javascript가 실행되면 Global Execution Context(anonymous)가 생성되어 Call Stack에 추가된다.
2. showMessage 함수가 호출되면서 Call Stack에 추가되고 showMessage 함수 내부에 있는 코드들이 실행된다.
3. showMessage 함수가 종료되어 Call Stack에서 제거되고 Global Execution Context(anonymous)만 남는다.
4. 모든 실행이 완료되어 Global Execution Context(anonymous)도 Call Stack에서 제거된다.

return문

  • 함수가 실행 중에 return문을 만나면 함수 실행을 종료한다.
  • 이때 return문 옆에 작성한 값을 함수를 호출한 지점으로 반환해 준다.
  • return문 뒤에 값이 없으면 undefined를 반환한다.
  • 함수에서 return문을 작성하지 않아도 기본으로 들어가 있다.
function showMessage() {
  console.log("hello world! 1");
  return;
  console.log("hello world! 2");
}

console.log(showMessage()); // undefined

return문의 함수 종료 시점과 return문 뒤에 값을 적어주지 않았을 때 결과

function showMessage() {
  return "hello world";
}

console.log(showMessage()); // hello world

return문 뒤에 값을 적어주었을 때 결과

참조

'Javascript' 카테고리의 다른 글

[Javascript] 형 변환  (0) 2022.11.03
[Javascript] 다양한 함수 선언 방법  (0) 2022.11.02
[Javascript] 변수와 상수  (0) 2022.10.31
[Javascript] 연산자  (2) 2022.10.28
[Javascript] Javascript란?  (0) 2022.10.28

[Javascript] 변수와 상수

CloudCoke
|2022. 10. 31. 14:20

변수

변수 선언

  • 변수 선언 시 초기화
// [변수 선언 예약어] [변수명] = [값]
let num = 1;

console.log(num); // 1
  • 변수 선언 후 초기화
// [변수 선언 예약어] [변수명]
// [변수명] = [값]
let num;
num = 1;

console.log(num); // 1
  • 변수 선언 및 초기화 후 재 할당
let num = 1;
num = 2;

console.log(num); // 2
  • 변수 선언 및 초기화 후 재 선언 [불가능]
let num = 1;
let num = 2;

Uncaught SyntaxError: Identifier 'num' has already been declared

let으로 변수 선언 및 초기화 후 재 선언

상수

상수 선언

  • 상수 선언 시 초기화
// [변수 선언 예약어] [변수명] = [값]
const num = 1;

console.log(num); // 1
  • 상수 선언 후 초기화 [불가능]
// [변수 선언 예약어] [변수명]
// [변수명] = [값]
const num;
num = 1;

Uncaught SyntaxError: Missing initializer in const declaration

const로 상수 선언 후 초기화

  • 상수 선언 및 초기화 후 재 할당 [불가능]
const num = 1;
num = 2;

Uncaught TypeError: Assignment to constant variable.

const로 상수 선언 및 초기화 후 재 할당

  • 상수 선언 및 초기화 후 재 선언 [불가능]
const num = 1;
const num = 2;

Uncaught SyntaxError: Identifier 'num' has already been declared

const로 상수 선언 및 초기화 후 재 선언

let과 const 사용 이유

let과 const

  • let과 const는 2015년 ECS6에서 추가됨
  • 그전까지는 var를 사용해왔음
  • var에 문제점이 있어서 ECS6 이후부터는 let과 const 사용을 권장하고 있음

var의 문제점

  1. 호이스팅(hoisting)
console.log(hoi); // undefined
var hoi;
hoi = 1;
console.log(hoi); // 1

var의 hoisting

  • 호이스팅 과정
    • 자바스크립트가 코드를 위에서 아래로 순차적으로 처리하지만 실행 전에 전체적으로 코드를 검사함
    • 코드 검사가 끝나면 코드를 실행
    • 코드 검사 시 var가 초기화되어있지 않고 선언만 되어 있으면 var를 최상단으로 옮김
    • var로 선언한 변수를 undefined로 초기화해버림
  1. 재 선언 가능
  • 재 선언이 가능해 코드가 길어질 시 같은 변수명을 사용해도 오류가 나지 않아 문제를 발생시킬 수 있음
var num = 1;
var num = 2;

console.log(num); // 2

'Javascript' 카테고리의 다른 글

[Javascript] 형 변환  (0) 2022.11.03
[Javascript] 다양한 함수 선언 방법  (0) 2022.11.02
[Javascript] 함수  (0) 2022.11.01
[Javascript] 연산자  (2) 2022.10.28
[Javascript] Javascript란?  (0) 2022.10.28

[Javascript] 연산자

CloudCoke
|2022. 10. 28. 22:51

연산자


산술 연산자

+ - * / %

console.log(1 + 1); // 2

console.log(2 - 1); // 1

console.log(3 * 3); // 9

console.log(4 / 2); // 2

console.log(5 % 2); // 5를 2로 나눈후 나머지 값 1

대입 연산자

=
변수 선언이나 값 할당 시 사용한다.
대입 연산자 우측에 있는 값을 왼쪽에 넣는다고 볼 수 있다.

let num = 1;
const num2 = 2;

단항 산술 연산자

++ --

// 선반영
let num = 1;
console.log(++num); // 2
console.log(num); // 2
// 후반영
let num = 1;
console.log(num++); // 1
console.log(num); // 2
// 선반영
let num = 7;
console.log(--num); // 6
console.log(num); // 6
// 후반영
let num = 7;
console.log(num--); // 7
console.log(num); // 6

비교 연산자

== != < <= > >= : 값만 비교
=== !== : 값과 타입까지 비교

console.log(1 == 1); // true
console.log(1 != 1); // false
console.log(2 < 1); // false
console.log(2 <= 1); // false
console.log(2 > 1); // true
console.log(2 >= 1); // true
console.log(1 == true) // true
console.log(1 === true) // false
console.log(1 != false) // true
console.log(1 !== false) // true
console.log(0 != false) // false
console.log(0 !== false) // true
console.log(1 == "1"); // true
console.log(1 === "1") // false

논리 연산자

|| : or 연산자

// true || true => true
// true || false => true
// false || false => true
// false || false => false
let num10 = 10;
let num5 = 5;

if (num10 > 5 || num5 > 10) {
    console.log("True")
} else {
    console.log("False")
}
// True

&& : and 연산자

// true && true => true
// true && false => false
// false && true => false
// false && false => false
let num10 = 10;
let num5 = 5;

if (num10 > 5 && num5 > 10) {
    console.log("True")    
} else {
    console.log("False")
}
// False

! : not 연산자

// !(true) => false
// !(false) => true

console.log(!true); // false
console.log(!false); // true

'Javascript' 카테고리의 다른 글

[Javascript] 형 변환  (0) 2022.11.03
[Javascript] 다양한 함수 선언 방법  (0) 2022.11.02
[Javascript] 함수  (0) 2022.11.01
[Javascript] 변수와 상수  (0) 2022.10.31
[Javascript] Javascript란?  (0) 2022.10.28

[HTML/CSS] CSS 선택자

CloudCoke
|2022. 10. 28. 20:49

CSS는 HTML을 꾸미기 위해서 사용한다.
HTML을 꾸미려면 특정 엘리먼트를 선택해야 하는데 이때 사용하는게 CSS 선택자이다.
CSS 선택자는 크게 5종류로 나눌 수 있다.

기본 선택자

* element .(class) #(id) [attr](특성)

<div>Hello</div>
<div class="header"></div>
<div id="footer"></div>
<input type="radio" />
* { background: red; } /* 전체 선택 */
div { height: 300px; } /* div 요소 전체 선택 */
.header { width: 100px; } /* header라는 class를 가진 요소 선택 */
#footer { margin: 0 auto; } /* footer라는 id를 가진 요소 선택 */
input[type="radio"] { display: none; } 
/* input 요소 중 type 속성을 가지고 속성값이 radio인 것 선택 */

그룹 선택자

,

<ul>
    <li>Hello</li>
</ul>
ul, li { list-style: none; } /* ul 요소와 li 요소 선택 */

결합자

(자손결합자) >(자식 결합자) ~(일반 형제 결합자) +(인접 형제 결합자)

<ul>
    <li>Say</li>
    <li><span class="content">Hello</span><li>
    <li><a class="content" href="#">Link</a></li>
</ul>
<div class="bro">brother</div>
<div class="near">near</div>
/* 자손 결합자 */
ul .content { color: red; } /* ul 안에 있는 content라는 클래스를 가진 요소 선택 */
/* 자식 결합자 */
ul > li { color: green; } /* ul 안에 있는 li 요소 전체 선택 */
/* 일반 형제 결합자 */
ul ~ .near { color: blue; } /* ul과 형제 관계인 near라는 클래스를 가진 요소 선택 */
/* 인접 형제 결합자 */
ul + .bro { color: gray; } /* ul과 인접한 형제인 bro라는 클래스를 가진 요소 선택 */

가상 클래스 선택자

:hover :focus :checked first-child nth-child :last-child

<input type="text" id="text_box" />
<label for="text_box">text_box</label>
<input type="checkbox" id="check_box" />
<label for="check_box">
  <span></span>
  <span></span>
  <span></span>
</label>
<div>
  <ul>
    <li>menu1</li>
    <li>menu2</li>
    <li>menu3</li>
  </ul>
</div>
div > ul > li:hover {
  cursor: pointer;
}
/* menu에 마우스를 올리면 커서가 바뀜 */
#text_box:focus + label {
  color: red;
}
/* text를 입력할 수 있는 input box를 선택하면 text_box 텍스트가 빨간색으로 변함 */
#check_box:checked + label {
  color: blue;
}
/* 체크박스를 선택하면 1 2 3 텍스트가 파란색으로 변함 */
#check_box + label > span:first-child {
  color: green;
}
/* label의 자식 요소중 첫 번째인 요소인 1이 녹색으로 변함 */
#check_box + label > span:nth-child(2) {
  color: blue;
}
/* label의 자식 요소중 두 번째 요소인 2가 파란색으로 변함 */
#check_box + label > span:last-child {
  color: red;
}
/* label의 자식 요소중 마지막 요소인 3이 빨간색으로 변함 */

가상 요소 선택자

css에서 유일하게 html을 만들 수 있음

가상으로 span이 만들어 졌다고 볼 수 있음
::before : 선택 영역 앞
::after : 선택 영역 뒤

<div id="before">Before</div>
<div id="after">After</div>
#before::before {
content: "-"
}
/* Before 글자 앞에 -가 생김 */
#after::after {
content: "*"
}
/* After 글자 뒤에 *이 생김 */

'HTML/CSS' 카테고리의 다른 글

[HTML/CSS] HTML 핵심 개념  (0) 2022.10.27
[HTML] label 요소  (0) 2022.10.26
[CSS] CSS 적용하는 3가지 방법  (0) 2022.10.21

[Javascript] Javascript란?

CloudCoke
|2022. 10. 28. 14:16
  • 인터프리터 언어이다.
  • Frontend와 Backend를 같이 할 수 있는 언어이다.
  • 브라우저에서 동적 요소를 프로그래밍하는 언어이다.

컴파일 언어

  • 번역기가 번역을 하듯이 내가 작성한 언어를 컴파일러가 기계어로 변환을 해줌
  • 100줄의 코드가 한번에 변환됨

인터프리터 언어 or 스크립트 언어

  • 기계가 알아서 코드를 해석해서 결과물까지 도출해 준다
  • 한줄을 실행할 때마다 변환됨

Java vs Javascirpt

  • java는 객체지향 언어 ( c++)
  • javascript는 prototype 언어
  • python은 함수형 언어

Javascript 장점

  • 타입 지정이 없음
  • 처음 배우는 사람에게 좋음

Javascript 사용하는 방법

  • 브라우저 자체 console 창 이용

브라우저 자체 console 창
브라우저 자체 console 창에서 Hello World! 출력

  • html 파일에서 작성
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script>
      console.log("hello world!");
    </script>
  </head>
  <body></body>
</html>

<!-- script 부분에 작성 -->

  • html 파일에서 javascript 파일 연결해서 작성
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="public/js/index.js"></script>
  </head>
  <body></body>
</html>
// index.js
console.log('Hi')

 

'Javascript' 카테고리의 다른 글

[Javascript] 형 변환  (0) 2022.11.03
[Javascript] 다양한 함수 선언 방법  (0) 2022.11.02
[Javascript] 함수  (0) 2022.11.01
[Javascript] 변수와 상수  (0) 2022.10.31
[Javascript] 연산자  (2) 2022.10.28