배경 이미지
728x90
반응형

 

자바스크립트에서 객체란?

객체(Object)는 자바스크립트에서 키(key)값(value)으로 데이터를 저장하는 데이터 구조이다. 객체는 여러 속성(Property)을 가질 수 있으며, 각 속성은 고유한 키를 통해 접근할 수 있다.

 

1. 객체 생성

1-1. 기본적인 객체 생성

let student = {
    name: "John",
    age: 17,
    gender: "남자"
};

위의 예제에서는 객체 student을 생성한다. 객체를 만들 때는 중괄호({})를 사용하며, 속성과 값을 콜론(:)으로 구분하고, 각 속성과 값은 쉼표(,)로 구분한다.

1-2. 생성자 함수를 사용한 객체 생성

function Student(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
}

let student1 = new Student("홍길동", 30, "남자");
let student2 = new Student("홍길순", 25, "여자");

생성자 함수를 사용하면 객체를 일괄적으로 생성할 수 있다.

 

2. 객체 요소 접근

객체의 속성에 접근하는 방법은 두 가지가 있다

let student = {
    name: "John",
    age: 17
};

// 1. 점 표기법(dot notation)
console.log(student.name);  // "John"
console.log(student.age);   // 17

// 2. 대괄호 표기법(bracket notation)
console.log(student["name"]);  // "John"
console.log(student["age"]);   // 17
  • 점 표기법은 객체의 속성에 접근할 때 가장 많이 사용하는 방법이다. 객체명.속성명 형태로 접근한다.
  • 대괄호 표기법은 속성명이 문자열이거나, 동적으로 속성명을 결정해야 할 때 유용하다. 예를 들어, 속성명이 변수로 주어질 때 사용한다..

3. 객체 메소드

자바스크립트는 객체를 다루기 위한 다양한 메소드를 제공한다. 이 메소드들은 객체의 속성을 다루거나, 객체를 조작할 때 매우 유용하다.

3-1. Object.keys()

객체의 모든 키(속성)를 배열로 반환한다.

let student = {
    name: "John",
    age: 17,
    grade: "11th"
};

let keys = Object.keys(student);
console.log(keys);  // ["name", "age", "grade"]

3-2. Object.values()

객체의 모든 을 배열로 반환한다.

let student = {
    name: "John",
    age: 17,
    grade: "11th"
};

let values = Object.values(student);
console.log(values);  // ["John", 17, "11th"]

3-3. Object.entries()

객체의 키-값 쌍을 2차원 배열 형태로 반환한다. 각 배열 요소는 [키, 값]의 형태이다.

let student = {
    name: "John",
    age: 17,
    grade: "11th"
};

let entries = Object.entries(student);
console.log(entries);
// [["name", "John"], ["age", 17], ["grade", "11th"]]

3-4. Object.assign()

하나 이상의 소스 객체에서 타겟 객체로 속성을 복사합니다. 타겟 객체가 반환된다.

타겟 객체와 소스 객체의 속성이 동일한 키를 가지는 경우, 타겟 객체의 속성이 덮어쓰여진다

let target = {name: "Jane"};
let source = {age: 18, grade: "12th"};

let student = Object.assign(target, source);
console.log(student);
// {name: "Jane", age: 18, grade: "12th"}

 

3-7. Object.hasOwnProperty()

특정 속성이 객체에 존재하는지 확인하고, 존재하면 true, 그렇지 않으면 false를 반환한다.

javascript코드 복사
let student = {
    name: "John",
    age: 17
};

console.log(student.hasOwnProperty("name"));  // true
console.log(student.hasOwnProperty("grade"));  // false

 

8. 객체 비교

let person1 = {
  name: "홍길동",
  age: 30,
  gender: "남자"
};

let person2 = {
  name: "홍길동",
  age: 30,
  gender: "남자"
};

console.log(person1 === person2);   // false
console.log(JSON.stringify(person1) === JSON.stringify(person2));   // true

객체를 비교할 때는 일반적으로 === 연산자를 사용할 수 없다. 대신 JSON.stringify() 함수를 사용하여 객체를 문자열로 변환한 후, 문자열 비교를 한다.

9. 객체 병합

객체 병합을 할 때는 전개 연산자(...)를 사용한다.

병합 시 같은 키가 여러 번 등장할 경우, 가장 나중에 병합된 객체의 값이 최종적으로 사용된다.

let person1 = {
  name: "홍길동",
  age: 30
};

let person2 = {
  gender: "남자"
};

let mergedPerson = {...person1, ...person2};

console.log(mergedPerson);   // { name: "홍길동", age: 30, gender: "남자" }

 


4. 객체를 순회하는 방법

객체의 속성들을 순회하면서 각 속성에 대해 작업을 수행할 수 있는 방법은 여러 가지가 있다.

1. for...in

for...in은 객체의 를 순회하는 반복문이다.

객체의 모든 속성을 순회하면서 키와 값을 다룰 때 유용하다.

let student = {
    name: "John",
    age: 17,
    grade: "11th"
};

for (let key in student) {
    console.log(key, student[key]);
}
// "name John"
// "age 17"
// "grade 11th"

 

 

728x90
반응형

'JavaScript' 카테고리의 다른 글

[JS] 반복문  (2) 2024.09.08
[JS] Map 사용 방법  (1) 2024.09.08
[JS] 1-1) JS 언어의 특징과 역사  (1) 2024.09.02
[JS] 헷갈리는 this 정리 (this 사용 방법)  (0) 2024.08.01
[JS] 화살표 함수 쓰는 방법과 사용 이유  (0) 2024.07.31
728x90
반응형

[JS의 역사]

    • JavaScript가 나온 이유
      • JavaScript는 원래 웹 페이지에 동적인 효과를 주기 위해 만들어진 스크립트 언어어에요. 1995년에 웹사이트들이 점점 많아지면서, 단순히 글이나 이미지로만 구성된 정적인 웹 페이지에 그치지 않고, 사용자가 클릭하거나 입력하는 것에 반응하는 동적인 웹 페이지가 필요해졌어요. 그래서 넷스케이프라는 회사가 LiveScript라는 언어를 만들었고, 나중에 이 이름은 JavaScript로 바뀌었어요. 웹 페이지의 부드러운 상호작용을 위해 HTML과 CSS와 함께 사용되었어요.
  • JavaScript의 발전
    • JavaScript가 인기를 끌면서, 이를 표준화하고 성능을 더 높이기 위한 노력이 시작됐어요. 그래서 1999년에는 ECMAScript라는 이름으로 JavaScript 표준이 만들어졌고, 덕분에 여러 웹 브라우저에서 똑같이 작동하게 됐어요.
    • 그리고 2005년에는 AJAX라는 기술이 나오면서, 웹 페이지 전체를 새로고침하지 않고도 서버와 데이터를 주고받을 수 있게 되었어요. 이 기술 덕분에 웹사이트가 훨씬 빠르고 사용자 친화적으로 변했어요. 예를 들어, 우리가 채팅을 할 때 페이지를 다시 로드하지 않아도 바로바로 대화가 가능하죠!
  • V8 엔진의 등장
    • 2008년, 구글은 JavaScript의 속도를 더욱 빠르게 만들기 위해 V8 엔진이라는 것을 만들었어요. 이 엔진은 구글 크롬 브라우저에서 사용되면서, 웹 페이지가 빠르고 매끄럽게 동작하게 했어요.
  • Node.js의 등장
    • 이것에 그치지 않고 V8 엔진의 우수한 성능을 기반으로 2009년, Node.js라는 도구가 등장하면서 JavaScript로 서버까지 만들 수 있게 되었어요. 이전에는 서버 개발을 위해 다른 언어들이 필요했지만, 이제는 JavaScript만으로도 웹사이트의 앞부분(프론트엔드)과 뒷부분(백엔드)을 모두 개발할 수 있게 되었죠. 이렇게 JavaScript는 FullStack 개발을 할 수 있는 강력한 도구로 자리 잡았어요.
  • ES6와 프론트엔드 프레임워크의 대중화
    • 2015년에는 ES6라는 JavaScript의 새로운 버전이 나왔어요. 이 버전에서는 더 쉽고 효율적으로 코드를 작성할 수 있는 다양한 기능이 추가되었죠. 그뿐만 아니라, React, Vue, Angular 같은 프레임워크들이 등장하면서 웹 개발이 더욱 쉬워졌어요. 이 도구들 덕분에 대규모 웹 애플리케이션을 더 쉽게 만들고 관리할 수 있게 되었어요.
더보기

[정리]

  • 1995년 자바스크립트 탄생
    • 🌐 넷스케이프 커뮤니케이션(LiveScript → Javascript)
    • 🖥️ 브라우저 동작 스크립트 언어
  • 1999년 자바스크립트 표준화(ECMA-262) 완료
  • 2005년 AJAX 등장
    • 웹 페이지 전체를 다시 로드하지 않고도 서버와 데이터를 주고받을 수 있도록 해줌   
    • 비동기 웹 애플리케이션 개발 가능
    • 폭발적인 UX 향상 🚀
  • 2008년 V8 엔진 출시(google)  
    • super fast(코드 실행 속도 상당부분 개선)
    • 🛠️ 컴파일러, 메모리관리 시스템 👍
  • 2009년 Node.js 등장, 서버 개발 활성화
    • 서버개발의 지각변동 : PHP, Ruby, Python, Java → Javascript(Node.js)
    • 하나의 언어 → FrontEnd + BackEnd + DB(MongoDB) = FullStack
  • 2015년 ECMAScript 6(ES6) 버전 출시 🚀
  • 2016년 프론트엔드 프레임워크(React, Vue, Angular) 대중화, SPA 개발 활성화 🌟
  • 현재 자바스크립트는 프론트엔드 및 백엔드 개발 분야에서 널리 사용되며, Node.js를 이용한 서버 개발도 활발하게 이루어지고 있습니다.

 

[JS 언어의 특징]

[1] 객체 지향 프로그래밍 지원

자바스크립트는 객체 지향 프로그래밍이 가능한 언어로서, 객체를 생성하고 관리하는 데에 강점이 있다. 이를 통해 복잡한 기능을 구현할 수 있다.

 

객체지향 vs 절차지향

  • 절차지향 프로그래밍: 프로그램을 순서대로 작성하는 방식이다. 예를 들어, 첫 번째 작업을 처리하고, 그 다음 작업을 처리하는 식으로 프로그램을 만드는 거죠.
  • 객체지향 프로그래밍: 데이터를 객체라는 그룹으로 묶어서 처리한다. 객체는 속성(상태)과 메소드(행동)를 가지고 있으며, 이를 통해 프로그램을 구성한다.

 

[2] 동적 타이핑

자바스크립트는 동적 타이핑을 지원한다. 이게 뭐냐면, 변수를 선언할 때 데이터 타입(숫자, 문자열 등)을 지정하지 않아도 된다는 뜻이. 즉, 변수에 어떤 값이 들어가느냐에 따라 그 타입이 자동으로 결정된다.

자바스크립트는 런타임 시점에 변수에 할당되는 값에 따라 자동으로 데이터 타입이 결정된다

선언 할당이라는 단어에 주목해주세요! 🥸

let myVariable = "Hello, world!"; // 변수 선언 및 문자열 데이터 타입으로 할당
console.log(typeof myVariable); // "string" 출력

myVariable = 123; // 숫자 데이터 타입으로 할당
console.log(typeof myVariable); // "number" 출력

myVariable = true; // 불리언 데이터 타입으로 할당
console.log(typeof myVariable); // "boolean" 출력
더보기

ℹ️ 런타임(Runtime)?

런타임 시점이란, 프로그램이 실행되는 동안의 시점을 의미한다. 즉, 코드가 실행되는 동안에 발생하는 시점을 말한다. 반대의 의미로는 컴파일 시점이 있어요.

 

[3] 함수형 프로그래밍 지원

자바스크립트는 함수형 프로그래밍을 지원하는 언어로서, 함수를 일급 객체로 취급하고, 고차 함수를 지원한다.

이게 뭐냐면, 함수형 프로그래밍이란 함수를 마치 값처럼 다루는 프로그래밍 스타일이다. 따라서 변수에 할당하거나, 함수의 인자로 전달하거나, 함수의 반환값으로 사용할 수 있다. 이를 통해 코드의 재사용성과 가독성을 높일 수 있다.

 

[4] 비동기 처리

비동기 처리란 작업을 순차적으로 기다리지 않고, 동시에 여러 작업을 처리하는 방식이다. 예를 들어, 웹 페이지에서 데이터를 가져오는 동안 다른 작업을 멈추지 않고 계속할 수 있게 해준다.

 

[5] 클라이언트 측 및 서버 측 모두에서 사용 가능

자바스크립트는 웹 브라우저에서만 사용하는 언어로 시작했지만, 지금은 Node.js를 이용하여 서버 측에서도 사용다. 이를 통해 웹 개발 전반에 걸쳐 자바스크립트를 활용할 수 있다.

 

728x90
반응형
728x90
반응형

this

this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 식별자이다. 

 

✓ 일반 메소드의 this

기본적으로 메소드의 this 를 호출하는 객체에 의해서 결정된다

호출한 놈(객체) = this 

단순히 함수로 호출될 때, this는 전역 객체를 가리킨. (단 엄격 모드에서는 undefined)

const user = {
  firstName: 'Gil dong',
  lastName: 'Hong',
  getFullName: function () {
    return `${this.firstName} ${this.lastName}`
  }
}

console.log(user.getFullName()) // Gil dong Hong

이때 this는 user 객체를 가리킨다.

 

 

 

✓ 화살표 함수의 this

화살표 함수의 this는 자신이 선언된 함수(렉시컬) 범위에서 정의

화살표 함수의 this는 화살표함수를 감싸고 있는 외부 함수의 this를 상속받는다.

하지만 만약 감싸고 있는 외부 함수가 없는 경우, this는 전역 객체를 가리키게 된다

(브라우저 환경에서는 window 객체가 전역 객체이며, Node.js 환경에서는 global 객체가 전역 객체)

const user = {
  firstName: 'Gil dong',
  lastName: 'Hong',
  getFullName: () => {
    return `${this.firstName} ${this.lastName}`
  }
}

console.log(user.getFullName())  //undefined undefined

화살표 함수를 감싸는 외부함수가 없기 떄문에 this는 전역 객체를 가리킨다.

따라서 firstName과 lastName 속성을 찾을 수 없어 undefined가 출력된다.

 

function user() {
  this.firstName = 'Neo'
  this.lastName = 'Anderson'

  return {
    firstName: 'Gil dong',
    lastName: 'Hong',
    getFullName: () => {
      return `${this.firstName} ${this.lastName}`
    }
  }
}

const u = user()
console.log(u.getFullName())  // Neo Anderson

여기서 화살표 함수의 this는 화살표 함수를 감싸고 있는 user 함수의 this를 참조하므로, Neo Anderson을 반환

 

 

 

화살표 함수가 유용한 상황

화살표 함수를 사용하면 this가 외부 함수의 this를 참조하기 때문에, 특히 콜백 함수에서 유용하다.

함수내부에 또 다른 함수가 들어있는 구조라면 일반함수보다는 화살표 함수를 쓰는것이 더 적합

const timer = {
  title: 'TIMER!',
  timeout() {
    console.log(this.title)
    setTimeout(function () {
      console.log(this.title)
    }, 1000)
  }
}

timer.timeout()
// TIMER!
// undefined

위 예제에서 setTimeout의 콜백 함수 내의 this는 전역 객체를 가리키므로 undefined가 출력된다.

 

const timer = {
  title: 'TIMER!',
  timeout() {
    console.log(this.title)
    setTimeout(() => {
      console.log(this.title)
    }, 1000)
  }
}

timer.timeout()
// TIMER!
// TIMER!

콜백함수를 감싸고 있는 timeout 함수가 가지고 있는 this를 상속 받아,  timer 객체를 가리키게 되어. TIMER!가 두 번 출력된다.

 

 전역 컨텍스트에서의 this

this 단순 호출인 경우

console.log(this);

브라우저 환경에서는 전역 객체인 window를, Node.js 환경에서는 global 객체를 가리킨다.

 

728x90
반응형
728x90
반응형

화살표 함수는 ES6에서 도입된 간단한 함수 표현식이다.

함수 작성

function sum() {}             // 함수 선언식
const sum = function () {}    // 함수 표현식
const sum = () => {}          // 화살표 함수(함수 표현식)

 

화살표 함수

function sum(a, b) {
    return a + b;
}

const sum = (a, b) => {
    return a + b;
}

const sum = (a, b) => a + b;

 

 

화살표 함수의 특징

1. 매개변수가 하나인 경우:  소괄호 생략 가능

const a = x => {}

 

2. 매개변수가 없거나 두 개 이상인 경우: 소괄호 생략 불가

const b = () => {};
const c = (x, y) => {};

 

3. 단일 표현식 반환 시 중괄호와 리턴 키워드 생략 가능

const d = x => { return x * x }
const e = x => x * x

 

4. 객체 리터럴 반환 시 소괄호로 묶어야 함

const g = () => { return { a: 1 } }
const h = () => ({ a: 1 })
const i = () => { return [1, 2, 3] }
const j = () => [1, 2, 3]

 

화살표 함수를 쓰는 이유

화살표 함수는 함수 표현식의 일종이며, 주로 짧은 구문과 this 바인딩의 특성을 활용하기 위해 사용

메소드 내부에서 화살표 함수를 사용하면, 화살표 함수는 자신만의this를 가지지 않고, 상위 스코프의 this를 상속받기 때문에 this 관련 문제를 피하고 코드를 간결하게 작성할 수 있다

const person = {
    name: "홍길동",
    func: function() {
        console.log(this.name); // 출력: "홍길동"
        
        /* 일반 함수를 사용 */
        setTimeout(function() {
            console.log(this); // 출력: window 객체
            console.log(this.name); // error 출력되지 않음
        }, 1000);
        
        /* 일반 함수를 사용 */
        setTimeout(function() {
            console.log(this); // 출력: person 객체
            console.log(this.name); // 출력: "홍길동"
        }.bind(this), 1000); // bind() 함수로 this를 person 객체로 설정해야 하는 번거로움이 있음
    },
    arrow_func: function() {
        console.log(this.name); // 출력: "홍길동"
        
         /* 화살표 함수를 사용 */
        setTimeout(() => {
            console.log(this); // 출력: person 객체
            console.log(this.name); // 출력: "홍길동"
        }, 1000);
    } 
}

person.func();
person.arrow_func();

 

  • 일반 함수: setTimeout 내에서 일반 함수를 사용하면 this는 전역 객체를 가리키며, bind를 사용해 수동으로 this를 설정해야 한다.
  • 화살표 함수: setTimeout 내에서 화살표 함수를 사용하면 this는 상위 스코프의 this를 그대로 사용하므로, 간편하게 person 객체의 this를 참조할 수 있ek

 

728x90
반응형

+ Recent posts