Moment 앱 따라하기

배경화면으로 쓰일 이미지를 랜덤으로 출력 위해 Math 내장객체에서 floor(), random() 메소드를 활용한다.


html 파일에서 body 요소를 가져온다.


  • 웹브라우저 화면 전체를 이미지로 씌울 예정이므로 body를 통째로 가져온다.


const body = document.querySelector("body");




1부터 시작하는 정수를 랜덤하게 뽑는 함수를 만든다.


  • Math.random()은 1이하의 실수를 랜덤으로 반환한다.
  • Math.floor()는 실수를 소수점 내림하여 정수 형태로 반환한다.
  • 0부터 숫자가 반환되므로 더하기 1을 하여 숫자 1부터 변수로 지정되도록 한다.


// 가지고 있는 배경사진 갯수
const IMG_NUMBER = 3;
function
genRandom(){

    // Math.random()은 1 이하의 실수를 랜덤으로 출력한다 (0.XXXXXX 형태로)
    // 3을 곱한다해도 숫자 3을 넘지 못하는 실수 형태의 숫자를 출력한다

    // Math.floor()는 소수점 내림을 하여 실수 형태를 정수로 만든다
    // 따라서 Math.floor(Math.random())는 "0"만 출력한다
    // Math.floor(Math.random() * 3)은 "0, 1, 2"까지 출력 가능하다
    // Math.ceil()은 소수점 올림을 한다
   
    // IMG_NUMBER는 3 이므로
    const number = Math.floor(Math.random() * IMG_NUMBER) + 1;
   
    // 0, 1, 2 중에 하나를 반환한다
    return number;
}



  • 배경사진의 개수가 3개라서 IMG_NUMBER 변수에 3을 담았다.
  • 이미지 개수에 맞게 임의로 하나의 숫자를 뽑아서 해당 숫자의 파일명을 가진 이미지를 가져올 것이다.



랜덤으로 뽑힌 숫자랑 같은 이름의 이미지 파일을 호출한다.


  • 랜덤으로 뽑은 숫자를 함수의 인자로 사용한다.
  • new Image() 메소드를 사용하여 html<img>를 만드는데, 이는 우리가 출력할 <img src="">가 담긴다.
  • <img src="">images 폴더에 있는 이미지 파일을 지정한다.
  • 그 이미지 파일은 랜덤으로 가져와야 하므로 imgNumber 파라미터를 통해 랜덤 숫자를 받는다


function paintImage(imgNumber) {

    // <img> 태그를 만들어준다
    const image = new Image();
    // document.createElement('img')와 같은 코드를 나타낸다
  
    // <img src=""> 이미지 파일의 소스를 입력한다
    // 랜덤 숫자에 +1을 하는 이유는 이미지 파일이 1부터 시작하므로
    image.src = `images/${imgNumber}.jpg`;
  
    // <img src="" class=""> 이미지 효과를 위해 클래스를 추가한다
    image.classList.add("bgImage");
   
    // <body>에 완성된 <image>를 자식요소로 삽입하기
    body.appendChild(image);
}


  • 배경사진이 원본 그대로 노출되면 웹브라우저에 맞지 않으므로, CSS를 통해 약간의 수정을 한다.
  • 완성된 image 변수를 body에 자식요소로 추가한다



배경사진의 크기를 조절하고 동시에 애니메이션 효과를 준다. 


  • animation 속성을 사용하기 앞서 @keyframes를 작성한다.
  • 투명도(opacity)를 0에서 1로 변화를 주어 자연스럽게 화면이 전환될 수 있게 한다.
  • top, left 크기를 0로 하여 텍스트로 인해 비어있는 상단, 왼쪽 공간을 제거한다. 
  • 웹브라우저 화면 크기에 맞도록 widthheight 비율을 100%로 작성한다. 
  • 텍스트가 배경사진 앞에서 노출될 수 있도록 z-index 속성을 이용해 레이어 순서를 조절한다.


/* 애니메이션으로 쓸 효과(fadeIn)를 설정한다 */
/* 사진의 투명도를 조절하여 안보이다가 보이게 한다 */
@keyframes fadeIn {
    from {
        /* 투명도 설정 */
        opacity: 0;
    }
    to {
        opacity: 1;
    }
}

.bgImage {
    /* 절대적인 위치를 계산한다 */
    position: absolute;
    top: 0;
    left: 0;
    /* 웹브라우저에 맞게 사이즈를 조절한다 */
    width: 100%;
    height: 100%;

    /* 쌓여있는 레이어 순서. -1을 입력하면 사진이 뒤로 밀리고 텍스트가 앞으로 온다 */
    z-index: -1;

    /* 0.5초 서서히 사진이 나타난다 */
    animation: fadeIn 0.5s linear;
}



genRandom() 함수와 printImage() 함수를 순차적으로 실행시킨다.


  • genRandom() 함수를 통해 랜덤으로 뽑은 숫자를 printImage() 함수의 인자로 사용한다


function init(){
    // 랜덤으로 받은 숫자를 변수 지정
    const randomNumber = genRandom();

    // 받은 숫자를 이미지를 선택하는 함수에 전달한다
    paintImage(randomNumber);
}

init();


블로그 이미지

쵸잇

,

filter() 메서드는 주어진 판별 함수를 통과하는 요소를 모아 새로운 배열로 만들어 반환합니다.

forEach() 메소드처럼 배열 내 각 요소에 함수를 적용할 수 있는데, 다른 점은 함수를 통해 반환된 결과를 모아 새로운 배열을 만들어준다는 것이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
let toDos = [];
 
function deleteToDo(event){
    const btn = event.target; #버튼 태그 지정
    const li = btn.parentNode; #버튼이 포함된 리스트
 
    toDoList.removeChild(li); #리스트 제거
 
    const cleanToDos = toDos.filter(function(toDo){
        return toDo.id !== parseInt(li.id); #리스트에서 제거된 id와 다른 값들로 새 배열 추가
    });
    toDos = cleanToDos; #새 배열 저장
    saveToDos(); #로컬스토리지에 문자열로 파싱 후 저장
}
cs


toDoList는 html 상에서 작성한 toDo가 출력되는 리스트인데,


그 중 하나의 toDo를 삭제하여, 그 toDo가 가진 id 값과 toDos 변수인 배열 안에 객체들의 id 값을 비교하는데,

배열 안에서 id 값이 다른 것들만 따로 모아 새로운 이름(cleanToDos)의 배열을 만든다는 것이다.


아직 설명하는 방법도 어려울 정도이다.


인강 들으면서 가장 이해 안되었던 부분이다. 이해하는데 정말 오랜 시간이 걸린듯;






출처

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

블로그 이미지

쵸잇

,

JSON은 JavaScript Object Notation의 준말이다. 자바스크립트 객체 표기로 해석해도 될지 모르겠다.

JSON.parse(text)에서 text는 JSON으로 파싱할 문자열에 해당한다.

다시 말하면, datatype이 현재 문자열인 데이터를 객체형 데이터로 바꾸겠다는 뜻으로 보면 좋다.




웹브라우저에서 폼을 통해 입력 받은 값을 문자열로 저장해야 스크린샷처럼 작성한 text와 id 값을 정확히 알 수 있다


1
localStorage.setItem(TODOS_LS, JSON.stringify(toDos));
cs


JSON.stringify(text)는 text를 문자열로 변환해주는 메소드이다.




그리고 로컬스토리지에 문자열 형태로 저장된 값을 호출하여 웹브라우저 상에서 띄우려면 다시 객체로 파싱해주어야한다. 


1
2
const loadedToDos = localStorage.getItem(TODOS_LS);
const parsedToDos = JSON.parse(loadedToDos);

c



객체로 파싱하여 정의된 변수를 객체(배열) 안에 포함된 요소마다 paintTodo 함수를 적용하기 위해 forEach() 메소드를 사용한다.


1
2
3
parsedToDos.forEach(function(toDo){
    paintToDo(toDo.text);
})
cs


블로그 이미지

쵸잇

,

조건부 삼항 연산자(conditional ternary operator) 는 세 개의 피연산 함수를 취할 수 있는 유일한 자바스크립트 연산자이다. 이 연산자는 if 문의 축약형으로 빈번히 사용된다. 

condition ? expr1 : expr2


condition (or conditions)
true 혹은 false로 평가되는 표현식

expr1, expr2
모든 형식의 값을 지닌 표현식


condition이 true이면, 연산자는 expr1의 값을 반환하며, 반대의 경우 expr2를 반환한다.


상황)


현재시각 1시 9분 3초를 웹브라우저에서 출력하면 1:9:3 형태로 출력된다

내가 나타내고 싶은 형태는 01:09:03 이다 


function getTime(){
    const date = new Date();
    const hours = date.getHours();
    const minutes = date.getMinutes();
    const seconds = date.getSeconds();

    clockTitle.innerText = `${hours}:${minutes}:${seconds}`
}



조건부 삼항 연산자를 적용하여 시간, 분, 초가 10보다 작은 경우 앞에 0을 붙여주는 것이다.



function getTime(){
    const date = new Date();
    const hours = date.getHours();
    const minutes = date.getMinutes();
    const seconds = date.getSeconds();

    clockTitle.innerText =
    `${hours < 10 ? `0${hours}` : `${hours}`
    }:${minutes < 10? `0${minutes}` : `${minutes}`
    }:${seconds < 10? `0${seconds}` : `${seconds}`
    }`
}




출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Conditional_Operator


'코딩 연습 > Javascript' 카테고리의 다른 글

Array.filter()  (0) 2019.01.01
JSON.parse(), forEach()  (0) 2018.12.31
객체 안에 특정 함수를 속성으로 지정하기  (0) 2018.12.07
함수를 변수에 지정하기  (0) 2018.12.07
문자열 속에 매개변수 넣기  (0) 2018.12.06
블로그 이미지

쵸잇

,

객체를 다시 떠올리면,


1
console.log()
cs


console이라는 객체 속에 log() 함수속성으로 포함되어 있다.



1
console.log("Ryan")
cs


따라서 console 객체 속에 포함된 log() 함수를 사용하여 "Ryan"을 출력하는 것이다.



우리도 만들 수 있다.


1
2
3
4
5
6
7
calculator = {
  sum : function(first, second){
  return console.log(first + second)
  }
}
 
calculator.sum(55)
cs


calculator라는 객체 속에 sum이라는 속성을 만들었다.

sum속성2개의 인자합산하여 출력하는 함수를 가진다.


console.log()를 사용하는 것처럼


calculator.sum()을 사용하면,


1
2
>>
10
cs


해당 결과가 출력된다.



객체와 인자를 변수에 담아서 출력할 수도 있다.


1
2
3
4
5
6
7
8
calculator = {
  sum : function(first, second){
  return first + second;
  }
}
 
const sum = calculator.sum(55)
console.log(sum)
cs



연습


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
calculator = {
  sum : function(first, second){
    return first+second;
  },
  sub : function(first, second){
    return first-second;
  },
  mul : function(first, second){
    return first*second;
  },
  div : function(first, second){
    return first/second;
  }, 
  imp : function(first, second){
    return first**second;
  },
}
 
const sum = calculator.sum(55)
console.log(sum)
const sub = calculator.sub(125)
console.log(sub)
const mul = calculator.mul(38)
console.log(mul)
const div = calculator.div(205)
console.log(div)
const imp = calculator.imp(28)
console.log(imp)
cs


'코딩 연습 > Javascript' 카테고리의 다른 글

JSON.parse(), forEach()  (0) 2018.12.31
조건부 삼항 연산자(conditional ternary operator)  (0) 2018.12.30
함수를 변수에 지정하기  (0) 2018.12.07
문자열 속에 매개변수 넣기  (0) 2018.12.06
함수(function)  (0) 2018.12.05
블로그 이미지

쵸잇

,

함수 호출시 인자 값이 전달된 문자열을 리턴하는 형태로 함수를 변경했고,

이를 새로운 변수에 담았다. 


1
2
3
4
5
6
7
function sayhello(name, age){
  return `Hello ${name}! Are you ${age}?`;
}
 
const greetRyan = sayhello('Ryan'31)
 
console.log(greetRyan)
cs


따라서 console.log()에는 변수만 입력하면 원하는 결과가 출력된다. 


블로그 이미지

쵸잇

,

함수의 매개변수와 문자열을 조합하여 한 줄의 문장을 만들었다.

(https://practice-a-lot.tistory.com/79)


1
2
3
4
5
6
7
8
9
function sayhello(name, age) {
  console.log("Hello"+','name+"!""Are you", age+"?");
}
 
sayhello("Ryan"31)
sayhello("Adrianne"31)
sayhello("Kaori"26)
sayhello("Bobby"25)
 
cs



매개변수를 사용하기 위해 전혀 아름답지 않게 곳곳에 따옴표(')나 쌍따옴표(")를 사용해야했다.


여기서 백틱(`)을 사용하여 한 줄의 아름다운 코드가 완성된다.


1
2
3
4
5
6
7
8
function sayhello(name, age) {
  console.log(`Hello ${name}!  Are you ${age}?`);
}
 
sayhello("Ryan"31)
sayhello("Adrianne"31)
sayhello("Kaori"26)
sayhello("Bobby"25)
cs


백틱(')으로 묶은 문자열 속에 ${매개변수} 형태로 매개변수까지 넣을 수 있다.


1
2
3
4
5
>>
Hello Ryan!  Are you 31?
Hello Adrianne!  Are you 31?
Hello Kaori!  Are you 26?
Hello Bobby!  Are you 25?
cs


생소한 백틱(`)과 ${}를 활용하면 된다.

블로그 이미지

쵸잇

,

내 정보(myInfo) 객체에서 성별을 출력할 때 console.log()를 사용했다.


1
console.log(myInfo.gender);
cs


myInfo 객체에 gender 키에 접근하는 것처럼,

console.log를 console 객체에 log() 함수를 사용한다고 보면 된다. 



console 객체를 출력하면,


1
2
3
4
5
6
7
8
9
10
11
12
13
t {
  log: [Function],
  error: [Function],
  info: [Function],
  warn: [Function],
  dir: [Function],
  time: [Function],
  timeEnd: [Function],
  trace: [Function],
  assert: [Function],
  clear: [Function],
  stdout: { [Function] clear: [Function] },
  _times: {} }
cs


log 함수를 비롯해 다양한 함수를 포함하고 있다.

이 중에서 우리가 사용하고 싶은 것을 console.함수명() 형태로 사용하는 것이다.

console이라는 객체는 여러가지의 내장함수를 가지고 있다.




그럼 함수는 왜 필요할까?


1
2
3
4
5
console.log("Hello, Ryan");
console.log("Hello, Adrianne");
console.log("Hello, Kaori");
console.log("Hello, Bobby");
 
cs


"Hello"라는 인삿말이 싫어서 "Hi"로 고치려면 1개씩 수정해야하는 번거로움이 있다.

만약 이런 코드가 100만개라면 100만개를 하나씩 언제까지 고치고 있을줄 모른다.


여기서 반복되는 


1
2
console.log("Hello");
 
cs


이 코드를 하나로 묶어 필요할 때마다 사용하고, 내용 수정한 번만으로 100개든 1000개든 한꺼번에 되도록 하는게 목표다.

그것을 도와줄 녀석이 함수이다.  



함수의 정의는 function 함수명()으로 시작한다.


1
2
3
4
5
function sayhello() {
  console.log("Hello");
}
 
sayhello();
cs


중괄호{} 안에 중복되는 코드를 입력하고, 필요시 함수명()만 입력하면 함수로 지정된 코드를 반환한다.



다시 한 번 정리하면, 함수 형태는 함수명()이다.

console.log()는 즉, console 객체에 포함된 log() 함수라는 걸 기억하자.



이어서 우리가 만든 함수를 활용하여 인삿말과 이름을 같이 출력해보자.


1
sayhello()+console.log("Ryan")
cs


실망스럽게도,


1
2
>> Hello
Ryan
cs


우리가 원하는 한 줄의 텍스트로 출력되지 않았다.



그럼 sayhello() 함수의 도움을 받아 sayhello("Ryan") 형태로 값을 담아 같이 출력해보는 방식을 만들어보자.


1
2
3
4
5
function sayhello(name) {
  console.log("Hello"+','name);
}
 
sayhello("Ryan")
cs

 

1
2
>>
Hello, Ryan
cs


드디어 우리가 원하던 결과가 반환되었다.

name은 매개변수(parameter)이고, sayhello() 함수 안의 "Ryan"은 인자(argument)이다.


매개변수는 인자를 받아서 넘겨주는 역할을 한다.

따라서 sayhello() 함수는 "Ryan"을 name에게 토스하여 "Hello"와 같이 출력된다. 

매개변수는 변수처럼 임의로 이름을 설정해주면 된다.


1
2
3
4
5
6
7
8
function sayhello(name) {
  console.log("Hello"+','name);
}
 
sayhello("Ryan")
sayhello("Adrianne")
sayhello("Kaori")
sayhello("Bobby")
cs


1
2
3
4
5
>>
Hello, Ryan
Hello, Adrianne
Hello, Kaori
Hello, Bobby
cs



추가로 인자를 2개 넘기는 연습을 해보자. 인자가 2개이면 매개변수도 2개이다.


1
2
3
4
5
6
7
8
function sayhello(name, age) {
  console.log("Hello"+','name+"!""Are you", age+"?");
}
 
sayhello("Ryan"31)
sayhello("Adrianne"31)
sayhello("Kaori"26)
sayhello("Bobby"25)
cs


1
2
3
4
5
>>
Hello, Ryan! Are you 31?
Hello, Adrianne! Are you 31?
Hello, Kaori! Are you 26?
Hello, Bobby! Are you 25?
cs


점점 함수가 발전되어가는 모습이다.



블로그 이미지

쵸잇

,

배열과 객체를 넓게 사용해보자


1) 여러 개의 객체배열에 담을 수 있고,

2) 객체 속성의 값으로 배열을 사용할 수 있으며,

3) 2)번의 배열객체를 담을 수도 있다.



1) 개개인의 정보 객체info라는 배열에 담았다. 


1
const info = [RyanInfo, DavidInfo, AdrianneInfo, KaoriInfo]
cs



2) 정보(myInfo) 객체에서 좋아하는 음식을 나열한 속성인 favoriteFood의 값으로 배열을 지정했다.


1
2
3
4
5
6
7
const myInfo = {
  name : "Ryan",
  age : 31,
  gender : "male",
  isHandsome : true,
  favoriteFood : ["kimchi""chickenSoup""bulgogi"],
}
cs



3) testPass 속성의 값인 배열객체를 담았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const myInfo = {
  name : "Ryan",
  age : 31,
  gender : "male",
  isHandsome : true,
  favoriteFood : ["kimchi""chickenSoup""bulgogi"],
  testPass : [
    {
      subject:"math"
      pass:false
    },
    {
      subject:"javascript",
      pass:true
    }
  ]
}
cs



'코딩 연습 > Javascript' 카테고리의 다른 글

문자열 속에 매개변수 넣기  (0) 2018.12.06
함수(function)  (0) 2018.12.05
객체(object)를 이용해 데이터 다루기  (0) 2018.12.04
배열(array)  (0) 2018.12.04
카멜 표기법(camel case)  (0) 2018.12.04
블로그 이미지

쵸잇

,

객체(object)를 이용해 데이터 다루기

그리고 똑같은 리스트 방식인 배열(array)과 다른 점 살펴보기


배열(array)의 문제점은 뭘까?


  • 내 정보인 이름(name), 나이(age), 성별(gender), 조건문(true or false)에 대한 값을 배열(array)로 만들었다.
  • console.log() 메소드를 통해 나이만 출력하고 싶다.


1
2
3
const my_info = ["Ryan"31"male"true]
 
console.log(my_info[1]);
cs


  • 우선 나이에 대한 데이터가 my_info에서 배열 몇 번째에 있는지 알아야 출력이 가능해진다.
  • 만약 배열 안에 데이터가 100만 개가 있다면 4만 7천번째 값이 뭔지 알아야 꺼낼 수 있다는 말이다.
  • 따라서 효율적으로 데이터를 관리하기 위해서 객체(object)를 사용한다.



동일한 데이터를 가지고 객체로 만들어보자


  • 객체는 {}괄호를 사용하고, 데이터에 이름을 붙여준다.
  • 데이터로는 문자, 숫자, 배열, 객체도 사용 가능하다.


1
2
3
4
5
6
7
8
const my_info = {
  name : "Ryan",
  age : 31,
  gender : "male",
  isHandsome : true,
}
 
console.log(my_info.age);
cs


  • 원하는 데이터를 호출하려면 객체에 점(.)을 찍은 후 데이터에 지정해준 이름을 적으면 된다.

  • 호출한 데이터로 console.log() 메소드를 통해 출력할 수 있다.



1
2
3
4
5
console.log(my_info.age);
 
my_info.age = 32
 
console.log(my_info.age);
cs


  • 호출한 데이터에 '32'를 입력하여 age 데이터를 바꿀 수 있다. 


'코딩 연습 > Javascript' 카테고리의 다른 글

함수(function)  (0) 2018.12.05
배열(array)과 객체(object)를 확장해서 사용  (0) 2018.12.04
배열(array)  (0) 2018.12.04
카멜 표기법(camel case)  (0) 2018.12.04
자료형(data type)  (0) 2018.12.04
블로그 이미지

쵸잇

,