[JavaScript] ES6 chap.2

 

 

 

default parameter & arguments

- default parameter

function 더하기 (a, b = 10){ // b에 default 값을 부여한다. 연산이나 함수 사용 가능
  console.log(a + b)
}

더하기(1); // 11
더하기(1, 3); // 4

 

- arguments

function 함수(a,b,c){
  console.log(arguments);
}

함수(2,3,4); // [2, 3, 4]....arguments
function 함수(a,b,c){
  for(var i=0; i<arguments.length; i++){
  	console.log(arguments[i]); // 반복문으로 함수의 파라미터 조회
  }
}

함수(2,3,4);

 

 

 

Rest Parameter

ES6에 추가된 arguments랑 비슷한 용도의 파라미터 (나머지 파라미터)

function 함수2(...파라미터들){
  console.log(파라미터들)
}

함수2(1,2,3,4,5,6,7); // [1, 2, 3, 4, 5, 6, 7]

arguments와의 차이점은 arguments는 함수를 사용할 때의 파라미터의 갯수가 변경되면 기존 함수의 파라미터 갯수도 변경 해야하지만 rest parameter는 유동적으로 변경 가능하다.

 

function 함수2(a, b, ...파라미터들){
  console.log(파라미터들)
}

함수2(1,2,3,4,5,6,7); // [3, 4, 5, 6, 7]



// 주의
function 함수2(a, ...파라미터들, b){
  console.log(파라미터들)
} // ...파라미터 뒤에 또 다른 파라미터가 오면 에러 발생

function 함수2(a, ...파라미터들, ...파라미터들2){
  console.log(파라미터들)
} // rest 파라미터를 중복으로 써도 에러 발생

 

 

 

Primitive data type / Reference data type

* primitive data type

- 자료 자체가 변수에 저장되는 자료 (문자, 숫자, 문자열 등)

var 이름1 = '김';
var 이름2 = 이름1;
이름1 = '박';
console.log(이름1); // 박
console.log(이름2); // 김

 

 

* reference data type

- 자료가 변수가 아닌 컴퓨터 메모리에 저장되고 참조하여 사용하는 자료 (Array, Object 등)

var 이름1 = { name: '김'};
var 이름2 = 이름1;
이름1.name = '박';
console.log(이름1.name); // 박
console.log(이름2.name); // 박

primitive 타입과 달리 reference 타입은 데이터가 저장된 것이 아니라 참조한다는 값을 가리키는 값이 저장된 것이기 때문에 참조되는 데이터를 변경하게 되면 두 변수가 가리키는 값은 같다.

 

 

- cf

var 이름1 = { name : '김' };
var 이름2 = { name : '김' };

console.log(이름1 == 이름2); // false
console.log(이름1 === 이름2); // false
console.log(이름1.name == 이름2.name); // true

위 처럼 새로운 {}를 할당할 때, 새로운 object가 생성되기 때문에 {} 안에 있는 오브젝트 데이터는 같지만 서로 다른 object이며 다른 object를 각각 가리키고 있는 것이다.

 

var 이름1 = { name : '김' };

function 변경(obj){
  obj = { name : 'park' }; // obj라는 변수에 새로운 {} object 재할당
  obj.name = 'park' // 파라미터로 들어온 object의 name의 value 변경
}

변경(이름1);

 

 

 

constructor

기존의 object 생성 방식

var 학생1 = { name : 'Kim', age : 15 };
var 학생2 = { name : 'Park', age : 15 };
...

여러번 선언하고 정의하거나 복사를 해야하는데 복사하는데 있어서 데이터가 같은 값을 참조 할 수 있기 때문에 constructor 방식으로 object를 생성할 수 있다.

 

 

* constructor

function 기계(이름){ // 기계: constructor
  this.name = 이름; // instance
  this.age = 15; // instance
  this.sayHi = function(){ // instance
    console.log('안녕하세요' + this.name + ' 입니다');
  }
}
var 학생1 = new 기계('Park');
var 학생2 = new 기계('Kim');

function이라는 함수를 정의하고 해당 함수를 new 함수() 형태로 사용한다. 어떤 변수에 기계라는 함수를 new 기계()로 할당하게되면 기계는 constructor가 되며 기계() 안에 있는 this는 instance가 되어 여러가지의 object를 생성할 수 있다.

 

 

 

prototype

prototype = 유전자의 역할

function 기계(){
  this.name = 'Kim';
  this.age = 15;
}
var 학생1 = new 기계(); // 상속의 개념 => 기계의 name과 age를 사용할 수 있음

console.log(기계.prototype); // 내부에 prototype이라는 항목이 생성

학생1이 기계의 constructor가 가진 name과 age의 instance를 사용할 수 있게되는 것을 상속(inheritance)했다고 한다. 하지만 constructor말고도 상속기능을 구현할 수 있는데 Java와 같은 다른 언어의 상속(extend)의 개념과 달리 Javascript는 prototype의 개념을 사용한다.

 

new 기계()를 생성하게되면 표면적으로 보이지 않는 내부의 공간에 prototype이라는 공간이 생성되는데 이것은 부모의 유전자 역할을 한다.

 

 

function 기계(){
  this.name = 'Kim';
  this.age = 15;
}

기계.prototype.gender = '남';
var 학생1 = new 기계();
var 학생2 = new 기계();

console.log(학생1.gender); // 남
console.log(학생2.gender); // 남

기계라는 부모의 prototype(유전자)에 {gender: '남'} 이라는 속성을 추가하게되면 기계를 상속한 학생1, 학생2 자식은 {gender: '남'}이라는 속성을 사용할 수 있다.

 

 

* 작동원리

- 자바스크립트는 오브젝트에서 값을 출력할 때

  • 학생1에 gender라는 값이 있는가 ?
  • 기계라는 부모 유전자에 gender라는 값이 있는가 ?
  • 그럼 그 부모의 유전자에 gender라는 값이 있는가 ?
  • ...

 

// Array 생성 시
var arr = [1,2,3];
// == var arr = new Array(1,2,3);

// Object 생성 시
var obj = {name: 'kim'}
// == var obj = new Object({name: 'kim'});

Array나 Object 등의 생성 방식의 차이일 뿐 결국엔 내부에선 constructor 방식으로 생성되기 때문에 해당 object에 prototype으로 저장 되어있는 내장 함수 또한 사용할 수 있다.

 

 

** prototype과 constructor의 차이

  • constructor: 자식들이 직접 값을 소유하게 하기
  • prototype: 부모만 가지고 있고 그걸 참조해서 쓰게 하기

 

 

 

* 특징

1. prototype은 constructor 함수에만 몰래 생성된다.

 - 일반 object, array엔 prototype 없음 (constructor 함수, Object.create(), class 써야 함)

 

 

2. 부모 유전자 찾기

function 기계(){
  this.name = 'Kim';
  this.age = 15;
}
var 학생1 = new 기계();
console.log(학생1.__proto__); // 기계
console.log(기계.prototype);

 - 부모의 의해 생성된 자식엔 __proto__라는 속성이 있는데 해당 속성은 자식의 부모 object를 찾아준다.

 

 

3. __proto__를 직접 등록하면 object끼리 상속기능 구현가능

var 부모 = { name : 'Kim' };
var 자식 = {};

자식.__proto__ = 부모;
console.log(자식.name); // Kim

 

 

4. 자바스크립트는 모든게 다 Object이다.

- __proto__로 계속 올라가다보면 모든 부모는 Object라는 constructor로 통한다.

 

 

 

상속

* ES5

- Object.create()

var 부모 = { name : 'Kim', age : 50 };
var 자식 = Object.create(부모);
자식.age  = 20;

var 손자 = Object.create(자식);

console.log(손자.age); // 20 ==> 자식의 age

손자에서 age를 호출하면 자식의 속성에 age가 있는지 확인하고 있으면 그 것을 사용하지만 없다면 부모로 올라가서 age가 있는지 확인하는 순서이기 때문에 자식의 age 값은 20으로 되어있어 20이 출력된다.

 

 

* ES6

- class

class 부모 {
  constructor(){
    this.name = 'Kim';
    this.sayHi = function(){ console.log('hello') } // constructor안에 추가하기
  }
  sayHi = function(){ console.log('hello') } // prototype에 추가하기
  // == sayHi(){ console.log('hello') } // prototype에 추가하기
}

var 자식 = new 부모();

function말고도 constructor를 만드는 ES6의 방식. constructor 안에 있는 인스턴스를 만들어 사용할 수 있으며 그 외부에 만들면 prototype으로 사용할 수 있다.

 

 

* Object.getPrototypeOf()

함수 안에 object를 넣으면 부모 prototype을 출력할 수 있다. (__proto__랑 유사함)

 

 

 

extends & super
class 할아버지{
  constructor(name){
    this.성 = 'Kim';
    this.이름 = name;
  }
  sayHi(){
    console.log('안녕 나는 할아버지')
  }  
}

class 아버지 extends 할아버지{ // 할아버지라는 객체의 특성을 복사할 때 사용
  constructor(name){
    super(name); // 할아버지 객체의 속성들을 사용하기위해 선언
    this.나이 = 50;
  }
  sayHi2(){
    console.log('안녕 나는 아버지');
    super.sayHi();
  }
}

var a = new 아버지('만수');
a.sayHi2(); // 안녕 나는 아버지 안녕 나는 할아버지

 

 

할아버지 객체의 속성들을 아버지 객체에 복사하기 위해 extends를 사용한다. extends를 사용하게 되면 따라오는 super라는 예약어가 있는데 super는 부모 객체의 속성들에 접근하는 것이다.

 

super는 constructor 안에서 사용하면 부모(할아버지) class의 constructor이고 prototype 함수 안에서 쓰면 부모(할아버지) class의 prototype이다.

 

 

 

getter & setter

자바스크립트의 getter, setter는 오브젝트 내의 데이터의 무결성을 보존하기 위해 쓰는 키워드이다.

var 사람 = {
  name : 'Kim',
  age : 30,
  nextAge(){
    return this.age + 1  
  }
  setAge(나이){
    this.age = parseInt(나이);
  }
}

console.log(사람.nextAge()); // 31
console.log(사람.setAge(20)); // 20

: 함수로 데이터 꺼내오기

- object 안의 데이터가 복잡할수록 함수로 만들어 데이터를 꺼내기 쉽다.

- 내부에 있는 인스턴스 변수를 건드리지 않아 수정 시 실수를 방지할 수 있다.

 

: 함수로 데이터 수정하기

- 원본 데이터를 덮어쓰지 않고 카피 데이터로 관리할 수 있다.

- 내부에 있는 인스턴스 변수를 건드리지 않아 수정 시 실수를 방지할 수 있다.

 

 

* get, set 사용

var 사람 = {
  name : 'Kim',
  age : 30,
  get nextAge(){
    return this.age + 1  
  }
  set setAge(나이){
    this.age = parseInt(나이);
  }
}

console.log( 사람.nextAge );
console.log( 사람.setAge = 20 );

get, set을 이용하면 오브젝트 내의 함수들을 괄호 없이 사용할 수 있다.

 

 

* 사용하는 기준

- 데이터를 뽑거나 가져올 때는 get, 데이터를 입력하거나 수정할 때는 set을 쓰면 된다.

get: 함수에 파라미터가 있으면 안되며 함수 내에 return이 있어야 한다.

set: 함수는 입력을 받아 수정을 해줘야 하기 때문에 파라미터가 한개 이상 꼭 존재해야 한다.

 

class 사람 {
  constructor(){
    this.name = 'Kim';
    this.age = 30;
  }
  get nextAge(){
    return this.age + 1  
  }
  set setAge(나이){
    this.age = parseInt(나이);
  }
}

var 사람1 = new 사람();

console.log( 사람.nextAge );
console.log( 사람.setAge = 20 );

마찬가지로 class에서도 사용할 수 있다.

 

 

 

 

'JavaScript' 카테고리의 다른 글

[JavaScript] 함수형 프로그래밍 (일급함수, 고차함수)  (0) 2022.03.29
[JavaScript] ES6 chap.3  (0) 2021.12.02
[JavaScript] ES6 chap.1  (0) 2021.11.29
[JavaScript] Chap.2  (0) 2021.11.25
[JavaScript] Chap.1  (0) 2021.11.19

[JavaScript] ES6 chap.1

 

 

 

this

1. 아무데서 쓰거나 일반 함수에서의 this는 window

<script>

    console.log(this); // Window
    
    function 함수(){
    	console.log(this); 
    }
    
    함수(); // Window
    
</script>

 

** use strict **

<script>
    'use strict';

    console.log(this); // Window
    
    function 함수(){
    	console.log(this); 
    }
    
    함수(); // undefined
    
</script>

 

 

2. object 자료형 안의 함수에서 this값은 오브젝트 그 자체

<script>
    
    var 오브젝트 = {
        data: "kim",
        함수: function(){
            console.log(this);
        }
    }
    
    오브젝트.함수(); // { data : 'Kim', 함수 : f }
    
</script>

this값: 오브젝트 객체

 

<script>
    
    var 오브젝트2 = {
        data: {
          함수: function(){
              console.log(this);
          }
        }
    }
    
    오브젝트2.data.함수(); // { 함수 : f }
    
</script>

this값: data 객체

 

 

* window 객체

<script>

  (1)
  function 함수(){
    console.log(this)
  }

  (2)
  window.함수 = function(){
      console.log(this);
  }; <!-- window라는 오브젝트에 함수 자료를 추가 -->
  
  <!-- (2)와 같은 의미
  var window = {
    함수: function(){
      console.log(this);
    }
  }
  실질적으로 window로 객체 변수를 선언하면 에러 남-->
  
</script>

- 2번의 뜻은 1번의 뜻과 상통한다. script라는 태그 자체안에 window라는 큰 객체(object)가 있는것이다.

 

 

3. constructor(생성자) 안에서 쓰면 constructor로 새로 생성되는 오브젝트

<script>
       
    function 생성자(){
        console.log(this);
    }        

    new 생성자(); // 생성자 {}
        
</script>

this 값: 생성자 객체

 

 

<script>

    function 생성자or함수(){
        this.테스트 = "test";
        console.log(this);
    }        

    // 1번의 경우
    new 생성자or함수(); // 생성자or함수 {테스트: kim}
    
    // 3번의 경우
    생성자or함수(); // Window
    
</script>

- 함수로 사용 했을시엔 window 객체를 가리키지만 new를 통해 생성자(constructor)로 만들게 되면 해당 function의 이름으로 새로운 object 객체를 만든다.

 

 

4. eventListener 안에서 쓰는 this는 e.currentTarget

<script>

	document.getElementById('ID').addEventListener('click', function(e){
            // == e.currentTarget
            console.log(this); // document.getElementById('ID')            
	});
    
</script>

- 이벤트리스너 안에서의 this는 지금 이벤트가 동작하는 곳을 의미하며, e.currentTarget과 document.getElementById('ID')와 같은 의미이다.

 

 

** 가장 가까이 있는 함수에 따라 바뀌는 this

<script>

    document.getElementById('버튼').addEventListener('click', function(e){
        console.log(this); // document.getElementById('버튼') (4)
        var 어레이 = [1,2,3];
        어레이.forEach(function(){
            console.log(this); // window, window, window (1)
        });
    });

    var 오브젝트 = {
        이름들 : ['김', '이', '박'],
        함수 : function(){
            console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
            오브젝트.이름들.forEach(function(){
                console.log(this); // window, window, window (1)
            });
        }
    }
    
    console.log(오브젝트.함수());
</script>

 

 

** function()과 arrow함수의 차이

<script>

    var 오브젝트 = {
        이름들 : ['김', '이', '박'],
        함수 : function(){
            console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
            오브젝트.이름들.forEach(function(){
                console.log(this); // window, window, window (1)
            });
        }
    }

    console.log(오브젝트.함수());
    
    var 오브젝트2 = {
        이름들 : ['김', '이', '박'],
        함수 : function(){
            console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
            오브젝트2.이름들.forEach( () => {
                console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
            });
        }
    }
    
    console.log(오브젝트2.함수());

</script>

ES6에선 function(){} 대신 () => {} 라는 arrow function 문법이 있는데, 둘의 차이는 함수 내부의 this 값을 새로 바꿔주지 않기 때문에(=바깥에 있던 this값을 내부에서 그대로 사용) this를 사용하기 유용하다.

 

 

 

Arrow function
<script>

    var x = function(){} // 기존 함수
    
    var y = () => {} // arrow 함수

</script>

 

 

* 사용법

<script>

    var 두배만들기 = (x) => { return x * 2 }
    console.log( 두배만들기(4) );
    
    
    var 두배만들기 = x => x * 2 ;
    console.log( 두배만들기(8) );

</script>

- 파라미터가 하나면 중괄호 생략이 가능하고 return 값도 한 줄이면 중괄호와 return도 생략 가능하다.

 

 

* arrow function에서의 this

<script>

    var 오브젝트1 = {
        함수 : function(){ 
            console.log(this)
        }
    }

    오브젝트1.함수(); // { 오브젝트1: 함수f }
    
    
    var 오브젝트1 = {
        함수 : () => { console.log(this) }
    }

    오브젝트1.함수(); // window

</script>

arrow function은 외부에 있던 this를 그대로 내부로 가져와서 사용한다.

 

 

 

 

 

var, let, const

* var

  • 재선언 (o)
  • 재할당 (o)
  • 범위: function
var 이름 = 'kim';

이름 = 'lee' // (o)
var 이름 = 'kim'; // (o)

function(){
    var 테스트 = 'test';
    테스트 // (o)
}

테스트 // (x)

 

 

* let

  • 재선언 (x)
  • 재할당 (o)
  • 범위: {}
let 이름 = 'kim';

이름 = 'lee' // (o)
let 이름 = 'kim'; // (x)

if(1 == 1){
    let 테스트 = 'test';
    테스트 // (o)
}

테스트 // (x)

 

 

* const

  • 재선언 (x)
  • 재할당 (x)
  • 범위: {}
const 이름 = 'kim';

이름 = 'lee' // (x)
const 이름 = 'kim'; // (x)

if(1 == 1){
    const 테스트 = 'test';
    테스트 // (o)
}

테스트 // (x)

 

const 오브젝트 = { 이름 : 'Kim' }
오브젝트.이름 = 'Park'; //가능

const 변수를 쓴다고 하더라도 const로 선언된 변수의 자료 형이 object 형이라면 안에 있는 값을 변경 할 수 있다. 변경 불가능한 값을 만드려면 Object.freeze()라는 기본 함수를 사용하면 된다.

 

 

 

호이스팅, 클로저

- 호이스팅

<script>

    // var 이름;

    console.log(이름); // undefined

    var 이름 = 'Kim'; // 이름 = 'kim;
    
    console.log(이름); // kim
    
</script>

var 변수를 사용하게되면 (var 변수) 선언 부분은 맨 위로 올리고 (변수 = 값)만 그 자리에 남게되는데 이런것을 호이스팅이라고 한다. (함수 또한 호이스팅 가능하다.)

 

 

- 클로저

var 나이 = 20;

function 함수(){
  console.log(나이)
}

함수();

클로저는 바깥에 있는 변수는 안쪽에서 자유롭게 사용할 수 있다는 것을 의미한다. 이것을 참조가능하다라고도 한다. 함수 안쪽에 나이라는 변수가 있다면 그것을 사용하겠지만 없으면 바깥에 있는 변수를 사용한다.

 

 

 

Template literals

따옴표 대신 backquote, backtick 이라는 '`' 기호를 사용하여 문자를 만드는 법이다.

: 장점

  • 문자 중간 엔터키 입력가능
  • 문자 중간 변수를 집어넣을 때 편리
var 문자 = `안녕

하세요`;
var 이름 = '손흥민';
var 문자 = `안녕하세요 ${이름} 입니다`;

 

 

* Tagged Literals

 - 문자 해체분석

var 변수 = '손흥민';

function 해체분석기(문자들, 변수들){
  console.log(문자들);
  console.log(변수들);
}

해체분석기`안녕하세요 ${변수} 입니다`; // () 대신에 이런식으로 사용 가능하다.
// 문자열 값: [안녕하세요, 입니다]
// 변수 값: 손흥민

 

 

 

spread operator

- 괄호를 제거해주는 연산자 (함수/소괄호, 오브젝트/중괄호, 어레이/대괄호에서 사용)

var 어레이 = ['hello', 'world'];
console.log(어레이); // ['hello', 'world']
console.log(...어레이); // hello world

 

- 문자의 경우

var 문자 = 'hello';
console.log(문자[0]); // h
console.log(문자[1]); // e
console.log(문자); // hello
console.log(...문자); // h e l l o

 

 

* 합치기 / 복사

// Array
var a = [1,2,3];
var b = [4,5];
var c = [...a, ...b]; // [1, 2, 3, 4, 5]

// Object
var o1 = { a : 1, b : 2 };
var o2 = { c : 3, ...o1 }; // { a: 1, b: 2, c: 3}

: 합치기

 

var a = [1,2,3];
var b = a;

console.log(a);
console.log(b);

var object1 = {a: 1, b: 2};
var object2 = object1;

console.log(object1);
console.log(object2);

: 복사

등호(=)를 이용하여 쉽게 Array와 Object의 값을 복사 할 수는 있지만 참조 값 타입의 변수를 등호(=) 방식으로 복사 하게되면 값 공유가 일어난다. 때문에 복사되어진 값과 복사한 값의 값 변경이 같이 일어나기 때문에 올바른 복사 방식은 아니다.

 

var a = [1,2,3];
var b = [...a];

console.log(a);
console.log(b);

var object1 = {a: 1, b: 2};
var object2 = {...object1};

console.log(object1);
console.log(object2);

: spread를 통한 복사 방식

값 변경이 일어나도 서로의 값에 영향을 주지 않는다.

 

 

* 만약 spread를 통한 복사를 했을 때, 중복되는 값이 있다면 ??

var o1 = { a : 1, b : 2};
var o2 = { a : 3, ...o1 };
console.log(o2); // {a: 1, b: 2}

중복된 값이 있다면 기존의 값에 새롭게 들어온 값으로 저장된다.

 

 

 

apply, call

array를 파라미터 형태로 집어넣고 싶을 때 사용한다.

function 더하기(a,b,c){
   console.log(a + b + c)
}

더하기(1,2,3); // 6

var 어레이 = [10, 20, 30];

더하기(어레이[0], 어레이[1], 어레이[2]); // 60 주먹구구
더하기.apply(undefined, 어레이); // 60 옛날방식
더하기(...어레이); // 60 요즘방식

 

var person = {
    인사 : function(){
      console.log(this.name + '안녕')
    }
}
  
var person2 = {
    name : '손흥민'
}

person.인사.apply(person2);
person.인사.call(person2);

어떤 함수(person)를 실행하는데 다른 오브젝트(person2)에다가 적용해서 실행할 때 사용한다.

 

person.인사.apply(person2, [1,2,3]); // array 형태
person.인사.call(person2, 1,2,3); // 일반 형태

apply와 call의 사용법과 결과는 똑같지만 함수에 파라미터를 넣어서 실행할 때, apply는 array[] 형태로, call은 일반 함수처럼 파라미터를 전달한다.

 

 

 

 

 

'JavaScript' 카테고리의 다른 글

[JavaScript] 함수형 프로그래밍 (일급함수, 고차함수)  (0) 2022.03.29
[JavaScript] ES6 chap.3  (0) 2021.12.02
[JavaScript] ES6 chap.2  (0) 2021.11.30
[JavaScript] Chap.2  (0) 2021.11.25
[JavaScript] Chap.1  (0) 2021.11.19

[JavaScript] Chap.2

 

 

 

반복문

- 단순 for문 사용

var = 사이즈 = [26,28,30,32,34,36];

for (var i = 0; i < 사이즈.length; i++) {
  var 템플릿 = `<option>${사이즈.[i]}</option>`;
  $('#option2').append(템플릿);
}

 

 

- foreach문 사용

var = 사이즈 = [26,28,30,32,34,36];

사이즈.forEach(function(i){
    // 6번 반복 해줌
    // i 값은 사이즈 안에있는 하나하나의 데이터
    var 템플릿 = `<option>${i}</option>`;
    $('#option2').append(템플릿);
});

 

 

 

sort, filter, map

- sort()

* 기본 sort()는 ㄱ,ㄴ,ㄷ / a,b,c 순으로의 정렬이다.

var arr = [7,3,5,2,40];
arr.sort(function(a,b){
  return a - b // 오름차순 정렬
});

a는 배열의 0번 인덱스, b는 배열의 1번 인덱스 순으로 a와 b가 차례로 (0, 1), (1,2), (2,3).... 순으로 비교하여 양수(+)를 return하면 a를 오른쪽, b를 왼쪽으로 보내고 음수(-)를 return하면 a를 왼쪽, b를 오른쪽으로 보낸다.

** sort() 함수는 기존에 사용한 배열 자체를 변환시킨다. (filter, map은 새로운 배열 만듬)

 

 

- filter()

* 자료에서 원하는 부분만 거를 때 사용한다.

var arr = [7,3,5,2,40];
var newArr = arr.filter(function(a){
  return a < 4 // 4 이하인 것만 남김
})

// newArr = [2, 3]

** filter() 함수는 원본 배열을 수정하지 않아서 새로운 변수에 담아서 사용해야한다.

 

 

- map()

* 자료들에 똑같은 작업을 할 때 사용한다.

var arr = [7,3,5,2,40];
var newArr = arr.map(function(a){
  return a * 2 // 모든 배열에 x2를 한다.
})

// newArr = [14, 6, 10, 4, 80]

** filter() 함수는 원본 배열을 수정하지 않아서 새로운 변수에 담아서 사용해야한다.

 

 

 

DOM (Document Object Model)

자바스크립트는 HTML문서를 해석할 때, 자바스크립트가 해석할 수 잇는 문법으로 정리를 하는데 Object나 Array형의 자료형에 담아서 정리한다. 때문에 어떤 태그를 찾을 때 document.queryselector('태그') 등의 형식으로 찾을 수 있다. 이런 것을 document object model = DOM이라고 한다.

 

 

HTML문서 안에서의 모든 구문은 위에서 아래로 순차적으로 해석을 하게된다. 하여

<script>
  document.getElementById('test').innerHTML = '안녕'
</script>

<p id="test">임시글자</p>

이런식으로 사용하면 에러가 난다. 이유는 ? (<p>태그가 존재하기 전에 미리 자바스크립트에서 <p>태그를 찾았기 때문에 없다고 나옴)

 

그럼 해결은 ??

 

<!Doctype>
<html>
<head>
</head>
<body>

<p id="test">임시글자</p>

<script>
  document.getElementById('test').innerHTML = '안녕'
</script>
<script>...</script>
<script>...</script>
<script>...</script>
</body>
</html>

이런식으로 자바스크립트 부분을 body태그 끝나기 직전에 전부 작성하면 위와 같은 에러는 발생하지 않는다.

 

하지만 이 방법 말고도 또 다른 방법이 있다.

 

 

 

 

 

이벤트리스너 ready, load

* ready

- HTML을 다 읽어 들였는지 알려주는 이벤트 리스너가 있다. HTML문서를 먼저 다 읽고난 후에 자바스크립트를 실행 하고 싶을 때 사용한다.

// javascript
document.addEventListener('DOMContentLoaded', function() { // IE9이상 적용
  //DOM생성이 완료되었을 때 실행할 코드 
});

// jquery
$(document).ready(function(){
  //$(document)에 있는 HTML을 다 읽었을 때 실행할 코드 
});

 

 

 

* load

- load라는 이벤트리스너를 사용하면 DOM 뿐만이 아니라 이미지, CSS, JS파일이 로드 됐는지도 확인 할 수 있다. ( * ready는 DOM 생성만 체크, load는 모든 파일과 이미지의 로드상태 체크)

// javascript
document.addEventListener('load', function() {
  //이미지가 다 로드가 되었을 경우 실행할 코드 
});

// jquery
$(document).on('load', function(){
  //이미지가 다 로드가 되었을 경우 실행할 코드 
});

 

 

** 주의

$('').load(function(){

});

이런 형태와 같은 load 함수는 jquery 3버전 이상부터는 다른 함수로 사용되기 때문에 완전 다른 함수. (Ajax 용으로 쓰인다.)

 

 

 

AJAX & JSON

* AJAX

서버와의 통신을 비동기로 처리할 수 있게 해주는 것. (GET, POST, PUT, PATCH, DELETE)

$('.btn').on('click', function(){
	$.ajax({
    	url: "url",
    	type: 'GET'
    	}).done(function(data){
    	console.log(data);
    	
    	}).fail(function(error){
    
        }).always(function(){
});

 

 

새로고침 없이 데이터 전달 가능.

 

 

* JSON

자바스크립트에선 자료를 Object나 Array 형식으로 관리를 하는데, 서버에서 데이터를 전달 할 때, Object와 유사한 JSON이라는 것을 사용한다. JSON은 Object와 비슷하지만 key값에 쌍따옴표를 쳐서 전달한다. 이유는, 데이터를 통신할 때 텍스트 형식이 아니라면 데이터가 중간에 깨질 수 있기 때문...!

{
  "key": "value", 
  "data": "data", 
  "object": "object", 
  "url": "https://www.naver.com",
  "number": 24200
}

 

하지만, 여기선 문제가 있다.

 

JSON은 Object처럼 '.'을 통해서 원하는 자료를 꺼낼 수 없다.

 

그렇기 때문에 변환 작업이 필요하다.

JSON.parse(JSON 데이터)

해당 함수 안에 담긴 데이터는 쌍따옴표가 제거된다.

 

JSON.stringify(여러분의 오브젝트데이터)

반대로, 해당 함수 안에 담긴 데이터는 Object 자료형에 따옴표를 쳐서 JSON 데이터가 된다.

 

 

 

Hammer.js 이미지 슬라이드

터치해서 이동하는 이미지 슬라이드를 바닐라 자바스크립트로 구현하지 않는 이유

  • 이미지에 touch에 관련된 이벤트리스너를 각각 만들어야 함.
  • 터치 시 X축 좌표를 저장
  • 터시 시작과 끝의 좌표를 연산하여 양수면 오른쪽 음수면 왼쪽 이런식으로 판단
  • 등등

호환성 잡기 또한 매우 귀찮다. (안드로이드, ios 버전 마다 다 다름)

 

 

* Hammer.js

<script src="https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.min.js" integrity="sha256-eVNjHw5UeU0jUqPPpZHAkU1z4U+QFBBY488WvueTm88=" crossorigin="anonymous"></script>

라이브러리 추가한다.

 

- 처음 도입부

var image = document.querySelectorAll('.slide-box img')[0];
    
var manager = new Hammer.Manager(image);
manager.add(new Hammer.Pan({ threshold: 0 })); // 이벤트가 발동되기 전까지의 값
    
manager.on('pan', function(e){
  //image가 pan 되었을 때 실행할 코드 (터치 후 슬라이드 하는 것, rotate 등 여러가지 있음)
})

 

- 실행부

manager.on('pan', function(e){
  console.log(e.deltaX) // x 축으로 드래그한 거리
  
  if ( e.deltaX < -1 ){ // 왼쪽으로 드래그 (오른쪽 사진을 볼 때)
      $('.slide-container').css('transform', 'translateX('+ e.deltaX +'px)');      
      if (e.isFinal) { //터치가 끝났을 때
        console.log(e.isFinal)
      }
    }
})

 

 

 

Typewriting (setTimeout)
setTimeout(function(){ 실행할 코드 }, 1000)

 

<div>
    <button>버튼</button>
    <h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Magnam praesentium, voluptate iusto sint atque officiis maxime vel id molestiae velit ullam deleniti ad, vero libero maiores tempora, quasi aspernatur voluptas.</h1>
</div>

<script>

    var h1태그 = document.querySelector('h1');
    var 원래글씨 = document.querySelector('h1').innerHTML;

    $('button').click(function(){
    	애니메이션(h1태그, 원래글씨);
    })

    function 애니메이션(h1태그, 원래글씨){
        h1태그.innerHTML = '';
        for(let i=0; i<원래글씨.length; i++){
            setTimeout(function(){                
                h1태그.innerHTML += 원래글씨[i];
            }, (100 * i));            
        }
    }

    </script>

 

 

** 유의

한글처럼 IME입력기를 사용해 타이핑하는 언어를 위해 타이핑 애니메이션을 구현하는 라이브러리도 있으니 그것을 이용하길 권장

 

 

 

canvas

이미지처럼 만들어서 사용할 수 있음.

<canvas id="canvas"></canvas>
var canvas = document.getElementById('canvas'); // 캔버스 그리기
var c = canvas.getContext('2d'); // 캔버스 작업하기
ctx.fillText('영수증', 10, 20); // 캔버스 안에 글쓰기

 

 

 

'JavaScript' 카테고리의 다른 글

[JavaScript] 함수형 프로그래밍 (일급함수, 고차함수)  (0) 2022.03.29
[JavaScript] ES6 chap.3  (0) 2021.12.02
[JavaScript] ES6 chap.2  (0) 2021.11.30
[JavaScript] ES6 chap.1  (0) 2021.11.29
[JavaScript] Chap.1  (0) 2021.11.19

[JavaScript] Chap.1

 

 

변수
// 범위가 function-scope
var 나이 = 20;
var 나이 = 21; // O
나이 = 22; // O

// 범위가 {} block-scope
// 재 선언이 불가능한 변수를 만들 때
let 나이 = 20;
let 나이; // X
나이 = 21; // O

// 범위가 {} block-scope
// 재 선언이 불가능한 변수를 만들 때
// 재 할당이 불가능한 변수를 만들 때
const 나이 = 20;
const 나이; // X
나이 = 21; // X

 

 

 

JQuery animate
$('.box').animate({ marginLeft : '100px', 1000 }); // css속성, 밀리초

 

 

 

정규식

정규식 사용: /텍스트/

/abc/
// 정규식.test('테스트 할 문자')
/abc/.test('abcdef')
/[A-z]/ // 대문자 A부터 소문자 z까지
/[ㄱ-ㅎ]/ // ㄱ부터 ㅎ까지
/\S/ // 모든 문자
/\S+/ // 모든 문자열

 

 

 

Carousel(이미지 슬라이드)
<div style="overflow: hidden">
  <div class="slide-container">
    <div class="slide-box">
      <img src="img/shirt1.jpg">
    </div>
    <div class="slide-box">
      <img src="img/shirt2.jpg">
    </div>
    <div class="slide-box">
      <img src="img/shirt3.jpg">
     </div>
   </div>
 </div>
    
<button class="slide-1">1</button>
<button class="slide-2">2</button>
<button class="slide-3">3</button>
.slide-box {
  width: 100vw;
  float: left;
}
.slide-container {
  width: 300vw; /* %로 대체가능 */
}
.slide-box img {
  width: 100%;
}

 

 

 

 

 

스크롤
//javascript
window.addEventListener('scroll', function(){

});

//jquery
$(window).on('scroll',function(){
  
});

// Window 대신 Document도 가능 !

- 스크롤 움직일시 이벤트

 

 

// javascript
window.scrollY;

// jquery
$(window).scrollTop();

- 현재 화면에서 세로(Y) 스크롤 위치 좌표찾기

 

 

 

반복문에서 var와 let의 기능 차이

반복문 안에서 이벤트 리스너가 존재할 시, 이벤트 리스너는 이벤트 리스너의 이벤트가 발생 했을 시 실행되기 때문에 반복문이 다 돌아지고 난 후에 이벤트 리스너에서 이벤트를 실행한다. 반복문에서 정의된 변수 i의 값을 var로 정의 했을 시 var의 범위가 반복문 이상이기 때문에 이미 i의 값은 반복문이 완료 되었을 때의 값으로 할당되어 있고, let의 경우는 i는 반복문 내에서 다른 코드가 참조할 수 있는 범위를 가지기 때문에 이벤트 리스너에서 i의 값을 찾을 때, 반복문의 범위 만큼 돌았을 때의 값을 참조할 수 있다.

(그냥 let을 사용하는걸로 하자)

 

 

 

이벤트 버블링과 이벤트 함수

- 어떤 HTML 태그에 이벤트가 발생하면 그의 모든 상위요소까지 이벤트가 실행되는 현상

<div>
  <div>
    <p>안녕</p>
  </div>
</div>

p 태그를 클릭하면 p와 상위 div, div가 전부 클릭 되었다고 인지함.

 

 

$('div').click(function(e){
  e.target; // 지금 실제로 클릭한 요소
  
  e.currentTarget; // 지금 이벤트리스너가 달린 곳
  $(this); // == e.currentTarget (jquery)
  this // == e.currentTarget (javascript)
  
  e.preventDefault(); // 기본동작 막기
  e.stopPropagation(); // 내 상위 요소의 이벤트 버블링 막기
});

 

** 주의 **

e.target과 비교시 e.currentTarget과 this는 비교가 잘 되지만 $(this)는 비교가 잘 안된다. 의미는 맞지만 javascript와 jquery의 형식이 다르기 때문이다. 비슷하게 e.target과 document.querySelector.... 이런식으로 찾아낸 요소는 비교가 가능하다. (그러므로 javascript는 javascript끼리 jquery는 jquery끼리 비교하자)

 

 

 

이벤트 버블링과 dataset
<div class="test">
  <ul class="list"> <!-- 이벤트리스너 위치 -->
    <li class="tab-button">Products</li> <!-- e.target 범위 -->
    <li class="tab-button active">Information</li> <!-- e.target 범위 -->
    <li class="tab-button">Shipping</li> <!-- e.target 범위 -->
  </ul>
</div>

 

 

* dataset

// javascript
// 셀렉터.dataset.작명
// HTML 태그의 요소와 속성에 (data-작명="") 식으로 작성
document.querySelector('요소').dataset.작명

// jquery
// $(HTML요소).data(키, 값) -> set
// $(HTML요소).data(키) -> get
$(document).data('id', 'test')
$(document).data('id')

- 개발자만 볼 수 있는 HTML 요소와 속성으로 값을 부여하여 사용할 수 있음.

 

 

<ul class="list">
  <li class="tab-button" data-id="0">Products</li>
  <li class="tab-button active" data-id="1">Information</li>
  <li class="tab-button" data-id="2">Shipping</li>
</ul>
$('.list').click(function(e){
    open(e.target.dataset.id);
});

 

 

 

 

'JavaScript' 카테고리의 다른 글

[JavaScript] 함수형 프로그래밍 (일급함수, 고차함수)  (0) 2022.03.29
[JavaScript] ES6 chap.3  (0) 2021.12.02
[JavaScript] ES6 chap.2  (0) 2021.11.30
[JavaScript] ES6 chap.1  (0) 2021.11.29
[JavaScript] Chap.2  (0) 2021.11.25

[Html/Css] 고급 정리 (SASS)

 

 

 

Pseudo

* pseudo class - (:) 다른 상태일 때 

* pseudo element - (::)내부의 일부분만 스타일을 줄 때

.text::first-letter {
  color : red;
}

.text::first-line {
  color : red;
}

.text::after {
  content : '뻥이지롱';
  color : red;
}

.text::before {
  content : '뻥이지롱';
  color : red;
}

first-letter: 앞 글자

first-line: 첫 문장

after: 뒤에 추가

before: 앞에 추가

 

.box::after {
  content : '';
  display : block;
  clear : both;
}

float 속성 사용시 clear: both; 속성 주기

 

 

 

shadow DOM

F12(개발자 도구) - 설정 - Show user agent shadow DOM 클릭

 

보려는 태그의 pseudo 속성값을 보면 해당 위치를 수정가능하다.

input::-webkit-input-placeholder {
  color : red; 
}

크롬: -webkit-

파이어폭스: -moz-

익스플로러: -ms-

 

* user agent stylesheet = 브라우저 기본 스타일같은 거

 - 기본 스타일은 apperance: none; 등을 사용해야 기본 스타일 적용을 해제 할 수 있다.

 

 

 

사이트 발행

1. github

아이디 / 아이디.github.io

Repository name 부분을 해당 형식으로 지정한다.

 

 

2. 일반 호스팅

cafe24.com 에서 웹 호스팅을 사고 FTP 프로그램(ex.Filezilla)을 이용해서 파일관리.

 

 

 

SCSS, SASS

css에 변수, 함수, import, 상속 등의 기능을 사용할 수 있게 만든 것.

$main-color: #2a4cb2; /* 변수 */
$sub-color: #eeeeee;

.box{
	font-color: $main-color; /* 변수 사용 */
}

- 자주 사용하는 색을 변수로 사용

 

$basic-size: 16px;

.background{
    font-size: ($basic-size - 2px);
}

- 사칙 연산도 가능하다.

 

 

* CSS에서 변수와 사칙연산 사용하기

:root{
  --main-color: red;
}

.background {
  background-color: var(--main-color);
  font-size: calc(16px - 2px);
}

 

 

 

 

* SCSS, SASS 차이

- SCSS

.background {
    color: red;
}

 

- SASS

.background
    color: red

 

 

* Nesting

- Nesting 전

.main-bg{
    width: 100px;
}

.main-bg h4{
    font-size: 16px;
}

.main-bg button{
    color: red;
}

 

- Nesting 후

.main-bg{
    width: 100px;
    h4{
        font-size: 16px;
    }
    button{
        color: red;
    }
}

 

 

 

* @extend

%btn{
    width: 100px;
    height: 100px;
    padding: 20px;
}

.btn-green{
    @extend %btn;
    color: green;
}

.btn-red{
    @extend %btn;
    color: red;
}

.btn-blue{
    @extend %btn;
    color: blue;
}

- %는 .대신 쓸 수 있는 임시 클래스를 의미한다. 아무것도 없는 css에 %를 쓴 임시클래스는 클래스로 컴파일 하고 싶지 않을 때 쓰는 기호이다. (% 대신 .도 사용 가능)

 

 

 

* @mixin

@mixin mixinEx($param, $param2) { /* 파라미터 받음 */
    font-size: $param; /* 파라미터 사용 */
    #{ $param2 }: -1px; /* 속성 부분은 #{} 으로 한번 더 감싸야 한다. */
}

h2{
    @include mixinEx(40px, letter-spacing); /* @mixin 적용 */    
}

h3{
    @include mixinEx(30px, width) /* @mixin 적용 */
}

h4{
    font-size: 10px;
    letter-spacing: -1px;
}

 

 

 

* @use

- reset.scss

body{
    margin: 0;    
}

div{
    box-sizing: border-box;
}

$main-color: brown;

 

- main.scss

@use 'reset'; /* 해당 경로의 파일 이름 */

*** @use나 @import 같은 경우는 항상 맨 위에 적용한다.

- 해당 파일 같은 경우는 css 파일을 컴파일 할 필요가 없기 때문에 _reset.scss 형식으로 앞에 '_'를 붙여서 생성한다. '_'를 붙인 경우는 css 파일을 만들지 않는다.

 

@use 'reset';

h2{    
    color: reset.$main-color; /* scss 파일의 변수를 사용 */
}

- @use로 가져온 scss 파일의 $나 @mixin을 사용하기 위해서는 위처럼 그 파일 명을 꼭 앞에 붙여야 한다.

 

 

 

Video, Audio
<video controls autoplay muted loop poster="썸네일경로" preload="metadata">
  <source src="비디오파일경로">
</video>
  • controls: 재생 버튼이 생김
  • autoplay: 자동 재생 (chorm에선 muted와 함께 써야 함)
  • muted: 음소거
  • loop: 반복재생
  • poster: 썸네일 이미지 생성
  • preload: 미리 다운 받을지 정함. (auto, metadata, none)

 

* 비디오 배경 가운데 정렬

.video-box {
  height: 500px;
  width: 100%;
  overflow: hidden;
  position: relative;
}

.video-container {
  position: absolute;
  width : 100%;
  top: 50%;
  left: 50%;
  transform : translate(-50%,-50%);
  z-index: 0;
}

 

 

자식 요소를 position absolute, top, left, transform 속성을 주면 position relative를 가진 부모 요소의 정 가운데에 위치 시킬 수 있다.

 

 

 

 

transform & animation
.box {
  transform : rotate(10deg); /* 회전 */
  transform : translate(10px, 20px); /* 좌표이동 */
  transform : scale(2); /* 확대축소 */
  transform : skew(30deg); /* 비틀기 */
  
  /*transform 두개 이상을 한꺼번에 쓰려면*/
  transform : rotate(10deg) translateX(30px);
}

 

* transition과의 차이

- transition은 시작스타일, 최종스타일, 트리거, transition을 변경하면 a -> b 형태로 변환이 가능하다. 하지만 추가적으로 a -> b -> c 등 이나 정지, 복잡한 움직임 등은 하지 못함. (@keyframes 사용해야 함)

 

 

@keyframes

@keyframes moveTo{
  0% {
    transform : translateX(0px); /* 애니메이션이 0%만큼 동작시 */
  }
  50% {
    transform : translateX(-20px); /* 애니메이션이 50%만큼 동작시 */
  }
  100% {
    transform : translateX(20px); /* 애니메이션이 100%만큼 동작시 */
  }
}

- 애니메이션을 정의하기 위한 공간이다.

 

.box:hover {
  animation-name : moveTo; /* 애니메이션 이름 (만든 keyframes) */
  animation-duration : 1s; /* 애니메이션 동작시간 */
  animation-timing-function : linear; /*베지어 주기*/
  animation-delay : 1s; /*시작 전 딜레이*/
  animation-iteration-count : 3; /*몇회 반복할것인가*/
  animation-play-state : paused;  /*애니메이션을 멈추고 싶은 경우 자바스크립트로 이거 조정*/
  animation-fill-mode: forwards;  /*애니메이션 끝난 후에 원상복구 하지말고 정지*/
}

 

 

* transform을 쓰는 이유

 - browser에는 RenderTree부터 layout, paint, composite 등의 작업을 순서대로 하면서 화면을 만들어 나가는데, margin이나 width 등은 layout 단계에서 수정이 일어나게 되어 layout부터 composite까지의 작업이 다시 일어나야 하지만 transform은 composite 단계에서 작업이 일어나기 때문에 상대적으로 성능부분에서 이득이 있다.

 

 

* css 성능 향상

 

- will-change

.box {
  will-change: transform;
}

바뀔 내용을 미리 렌더링한다. 애니메이션을 주는 스타일이 느리게 동작한다면 사용한다. 성능이 안나올 때만 사용하자.

 

 

- 하드웨어 가속

.box {
  transform: translate3d(0, 0, 0); /* 3D 이동을 하여 GPU 사용하여 연산 */
}

3D 이동을 하는데 값을 0,0,0을 주었기 때문에 움직이지 않는 이동명령을 내린 뒤, 추가적으로 필요한 transform을 적용하면 GPU를 통해서 transform 속성을 연산할 수 있다.

 

 

 

CSS Grid
.grid-container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr; /* 격자 열 (fr은 배수) */
  grid-template-rows: 100px 100px 100px; /* 격자 행 */
  grid-gap: 10px;
}

 

 

* 레이아웃 만드는 법

 

1. 자식 높이와 폭 조정

<div class="grid-container">
    <div class="grid-nav"></div>
    <div class="grid-sidebar"></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
</div>
.grid-nav {
  grid-column : 1 / 4; /* 열의 1번 째 선부터 4번째 선까지 병합 */
  grid-row : 2 / 4; /* 행의 2번 째 선부터 4번째 선까지 병합 */
}

- grid-column: 열의 시작 선 / 열의 끝 선

- grid-row: 행의 시작 선 / 행의 끝 선

 

 

2. 자식 이름으로 부모가 배치

<div class="grid-container">
    <div class="grid-nav">헤더</div>
    <div class="grid-sidebar">사이드바</div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
</div>
.grid-nav {
  grid-area: 헤더;
}

.grid-sidebar {
  grid-area: 사이드;
}

- grid-area: 자식 태그의 이름 지정할 수 있음.

 

 

.grid-container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  grid-template-rows: 100px 100px 100px;
  grid-gap: 10px;
  grid-template-areas: 
    "헤더 헤더 헤더 헤더"
    "사이드 사이드 . ."
    "사이드 사이드 . ."
}

grid-template-areas 속성으로 지정한 모양대로 grid를 나눌 수 있음

 

 

 

position sticky
<body style="background : grey; height : 3000px">

<div class="grey">
  <div class="image">
    <img src="appletv.jpg" width="100%">
  </div>

  <div style="clear : both"></div>
  <div class="text">Meet the first Triple Camera System</div>
    
</div>

</body>
.grey {
  background: lightgrey;
  height: 2000px;
  margin-top: 500px;
}
.text {
  float: left;
  width : 300px;
}
.image {
  float: right;
  width : 400px;
  position: sticky;
  top: 100px;
}

position: sticky; 는 스크롤할 만큼의 크기에 부모 박스가 있어야하고 top을 꼭 지정해 주어야 한다.

 

 

 

3D 애니메이션
transform : rotateX(180deg); /* 가로를 대칭으로 회전 */
transform : rotateY(180deg); /* 세로를 대칭으로 회전 */
transform : rotateZ(180deg); /* 모니터와 사용자간을 대칭으로 회전 */
transform-style: preserve-3d; /* 3d 사물처럼 동작하기 위해 줌 */
backface-visibility: hidden; /* 뒷면의 그림자(앞면의 대칭) 안보이게 처리 */

 

 

 

 

 

 

'Html&Css' 카테고리의 다른 글

[Html/Css] 중급 정리  (0) 2021.11.15
[Html/Css] 기초 정리  (0) 2021.11.05

[Html/Css] 중급 정리

 

 

font-family 설정
body {
  font-family : 'gulim', 'gothic'
}

 

폰트를 여러개 나열하면 차례대로 적용하며 없다면 그 다음 폰트를 적용한다.

 

 

* @font-face

@font-face {
    font-family: '고딕';
    src: url(../font/gothic.ttf);
}

 

폰트가 사용자의 컴퓨터에 저장이 되어 있지 않으면 적용이 되지 않기때문에 해당 스타일을 사용한다. (url 경로에 있는 폰트 파일을 가져온다.)

 

 

* ttf, woff

 - 폰트 파일 중 확장자가 .ttf인 파일은 대체로 용량이 크기 때문에, woff 파일을 쓰면 용량도 적고 서버에서 성능도 챙길 수 있음.

 

 

* IE의 낮은 버전에서 폰트사용하기

@font-face { 
  font-family: 'Gothic'; 
  font-weight: 400; 
  src: url(GothicR.eot); 
  src: url(GothicR.eot?#iefix) format('embedded-opentype'), 
      url(GothicR.woff) format('woff'), 
      url(GothicR.ttf) format('truetype'); 
}

 

 

* 구글 폰트 사용하기

 

fonts.google.com

 

Google Fonts

Making the web more beautiful, fast, and open through great typography

fonts.google.com

 

해당 사이트의 폰트에 들어가서 link(html)나 @import(css)로 복붙하고 사용하면 된다.

 

 

* Anti-aliasing (윈도우에 한함)

 

 - 폰트가 비트맵 이미지 마냥 살짝 깨져보이는 현상

transform : rotate(0.03deg);

 

기울기를 살짝 돌려주면 글자가 매끈해 보인다.

 

 

 

Flexbox
<div class="flex-container">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>
.flex-container {
  display : flex;
  justify-content : center;  /* 좌우정렬 */
  align-items : center;  /* 상하정렬 */
  flex-direction : column; /* 세로정렬 */
  flex-wrap : wrap;  /* 폭이 넘치는 요소 wrap 처리 */
}
.box {
  flex-grow : 2;  /* 폭이 상대적으로 몇배인지 결정 (중간에 삽입하면 크기가 큰 박스가 생김)*/
}

 

메뉴 만들 때, 왼쪽에 로고 오른 쪽에 메뉴 정렬을 하고싶다면

<div class="flex-container">
  <div class="box"></div>
  <div class="box" style="flex-grow : 1"></div>
  <div class="box"></div>
</div>

위와 같은 방법으로 임시로 만든 div에 flex-grow로 크기를 키워준 박스를 삽입한다.

 

 

 

 

head 태그

- CSS 파일

<head>
  <link href="css/main.css" rel="stylesheet">
</head>

1. css/main.css (상대경로: 현재 파일의 경로부터 시작)

2. /css/main.css (절대경로: 현재 사이트에 메인(root) 경로부터 시작)

 

 

- style 태그

<head>
  <style>
    .main {
      
    }
  </style>
</head>

html은 코드 진행이 위에서 아래이기 때문에 body보다 head에 넣는 편이 낫다.

 

 

- 제목

<head>
  <title>페이지 제목</title>
</head>

 

 

- meta 태그

<head>
  <meta charset="UTF-8">
  <meta name="description" content="검색 시 제목으로 뜨는 부분">
  <meta name="keywords" content="검색에 도움을 주는 키워드">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

1. UTF-8: 캐릭터셋 인코딩

2. description: 구글 등의 브라우저에서 검색 시 화면에 뜨는 글

3. keywords: 검색에 도움을 주는 키워드

4. viewport: 화면 시작 시 렌더링 하는 부분 (width=device-width: 장치 기기의 실제 폭으로 렌더링, initial-scale: 화면 줌 레벨)

5. open graph

<head>
  <meta property="og:image" content="/이미지경로.jpg">
  <meta property="og:description" content="사이트설명">
  <meta property="og:title" content="사이트제목">
</head>

페이스북에서 만든 메타태그로 커스터마이징 하여 사용 가능

 

 

 

- Favicon

<head>
  <link rel="icon" href="아이콘경로.ico" type="image/x-icon">
</head>

ico, png 등 파일 가능, 호환성은 ico가 제일 좋으며 사이즈는 32 x 32로 사용한다.

 

 

 

반응형 레이아웃

- 웹의 단위

.box {
  width : 16px; /* 기본 px 단위 */
  width : 1.5rem; /* html태그 혹은 기본 폰트사이즈의 1.5배 */
  width : 2em; /* 내 폰트사이즈 혹은 상위요소 폰트사이즈의 2배 */
  width : 50vw; /* 브라우저(viewport) 화면 폭의 50% */
  width : 50vh; /* 브라우저(viewport) 화면 높이의 50% */
}

typography 디자인 할 때, rem을 사용하긴 함. (18px = 1.2rem, 22px = 1.4rem)

 

 

- viewport 설정

<meta name="viewport" content="width=device-width, initial-scale=1.0">

태블릿이나 모바일 등에서 반응형을 하기 위함.

 

 

- media query

@media screen and (max-width : 1200px) { 
  .box {   
  } 
  
  .box2 {   
  } 
} 

@media screen and (max-width : 768px) { 
  .box { 
    font-size : 30px; 
  } 
}

css 파일의 최하단에서 사용함. 설정한 css에 중복이 발생하면 더 밑에 있는 스타일을 적용한다. 크기는 대체로 (1200px / 992px / 768px / 576px) 사이즈를 권장함. 1200 / 768 or 992 / 576 등으로 사용한다.

 

 

 

개발자 도구 디버깅 및 IE 호환성

- Ctrl + Shift + C 를 누르거나 f12 누르면 원하는 요소의 디버깅이 가능하다. style을 보면 해당 요소에 적용 되어있는 모든 css를 확인할 수 있음.

 

- IE 11 버전 이하에서는 적용되지 않는 요소들이 많은데 조건부로 style을 적용할 수 있다.

<!--[if lt IE 10]>
  <link rel="stylesheet" type="text/css" href="ie/main.css" />
<![endif]-->

해당 조건부로 첨부하면 인터넷 익스플로러 10 미만에서 스타일이 적용된다. (link 태그는 중요할 수록 밑으로 보내는게 좋다.)

 

 

 

Font awesome

- download

https://fontawesome.com/start

 

Font Awesome

The world’s most popular and easiest to use icon set just got an upgrade. More icons. More styles. More Options.

fontawesome.com

 

zip파일 다운로드 후 사용

 

 

- cdn

https://cdnjs.com/libraries/font-awesome

 

font-awesome - Libraries - cdnjs - The #1 free and open source CDN built to make life easier for developers

The iconic SVG, font, and CSS toolkit - Simple. Fast. Reliable. Content delivery at its finest. cdnjs is a free and open-source CDN service trusted by over 12.5% of all websites, serving over 200 billion requests each month, powered by Cloudflare. We make

cdnjs.com

 

url 긁어와서 사용

 

 

fontawesome에선 주로 아이콘을 많이 사용한다.

 

 

 

Transition css 애니메이션
.box {
  opacity : 0; /*투명도 (1: 불투명, 0: 투명)*/
  transition : all 1s; /*1초 동안 모든 스타일 중 하나가 변할 때 동작*/
}
.box {
  transition-delay: 1s; /* 시작 전 딜레이 */
  transition-duration: 0.5s; /* transition 작동 속도 */
  transition-property: opacity; /* 어떤 속성에 transition 입힐건지 */
  transition-timing-function: ease-in; /* 동작 속도 그래프조정 */
}

 

- 애니메이션 만드는 순서

1. 시작 스타일 정하기

2. 최종 스타일 정하기

3. 언제 최종스타일로 변할지 트리거 주기 (대부분 hover)

4. transition으로 서서히 동작하게 하기

 

 

* Tip

<div style="position: relative;">
  <div class="overlay-wrap"> <!-- 회색화면 추가 동작을 위해 한번 더 감싼다. -->
    <div class="overlay-black"> <!-- 회색화면 -->
      <span>$60</span>
    </div>
  </div>
  <img src="img/product1.jpg"> <!-- 이미지 -->
</div>

 

 

 

 

Bootstrap

https://getbootstrap.com/docs/5.1/getting-started/download/

 

Download

Download Bootstrap to get the compiled CSS and JavaScript, source code, or include it with your favorite package managers like npm, RubyGems, and more.

getbootstrap.com

 

ex)

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <title>Hello, world!</title>
  </head>
  <body>
  
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
  </body>
</html>

 

 

- Bootstrap Grid

<div class="row">
  <div class="col-md-4"></div>
  <div class="col-md-4"></div>
  <div class="col-md-4"></div>
</div>
  • row : 행(row)을 뜻함
  • col : 열(column)을 뜻함
  • md : 반응형을 위한 크기지정 (sm : 576px, md : 768px, lg : 992px, xl : 1200px)
  • 숫자 : 한 row를 12분할 했을 때, 가져 갈 크기 비율

 

 

 

CSS 덮어쓰기

- 하나의 CSS 파일

.box {
  background : red;
}

.box {
  background : blue; /* 하단의 스타일이 우선 적용 */
}
<link href="css/main.css" rel="stylesheet">
<link href="css/main2.css" rel="stylesheet"> <!-- 하단이 css가 우선 적용 -->

 

 

- 우선 순위 적용

.div {
  background : red !important; /* 우선 순위 10000 */
}

#div {
  background : blue; /* 우선 순위 100 */
}

.div {
  background : blue; /* 우선 순위 10 */
}

div{
  background : blue; /* 우선 순위 1 */
}

 

 

- Specificity(구체성 점수) 적용

div.container div.box { /* 22점 */
  color : red;
}

div.container .box { /* 21점 */
  color : blue;
}

 

 

 

 

'Html&Css' 카테고리의 다른 글

[Html/Css] 고급 정리 (SASS)  (0) 2021.11.17
[Html/Css] 기초 정리  (0) 2021.11.05

[Html/Css] 기초 정리

 

 

기본 글씨 서체
font-size : 20px; /*글자 크기*/
font-family : 'gulim'; /*서체*/
color : black; /*글자 색*/
letter-spacing : -1px; /*자간*/
text-align : center; /*글자 정렬 위치*/
font-weight : 600; /*글자 굵기*/

 

 

가운데 정렬
display : block;
margin-left : auto;
margin-right : auto;

 

 

* span과 p의 차이

span = inline 속성 -> 요소의 폭 높이 등 설정 불가 (기본적으로 display:inline;)

p = block 속성 -> 요소의 폭 높이 등 설정 가능 (기본적으로 display:block;)

 

 

네모 박스 디자인 속성
width: 200px; /*너비*/
background-color: cadetblue; /*배경색*/
margin: 10px; /*여백*/
padding: 40px; /*안쪽 여백*/
border: 4px solid black; /*테두리 (두께 종류 색상)*/
border-radius: 5px; /*테두리 둥글게*/

 

 

* inherit

일부 속성은 상속이 가능하다. 예를 들어 글자와 관련된 스타일들이 주로 inherit 된다.

 

 

레이아웃 만들기

기본적으로 header, navbar, content, footer로 나눈다. (공통적으로 div -> block 속성)

 

  • float 사용
.container{
    width: 1000px;
} /* 해당 레이아웃의 흘러넘침을 방지하는 감싸는 컨테이너*/

.header{
    width: 100%; /*부모 요소의 style의 %를 따름*/
    height: 100px;
    background-color: black;
}

.navbar{
    width: 20%;
    height: 400px;
    background-color: red;
    float: left; /* 해당 요소를 공중에 띄워서 left 정렬*/
}

.content{
    width: 80%;
    height: 100px;
    background-color: blue;
    float: left; /* 해당 요소를 공중에 띄워서 left 정렬*/
}

.footer{
    width: 100%;
    height: 100px;
    background-color: yello;
    clear: both; /* float 속성으로 인해 공중에 뜬 태그들의 다음으로 정렬하기 위해 사용*/
}

 

 

  • inline-block 사용
.container{
    width: 1000px;
} /* 해당 레이아웃의 흘러넘침을 방지하는 감싸는 컨테이너*/

.header{
    width: 100%; /*부모 요소의 style의 %를 따름*/
    height: 100px;
    background-color: black;
}

.navbar{
    width: 20%;
    height: 400px;
    background-color: red;
    display: inline-block; /*inline-block 속성 추가*/
    vertical-align: top; /* inline 요소에 사용*/
}

.content{
    width: 80%;
    height: 100px;
    background-color: blue;
    display: inline-block; /*inline-block 속성 추가*/
}

.footer{
    width: 100%;
    height: 100px;
    background-color: yello;
}

 

* display: block; = 한 행을 전부 차지 함.

* display: inline-block; = 내 크기 만큼 차지 함.

 

*** inline-block는 html의 태그 간에 띄어쓰기(공백)가 생기면 그대로 공백이 반영 된다. ***

 

 

  - 해결 1) 태그 사이에 공백을 제거한다. (사실 상 안쓰는게 나음)

<div class="navBar"></div><div class="content"></div>

 

  - 해결 2) 주석을 사용한다.

<div class="navBar"></div><!--
--><div class="content"></div>

 

  - 해결 3) 부모의 폰트 사이즈 0으로 만들기

<div style="font-size: 0px;">
	<div class="navBar"></div>
	<div class="content"></div>
</div>

 

 

* inline or inline-block 속성을 사용하게되면 vertical-align: top; 태그를 사용한다.

vertical-align을 사용하는 이유는 inline 속성의 주변에 글씨를 쓸 때 baseline이 존재할 경우, baseline 위 쪽에 오려고 하기때문에 vertical-align으로 위치를 지정해 주어야 한다.

 

 

셀렉터
.content li{} /* 자식의 요소 전부 다 */
.content > li{} /* 직계 자식 요소 만 */
<div class="content title"></div> <!-- 클래스 여러개 부여 -->

 

 

 

 

배경
.background {
  background-image : url(../img.jpg); /*배경 이미지 url*/
  background-size : cover; /*배경 크기 cover: 꽉 채움, contain: 배경이 안짤리게 꽉 채움*/
  background-repeat : no-repeat; /*배경 이미지 반복 안함*/
  background-position : center; /*배경 위치*/
  background-attachment : fixed; /*스크롤 시 고정효과*/
  /*filter 속성을 사용하면 더욱 스타일 효과를 줄 수 있음*/
}

 

*margin collapse

두개의 박스에 테두리가 겹치면 하나의 박스에 스타일을 부여했을 시 같이 움직이는 현상.

 - 해결: padding을 1px 준다.

 

 

좌표 레이아웃 설정
.box {
  position: relative; /*좌표 속성의 기준 점*/
  top : 20px; /*위에서 20px*/
  left : 30%; /*왼쪽에서 30%*/
}

 

* position

 - 좌표 이동을 가능하게 한다.

 - 공중에 뜬다 (like float)

 

.box {
  position : static; /* 기준이 없음 (기본 값) */
  position : relative; /* 기준 */
  position : absolute; /* 기준이 부모 중 relative 속성이 있는 것 */
  position : fixed; /* 기준이 브라우저 창 (viewport) */
}

 

 - position: absolute 일 때, 가운데 정렬하기

.button {
  position : absolute; 
  left : 0;
  right : 0; 
  margin-left : auto;
  margin-right : auto;
  width : 아무값이나
}

 

 

max-width & box-sizing

* max-width

 - 기본적으로 width와 같이 사용. width 값을 %로 지정 해놓고 max-width 값을 설정하면 창이 커질 때 최고 width 값이 max-width 값으로 정해진다. (min-width는 반대)

 

* box-sizing

div {
  box-sizing : border-box; /*박스의 폭은 border까지 포함*/
  box-sizing : content-box; /*박스의 폭은 padding 안쪽*/
}

content-box의 width는 margin, padding, border를 포함 하지 않은 값으로 해당 하는 값이 더 해진 값이 box 값이지만 border-box는 해당 하는 값과 width 값의 총 합이 설정한 값이 된다.

 

 

vertical-align 상하정렬 속성

- 테이블

td, th {
  vertical-align : middle;
}

 

- inline 요소

span {
	vertical-align: top;
    vertical-align: super;
    vertical-align: middle;
    vertical-align: sub;
    vertical-align: bottom;
}

 

 

div 태그 table로 바꾸기
.box {
  display : table;
  display : table-row;
  display : table-cell;
}

 

 

Pseudo-class 셀렉터
:any-link /*방문 전, 방문 후 링크 한번에 선택할 때*/
:playing /*동영상, 음성이 재생중일 때*/
:paused /*동영상, 음성이 정지시*/
:autofill /*input의 자동채우기 스타일*/
:disabled /*disabled된 요소 스타일*/
:checked /*체크박스나 라디오버튼 체크되었을 때*/
:blank /*input이 비었을 때*/
:valid /*이메일 input 등에 이메일 형식이 맞을 경우*/
:invalid /*이메일 input 등에 이메일 형식이 맞지 않을 경우*/
:required /*필수로 입력해야할 input의 스타일*/
:nth-child(n) /*n번째 자식 선택*/
:first-child /*첫째 자식 선택*/
:last-child /*마지막 자식 선택*/

* hover, focus, active 스타일의 순서 -> 차례로 적용해야 작동이 잘 됨.

 

 

OOCSS, BEM

 - OOCSS

btn {
  font-size : 10px;
  padding : 8px;
  border : none;
  cursor : pointer;
}

.bg-red {
  background : red;
}
.bg-blue {
  background : blue;
}
<button class="btn bg-red">빨간버튼</button>
<button class="btn bg-blue">파란버튼</button>

 

 

 - BEM(Block__Element--Modifier)

<div class="main">
  <img class="main__img">
  <h4 class="main__h1">이름</h4>
  <p class="main__content">소개글</p>
  <button class="main__button--red">빨간버튼</button>
  <button class="main__button--blue">파란버튼</button>
</div>

 

'Html&Css' 카테고리의 다른 글

[Html/Css] 고급 정리 (SASS)  (0) 2021.11.17
[Html/Css] 중급 정리  (0) 2021.11.15

[Mysql] root 비밀번호 변경하기 (접속 안될 때)

 

 

 

이번에 포트문제로 인해서 mysql 접속을 못해서

 

(관련 내용은 아래 링크 참조)

 

 

2021.10.27 - [에러] - [Mysql] Access denied for user (using password: yes) 에러 재발생 되다가 안될 때 (feat. 3306포트)

 

[Mysql] Access denied for user (using password: yes) 에러 재발생 되다가 안될 때 (feat. 3306포트)

[Mysql] Access denied for user (using password: yes) 에러 재발생 되다가 안될 때 (feat. 3306포트) 해당 글은 일반적인 Access denied for user (using password: yes) 에러 발생과 다른 내용을 다룹니다. 일..

dbsyys.tistory.com

 

 

 

여러가지 이것저것 다 해보다가

 

결국 root 계정까지 막힌적이 있다...

 

 

그러면서 찾게 된 mysql -u root -p 로 root 계정 접근이 안될 때

 

비밀번호 새로 설정하는 방법.

 

 


 

먼저 관리자 권한으로 cmd 창을 연다.

 

그 후 경로를 "mysql.exe"가 있는 파일로 이동 해야하는데

 

where mysql

 

이라는 명령어를 치면 설치된 경로를 알수 있다고 한다.

 

(근데 난 안나와서 그냥 내가 직접 찾아냈다.)

 

 

C:\Program Files\MySQL\MySQL Server 8.0\bin

 

웬만하면 이런 경로에 있다.

 

 

 

*cd를 이용하여 해당 경로로 이동할 때 띄어쓰기가 있는 디렉토리에 접근 하려면 ""로 감싸면 된다*

 

 

해당 경로로 이동 한 후에

 

mysqld.exe --skip-grant-tables --console --shared-memory

명령어를 입력하면

 

 

 

 

일반적으로 발생하지 않는다고 하는데

 

나는 에러가 났다.

 

 

에러난 경로에서

 

 

mysqld --initialize --console

 

명령어를 입력한다.

 

 

 

 

위의 로그를 보면 정상적으로 명령어가 수행되었지만

 

에러가 난다면 해당경로의 상위 폴더에

 

data 폴더를 삭제 후에 다시 실행 시키면 된다고 한다.

 

 

정상적으로 초기화 되었다면

 

mysqld.exe --skip-grant-tables --console --shared-memory

 

아까 위의 명령어를 다시 실행 시켜준다

 

 

 

 

이렇게 실행된 것을 확인했다면

 

관리자 권한으로 새로운 cmd 창을 실행 시킨 뒤에

 

mysql root로 접속한다.

 

 

 

 

 

 

 

mysql -u root -p 로 접속한다.

 

위의 명령어를 입력하면

 

Enter password 라고 비밀번호 입력하는 창이 나오는데

 

초기화 했기때문에 그냥 엔터치고 넘어간다.

 

 

 

 

 

 

select host, user, authentication_string from user;

 

user를 조회 한다.

 

그리고 나서

 

 

 

 

update user set authentication_string=null where user='root';

 

root 비밀 번호를 NULL로 변경했다.

 

 

 

후에 다른 user 정보 변경 하는 것처럼 원하는 비밀 번호로 바꿔서 사용 할 수 있다.

 

 

2021.09.01 - [에러] - [Mysql] Access denied for user (using password: yes) 에러 발생

 

[Mysql] Access denied for user (using password: yes) 에러 발생

[Mysql] Access denied for user (using password: yes) 에러 발생 JPA 공부하면서 뭔가 혼자 해보려고 기존에 쓰던 h2데이터베이스 말고 다른 데이터베이스 뭘 쓸까 하다가 개인적인 작업이기 때문에 mysql 데이.

dbsyys.tistory.com

 

 

 


출처: https://one-step-a-day.tistory.com/141 [매일 성장하는 블로그]

 

출처 : goodteacher.tistory.com/291

 

MySQL root 계정 비밀번호 초기화

MySQL 비밀번호 초기화 데이터베이스를 사용하다가 root 계정의 비밀번호를 분실하는 것은 정말 큰 일이다. 그나마 오라클의 경우 OS인증을 통해 좀 더 쉽게 처리할 수 있지만 MySQL은 갈길이 좀 멀

goodteacher.tistory.com

 

 

 

 

출처 : github.com/TablePlus/DBngin/issues/18

 

 

 

 

+ Recent posts