기본적인 함수의 생성 및 사용법

JavaScript는 HTML과 CSS에서 하지 못하는 보다 유연한 사용자 입출력 값에 대한 처리와 상호작용을 가능케 합니다. 그래서 Javascript를 주로 사용자가 원하는 상황을 수행하는 함수를 생성하는대에 활용합니다.

  • 이 함수를 선언하면 우리가 일일이 동작을 코드로 구현하지 않고도 미리 만들어 놓은 함수의 키워드를 호출 함으로서 코드가 간결해지고 깔끔하게 동작 할 수 있도록 해줍니다.
  • 이러한 함수 선언은 크게 익명 함수 표현식과 기명 함수 선언문, 화살표 함수 형태로 함수 선언이 가능한데, 사용법에는 차이가 없으나 기명 함수 선언문은 호이스팅(인터프리터가 작업 전 메모리 공간을 할당하는 작업) 시 최우선적으로 읽혀진다는 차이점이 있습니다.
  • 이들 구분은 아래의 코드와 같이 구분 가능하며 이름을 정하는 것 외에도 몇몇의 차이점을 가지고 있으며 이들은 상황 및 표현 방법에 따라 적절히 사용 되나 method 함수에서는 화살표 함수(ES6부터 도입)를 가장 많이 사용하고 있습니다.
  • 특히 화살표 함수는 기존의 함수 선언과는 달리 축약형으로서 몇몇의 코드를 제외해도 된다는 점에서 메모리를 절약 할 수 있고 코드를 보다 간결하게 작성 할 수 있는 장점을 가집니다. 단 객체 데이터를 반환 할 때에는 중괄호를 소괄호로 한번 감싸준 후 작성을 해야 합니다. ( ({name : james}) 처럼.)
  • 아래의 코드는 각각 input1과 input2 라는 ID를 가진 Input 창에 사용자가 값을 각각 입력하고 button을 클릭 하게되면 script 태그에 연결 되어있는 practice.js 파일 속 사용자가 만든 함수인 add 함수를 onclick 이벤트로 호출하여 더하기를 수행하도록 하는 코드입니다.
  • 이처럼 자바스크립트가 하는 일은 주로 사용자가 화면 상에 특정 정보를 입력하고 어떠한 행위를 했을 시 그 값을 받아와 처리하여 다시 사용자에게 반환 하는 작업을 처리 하는데 사용됩니다.

 

//★ 익명 함수 표현식
const add = function () {
  let add =
    parseInt(document.querySelector("#input1").value) +
    parseInt(document.querySelector("#input2").value);
  console.log(add);
	return add;
};

//★ 화살표 함수 (return, 중괄호, 변수 선언 생략)
const add = () => 
console.log(
parseInt(document.querySelector("#input1").value) +
parseInt(document.querySelector("#input2").value));

//★ 기명 함수 선언문
function add() {
  let add =
    parseInt(document.querySelector("#input1").value) +
    parseInt(document.querySelector("#input2").value);
  console.log(add);
	return add;
};

 

일반적으로 이러한 함수를 만드는 코드는 const (함수명) = function(){} 이며, 해당 중괄호 안에 값을 매게 변수로 받아올지, 그 받아온 값을 어떻게 처리를 해서 반환 할지에 대해 작성을 합니다.

 

//★ 기본적인 더하기와 빼기 함수 구현법
function sum(a, b){
 return a+b;
}
function sub(a, b){
 let result = a-b
 return result;
}
let a = sum(1,2);
let b = sub(10,5);

console.log(a,b,c);
//a는 두 변수를 더한 값인 3이, b는 두 수를 뺀 값인 5가 각각 출력된다.

 

특히 함수의 매게 변수는 전달 받는 인자의 개수를 초과하는 값이 전달 될 경우 지정 된 함수의 인자 외에는 무시되지만, arguments 함수를 사용하여 전달 받는 인자값을 직접 선택 받을 수 있습니다.

 

//★ arguments 함수의 기본 사용법

function add(a, b) { //2. add가 사용 할 매게변수는 a와 b 2개지만
  console.log(arguments); //3. arguments를 쓰면 전달 받은 인자값 1,3,5,7이 출력 되고
  console.log(arguments[0]); // 4. 그 중 0번째 arguments인 1이 선택 됩니다.
  console.log(typeof arguments); // 5. 이때의 arguments의 타입은 Object입니다.
  return a + b; 
}

console.log(add(1, 3, 5, 7)) /*1. add 함수에 네 개의 인자를 전달하고 전달 받는 값은 1과 3의 
                      		  더하기 값인 4가 출력됩니다.*/
);

//★ arguments 응용

function getAverage() {
  let result = 0;
  for (const num of arguments) { //2. for-of를 활용해 arguments들을 
    result += num; //3. result에 누적 시켜줍니다.
  }
  return result / arguments.length; // 4. 그리고 누적 합산 된 result 값을 arguments의 길이로
																		// 5. 나눈 후 결과값을 리턴 해줍니다.
}

console.log(
  getAverage(1, 4, 7), // 1. 첫번째 arguments로 1,4,7이 getAverage로 전달 되면
  getAverage(24, 31, 52, 80) // 6. 다시 두번째 arguments들을 getAverage에 전달 후 실행
); //arguments를 사용 할 경우에는 굳이 함수의 인자를 특정하지 않아도 됩니다.

 

또한 함수는 일급 객체(First Class Object)로서의 특성을 가지는데, 즉 function으로 생성 된 함수는 function 타입의 변수로도 사용 될 수 있다는 의미이죠.

  • 이러한 일급 객체는 상수및 변수에 할당도 할 수 있고, 다른 함수에 인자로서 전달도 할 수 있으며, 결과값으로서 반환되는 매게가 될 수도 있습니다. 즉 말 그대로 변수로서의 역할을 수행하는 것이죠.

 

//★ 할당으로서의 역할을 하는 일급 객체

function isOddNum (number) {
  console.log(
   let answer = (number % 2 ? '홀' : '짝')
    + '수입니다.'
  ); //짝수인지 홀수인지 판별하는 코드를 작성 후
  return answer; // 그 값을 저장한 answer에 저장 후 return
};

const checkIfOdd = isOddNum; 
/* 이렇게 만들어진 isOddNum 함수를 checkIfOdd에 할당하면
*/ isOddNum 안의 코드는 전부 checkIfOdd로 할당이 됨.

console.log(checkIfOdd(23)); // checkIfOdd는 정상적으로 실행 가능

//★ 객체에 할당 되는 일급 객체
let person = {
  name: '홍길동',
  age: 30,
  married: true,
  introduce: function (formal) { // person 객체에 introduce 속성에는 키 값으로
    return formal                // funtion이 들어가고 삼항 연산자를 실행한 값을 리턴함
    ? '안녕하십니까. 홍길동 대리라고 합니다.'
    : '안녕하세요, 홍길동이라고 해요.';
  }
};

console.log(person.introduce(true)); 
/* 그래서 person에 introduce를 선택 하고 true를 매게 변수로 전달하면 그 안의 함수가 
매게변수를 받아 실행 되고 해당 결과 값을 리턴 받는거임.
이런 이유로 true를 전달 할 경우 introduce의 함수가 실행 되어 formal 삼항 연산의 조건에 따라 
true 값인 첫번째 결과값이 출력 되는 것입니다.*/

console.log(person.introduce(false)); // 마찬가지로 false에 대한 결과값이 출력.

//★ 배열에 할당 되는 일급 객체

let arithmetics = [
  (a, b) => a + b, //화살표 함수를 사용해 첫번째 값은 a와 b를 더하는 값을 저장
  (a, b) => a - b, //나머지 값들도 해당 연산 실행 후 그 값을 저장
  (a, b) => a * b,
  (a, b) => a / b
];

for (arm of arithmetics) { // for-of문을 사용해 배열의 값들을 꺼내오는데
  console.log(arm(5, 3)); // arithmetics의 값들을 하나씩 꺼내오는데 매게변수로 5와 3을 전달하고
  						  // 각각의 연산이 끝난 arithmetics의 값들을 호출 받아 콘솔 출력.
}

//★ 배열과 함수인자를 전달하는 일급 객체 사용 예시 

let list = [1, 2, 3, 4, 5]; //1부터 5까지 존재하는 리스트 생성

function doInArray (array, func) { //아래 list와 console.log를 각각 array와 func라는 이름으로 입력을 받아
  for (item of array) { // for-of를 사용해 전달 받은 첫번째 array(배열) 안의 item들을
    func(item);         // 하나 하나 꺼낸 후 두번째 메게로 받은 func 함수의 매게로 전달.
  }
}

doInArray(list, console.log); 
/*doInArray의 첫번째 매게 변수에 배열 list를,
두번째 매게변수에는 함수 console.log를 입력 받아 list를 하나 하나 출력 합니다.*/
//참고) 이때 전달되는 함수(console.log)를 콜백 함수, 전달 받는 함수(doInArray)를 고차 함수 라고 합니다.

//★ 익명 함수와 변수들을 전달하는 일급 객체
function doNTime (func, repeat, x, y){// 2.그렇게 네 인자가 들어오면
let result = x; // 3.result 값에 x를 저장합니다. 
for(i = 0; i<repeat ; i++){ // 4. 그리고 repeat 값(3) 만큼 반복을 하는 동안
	result = func(result, y); // 5. result에 첫번째로 받은 익명함수(x,y를 받으면 이 둘을 곱하는 함수)를 실행합니다. 
	}                         // 이때 result는 x(5), y는 2가 됩니다.
	return result; // 6. result 값에 대한 연산이 다 끝난 후 result를 리턴합니다.
}
console.log(
	doNTime((x,y) => x*y, 3, 5, 2) /*1. 네 개의 인자에서 첫번째는 익명 함수((x,y) => x*y)를 전달합니다. 
                                   그리고 두번째 값은 반복할 횟수, 세번째 값은 result에 담길 x, 
                                   네번째 값은 y를 전달합니다.*/
	doNTime((x,y) => x/y, 3, 5, 2) // 7. 첫번째 doNTime이 끝나고 두번째 doNTime을 또 실행합니다.
)

//★ 결과값을 반환 받는 일급 객체 getIntroFunc
function getIntroFunc (name, formal) {// 2. 해당 인자값들을 받은 후
  return formal // 3. return 뒤에 바로 삼항 연산자를 작성합니다. 
  ? function () { // 그래서 formal이 참이면 첫번째 함수가, 거짓이면 두번째 함수가 실행된 값을 retrun 합니다.
    console.log(`안녕하십니까, ${name}입니다.`); // 4. 템플럿 리터럴로 해당 이름을 표기합니다.
  } : function () {
    console.log(`안녕하세요~ ${name}이라고 해요.`);
  }
}

const hongIntro = getIntroFunc('홍길동', true); // 1. getIntroFunc에 인자값으로 이름과 boolean 을 제공합니다.
const jeonIntro = getIntroFunc('전우치', false); // 5. 다음 코드문 실행

생성자 함수 생성 및 사용법

생성자 함수는 같은 양식의 객체들을 반복적으로 만들 경우 사용하는 함수입니다.

  • 우선 new 키워드로 특정 생성자 함수를 호출하는 객체를 생성합니다. 그리고 그 객체를 참조하는 변수를 지정하여 인스턴스들을 생성합니다.
  • 생성된 객체에 인자값을 생성자 함수에 전달하고, 그 인자값을 생성자 함수가 받게 되면 그 각각의 함수를 this 키워드를 통해 해당 인자를 초기화 시켜줍니다. 그 이후 다시 this 키워드로 실행할 함수를 초기화 시켜준 수 해당 인자값들에 대한 함수를 실행하여 반환 해줍니다.
  • 이후 반환된 결과 값을 콘솔 출력이나 이외의 작업으로 처리하면 됩니다.
  • 이 작업을 통해 일일이 해당 변수에 대한 오브젝트를 만들어줄 필요 없이 하나의 생성자 함수에 인자들을 동적으로 처리하여 마치 인쇄를 찍어내듯 여러 변수들에 같은 양식으로 다른 데이터를 저장 할 수 있게 되는 것입니다.
  • 또한 생성자 함수를 통해 생성 된 객체들이 프로퍼티나 메서드 공유를 할 수 있도록 도와주는prototype 키워드를 통해 공통된 일련의 작업을 수행하는 메서드를 사용 할 수 있습니다. 이 경우
  • 이때 prototype으로 만든 프로퍼티나 메서드는 prototype프로퍼티 안에서 따로 보관 및 관리합니다.
  • 물론 인스턴스를 활용하지 않고도 해당 생성자 함수 내에서 자체적으로 프로퍼티와 메서드를 생성 할 수 있습니다. 이럴 경우 해당 생성자 함수를 공유하고 있는 인스턴스는 자체적으로 생성된 프로퍼토와 메서드에 접근 및 사용을 하지 못하지만 함수 자체로는 그 함수를 사용하는 것이 가능합니다.
  • 이러한 생성자 함수는 기존의 함수들과 구별을 짓기 위해 네이밍을 할때 파스칼 케이스(맨 앞글자를 대문자로) 표기법을 사용합니다.
// 생성자 함수
function YalcoChicken (name, no) { //2. chain1으로부터 '판교'와 3을 받어서
  this.name = name; //3. name을 '판교'로 초기화
  this.no = no;//4. no를 3으로 초기화
  this.introduce = function () { //5. 다시 this 키워드를 사용해 이 introduce함수는 
    return `안녕하세요, ${this.no}호 ${this.name}점입니다!`; //6. 초기화 된 no(3)와 name('판교')를 용하여 해당 문구를 문자열 이터럴로 반환 해줍ㄴ디ㅏ.
  }
}// 인스턴스 생성
const chain1 = new YalcoChicken('판교', 3); //1. 생성자 함수 생성
const chain2 = new YalcoChicken('강남', 17);// 7. 1번부터 6번까지의 작업 다시 반복
const chain3 = new YalcoChicken('제주', 24);// 8. 7번의 작업이 끝나면 다시 1번부터 6번까지의 작업 다시 반복

console.log(chain1, chain1.introduce()); // chain1에 저장된 오브젝트의 프로퍼티들과 반환 받은 introduce 함수를 출력
console.log(chain2, chain2.introduce()); // chain1과 똑같이 출력
console.log(chain3, chain3.introduce()); // chain1과 똑같이 출력

// prototype을 이용해 영어로 소개하는 함수 만들기
YalcoChicken.prototype.introEng = function () { //1. prototype키워드를 삽입 후 변수명 지정
  return `Welcome to Yalco Chicken at ${this.name}!`; //2. 지점명을 영어로 소개하는 문장을 반환
};
console.log(chain1.introEng()); /*3. chain1의 introEng 함수를 호출하는데 이때는 이미 위에서 name과 no가 초기화 및 저장 되었기 때문에 인자를 전달 해주지 않아도 된다.
																즉 prototype에서 인자를 받지 않는 이유 또한 이미 위의 원 생성자 함수에서 값들을 연결 받고 있기 때문이다.*/

// 생성자 함수 YalcoChicken 자체의 프로퍼티와 함수 만들기
YalcoChicken.brand = '얄코치킨'; // 1. 생성자 함수의 자체 프로퍼티
YalcoChicken.contact = function () { 2. 생성자 함수의 자체 메서드
  return `${this.brand}입니다. 무엇을 도와드릴까요?`; // 3. 자체 프로퍼티를 이용합니다.
};

const chain1 = new YalcoChicken('판교', 3); // 4.생성자 함수를 참고하는 인스턴스 생성

console.log(YalcoChicken.contact()); //5. 생성자 함수의 자체 contact 함수를 실행하여 호출하면 정상적으로 해당 안내 문구가 호출되지만
console.log(chain1.contact());//6. chain1 인스턴스는 자체 프로퍼티와 메서드에 접근을 할 수 없기에 contatct 메서드를 호출시 에러가 발생합니다.

 

Class 함수

class 함수는 class 키워드로 생성한 함수의 일종이며, 객체 지향 프로그래밍을 구현하기 위한 편리한 문법적인 기능을 제공합니다.

  • 생성자 함수의 역할을 수행하며, new 키워드를 사용하여 인스턴스를 생성할 수 있습니다. 클래스 내부에는 프로퍼티와 메서드를 정의할 수 있습니다. 즉 전체적인 사용법은 생성자 함수와 비슷하지만 몇가지 차이점을 보이기도 합니다.
  • 우선 생성자 함수에서는 함수가 인스턴스로부터 직접 인자를 전달 받았으나, class 함수는 자체 메서드인 constructor에서 전달을 받아 초기화를 합니다. 클래스 당 하나만 사용 가능하며 인스턴스 초기화가 필요 없는 클래스에는 constructor 선언이 불필요합니다.
  • 단, class 함수는 호이스팅을 지원 받지 않으므로 다른 함수들과는 달리 실행 순서를 올바르게 작성을 해주어야 하며, new 연산자를 사용하지 않은 인스턴스일 경우 생성자 함수 실행시에는 undefined가 출력 되었으나, class 함수에서는 오류가 발생합니다. 이유는 class의 경우Syntactic Sugar 문법을 위해 ES6이후 출시 된 함수인지라 엄격 모드가 적용 되었기 때문에 이런 제약들이 존재하는 것입니다.
  • 이때 해당 인스턴스의 변수를 직접 출력하게 될경우 오브젝트 값이 출력 되는 생성자 함수와는 달리 아무것도 출력이 되지 않습니다.
  • 또한 이 class 함수는 ES6 이후부터 객체로서의 함수를 실행 할 때에는 function 키워드를 생략해도 해당 객체가 함수의 기능을 수행함을 인식 할 수 있기 때문에 생략해도 됩니다.
//기본적인 class 함수 생성

class YalcoChicken {//1. 클래스 생성
  constructor (name, no) {//2. constructor 메서드를 이용해 인자값들을 초기화
    this.name = name;
    this.no = no;
  }
  introduce () { // //3. class 내의 introduce 메서드를 생성하고 
    return `안녕하세요, ${this.no}호 ${this.name}점입니다!`;// 4. 해당 문구를 리턴
  }
}
const chain1 = new YalcoChicken('판교', 3);//5. chain1 인스턴스를 생성하여 인자값을 넘겨주고
const chain2 = new YalcoChicken('강남', 17);
const chain3 = new YalcoChicken('제주', 24);

console.log(chain1, chain1.introduce());//6. chain1은 출력이 안되는 대신 introudce 함수를 실행한 리턴값을 받아 출력.
console.log(chain2, chain2.introduce());
console.log(chain3, chain3.introduce());

즉시 실행 함수

즉시 실행 함수(IIFE, Immediately Invoked Function Expression)는 함수를 정의하고 즉시 호출하는함수 형태입니다. 이를 사용하여 함수 스코프를 생성하고 변수들이 전역 스코프로 노출되는 것을 방지할 수 있습니다.

  • IIFE는 함수를 만들자마자 바로 실행하는 패턴을 가집니다.
  • 기본적인 작성법은 익명의 함수(function)의 앞뒤로 소괄호() 로 감싸주고 맨 뒤에 다시 소괄호를 하나 작성 해줍니다.
  • 마지막 소괄호가 중괄호와 함수를 감싸는 소괄호 사이 중간에 들어가도 해당 함수는 정상적으로 작동 됩니다.
const a = 7

(function (){
	console.log(a * 7)
})();

타이머 함수

타이머 함수는 자바스크립트에서 특정 시간 간격 또는 지정된 시간 후에 코드를 실행하는 기능을 제공합니다. 타이머 함수를 사용하여 원하는 시간에 작업을 예약하거나 반복적인 작업을 수행할 수 있습니다.

  • 타이머 함수의 기본 시간은 1000ms(밀리 세컨드) 입니다. 즉 0.001초에 해당하는 단위죠.
  • setTimeout(함수, 시간) : 일정 시간 후 함수를 실행합니다.
  • setInterval(함수, 시간) : 시간 간격마다 함수를 실행합니다.
  • clearTimeout() : 설정 되어있는 setTimeout 함수를 종료합니다.
  • clearInterval() : 설정 되어있는 setInterval 함수를 종료합니다.
const timer = setTimeout(function(){
	console.log('Paul!');
}, 3000); // 3초 후 해당 함수를 실행합니다.

clearTimeout(timer); //setTimeout 정보가 담긴 timer 상수를 종료

const timer = setInterval(() => {
	console.log('Paul!');
}, 3000); // 3초 간격마다 해당 함수를 실행합니다.

clearInterval(timer); //setTimeout 정보가 담긴 timer 상수를 종료

 

 

'프론트 엔드 > 자바 스크립트 | Javascript' 카테고리의 다른 글

5. 배열 선언 및 활용  (0) 2023.08.06
4. 조건문 및 반복문  (0) 2023.08.06
3. 비교 연산자  (0) 2023.08.06
2. 데이터 타입 총정리  (0) 2023.07.24
1. 개념 및 변수 선언  (0) 2023.07.23

JavaScript에서도 마찬가지로 배열 사용이 가능합니다. 단 문자를 저장 할 때는 쿼터를 무조건 기용 해주어야 하며, 중괄호({})를 사용했던 자바에 비해 대괄호([])를 사용한다는 차이점을 갖고 있습니다. 그 외에 인덱스 개념은 동일합니다.

 

let String = ["james", "tomas", "hans"] --> String  배열에 해당 문자열들이 저장됩니다.
let Number = [1,2,3,4,5] --> Number 배열에 해당 숫자들이 저장됩니다. 

console.log(String[0]) --> "james" 출력
console.log(Number[0]) --> 0 출력

다음은 배열의 기본 함수입니다.

 

//기본적인 메소드 사용법

//★ concat : Number 배열과 String 배열을 병합하며 각각의 원본의 배열값은 유지됩니다.
Number.concat(String);  --> [1,2,3,4,5,"james", "tomas", "hans"] 출력

//★ length : 배열의 길이를 출력합니다. 
Number.length; // Number 배열의 길이 5 출력

//★ unshift: 배열의 맨 앞열에 새로운 데이터 값을 추가합니다.
String.unshift("jamesbrother"); // String 배열의 맨 뒷열에 jamesbrother 문자열 추가

//★ push: 배열의 맨 뒷열에 새로운 데이터 값을 추가합니다.
String.push("paul"); // String 배열의 맨 뒷열에 paul 문자열 추가

//★ pop : 배열의 맨 뒷열의 데이터 하나를 삭제합니다. 이때 인자값은 없습니다.
String.pop(); // paul 삭제

//★ reverse : 배열의 순서가 역전됩니다.
Number.reverse(); // [1,2,3,4,5]가 [5,4,3,2,1] 순서로 재배치 됩니다.

/*★ splice : 첫번째 인자의 인덱스 값부터 두번째 인자 개수만큼 데이터를 삭제하고
세번째 인자값을 기입시 해당 삭제된 데이터의 자리에 들어갈 값을 지정할 수 있습니다.*/

String.splice(0,1,"jamesbrother"); // james 문자열 삭제 후 그 자리에 jamesbrother 문자열 추가

//★ indexOf : 해당 배열의 찾고자 하는 인자의 인덱스 값을 반환합니다.
String.indexOf("james"); // james의 인덱스 값 0 반환

//★ includes : 해당 배열의 지정 인자값이 배열에 존재하는지의 유무를 boolean 결과값으로 반환합니다.
String.includes("james"); // String 배열 안에 james 문자열이 존재하므로 true 반환.

/*★ foreach : 첫번째 인자인 콜백 함수로 배열의 매개 변수를 받아 두번째 실행 코드를 반복적으로 수행합니다.
이때 콜백 함수의 매개변수들의 이름은 자유이며 첫번째 인자는 데이터, 두번째 인자는 인덱스 라는 점만
참고하시면 됩니다.*/
const a = Number.foreach(function(x, index) {console.log(x, y)});
// Number 배열의 인자와 해당 인덱스 값을 그 수 만큼 반복적으로 console 출력합니다. 

/*★ map : foreach 함수와 작성법은 비슷하지만 코드 실행에 대한 결과값이 반환 된다는 점에서
반환이 되지 않는 foreach와 차이를 보인다고 할 수 있습니다.
또한 중괄호 안에는 객체 데이터를 작성하는 리터럴 방식도 차용 가능합니다.*/
	const b = Number.map(function(x, index) {return `${x}-${index}`});
// 1-0, 2-1, 3-2, 4-3, 5-4가 상수 b에 반환됩니다.

/*★ filter : map과 비슷한 방식으로 구동하는 filter는 화살표 함수(=>)를 사용해
특정 조건의 경우에 맞는 결과값들을 반환 합니다.*/
	const c = Number.filter(number => return number < 3);
// 배열 중 3보다 작은 값들인 1,2의 데이터가 담긴 배열을 상수c에 반환

/*★ find : 배열 안에 찾고자 하는 데이터를 정규표현식으로 검색 후 반환합니다. */
const d = String.find(people => return /^j/.test(String) );
/* String 배열의 j로 시작하는 데이터가 test 함수를 통해 같은 데이터가 있는지 확인한 후
찾은 값을 return 합니다.*/

//★ findIndex : 배열 안에 찾고자 하는 데이터의 인덱스 값을 정규표현식으로 검색 후 반환합니다.
	const d = String.find(people => return /^j/.test(String) );
/* String 배열의 j로 시작하는 데이터가 test 함수를 통해 같은 데이터가 있는지 확인한 후
찾은 값의 인덱스 값을 return 합니다.*/

'프론트 엔드 > 자바 스크립트 | Javascript' 카테고리의 다른 글

6. 함수 총정리  (0) 2023.08.08
4. 조건문 및 반복문  (0) 2023.08.06
3. 비교 연산자  (0) 2023.08.06
2. 데이터 타입 총정리  (0) 2023.07.24
1. 개념 및 변수 선언  (0) 2023.07.23

If문

자바스크립트에서의 조건문은 자바와 동일한 로직과 작성법을 가지고 있습니다. (엄격한 동등 비교 연산자를 제외한 조건문 양식 동일.)

  • 조건에는 기본적으로 true값이 존재 할경우 해당 명령을 실행합니다. 즉 조건에 맞는 경우(true)는 해당 명령이 실행되고 false일 경우 바로 그 다음의 if문으로 내려가 조건을 살펴보는 로직인 것이죠.
  • 또한 자바와 마찬가지로 자바스크립트 또한 if문은 중첩 if문 또한 사용이 가능합니다.

 

let Input= 5
if(Input === 1){
		console.log("입력값은 1입니다."); // true값일 경우 다음 문구 출력
}else if(Input === 2){
		console.log("입력값은 2입니다."); // 또다른 true값일 경우 다음 문구 출력
}else{
		console.log("범위 외의 값입니다."); // false값일 경우 다음 문구 출력
}

For문

바스크립트에서의 조건문은 자바와 동일한 로직과 작성법을 가지고 있습니다. (엄격한 동등 비교 연산자를 제외한 조건문 양식 동일.)

  • 조건에는 기본적으로 true값이 존재 할경우 해당 명령을 실행합니다. 즉 조건에 맞는 경우(true)는 해당 명령이 실행되고 false일 경우 바로 그 다음의 if문으로 내려가 조건을 살펴보는 로직인 것이죠.
  • 조건문에는 (초기화 : 조건문 : 증감자)가 들어갑니다. 이는 특정 인수를 초기화 한 후 조건문이 실행 되는 동안 증가시키거나 감소시켜 정해진 루프를 수행하게 하도록 하는 것을 의미합니다.
  • 물론 자바와 마찬가지로 자바스크립트도 중첩문 사용이 가능합니다.

 

//기본적인 for문

for (let i = 0; i < 10; i++) {
  console.log(i);
}

let j = 0;

//중첩 for문
for (let i = 0; i<2; i++){
	for (let j = 0; j<5; j++){ // i가 0일때 j는 0부터 4까지 다 돌고 종료 후 i는 1이 되고
														 // j는 또 1부터 4까지 돌고를 반복합니다.
		 console.log(i, j);
	}
}

 

  • 이러한 반복문은 기본적으로 사용하는 for문은 추가적으로 for-in 과 for-of 사용법도 존재합니다.
  • 이 구문에서는 일반 변수들 뿐만 아니라 배열과 객체의 값들을 가져오는 것 또한 가능한데, 단지 초기값을 상수(const)로 지정을 해야 한다는 점만 명심하면 됩니다.
  • for-in은 주로 Object형 데이터를 처리할 때, for-of는 주로 배열이나 set, map 등의 순회 가능한 데이터들을 처리할 때 사용됩니다. 물론 for-in을 통해서도 해당 객체의 값들을 접근연산자 [] 를 사용하여 호출 할 수 있습니다. 

 

//기본 for-in문
for(let var in Object){
	console.log(var)
} // var변수를 임의 생성 후 Object에 있는 키들을 var을 통해 콘솔창에 순서대로 출력합니다.
//기본 for-of문
for(let var in Arrays){
	console.log(var)
} // var변수를 임의 생성 후 Arrays에 있는 값들을 var을 통해 콘솔창에 순서대로 출력합니다.

// for-in문 응용
const lunch = {
  name: '라면',
  taste: '매운맛',
  kilocalories: 500,
  cold: false
}

for (const k in lunch) { // lunch의 변수들을 차례대로 접근하여 for문을 실행
  console.log(k, ':', lunch[k]) // 첫번째는 key(속성), 두번째는 value 접근[]을 사용합니다.
																	
}

//for-of문 응용
const list = [1, '가나다', false, null]; //배열 안에는 다양한 변수들이 존재하는데

for (const item of list) { //for of문을 사용 하면
  console.log(item); // 해당 값들을 순차적으로 출력합니다.
}

 

  • 만약 특정 조건에서 건너띄게 하는 기능을 실행시키고 싶다면 continue 키워드를를 사용하면 됩니다. 이 경우 해당 조건에 만족하는 값은 건너띄고 다시 for문을 실행하게 되죠.
  • continue가 아니라 break를 기입 할경우 해당 조건에 맞아 break 키워드를 실행 후 해당 for문을 아예 종료합니다.

 

//continue 예시
for (let i = 1; i <= 10; i++) {
  if (i % 3 === 0) continue; /*만약 i를 3으로 나눈 나머지 값이 0, 즉 3의 배수일 경우
                               건너띄고 다시 다음 i부터 실행합니다*/
  console.log(i); // 이럴경우 3의 배수, 3,6,9는 출력 되지 않고 나머지 값들만 출력됩니다.
}

console.log('for 루프 종료');

//break 예시
for (let i = 1; i <= 10; i++) {
  if (i % 3 === 0) break; //마찬가지로 3의 배수일 경우 for 루프를 아예 종료합니다.
													
  console.log(i); //하지만 for문 종료 이전까지는 i였던 1과 2는 출력됩니다. 
}
console.log('for 루프 종료');

while문

자바스크립트에서의 while 문은 자바와 같은 매커니즘으로 동작을 합니다.

  • 특정 조건이 유효한 동안에 해당 코드를 실행합니다.
  • 하지만 코드 안에서 해당 조건문의 초기 변수를 증가시켜주지 않는다면 해당 코드문은 무한으로 돌아버리기 때문에 해당 초기 변수가 해당 조건에 사용되는 변수의 초기화 및 감가 처리를 해주어야 합니다.

 

// 범위가 존재 하는 whilte문

let j = 0;
while (j < 10) { // j가 10이 될때까지 실행
  console.log(j);
  j++; // j를 증가
}

//무한 루프의 while문
while (true) {
  console.log('나는 군단이다'); //무한루프
}

//do-while문
let x = 9; //x는 9

do { // 일단 do 안의 코드를 실행하여 9가 출력되고
  console.log(x++); // x를 증가하면 10이 되는데
} while (x < 10){ //while문에서 x는 10이므로 조건에 해당되지 않아 실행 되지 않음
  console.log(x)
	x++;
}

Switch문

자바스크립트에서의 switch 문은 자바와 같은 매커니즘으로 동작을 합니다.

  • 특정 상수나 변수가 조건문에 들어갈 경우 중괄호 안에 있는 알맞은 case문을 찾아 해당 코드를 실행합니다.
  • switch문은 조건문에 맞는 case를 찾은 후 나머지 하위 case를 실행하기 때문에 특정 case를 실행하고 종료시키기 위해서는 break 함수를 작성해 주어 해당 case문만 실행하도록 해야합니다.
  • 만약 입력을 받은 조건문의 값이 case에 해당 되지 않거나 존재하지 않을 시 default문을 사용해 그 예외에 대한 처리를 실행하게 할 수 있습니다. 이때 이 구간에는 break를 걸어줄 필요가 없습니다.
  • 또한 같은 코드 실행문에 여러 case문을 해당 구간에 같이 넣어주어도 상관이 없습니다. 이럴 경우 해당 case를 찾아도 그 구간에 존재하는 나머지 case을 거친 후 break문을 만나 switch문을 종료를 합니다. 그러나 출력은 케이스 수에 상관 없이 한 번만 출력 됩니다. 

 

// 간단한 switch문

let Answer = 3; //입력값은 3

switch (Answer){ //조건문에 Answer(3)이 기입
	case 1:
		console.log('틀렸습니다!');
		break;
	case 2:
		console.log('틀렸습니다!');
		break;
	case 3: // case가 3인 구간으로 이동 후 해당 코드문 실행
		console.log('맞았습니다!');
		break; // break에서 만나 바로 switch문 종료
	case 4:
		console.log('틀렸습니다!');
		break;
	case 5:
		console.log('틀렸습니다!');
		break;
		defalut; //조건문의 값이 그 어느 case문에도 해당하지 않을 시 실행되는 구간.
		console.log('무효입니다.');
}

// 한 구간에 존재하는 여러 switch문

let Order = 4; //입력값은 4

switch (Order){ //조건문에 Order(4)이 기입
	case 1: case 2: case 3:
		console.log('한식');
		break;
	case 4: case 5: case 6: //case 4를 찾았지만 5, 6까지 내려간 후 그때 해당 코드문을 실행.
		console.log('중식');
		break;
	case 7: case 8: case 9:
		console.log('일식');
		break;
		defalut; //조건문의 값이 그 어느 case문에도 해당하지 않을 시 실행되는 구간.
		console.log('메뉴에 해당하지 않습니다.');
}

 

  • 이 switch문의 원리를 이용해서 object의 특정 값을 가져올때 굳이 swtich문을 이용하지 않고도 속성 접근법(?) nullish 병합 연산자(??)를 이용해 해당 입력값에 대한 값을 가져오도록 할 수 있습니다.

 

const direction = 'north'

const directionKor = {
  north: '북',
  south: '남',
  east: '동',
  west: '서'
}[direction] ?? '무효'; /*direction의 값이 north일때 해당 속성을 접근자로 그 값을 찾게 될 경우
                          객체 안에서 해당 key의 value값을 찾은 후
                          directionKor에 할당하게 됩니다.*/

console.log(directionKor); /*그리고 directionKor를 출력 하게되면 그 할당 된 값인
                            '북' 을 출력합니다. 물론 directionKor에는 객체의 값들이 
                             저장 된 상태를 유지합니다. 참조 없이 값만 가져온 것입니다.*/

'프론트 엔드 > 자바 스크립트 | Javascript' 카테고리의 다른 글

6. 함수 총정리  (0) 2023.08.08
5. 배열 선언 및 활용  (0) 2023.08.06
3. 비교 연산자  (0) 2023.08.06
2. 데이터 타입 총정리  (0) 2023.07.24
1. 개념 및 변수 선언  (0) 2023.07.23

자바스크립트에서도 자바와 마찬가지로 비교 연산자를 가지고 있습니다. 하지만 대부분의 비교연산자가 자바와 동일하지만 비교 연산자는 좀더 다른 차이점을 가지고 있습니다. 그래서 자바스크립트에서는 같은지를 비교 해보는 동등 연산자는 주로 일치 연산자, 즉 엄격한 비교 연산자(===)를 사용합니다.

  • 이들 두 비교 연산자의 차이점에는 실제 주소값까지 같은지를 비교하느냐의 유무입니다. 그리고 동등 연산자는 바로 이 실제 주소값의 데이터 까지 같은지를 확인 하는 비교 연산자인 것이죠.
  • 마찬가지로 데이터 타입이 다른 두 변수의 값이나 데이터를 비교할 때는 단순히 느슨한 비교 연산자인 일치 연산자(=)를 다른 기호와 조합하여 사용하는(!=, <= 등등) 것보다 등호(=)를 하나 더 추가해 엄격한 동등비교 연산자를 사용(!==, <== 처럼) 하는 것을 권장합니다.
"1" == 1; //  느슨한 비교는 어느정도 같으면 true 값을 반환합니다.
"1" === 1; // 엄격한 비교는 주소값까지 확인 후 해당 결과를 false 값으로 반환합니다.
"1" !== 1; /* 마찬가지로 숫자 1과 문자1은 다르다는 것을 엄격한 비교로 비교 해보아 
			   true 값을 반환합니다.*/

'프론트 엔드 > 자바 스크립트 | Javascript' 카테고리의 다른 글

6. 함수 총정리  (0) 2023.08.08
5. 배열 선언 및 활용  (0) 2023.08.06
4. 조건문 및 반복문  (0) 2023.08.06
2. 데이터 타입 총정리  (0) 2023.07.24
1. 개념 및 변수 선언  (0) 2023.07.23

원시타입 VS 참조타입

 

우선 자바스크립트의 다양한 데이터 타입은 제법 까다로운 특성과 조건이 있는데요. 그 중 하나가 바로 데이터의 타입이 두 가지로 나뉜다는 것에 있습니다. 즉 자바스크립트의 데이터는 크게 원시 타입과 참조 타입, 이렇게 두 가지로 나뉘어서 관리가 되고 있다는 것이죠. 그래서 대부분의 경우 원시 타입을 외우고나면 그 이외의 변수들은 참조 타입이기 때문에 원시 타입의 종류만 알아두어도 무방합니다.

 

(원시 타입)
String = "", ''
Number = 
Boolean = true(0), false(1)
Bigint
undefined
Symbol
Null
(참조 타입)
배열, 함수, 오브젝트 등

 

원시 타입은 어떠한 변수를 해당 타입으로 특정 값을 저장하고, 그 변수에 새로운 값을 저장 할때 기존에 있던 값과 주소가 삭제되거나 변하지 않고 새로운 값과 그 값의 주소가 저장이 되는 방식입니다. 즉 기존에 있던 값과 주소가 메모리에 그대로 남아 있는 타입인 것이죠.

 

그에 반해 참조 타입은 해당 변수나 함수가 해당 값(객체)를 가지고 있는 것이 아니라, 해당 주소 안에 객체들의 주소를 나타내는 또 다른 주소를 그 값으로 가지고 있고, 그 주소를 참조하여 실제로 객체들이 있는 주소를 갈 수 있는 것입니다. 즉 원시 타입은 해당 주소와 실제하는 값을 가지고 있다면, 참조 타입은 해당 주소 안에 실제 객체가 있는 주소를 그 값으로 가지고 있다는 의미입니다.

 

또한 원시 타입과 참조 타입의 결정적 차이는, 원시 타입은 원본의 값이 변할 때 그 원본을 참조 하는 변수의 값에는 영향을 주지 않지만, 참조 타입은 원본의 값이 변하면 그 원본을 참조하는 변수의 값도 같이 바뀐다는 것에 있습니다.

 

let original = 1;
let copy = original;
original = 2;
console.log(copy) --> 1 출력
// 원시 타입은 참조 변수에 영향을 주지 않기 때문에 참조 변수의 원본 값 유지

let original = [1,2,3];
let copy = original;
original.push(4);
console.log(copy) -->[1,2,3,4] 출력
// 참조 타입은 원본의 값 변경시 참조 타입의 값도 같이 변하게 됩니다.

 

이렇게 원시 타입이냐 참조 타입이냐에 따라 데이터의 참조가 달라지는 특성이 각각 다른데, 그 중 참조 타입의 데이터들은 원본의 데이터를 변경 할 경우 그 주소를 참조하는 다른 데이터도 같이 변경 될 경우를 대비해서 얕은 복사, 깊은 복사의 개념을 활용하게 됩니다.

  • 얕은 복사 방법은 복사할 내용을 다른 대상 객체에 복사한 후 그 객체를 다시 복사 받을 대상에 대입하는 방법입니다. 대표적으로 오브젝트 함수 assign을 활용하여 빈 객체를 새로 생성 후 복사 데이터들을 전달 받아 대상 변수에 대입하는 방식입니다.
  • Node.js를 활용하여 lodash를 임포트 해준 후 cloneDeep 함수를 사용하여 깊은 복사를 할 수 있습니다. 이 경우 얕은 복사와 비교시 앞으로 소개 해드릴 전개 연산자(스프레드)를 활용한 데이터 복사와 마찬가지로 별개의 데이터를 복사 및 할당하기 때문에 원본 데이터의 변경에도 자유롭게 새로운 데이터를 활용 할 수 있습니다. 
const user = {
	name: 'paul',
	age: 29,
	email: 'paul@naver.com'
}

//★ 얕은 복사(shallow copy)
const copyUser = Object.assign({}, user);
/*오브젝트 함수 assign을 활용해 복사를 받고자 하는 객체의 속성들을 
새로운 주소를 가진 빈 객체를 생성 후 받고 
다시 그 객체의 값을 copyUser에 대입하는 방식입니다.*/

const copyUser = {...user}
/*전개 연산자를 활용해 user의 데이터들을 새로운 값으로 재생성 후 copyUser에 저장.*/

//★ 깊은 복사(deep copy)
const copyUser = _.cloneDeep(user);

형 변환

 

또한 자바스크립트에서는 boolean 타입이 단 두가지(true, false)밖에 존재하지 않으나, 각각의 boolean 타입과 비슷한 타입이 존재합니다. 바로 Truthy와 Falsy인데요.

  • Truthy는 true타입과 비슷한 타입으로 비어있는 배열, 객체와 Int, String, 0을 제외한 양음수 등이 있습니다.
  • Falsy는 false타입과 비슷한 타입으로 비어있는 스트링, null, undefined, NaN0의 값 등이 있습니다.
  • 보통 Falsy 값이 많지 않아서 이 값들을 외우면 나머지는 Truthy 타입이라는 점에서 외우기가 쉽다.

 

// Truty
true, [],{},1,2, 'false', -12, '3.14' ㆍㆍㆍ

//Falsy 
false, '', null, udefined, 0, -0, NaN

 

이러한 Javascript는 Java의 Print 함수와는 다르게 console.log() 라는 명령어를 통해 해당 문구를 콘솔에 출력 할 수 있는 기능을 제공하며 가장 많이 사용하는 명령어입니다.

 

// String형 "자바스크립트 입니다." 문구 출력
console.log("자바스크립트 입니다.");

// int형 10과 20을 더한 30의 결과값을 콘솔창에 출력
console.log(10 + 20);

// boolean 형태의 true가 출력
console.log(true);

// 키와 벨류 값으로 이루어진 object 객체를 출력
console.log({name: '홍길동', age: 20, married: false});

// 다양한 타입의 데이터들을 혼합해서 작성하고 출력
console.log('Hi!', 100, true, [1, 2, 3]);

 

  • 또한 자바스크립트는의 내장 객체인 console는 내장 함수인 log뿐만 아니라 다른 함수들을 가지고 있습니다.

 

// 기본적인 출력console.log("자바스크립트 입니다.");

// 정보를 나타내는 마크를 생성 후 해당 문구 출력console.info("이것은 info 내장 함수를 이용한 출력입니다.");

// boolean 형태의 true가 출력console.warn("이것은 warn 내장 함수를 이용한 경고입니다!.");

// 키와 벨류 값으로 이루어진 object 객체를 출력console.error("이것은 error 내장 함수를 이용한 에러입니다.");

 

String

 

String 타입은 자바에서는 쿼터의 사용새에 따라 문자(char | ’’)와 문자열(String | ””) 로 나누어 사용하지만, JavaScript에서는 문자열 타입을 의미하며 ‘’(싱클 쿼테이션), “”(더블 쿼테이션) 안에서 표현이 가능합니다.

  • 자바스크립트에서는 자바에 비해 ‘문자’ 라는 개념이 존재하지 않기 때문에 하나의 독립 된 문자를 저장할 시에는 해당 문자 또한 문자열 시퀀스를 가지게 됩니다.
  • 만약 String형 변수에 해당 문구를 적고 그 안에 “” 기호나 ‘’ 기호를 출력하게 하고 싶다면 해당 기호 앞에 이스케이프 표현중 하나인 백슬레쉬(\)를 넣어 줍니다.
  • 비단 “”나 ‘’뿐만 아니라 백슬레시 자체를 사용 할때에도 \\ 이렇게 작성 해주고 탭이나 줄바꿈을 하려면 \t나 \를 작성 해주면 됩니다. 자바랑 거의 같은 메커니즘이죠.

 

let A = 10;

console.log(A) --> 10 출력
console.log("A") --> A 문구 출력
// 이때 해당 문구는 문자열(String)을 의미합니다.

console.log("A" + "B") --> "AB" 문구 출력
//또한 문자열 끼리 더하는 작업만 가능합니다.

//백슬레쉬를 이용하여 문구 안에 특수기호 출력
let word1 = '작은 따옴표 안에 \\"큰따옴표\\" 사용';
console.log(word1); // 출력값은 작은 따옴표 안에 "큰따옴표" 사용

//탭과 줄바꿈

let word2 = "태정태세 문단세\\
예성연중인명선\\
광인효현숙경영\\
정순헌철고순";
console.log(word2);
// (아래의 문구가 출력됩니다.)
태정태세 문단세
예성연중인명선
광인효현숙경영
정순헌철고순


 

 

  • 이러한 이스케이프 문자를 번거롭게 치지 않고도 입력 그대로 출력을 가능하게 하는 기능이 있는데, 이러한 기능은 바로 백틱 기호(`)를 사용하는 것입니다. 키보드에서는 shift+~를 입력하면 생성되죠.
  • 단 백슬레시를 생성 할때만 \\를 넣어주어야 합니다.

 

let word3 = `안녕하세요~ 일론        머스크입니데잉~
화성 \\\\갈끄니까~\\\\ !!!.`;
console.log(word3)
//아래와 같이 출력합니다.
안녕하세요~ 일론        머스크입니데잉
화성 \\갈끄니까~\\ !!!.

 

 

  • 또한 백틱 안에 달러($)를 활용해 변수의 데이터를 불러오거나 연산 후 결과를 반환하게 할 수도 있습니다.

 

const NAME = '홍길동';
let age = 20;
let married = false;

console.log(
`제 이름은 ${NAME}, 나이는 ${age}세구요, \\
${married ? '기혼' : '미혼'}입니다.`
);
// (다음과 같이 출력 됩니다.)
제 이름은 홍길동, 나이는 20세구요, 
미혼입니다.

 

  • 다음은 문자 데이터(String)에 사용하는 내장 함수의 종류 입니다.

 

/* indexOf : 해당 문자열의 첫번째 등장 인덱스 값을 반환합니다. 
만약 해당 문자열을 찾지 못했다면 -1을 반환 합니다.*/

const result = "Hello World".indexOf('Hello');
console.log(result) /* Hello World의 Hello 의 
											 첫번째 인덱스를 반환 하므로 0을 반환 합니다.*/

/* length : 해당 문자열의 길이를 숫자 데이터로 반환합니다.*/

const result = "Hello World";
console.log(result.length); // 공백을 포함한 11이 출력 됩니다.

/* slice : 특정 문자열의 시작 지점부터 끝 지점 까지의 문자를 포함하는 문자열을 반환합니다.*/

const result = "Hello World";
console.log(result.slice(6, 10)); /* result의 6번째 인덱스 부터 10번째 인덱스의 문자 까지
																	가져오기 때문에 World를 반환 합니다.*/

/* replace : 특정 문자열의 다른 문자열로 대체합니다.*/

const result = "Hello World";
console.log(result.replace('World', 'Life')); /* Hello Wolrd 에서 World 문자열을 
																								 Life 문자열로 대체하기 때문에.
																								 Hello Life를 반환 합니다.*/

/* trim : 특정 문자열의 양쪽 공백을 제거합니다.*/

const result = "     Hello World     ";
console.log(result.trim()); /* "     Hello World     "에서 양쪽 공백을 없앤 문자열
														   "Hello World"를 반환합니다.*/

/* match : 특정 문자열을 찾아서 반환 합니다. 이때 찾고자 하는 대상을 //로 감싸준 후
g(전역 검색)을 붙여주어 해당 문자열에 대해 특정 문자를 찾을 수 있습니다.*/

const result = "jongmin0919@naver.com";
console.log(result.match(/.+(?=@)/)[0]); /*해당 정규식은 이메일의 아이디 부분을 추출하는
기본적인 정규 표현식 입니다. 해석을 하자면 문자열의 범위(//) 안에서 
해당 문자열의 @를 기준으로 앞쪽 전방 탐색(?=)을 할 때 하나 이상(+)의 문자(.)를 찾는 것을
의미합니다. 즉 뜻을 풀어보면 "문자열의 @기호 앞의 하나 이상의 문자열을 전부 찾는다"
라는 의미이고, 이에 대한 반환값은 배열 데이터 중에서 0번째 데이터 이기 때문에
해당 배열 인덱스의 0번째, 즉 추출된 문자열의 인덱스를 [0] 처럼 넣어주면 됩니다.*/

 

Int

 

Number 타입은 음수와 양수를 포함한 정수, 실수 등이 따로 구별되지 않고 Number 라는 데이터 타입 하나로 관리됩니다.

  • 마찬가지로 출력값이 무한대의 값일 경우 Infinity 라는 예약어가 결과값으로 출력됩니다. 이는 인터프리터인 JavaScript의 특성상 결과값이 무한대로 나오는 경우를 대비하기 위해 따로 예약어를 만들어 관리하는 경우라고 개인적으로 생각됩니다. 또 이 Infinity 출력값은 음수의 결과값도 가질 수 있습니다.
  • 또한 자바에서 Number 타입은 모든 연산이 가능하며, 문자와 숫자의 연산시 자동 캐스팅이 되지만 JavaScript 에서는 숫자간의 연산에는 그 제한이 없으나 숫자와 다른 데이터 타입 간의 연산에는 더하기를 제외한 나머지 연산시 NaN 값을 출력하게 됩니다. 이 NaN 값은 양, 음수 값이 따로 없이 그 자체로 NaN의 값을 가집니다.
// (산술 연산자)

console.log(1+2); --> 3 출력
console.log(1-2); --> -1 출력
console.log(1*2); --> 2 출력
console.log(1/2); --> 0.5 출력
console.log(1%2); --> 나머지 연산(MOD), 1 출력
console.log(1**2) --> 제곱 연산(POW), 1 출력

// (단항 산술 연산자)

let a = 5;
console.log(a++); --> a를 식에 사용 후 증가 (5출력)
console.log(++a); --> a를 증가시킨 후 식에 사용 (6출력)
console.log(a--); --> a를 식에 사용 후 감소 (5출력)
console.log(--a); --> a를 증가시킨 후 식에 사용 (4출력)
console.log(+a); --> 변화 없음 (5출력)
console.log(-a); --> 음수로 전환 (-5출력)

// 문자열 산술

console.log(+'100'); --> 문자열에 산술 연산자를 기입시 Number형으로 전환합니다.

console.log(1+''); --> 문자와 숫자를 더할 경우 문자형 타입의 결과값('1')이 출력됩니다.

console.log(1*'2'); --> 또한 더하기를 제외한 숫자와 문자간 연산에서 문자열이 숫자를 
											 내포하는 경우 자바스크립트에서 자동으로 문자열을 숫자로 변환시켜
											 해당 연산을 가능하게 합니다. 이것을 '암시적 타입 변환; 이라고도 합니다.

console.log(1*'a'); --> 반면 더하기 이외의 나머지 연산자를 숫자와 문자간에 사용시 
 											 자바와 달리 자바스크립트는 해당 문자열을 자동 캐스팅 할 수 없다고 판단,
 											 NaN(숫자 데이터가 아님을 의미) 데이터 결과값을 돌려받게 됩니다.

let Inf = 1/0;
console.log(Inf); --> 출력값이 무한대에 가깝기 때문에 Infinity를 출력합니다.

let Inf = -1/0;
console.log(-Inf); --> Infinity는 그 결과값이 음수일 경우 -Infinity 로 출력이 가능합니다.

 

  • 또한 이 Number 의 결과값이 NaN인지를 확인하는 경우 비교 연산자 사용시 자신과 다른 NaN과 비교를 해도 false 값을 반환합니다.
  • 그래서 보다 정확하게 비교를 원하는 경우 isNaN 내장 함수를 사용 하면 올바른 비교값을 반환 받을 수 있습니다.

 

let x = 1 / 'abc';

console.log(
  x, --> NaN 출력
  x == NaN, --> false 출력
  x === NaN, --> false 출력
  isNaN(x), --> true 출력
  Number.isNaN(x) -->   Number.isNaN 메서드를 사용하며, true 출력
);

 

  • 다음은 숫자 데이터(Int)에 사용하는 내장 함수의 종류 입니다.

 

/* toFixed : 지정된 소수점의 자리까지 반올림 하여 그 결과값을 반환합니다.
이때의 반환 데이터의 타입은 String(문자열) 입니다.*/

const pi = 3.14159265358979
const fixedPi = console.log(pi.toFixed(2)); // 3.14가 String 형으로 출력됩니다. 

/* parseInt : 해당 데이터를 분석하여 Int 부분만 Int형으로 변환 후 반환 합니다.*/
/* parseFloat: 해당 데이터를 분석하여 Int 부분까지 Float형으로 변환 후 반환 합니다. */

const convertFixedpitoint = parseInt(fixedPi);
//String 형의 fixedPi값 3.14중 Int형 부분인 3만 Int형으로 변환하여 반환 합니다.

const convertFixedpitofloat = parseFloat(fixedPi);
/*String 형의 fixedPi값 3.14 중 소수점 자리(.14) 뿐만 아니라 정수형(3) 까지
 Float형으로 변환 합니다.*/


 

  • 특히 Math 내장 객체를 사용하여 해당 객체가 가진 함수를 통해 다양한 수학적 처리 수행이 가능해집니다.

 

//Math.abs : 숫자의 절댓값을 반환합니다.
console.log(Math.abs(-5)); // 5

//Math.ceil : 소수점의 값에 상관 없이 x보다 크거나 같은 최소의 정수를 반환 합니다.
console.log(Math.ceil(4.3)); // 5

//Math.floor : 소수점의 값에 상관 없이 x보다 작거나 같은 최대의 정수를 반환 합니다.
console.log(Math.floor(4.9)); // 4

//Math.round: 소수를 반올림하여 반환합니다.
console.log(Math.round(4.5)); // 5

//Math.max: 인자들의 최대값을 반환합니다.
console.log(Math.max(1, 3, 2)); // 3

//Math.min: 인자들의 최소값을 반환합니다.
console.log(Math.min(1, 3, 2)); // 1

//Math.random : 0부터 1까지의 랜덤한 인자를 반환합니다. 
console.log(Math.random()); // 임의의 0 이상 1 미만의 숫자

//Math.sqrt: 인자의 제곱근을 반환합니다.
console.log(Math.sqrt(25)); // 5

//Math.pow: 첫번째 인자의 두번째 제곱의 값을 반환 합니다.
console.log(Math.pow(2, 3)); // 8

 

Boolean

 

Boolean 타입은 true(1)와 falrse(0) 두 가지로 구성이 되어 있으며 이들은 여러가지 연산 방법을 통해 다양하게 연산 될 수 있습니다.

  • 자바스크립트 또한 자바와 마찬가지로 비교 연산자(일치, 동등 연산자 포함), 부정 연산자, 논리 연산자, 삼항 연산자, 다항 연산자 등의 여러 종류의 연산자를 활용 할 수 있습니다.

 

//일치, 동등 비교 연산자 예시

let a = 1 === 2;
let b = 'abc' !== 'def'
let c = a !== b;
let d = typeof a === typeof b === true;

console.log(a, typeof a); // false, boolean 반환
console.log(b, typeof b); // true, boolean 반환
console.log(c, typeof c); // true, boolean 반환
console.log(d, typeof d); // true, boolean 반환

//부정 연산자 예시

console.log(
	true === !false, // true는 false의 반대와 같다, 즉 true는 true와 같다로서 true 반환
	!(typeof false === 'boolean') /* typeof 의 반환값은 String이며 
																	'boolean'도 String 이므로 true 이나
																	 그것의 부정(!) 이므로 false를 반환*/
);

//논리 연산자 예시

console.log(
true || false, // OR 연산자 이므로 앞에 참이 존재하면 컴퓨터는 바로 true를 반환
false || true, // OR 연산자 이므로 앞이 거짓이지만 컴퓨터는 뒤에까지 계산, 뒤에는 true 이므로 true를 반환
true && false, // AND 연산자 이므로 앞이 참이여도 뒤에까지 확인을 하는데 뒤는 false니까 false를 반환
false && true, // AND 연산자 이므로 앞이 false면 그 상태 그대로 뒤쪽을 확인하지 않고 false를 반환
true || true, // 위의 내용에 근거하여 true를 반환
true && true, // 위의 내용에 근거하여 true를 반환
false || false, // 위의 내용에 근거하여 false를 반환
false && false, // 위의 내용에 근거하여 false를 반환
);

//삼항 연산자 예시
let a = true;
let b = a ? '참말입니다.' : '구라입니다.';
console.log(b); // '참말입니다.' 출력

//다항 연산자 예시

let a = 5;
let b = 3;

console.log(a + b); // 덧셈: 8
console.log(a - b); // 뺄셈: 2
console.log(a * b); // 곱셈: 15
console.log(a / b); // 나눗셈: 1.6666666666666667
console.log(a % b); // 나머지: 2
console.log(a ** b); // 5의 3거듭제곱: 125

console.log(a & b);  // 비트 AND: 1
console.log(a | b);  // 비트 OR: 7
console.log(a ^ b);  // 비트 XOR: 6
console.log(~a);     // 비트 NOT: -6
console.log(a << 1); // 왼쪽 시프트: 10
console.log(a >> 1); // 오른쪽 시프트: 2

 

Array

 

Array 타입은 문자와 숫자를 같이 저장 가능하며, 문자를 저장 할 때는 쿼터를 무조건 기용 해주어야 하며, 중괄호({})를 사용했던 자바에 비해 대괄호([])를 사용한다는 차이점을 갖고 있습니다. 그 외에 인덱스 개념은 동일합니다.

  • 이 Array는 typeof 함수로 해당 데이터 타입을 조회시 Object를 반환 합니다. 이는 해당 배열이 오브젝트 타입이라는 말이 아니라 배열은 내부적으로 객체(Object)로 처리가 되기 때문에 typeof로 조회시 Object의 값이 나오는 것입니다.
  • 또한 배열에서도 Object와 마찬가지로 키와 값으로 구성이 되어 있으나 키는 Object의 키 처럼 사용하지 않고 0부터 연속 된 숫자를 의미합니다. 그래서 이 키 값에 접근 할때는 bracket을 활용합니다. 이는 자바에서 배열의 특정 인덱스에 접근 할때 사용하는 방법과 동일한 방법이라고 할 수 있겠습니다.
  • 더불어서 배열은 배열 안에 기본적인 타입들 뿐만 아니라 오브젝트, 배열을 추가 할 수 있습니다.

 

let StringList = ["james", "tomas", "hans"] // String  배열에 해당 문자열들이 저장됩니다.
let NumberList = [1,2,3] // Number 배열에 해당 숫자들이 저장됩니다. 
let MixedList = ['박종민', 29, true, null, undefined] // 배열에는 다양한 타입의 데이터들을 함께 저장 하는 것도 가능합니다.
console.log(StringList[0]) --> "james" 출력
console.log(NumberList[0]) --> 1 출력
console.log(MixedList[0]) --> '박종민' 출력

 


 

다음은 배열의 대표적인 내장 함수입니다.

String.push("paul") --> String 배열의 맨 뒷자리에 paul 요소 추가

String.splice(0,1) --> 배열의 첫번째 인덱스부터 1개를 삭제합니다. 
											 즉 소괄호의 첫번째는 시작 인덱스, 
											 두번째는 연속으로 삭제 할 개수를 의미합니다.

String.pop() --> String 배열의 맨 뒷자리에 paul 요소 삭제, 소괄호 안의 데이터는 입력 X

String.indexOf("paul") --> "paul" 문자열이 String 배열의 인덱스 번호를 반환합니다.

String.includes("paul") --> "paul" 문자열이 해당 배열 안에 존재 할 경우 ture값을, 
														존재하지 않을 경우 false를 반환합니다.

/* 참고로 기본적으로 반환하는 메서드는 console.log()의 소괄호 안에 작성해야
   정상적인 해당 메서드 반환값이 출력 됩니다.*/


 

Object

 

Object 개체는 중괄호({})를 사용하며 해당 프로퍼티(키와 값으로 구성)를 함께 저장 할 수 있습니다. 참고로 자바스크립트에서 문장의 끝에 세미콜론을 생략 시 자동으로 삽입하는 기능을 제공하기 때문에 생략을 해도 생관 없으나 가독성을 위해 세미콜론을 붙이는 것을 권장합니다.

  • 또한 오브젝트의 값으로는 배열을 포함한 거의 모든 데이터 타입이 저장 가능합니다.
  • 키의 이름을 지정 할떄는 콜론을 이용하여 생성 할 수 있습니다. 이때는 bracket으로 묶어서 지정합니다.
  • 또한 오브젝트는 const 상수를 사용하여 생성 및 초기화를 시켜주어도 후에 프로퍼티 값을 변경 할 수 있습니다.
  • 참고로 오브젝트는 배열과 마찬가지로 오브젝트 안에 기본적인 타입들 뿐만 아니라 오브젝트, 배열을 추가 할 수 있습니다.
// 기본적인 오브젝트 객체 생성

const person1 = {
	name: "paul",
	age: 30,
	gender:"male"
};

// 네이밍 규칙에서 벗어난 프로퍼티 생성시 백틱(`)을 키 앞뒤로 넣어줍니다.
const person2 = {
	'1name': "joseph", //숫자로 시작
	'real-age': 50, //대쉬(-) 사용
 'g e n d e r':"male" //스페이스 사용
};

//CPN(Computed Property Name) 으로도 해당 네이밍을 정할 수 있습니다.
let idx = 0; // 1. idx를 0으로 설정
const  obj = {
  ['key-' + ++idx]: `value-${idx}`, // 2. CPN 안에 key-를 따옴표로 감싸주고 거기에 누적된 idx를 더해줍니다. 
  ['key-' + ++idx]: `value-${idx}`, // 3. 그리고 백틱을 이용해 누적 증가된 idex를 출력합니다.
  ['key-' + ++idx]: `value-${idx}`,
  [idx ** idx]: 'POWER' // 4. idx의 제곱, 즉 idx의 idx 승도 계산을 해줍니다.
}

console.log(obj);

// 해당 오브젝트의 프로퍼티에 접근하는 기본적인 방법
console.log(
	person1.name,q
  person1.age,
  person1.gender
);
console.log(
  person1['name'], // 속성명을 문자열로 작성하여 접근하는 방법
  person1['age'],
  person1['gender'],
);

// 어떤 오브젝트에 특정 키가 있는지를 조회하는 방법
console.log('age' in person1); // true를 출력

// 오브젝트의 프로퍼티의 값을 생성, 수정하는 방법
person1.name = "박종민"; // 이름을 박종민으로 수정
person1['age'] = 29; // 나이를 29세로 수정
person1.hobby = "운동"; // 없는 프로퍼티를 작성 할때는 생성이 됩니다. hobby 프로퍼티 생성
console.log(person1); // name은 박종민, age는 29의 값으로 변경 된 채 출력

// 오브젝트의 특정 프로퍼티를 삭제하는 방법
delete person1.name; // delete 연산자를 활용해 person1의 name 프로퍼티를 삭제
delete person1['age']; // 마찬가지로 person1의 age 프로퍼티를 삭제
console.log(person1) // 그럼 출력 값은 gender 프로퍼티만 남게 됩니다.

//함수를 이용해 키를 동적으로 생성, 수정 및 삭제하는 법
const product1 = {// product1 오브젝트에 다음의 프로퍼티들을 생성
  name: '노트북',
  color: 'gray',
  price: 800000
}

function addModifyProperty (obj, key, value) {// 오브젝트, 키, 밸류 값을 입력 받아 
  obj[key] = value; // 기존의 값은 수정, 없는 값은 생성
}
function deleteProperty (obj, key) {// 오브젝트, 키 값을 입력 받아
  delete obj[key]; // delete 연산자를 활용해 해당 프로퍼티를 삭제
}
addModifyProperty (product1, 'inch', 16); // addModifyProperty 함수 호출
deleteProperty(product1, 'color'); // deleteProperty 함수 호출
console.log(product1); // 두 함수가 반영 된 product1 오브젝트 출력

 

  • 특히 ES6 이후 부터 오브젝트를 생성시 변수와 프로퍼티 이름이 동일하다면 자동적으로 전달 받은 인자 값들을 키 값으로 구성해주는 기능으로 편하게 사용이 가능합니다.’

 

function memberList (name, age, address) { // 2. 매게변수와 리턴할 오브젝트의 프로퍼티들은 같으므로
  return { name, age, address }; // 3. name 오브젝트에 전달 받은 키 값들을 자동으로 넣어줍니다.
}

const member1 = memberList('박종민', 30, '서울'); // 1. memberList 해당 값들을 전달하는데 
const member2 = memberList('Re_Go', 20, '강원'); // 2. member2도 1과 마찬가지로 수행

console.log(member1, member2); /* member1은 name: '박종민', age: 30, address:'서울' 이라는 프로퍼티를 가지는 오브젝트 데이터를 출력하고
2도 member1과 마찬가지로 할당 받은 데이터를 콘솔에 출력합니다.*/

 

  • 또한 Object에 프로퍼티에 접근 할 경우 두 가지 접근 방식을 대표로 사용 할 수 있습니다. 보통은 Dot notation을 사용하지만 반복문을 통한 프로퍼티 접근값을 불러올때는 Bracket notation이 사용됩니다.

 

(Dot notation)
Data.name --> 해당 Object의 name키의 값을 닷(.)을 이용해 호출합니다.

(Bracket notation)
Data["name"] --> 해당 Object의 name키의 값을 대괄호([])를 이용하여 호출하며
									 이때의 키 이름은 문자열("") 로 감싸주어야 합니다.
/* 특히 Bracket notation 접근법에서 해당 키 값에 더블 쿼테이션을 씌어주는 이유는
만약 더블 쿼테이션을 사용하지 않고 name 이라고 입력을 하게 되면 해당 키워드로 선언된
let 변수의 값을 호출하기 때문에 더블 쿼테이션으로 감싸주어야 정상적인 오브젝트의 
키 값 호출이 가능합니다. (물론 해당 변수가 "name" 이라는 값을 가지고 있다면 "name"
값이 호출 되는 것과 마찬가지겠고, 그럼 결과적으로 해당 오브젝트의 "name"을 호출하는 것과
같은 효과를 낼 수도 있습니다.*/

/*또한 대입 연산자를 통해 기존의 오브젝트에 새로운 키와 값을 추가 하는 것도 가능합니다.
(예를 들어 Data.place = "Seoul", Object["favorite"] = "책읽기")*/

 

  • 특히 프로퍼티를 포함하는 개체에 해당 값들을 순차적으로 불러오는 자체 함수는 없고(for in식 제외), for문을 사용 하더라도 해당 프로퍼티 자체가 개체이기 때문에 length를 사용하여 조건식을 작성 할 수도 없게 됩니다.
  • 이럴 경우 Bracket notation을 이용해 해당 프로퍼티의 키 값들이 담겨 있는 Keys 배열 변수를 생성 한 후 그 키 값들이 참조하는 프로퍼티의 i번째의 속성 값을 for문을 활용해 순차적으로출력 할 수 있습니다.

 

for (let i = 0; i < Keys.length; i++) {
  console.log(documentObj[Keys[i]]);
}

 

  • 다음은 Object 객체의 method 입니다. 이때 해당 배열의 변수 이름을 먼저 작성하는 Array의 method 사용법과는 다르게 Object를 먼저 써주고 그 다음 닷과 메소드, 그 다음 소괄호 안에 해당 오브젝트를 작성 해줍니다.

 

Object.keys(Data) --> Data의 프로퍼티 중 키만 배열에 담아 문자열로 반환합니다.

Object.values(Data) --> Data의 프로퍼티 중 값만 배열에 담아 기본 타입 상태로 반환합니다.

let result = Object.keys(Data) --> keys 메소드를 사용시 반환값들의 타입은 동일하기에
																	 해당 배열 반환값을 result 변수에 저장하는 것도 
																	 가능합니다.

 

  •  특히 앞서 언급한 assign 함수를 사용하여 특정 오브젝트의 프로퍼티들을 가져올 시 동일한 프로퍼티에는 호출한 키 값으로 대체되고, 새로운 프로퍼티는 기존의 오브젝트에 추가 됩니다.

 

/*assign : 하나 이상의 출처 객체로부터 대상 객체로 속성을 복사할 때 사용합니다.
출처 객체는 여러 값을 입력 할 수 있으며 대상 객체는 빈 오브젝트 리터럴 이여도 상관 없습니다.*/

const target = { a: 1, b: 2 };
const source = { b: 3, c: 4 };

const merged = Object.assign(target, source); // source 속성들이 target에 덮여짐.

console.log(target); // 덮여지는 대상은 원본이 달라집니다. 출력값은 { a: 1, b: 3, c: 4 }
console.log(merged); // { a: 1, b: 3, c: 4 }

 

  • 그리고 오브젝트에는 구조 분해 할당이라는 개념이 존재합니다. 해당 오브젝트 내의 속성들을 분해한 후 변수에 저장을 해서 사용하는 개념입니다. 이를 통칭 디스트럭쳐링(Destructuring) 이라고 부릅니다.

 

const user{
	name: 'paul',
	email: 'paul@naver.com',
	address:'heaven'
}

const {name, email, address: myAddress, age = 23} = user 
/*user 객체의 속성들을 변수로 분해하여 지정합니다. 
이때 속성을 받을 변수 이름과 객체의 속성의 키 이름은 동일해야 합니다. 
속성은 전부 받을 필요는 없으며
만약 본인이 원하는 변수명으로 받고 싶다면 address: myAddress와 같이 
원본을 어떤 변수명으로 바꾸어 받을지 작성하면 됩니다. 
마찬가지로 없는 속성을 추가하여 받고 싶다면 age = 23와 같이 작성 해주면 되는데
age에 원본 속성이 존재 한다면 age = 23은 무효화되고 
객체의 원본 속성이 age 변수에 저장 됩니다.*/

console.log(name, email, address) // 'paul', 'paul@naver.com', 'heaven' 출력

/*물론 배열 타입도 구조 분해 할당이 가능하며, 
이때 변수들은 중괄호 대신 대괄호[]로 감싸줍니다.
단 배열에서의 구조 분해 할당은 순서대로 꺼내오기 때문에
배열에 3개의 값 중 세번째 값을 받고 싶다면 const [, , 배열의 세번째 값]
으로 콤마로 구분 지어 차례대로 작성해야 합니다.*/

 

  • 마찬가지로 전개 연산자를 활용하여 배열이나 객체를 확장, 또는 병합하는데 사용이 가능합니다.

 

//출력 방법
const arr = [1, 2, 3];
console.log(...arr); // arr 배열을 출력하는게 아니라 개별적인 값 1,2,3이 출력 됨.

const obj = { x: 1, y: 2 };
console.log({...obj}); // obj와는 별개의 새로운 프로퍼티가 출력 됩니다. 

//활용 방법 
const arr = [1, 2, 3];
const secondArr = [...arr];
console.log(arr===secondArr); /*secondArr은 arr의 전개 연산자를 활용해 
완전한 별개의 배열 데이터를 받았으므로 false를 반환합니다.*/

 

'프론트 엔드 > 자바 스크립트 | Javascript' 카테고리의 다른 글

6. 함수 총정리  (0) 2023.08.08
5. 배열 선언 및 활용  (0) 2023.08.06
4. 조건문 및 반복문  (0) 2023.08.06
3. 비교 연산자  (0) 2023.08.06
1. 개념 및 변수 선언  (0) 2023.07.23

JavaScript는 웹 페이지를 동적으로 만들기 위해 사용되는 프로그래밍 언어입니다. HTML과 CSS와 함께 웹 개발에서 주요한 역할을 하는 언어로, 웹 브라우저에서 실행되며 사용자와 유연한 동적 상호작용을 가능케 하는 언어입니다. 이러한 JavaScript는 Java와 비슷한 메커니즘을 가지고 있으나 세부적인 디테일이 은근 다른데,

 

우선 Javascript는 Java와는 다르게 선언 하는 변수의 선언 키워드가 많지 않은데, 대표적으로 var, let, const가 있으며, 이들의 차이는 재할당 및 재선언의 가능, 불가능 여부에 따라 달라자며, const는 대표적인 상수 객체이고 var과 let은 대표적인 변수 객체인데 요즘은 const와 let 두가지를 적절히 활용합니다.

 

키워드 재할당 재선언
var O O
let O X
const X X

 

var A = 1;
var A = 2; --> var 키워드는 재할당 및 재선언이 가능하기 때문에 협업시 혼란의 소지가 있어 
							 지양하는 키워드 입니다. 

let B;
B = 1; --> let 키워드는 최초의 변수 선언 후 재할당이 가능하다.

const C = 1; --> const키워드는 선언시 할당을 동시에 해주어야 한다.

또 Java에서 값을 할당하지 않은 변수의 선언시 각 타입의 기본값이 할당되나, Javascript에서는 빈 변수를 선언시 undefined라는 데이터 타입이 할당 됩니다. 마찬가지로 Java에서는 기본적인 원시 타입에 null 타입의 데이터를 할당 할 수 없으나, Javascript에서는 null을 할당 할 수 있습니다.

 

let undef;
let nullName = null;
console.log(undef); -> undefined 출력
console.log(nullName); -> null 출력

그 다음으로 Java에서는 한 줄에 서로 다른 타입의 변수를 같이 선언 할 경우 컴파일 에러가 뜨지만, Javascript 에서는 서로 다른 데이터 타입이더라도 같은 줄에서 한 번에 할당 및 선언이 가능합니다. 단 키워드가 다를 경우 각각 다른 줄에 따로 작성을 요합니다. 

 

//같은 키워드의 두 변수를 같은 줄에 각각 다른 타입의 데이터를 할당
let a = 1, b = "변할 수도 있는 사랑";

//다른 키워드의 두 변수를 같은 줄에 각각 같은 타입의 데이터를 할당
let a = 1;
const b = "변함 없는 사랑";

이러한 변수의 선언에 있어서 네이밍을 지정 할때는 다음과 같은 규칙이 권장 및 적용 됩니다.

  • 한글, 영문 및 유니코드 글자와 숫자를 사용 할 수 있습니다.
  • 특수문자는 $, _ 기호를 사용 할 수 있습니다.
  • 변수명의 첫번째 문자에 숫자를 입력 할 수 없습니다.
  • 공백(space)사용이 불가능 합니다. 단어간 구분이 필요할때는 언더바(_)나 카멜 표기법(nameList 같이 두번째 단어부터 앞글자를 대문자로 표기)를 권장합니다.
  • 자바스크립트에 지정된 예약어로 변수명을 지정 할 수 없습니다.
  • 해외 유저들의 사용 및 협업을 위해 영어 변수명을 지향하고 그 외 언어로 변수명을 정하는 것은 지양합니다.

'프론트 엔드 > 자바 스크립트 | Javascript' 카테고리의 다른 글

6. 함수 총정리  (0) 2023.08.08
5. 배열 선언 및 활용  (0) 2023.08.06
4. 조건문 및 반복문  (0) 2023.08.06
3. 비교 연산자  (0) 2023.08.06
2. 데이터 타입 총정리  (0) 2023.07.24

CSS에서는 Transition 이외에도 Animation 속성을 활용해 요소의 움직임에 변화를 줄 수 있습니다.

 

이때 Transition과 다른 차이점은, Transition은 속성과 함수 적용 후에도 요소에 특정 행위(마우스를 올리 hover 등의 행위)를 할때에만 발동이 되지만 Animation은 설정한 이벤트를 실행하기 위해 특정 행위를 하지 않아도 되며, 특정 속도로 정해진 트랜지션 함수를 사용해야만 했던 Transition에 반해 전체 이벤트에 대한 세부 제어가 가능하다는 점을 들 수 있습니다.

 

이러한 Animation 속성을 사용하기 위해서는 해당 애니메이션이 설정 된 규칙을 정의하고있는 @keyframes 쿼리 규칙이 우선적으로 작성 되어야 합니다.


  1. from{}: 해당 요소의 시작점을 의미합니다. 중괄호 안에는 해당 요소의 시작점에 해당하는 함수와 값을 넣어주면 됩니다. 퍼센트(%)로 대체시 0%에 해당합니다.
  2. to{}: 해당 요소의 도착점을 의미합니다.중괄호 안에는 해당 요소의 도착점에 해당하는 함수와 값을 넣어주면 됩니다. 마찬가지로 퍼센트로 대체시 100%에 해당합니다.
  3. 0% 50% 100%: from과 to 함수 대신 % 기호를 사용해 Animation의 시작점과 중간점, 도착점을 설정 할 수 있으며, 이때의 중간값은 50%에 해당합니다.

또한 이러한 Animation은 호출한 @keyframe의 애니메이션에 대한 애니메이션의 조절값을 지정 해줄 수 있습니다.


  1. animation-name: 애니메이션에 사용될 @keyframes 규칙의 이름을 지정합니다.
  2. animation-duration: 애니메이션의 지속 시간을 지정합니다. 시간 값은 초(s) 또는 밀리초(ms) 단위로 표시됩니다.
  3. animation-direction: 애니메이션의 방향을 지정합니다. normal, reverse, alternate,alternate-reverse 등의 값이 사용됩니다. 애니메이션의 진행 순서를 설정합니다.
  4. animation-timing-function: 애니메이션의 타이밍 함수를 지정합니다. linear, ease, ease-in, ease-out, ease-in-out, steps, cubic-bezier 등의 값이 사용됩니다. 각 값은 애니메이션의 시간에 따른 속도 변화를 나타내며 Transition의 함수와 사용이 동일합니다.
  5. animation-delay: 애니메이션 시작 전에 대기할 시간을 지정합니다. 시간 값은 초(s) 또는 밀리초(ms) 단위로 표시됩니다.
  6. animation-iteration-count: 애니메이션의 반복 횟수를 지정합니다. **infinite**로 설정하면 무한 반복됩니다.
  7. animation-fill-mode: 애니메이션 실행 전과 후의 스타일을 지정합니다. none, forwards, backwards, both 등의 값이 사용됩니다.
  8. animation-play-state: 애니메이션의 재생/일시정지 상태를 지정합니다. running, paused 등의 값이 사용됩니다.

CSS에서는 요소의 해당 요소의 상태 변화를 나타낼 때 Transform 속성을 통해 변화를 줄 수 있습니다. transition과 마찬가지로 단독으로 사용 될 경우 translate>scale>rotate>skew 순으로 작성 합니다.

 

또한 transform 속성의 각 함수들은 2D 변환, 3D 변환 함수 두가지로 나뉘는데 perspective와 rotate(x,y), z축을 다루는 함수의 상황들을 제외한 거의 모든 함수가 2D 변환 함수라는 점을 기억하면 됩니다.


  1. translate(x,y): 해당 요소를 x축과 y축으로 각각 이동 시킬 수 있으며 일부 절대 및 상대 단위의 혼용 사용이 가능합니다.
    • 해당 속성에 한가지 값만 주면 x축과 y축에 동일한 값으로 이동이 되기 때문에 한 축만을 이동하고 싶다면 translateX 또는 translateY 속성을 활용하여 해당 축만 이동시킬 수 있습니다.
  2. scale(x,y): 요소가 가진 x축과 y축을 중심으로 축소 및 확대를 가능하게 합니다.
    • 기본 값은 1이며, 1 미만으로는 축소, 1 초과로는 확대를 의미합니다.
    • translate와 마찬가지로 한 가지 방향만 축소 및 확대를 하고 싶다면 scaleX, scaleY 속성 값을 부여하면 됩니다.
  3. skew(x,y): 문자 그대로 해당 x축 혹은 y축의 각도를 부여합니다. 이때의 속성값 단위는 deg(degree|각도)를 사용합니다.
  4. rotate(deg) : 해당 요소를 rotate의 값 만큼 회전 시킵니다. 이때의 속성값 단위는 skew와 마찬가지로 deg 단위를 사용합니다.
    • rotate도 마찬가지로 x축과 y축에 대한 회전이 가능하며 이때는 perspective 속성과 같이 3D 변환 함수로서 적용이 가능합니다. 즉 rotate에 deg 값을 주면 2D, x축과 y축 값을 지정하면 3D 변환 함수의 역할을 하는 것이죠.
  5. perspective(n) : 3D 변환 함수이며 원근의 거리를 나타냅니다. 즉 rotate 함수와 함께 사용시 해당 축으로 회전이 진행 되는 동안 해당 아이템을 바라보는 유저가 얼마만큼 떨어져서 그 물체를 보는지에 대한 원근감을 설정한다고 할 수 있겠습니다.
    • 이러한 perspective 함수가 transform에 입력 될 때에는 가장 첫번째로 입력이 되어야 합니다.
    • 값이 작을수록 사용자가 요소의 회전을 더욱 가까이에서 목격 하는 것과 같은 효과를 낼 수 있습니다.

 

See the Pen Transform-1 by 종민박 (@kfwueolj-the-scripter) on CodePen.


또한 이 Transform 속성은 Transition과 마찬가지로 해당 함수들을 중첩 적용 시키는 것도 가능합니다.

 

See the Pen Transform-2 by 종민박 (@kfwueolj-the-scripter) on CodePen.


이러한 회전의 기준선은 부모 요소에 perspective 속성을 설정 하였다면 부모 요소의 가운데를 기준으로 아이템을 바라보게 되는 것이고 자식 요소인 아이템에 transform 속성 중 perspective 함수를 입력 할 경우 그 요소의 중심을 기준으로 원근값이 계산 됩니다.

 

그리고 backface-visibility라는 속성은 회전된 요소의 뒷면을 보여줄지 말지에 대한 여부를 설정합니다. default 값은 visible 이며 hidden 설정시 뒷면이 보이지 않습니다.

 

See the Pen Untitled by 종민박 (@kfwueolj-the-scripter) on CodePen.

 

+ Recent posts