개인공부

개발공부 29일,30일차 [유데미 자바스크립트기본 강의]

stella0905 2023. 2. 23. 21:39

실은 리엑트강의인데 아직 자바스크립트 단계다..

자바스크립트 여러 영상 많이 봐서 대부분 비슷한 얘기겠지 했는데 무슨?

난 정말 개발공부를 얕게만 본 거 같다

모르는 게 수두룩 빽빽이었고 아직 영상 몇 개 남았는데 앞으로도 더 모를 예정이다.

 

Javascript 기본

변수에 var를 쓰지 않는 이유 : 변수명을 중복해서 사용이 가능하기 때문에 같은 변수명으로 두 번 적히면 이후 적은 변수는 정상작동 할 수 있지만 이전 변수가 오류가 날 수 있다.

let과 동일한 점은 변수 값을 변경할 수 있지만 let은 동일한 변수명으로 또 적혔을 때 에러가 떠서 중복으로 사용을 할 수 없게 한다.

 

자료형과 형 변환

  • 숫자열
    Infinity 무한대
    -Infinity 음의 무한대
    NaN 수학적인 계산의 실패 결과값

  • null
    직접 null이라는 값을 넣어줘야 하는데 의미로는 의도적으로 이값은 아무것도 안 가리키고 있다. 아무것도 안 담고 있다는 의미를 줌.

parseInt( ) → 문자열을 숫자열로 바꿔줌.

 

복합연산자

let a = 5;
a += 10; 
//a = a+10 = 15

증감연산자

let a = 10;
a++;
console.log(a);
//11
let a = 10;
console.log(a++); //10
console.log(a); //11

---
let a = 10;
console.log(++a); // 11

console에 a가 먼저 찍히고 나서 ++가 되기 때문에 처음 a++에는 10이라고 나온 거임.

++a일 경우 먼저 더해지고 a가 출력되기 때문에 11로 찍힘.

 

논리연산자

! - not

console.log(!true);
//false

&& - AND

|| - OR

 

타입확인

let A = 1;

A = "1";
console.log(typeof A);
//string

변수 A는 1이였지만 문자열 “1”로 바뀌었고 그 타입을 콘솔에 찍어봤을 때 숫자가 아니나 문자열(string)임이 나타난다.

 

null병합 연산자

let a;

a = a?? 10;
console.log(a);
//10

a가 null이거나 undefined이면 a의 값은 a가 아닌 10이 출력된다.

 

조건문

let a = 5;

if(a >=7){
	console.log("7 이상입니다.")
} else if(a >=5){
	console.log("5 이상입니다.")
} else {
	console.log("5 미만입니다.")
}

//5 이상입니다.

스위치 문

let country = "ko";

switch (country) {
  case 'ko':
    console.log("한국");
    break;
//break를 안써주면 밑에 조건까지 하나로 인식을 해버림.
  case 'cn':
    console.log("중국");
    break;
  case 'jp':
    console.log("일본");
    break;
  default:
    console.log("미 분류");
    break
}

//한국 으로 출력됨.

함수

함수 선언식

function getArea(){
  let width = 10;
  let height = 20;

  let area = width * height
  console.log(area);
}

//함수 선언식, 함수 선언 방식의 함수 생성

getArea(); //함수의 호출
console.log("함수 실행 완료")

//함수의 호출이 먼저 이루어지면 호출이 완료될때까지 다음동작은 실행하지 않음.

<직사각형 10개의 너비를 구하기>

let width1 = 10;
let height1 = 20;

let area1 = width1 * height1

console.log(area1)

//200

let width2 = 30;
let height2 = 15;

let area2 = width2 * height2 
console.log(area2)

//450

⬇️

function getArea(width, height){
  let area = width * height;
    console.log(area)
}


getArea(100,200); 
//100 = width
//200 = height
getArea(1,200); 
getArea(2,200); 
getArea(3,200); 
getArea(4,200); 
getArea(5,200); 
getArea(6,200); 
getArea(7,200); 
getArea(8,200); 
getArea(9,200); 
console.log("함수 실행 완료");

 

콘솔에 찍는 게 아닌 변수에 할당하고 싶을 땐 return을 사용한다.

function getArea(width, height){
  let area = width * height;
  return area
}


let area1 = getArea(100,200); 
//100 = width
//200 = height
console.log(area1) //20000
console.log("함수 실행 완료");

return을 적지 않을 경우 area1은 undefined이 뜬다.

 

함수내부에 선언된 변수 - 지역변수

함수 내부에 선언된 변수는 함수 바깥에서 호출할 수가 없다.

function getArea(width, height){
  let area = width * height;
  return area
}

let area1 = getArea(100,200); 
//100 = width
//200 = height
console.log(area)
//Uncaught ReferenceError: area is not defined라고 에러가 뜸.

함수 외부에 선언되어 어디서든 사용가능 한 변수

  • 전역변수, 글로벌변수

함수외부에 선언된 변수는 함수 내부에서도 사용 가능하다.

let count = 1;

function getArea(width, height){
  let area = width * height;
  console.log(count)
  return area
}

let area1 = getArea(100,200);

 

함수 표현식
함수를 변수에 담을 수 있다.

let hello = function(){
  return "안녕하세요 여러분";
}

console.log(hello)

//ƒ (){
//  return "안녕하세요 여러분";
//}
let hello = function(){
  return "안녕하세요 여러분";
}

const helloText = hello()
console.log(helloText)
//안녕하세요 여러분

호이스팅 - 프로그램 실행 전에 코드의 최상단으로 끌어올려진다.

console.log(helloB());
//안녕하세요. 여러분 

let helloA = function(){
  return "안녕하세요 여러분";
} //함수 표현식

function helloB(){
  return "안녕하세요 여러분"
} //함수 선언식

함수선언식이 아래에 되어있지만 프로그램 실행 전에 최상단으로 끌어올려져

맨 위에 호출을 해도 정상적으로 호출이 된다.

console.log(helloA())
//Cannot access 'helloA' before initialization
let helloA = function(){
  return "안녕하세요 여러분";
} //함수 표현식

console.log(helloA());
//안녕하세요 여러분

함수표현식은 호이스팅이 되지 않기 때문에 함수 위에 호출할 경우 에러가 뜬다.

 

화살표함수

let helloA = () => {
  return "안녕하세요 여러분";
} //함수 표현식
console.log(helloA())
//안녕하세요 여러분

let helloB = () => "안녕하세요 여러분";
//함수가 return할 필요가 없다면 중괄호가 없어도 된다.
console.log(helloB())
//안녕하세요 여러분

 

콜백함수

기분에 따라 동작하게 하기

function checkMood(mood,goodCallback,badCallback){
  if(mood === 'good'){
    // 기분 좋을 때 하는 동작
    goodCallback()
  } else {
    // 기분 안좋을 때 하는 동작
    badCallback()
  }
}

function cry(){
  console.log("ACTION :: CRY")
}
function sing(){
  console.log("ACTION :: SING")
}
function dance(){
  console.log("ACTION :: DANCE")
}

checkMood("sad",sing,cry)
//"sad" -> else에 해당한다.
//sing -> goodCallback()에 해당한다.
//cry -> badCallback()에 해당한다.
//else에 해당하면 badCallback()함수가 들어와야 하기 때문에 ACTION :: CRY가 출력된다.

콜백 함수 = 함수의 파라미터로 함수를 넘긴다.

 

객체

let person = new Object(); //객체 생성자 방식
//new ObJect = 새로운 객체를 생성한다.
let person = {}; //객체 리터럴 방식
let person = {
  key: "value",
  key1: 123,
  key2: true,
  key3: undefined,
  key4: [1,2],
  key5: function (){}
}; //객체 리터럴 방식 

console.log(person.key1)// 점 표기법 
// 123

key값에는 문자열, 숫자열, 불리언, 배열, 함수 어떤 게 들어가도 상관이 없고 중복이 되어도 괜찮다.

다만 key값이 중복이 되면 뒤에 선언된 key값으로 인식되기 때문에 key값은 중복되면 안 된다.

let person = {
  name : "유리",
  age : 29
}; //객체 리터럴 방식 

console.log(person["name"])// 괄호 표기법(key를 문자열로 입력해야함.)
// 유리
let person = {
  name : "유리",
  age : 29
}; //객체 리터럴 방식 

console.log(getPropertyValue("name"));

function getPropertyValue(key){
  return person[key];
}

프로퍼티 추가하는 방법

let person = {
  name : "유리",
  age : 29
}; //객체 리터럴 방식 

person.location = "한국"; // 점표기법 추가 
person["gender"] = "여성" //괄호표기법 추가

프로퍼티 수정하는 방법

let person = {
  name : "유리",
  age : 29
}; //객체 리터럴 방식

person.name = "최유리"
person["age"] = "27"

만약 let을 const로 바꾸면 추가하거나 수정했을 때 에러가 뜨는가?

에러가 뜨지 않는다. 상수자체를 수정하는 게 아닌 객체의 값만 수정이 되다 보니 에러가 뜨지 않는다.

다만 상수자체를 수정하려고 하면 에러가 뜬다.

const person = {
  name : "유리",
  age : 29
}; //객체 리터럴 방식 

person = {
  age:20
}

프로퍼티 삭제하는 방법

let person = {
  name : "유리",
  age : 29
}; //객체 리터럴 방식 

delete person.age;
delete person["age"]

이렇게 하면 지워지긴 하나 메모리 자체에서 삭제되진 않는다.

let person = {
  name : "유리",
  age : 29
}; //객체 리터럴 방식 

person.name = null;

name의 값을 null을 주게 되면 삭제된 거랑 동일하게 작용한다.

위 방법보단 null을 주는 방법을 추천한다.

 

메서드 - 객체 안에 들어있는 함수

let person = {
  name : "유리",
  age : 29,
  say: function(){
    console.log("hi");
  }
}; //객체 리터럴 방식 

person.say();
// hi

메서드 안에 함수자신을 가리킬 땐 this라고 써줘도 된다.

let person = {
  name : "유리",
  age : 29,
  say: function(){
    console.log(`hi ${this.name}`);
  }
}; //객체 리터럴 방식 

person.say();

현재 메서드 안에 this는 person과 같다.

 

객체에 존재하지 않는 프로퍼티에 접근하면?

let person = {
  name : "유리",
  age : 29,
  say: function(){
    console.log(`hi ${this.name}`);
  }
}; //객체 리터럴 방식 

console.log(person.gender);
//undefined

undefined이 나타나는 방식은 유연한 프로그래밍을 가능하게 하지만 존재하지 않는 프로퍼티에 잘못 접근해서 연산을 수행한다던가

오류를 발생할 수 있다.

존재하지 않는 프로퍼티는 추가할게 아니면 접근하지 않는 것이 좋다.

찾고자 하는 프로퍼티다 존재하는지 확인을 하는 방법.

 

let person = {
  name : "유리",
  age : 29,
  say: function(){
    console.log(`hi ${this.name}`);
  }
}; //객체 리터럴 방식 

console.log(`${"name" in person}`);
//name이라는 프로퍼티가 person안에 있는가?라는 의미 
//결과값은 true
console.log(`${"gender" in person}`)
//false

 

난 정말 태어나지도 않았다 아직 엄마배에도 없다 

아는 게 없다.. 충격적이다.. 

 

앞으로 얼마나 더 무궁무진할지... 감도 안 온다