클라우딩 어플리케이션 엔지니어링 TIL Day 11 (2)

2024. 1. 14. 22:25· TIL/프로그래머스 데브코스
목차
  1. # 객체
  2. # 문자열
  3. # Collection
  4. # 프로토타입
  5. # Class 문법
  6. # this 와 화살표 함수
  7. # 새로 알게 된 점

# 객체

# 문자열

문자열 내에 이스케이프 문자 사용 가능

줄바꿈 문장 표현 가능 -> 이스케이프 문자(\n), 템플릿 리터럴(백틱 `)

데이터 보관시 문자열 형태로 저장 유용 -> 텍스트 형태, 객체 형태(JSON.stringify)

# 문자열 조작

▶문자열 요소 접근

charAt

유사 배열이라 배열처럼 접근

const aaa = "가나다라마바사";

console.log(aaa.charAt(3)); //라
console.log(aaa[3]) //라

▶ 문자열 비교

알파벳순을 비교하여 순서가 뒤에 올수록 크다고 판단

//알파벳 순서로 크기 비교
const abc = "abc";
const def = "def";

console.log(abc < def); //true

변수 또는 객체의 속성이 문자열을 가지고 있으면 String 인스턴스 속성과 메서드 사용 가능하다

# String 객체

문자열을 다룰 때 사용하는 원시 래퍼 빌트인 객체

함수로 바로 사용

▶ 인스턴스 메서드

문자열 접근 및 찾기

const aaa = "가나다라마바사";

//접근 및 비교
const exam = [aaa.at(0), // 가
			aaa.charAt(0), // 가
            aaa.indexOf("라"), // 3
            aaa.search("카")]; // -1

문자열 포함 여부

const aaa = "가나다라마바사";

//문자열 포함 여부
const exam = [aaa.includes("바"), //true
            aaa.startsWith("나"), //false
            aaa.match("가")]; //["가"]

문자열 비교

const aaa = "가나다라마바사";
const bbb = "안녕하세요";

//문자열 비교
const exam = [aaa.localeCompare(bbb)];

문자열 변경

//문자열 변경
const changeString = [
  "abcdef".toLocaleUpperCase(), //ABCDEF
  "ABCDEF".toLocaleLowerCase(), //abcdef
  "hello".replace("h", "H"), //Hello
  "hello".replace("l", "L"), //heLlo
  "hello".replaceAll("l", "L"), //heLLo
];

문자열 추가 및 합치기

//문자열 추가 및 합치기
const addString = [
  //길이 length 값 , 빈 length에 채울 값
  "abcdef".padStart(10, "1"), // '1111abcdef'
  "ABCDEF".padEnd(10, "k"), //'ABCDEFkkkk'
  //문자열 반복
  "hello".repeat(2), // 'hellohello'
  //문자열 합치기
  "hello".concat(" nice to meet you!"), // 'hellonice to meet you!'
  "hello" + " nice to meet you!", // 'hellonice to meet you!'
];

문자열 분리하기

//문자열 분리하기
const partString = [
  //5번째 인덱스부터 마지막까지 자르기
  "abcdef".slice(4),
  //2번째 인덱스부터 4번째 인덱스까지 자르기
  "abcdef".slice(1, 4),
  "abcdef".substring(4),
  "abcdef".substring(1, 4),
  //배열로 변경
  "abcdef".split(),
  //공백 제거
  " abc ".trim(),
];

 

# 정규표현식

문자열에서 특정 문자 조합을 찾기 위한 패턴

/pattern/flags

정규표현식 생성 방법

1. 리터럴 표기법

평가할 때 정규 표현식을 컴파일

정규식이 변하지 않으면 리터럴 표기법을 사용하자

/pattern/flag

2. RegExp 객체

런타임 때 컴파일

패턴이 변할 가능성이 있거나, 알 수 없는 데이터에서 가져오는 정규식의 경우 생성자 함수 사용하자

new RegExp(/pattern/, flag)

▶정적 속성 : lastIndex

▶생성자 함수 : RegExp.prototype

▶인스턴스 속성 : flags, dotAll, global, ignoreCase, multiline, source, sticky, unicode

▶ 인스턴스 method : compile(), exec(), test(), toString()

//RegExp 객체
const str = "abcdef";
const regex = /a/g;

const exam = [
  //일치 확인
  str.match(regex),
  //찾기
  str.search(regex),
  //찾아서 교체
  str.replace(regex),
  //찾아서 분리
  str.split(regex),
];

# Collection

비용을 절감하기 위하여 상황마다 효율적인 데이터 형태로 처리하는 것이 필요하다

컬렉션은 데이터 항목의 그룹을 의미한다 -> list, set, tree, graph

자바스크립트 Collection의 2가지 타입

# Indexed Collections

인덱스 값을 기준으로 정렬되어 있는 데이터 집합

Array

이름과 인덱스로 참조외더 정렬된 값들의 잡합이다

자바스크립트는 명시적인 배열 데이터 타입을 가지고 있지 않다

Array 객체 생성방법

배열 리터럴 : 대괄호로 묶기 []

Array 객체 생성자 : new Array(arrayLength); 길이만 지정된 배열, new Array(ele0, ele1, ...); 요소만 지정된 배열

//Array 객체
//길이만 지정해서 배열 생성
new Array(23);
//요소만 지정해서 배열 생성
new Array("hi", "hello");

Array 객체 특징

배열 요소의 참조

  • index로 참조, 0부터 시작
  • index값을 속성 이름으로 사용하여 표준 객체의 속성처럼 저장
  • index로 문자열 사용 불가능, 무조건 정수로만 참조하여 저장

배열에 값 저장

  • index로 참조하지 않으면 객체의 속성으로 저장됨

배열의 반복 처리 시 -> for문. forEach문 활용

# Keyed Collections

Key 값을 기준으로 정렬되어 있는 데이터 집합

Map, Set

키와 값을 매핑하여 저장한다

저장된 순서대로 각 요소들을 반복적으로 접근할 수 있다

# Map 객체

간단한 키와 값을 서로 매핑시켜 저장하고 저장된 순서대로 요소를 반복적으로 접근

[key, value]

Map 인스턴스 속성 : size

Map 인스턴스 method : get, has, clear, delete, set, keys, values, entries, forEach

# Map과 Object는 어떤 차이가 있을까?

  Object Map
속성의 데이터 타입 String, Symbol만 가능 모든 값을 키로 활용 가능
default 속성과의 충돌 Object prototype의 기본속성과 동일한 키를 생성시 충돌 기본적으로 갖고 있는 속성이 없어 기본 속성들과 충돌 없음
객체의 크기 수동으로 추적 size 인스턴스 속성으로 얻을 수 있음
순서 보장 순서 보장 X 추가된 순서대로 반복
iterable 여부 iterable X iterable
퍼포먼스 키, 값 쌍의 빈번한 추가 제거 시 퍼포먼스 좋지 않음 키, 값 쌍의 빈번한 추가 제거 시 퍼포먼스 좋음
직렬화 구문분석 제공 여부 직렬화와 구문분석 제공(JSON.stringify, JSON.parse) 제공 X

# WeakMap

키에 대한 강력한 참조를 생성하지 않는 키/값 쌍의 모음

키는 object만을 허용

객체 정보를 노출하지 않는다 -> 객체의 사적 정보 저장, 상세 구현내용 숨기기 위해서 사용된다

WeakMap 인스턴스 속성 : size

WeakMap 인스턴스 method : get, has, delete, set


# Set

모든 값들의 집합이다

입력된 순서에 따라 저장된 요소를 반복처리할 수 있다

특정 값은 Set 내에서 하나만 존재

배열은 set으로, set은 배열로 변환 가능하다

for ... of 를 통해 순회 가능하다

Set 인스턴스 속성 : size

Set 인스턴스 method : has, clear, delete, add

# WeakSet

객체 컬렉션으로 object 값만 허용한다

약한 참조를 가진다

WeakSet 인스턴스 method : has, delete, add

순환 관련 method 없음


# JSON 객체

인터넷에서 자료를 주고 받을 때 자료를 표현하는 방법

키-값 쌍, 배열 자료형, 기타 모든 직렬화 가능한 값

직렬화란 무엇일까?

다양한 환경 간 데이터를 주고 받기 위해 직렬화 작업이 필요
직렬화 : Object -> 문자열 변환
역직렬화 : 문자열 -> Object로 변환

파일 확장자 : .json

객체의 형태와 유사하다

JSON 정적 method

JSON.stringify : 직렬화

JSON.parse : JSON 형태로 역직렬화 -> 문자열이 객체 형태가 아니면 오류 발생, try... catch문으로 에러를 핸들링하자!

 

# intl 객체

각 언어에 맞는 문자, 숫자, 시간, 날짜 비교를 제공하는 국제화 API를 위한 namespace

동일한 데이터를 언어나 지역별로 다른 형식으로 보여주기 위

▶ DateTimeFormat 생성자 함수

언어에 맞는 날짜, 시간 서식을 적용하기 위한 객체

인스턴스 method :  format, formatRange, formatToParts, formatRangeToParts ...

//intl 객체 DateTimeFormat 생성자 함수
//인스턴스 생성 언어 설정
const dateTimeFormatKo = new Intl.DateTimeFormat("ko");

const example = [
  //한국 기준 형식에 맞춘 한국 날짜
  dateTimeFormatKo.format(), //'2024. 1. 14.'
  //각 부분별로 type과 value로 반환
  dateTimeFormatKo.formatToParts()]; 
  // [
        { type: 'year', value: '2024' },
        { type: 'literal', value: '. ' },
        { type: 'month', value: '1' },
        { type: 'literal', value: '. ' },
        { type: 'day', value: '14' },
        { type: 'literal', value: '.' }
  ]

formatRange 함수는 지정된 날짜부터 현재까지의 날짜 범위를 표현한다

▶NumberFormat 생성자 함수

언어에 맞는 숫자 서식을 적용하기 위한 객체

인스턴스 method : format, formatRange, formatToParts, formatRangeToParts ...

// NumberFormat 생성자 함수
const numberFormat = new Intl.NumberFormat("ko", {
  //출력할 number의 서식 지정
  style: "currency",
  currency: "KRW",
});

//KRW 즉 한화로 format되어서 출력
numberFormat.format(100000); // ₩100,000

# 프로토타입

# 프로토타입 객체

자바스크립트는 프로토타입 기반 객체지향 언어이다

프로토타입 객체란?

객체의 인스턴스를 만드는 부모 객체의 개념이다

자바스크립트의 모든 객체는 부모 객체인 프로토타입 객체와 연결된다

부모객체의 속성과 메서드를 상속받아 사용 가능하다

▶ 접근하기

__proto__ 라는 접근자 속성으로 접근 가능 -> __proto__ 로 Object.prototype 객체에 접근한다

▶ 생성하기

함수 타입에만 prototype 이라는 필드가 존재한다

함수를 활용하여 부모 객체의 인스턴스를 생성할 수 있다

- 생성자 함수

  • 인스턴스 객체 생성시 사용
  • 대문자 함수명 컨벤션 사용
  • new 키워드와 함께 호출

인스턴스의 부모 객체 == 생성자 함수.prototype

constructor : 자기 자신을 생성한 객체 참조

# 프로토타입 chain과 상속

프로토타입 chain이란?

객체의 속성 참조시, 속성이 없는 경우 프로토타입 체인이 동작한다 -> [[Prototype]] 을 통해서 부모 객체를 탐색

모든 객체의 부모는 Object.prototype이다 -> 프로토타입 체인의 종점

만약 마지막 부모 객체인 Object.prototype에서까지 속성을 찾지 못하면 undefined 가 반환된다

=> 부모 객체를 타고 올라가면서 속성을 탐색하는 것을 프로토타입 chain 이라고 한다!

  • 객체와 프로토타입에 동일한 이름의 속성이나 메서드가 있는 경우 -> 객체의 속성이 먼저 참조된다
  • property shadowing : 프로토타입 속성이 가려지는 현상
  • method overriding : 프로토타입 메서드가 가려지는 현상

# Class 문법

class 메서드명 { ..... }

class 내에는 메서드만 작성 가능하다

인스턴스 생성 -> new 클래스명();

//class의 형태
class Person {
  //인스턴스 생성 및 클래스 필드 초기화 (생략 가능)
  constructor(name, age, gender) {
    //멤버 변수
    //인스턴스 속성 초기화
    this.name = name;
    this.age = age;
    this.gender = gender;
  }

  //static 으로 메서드 작성시 -> 인스턴스를 생성하지 않아도 호출 가능

  //get : 속성 조회 및 조작 -> 무조건 값을 반환
  get uppercaseName() {
    return this.name.toLocaleUpperCase();
  }

  //set : 속성 할당하며 조작
  set plusAge(age) {
    this.age += age;
  }

  get whatIsGender() {
    if (this.gender === "female") {
      return "여자입니다!";
    } else {
      return "남자입니다!";
    }
  }
}

const jinny = new Person("jinny", 100, "female");
console.log(jinny.whatIsGender); // 여자입니다!

# 상속 extends

코드의 재사용 관점에서 상속이 필요하다

extends와 super 키워드를 통해 class에서 상속을 구현한다

class 부모클래스 { ..... }

class 자식 extends 부모 { ....}
class Person {
      //인스턴스 생성 및 클래스 필드 초기화 (생략 가능)
      constructor(name, age, gender) {
        //멤버 변수
        //인스턴스 속성 초기화
        this.name = name;
        this.age = age;
        this.gender = gender;
      }
  }

//Person class를 상속 받는 Children class
//상속 extends
class Children extends Person {
  constructor(name, age, gender) {
    //super : 부모 클래스의 생성자를 호출
    // 자식 클래스의 생성자가 this에 접근하고 수정 가능함
    super(name);
  }
  play() {
    return this.name + " 는 지금 놀고 있답니다!";
  }
}

const child = new Children("jina");
child.play(); // jina 는 지금 놀고 있답니다!

 

# this 와 화살표 함수

# this란?

현재 실행 중인 코드에서 어떤 객체에 바인딩 되어 있는지를 나타낸다

this 의 값은 실행 컨텍스트에 따라 동적으로 결정된다

1. 전역 컨텍스트

this 는 전역 객체를 가리킨다

객체의 메서드 내에 내부 함수가 있을 경우 함수 호출방식으로 취급되어 전역 객체를 바라본다

2. 함수 호출

this 는 호출 시점에 따라 동적으로 결정

function exampleFunction() {
  console.log(this);
}

exampleFunction(); // 전역 객체 (브라우저: window, Node.js: global)

const obj = {
  method: exampleFunction,
};

obj.method(); // obj

3. 메소드 호출

this 는 그 메소드를 호출한 객체를 가리킨다

const myObject = {
  myMethod: function() {
    console.log(this);
  },
};

myObject.myMethod(); // myObject

4. 생성자 함수

this 는 생성된 인스턴스를 가리킨다

function MyClass() {
  this.property = "example";
}

const myInstance = new MyClass();
console.log(myInstance.property); // example

5. 이벤트 핸들러

this 는 이벤트를 발생시킨 요소를 가리킨다

document.getElementById("myButton").addEventListener("click", function() {
  console.log(this); // 클릭된 버튼 요소
});

6. 화살표 함수

ES6 부터 화살표 함수 사용

익명함수 형태

(인자들) => { .... }

this 는 함수가 생성된 시점에서의 상위 스코프의 this를 따른다 -> 정적 바인딩

const arrowFunction = () => {
  console.log(this);
};

arrowFunction(); // 전역 객체 (화살표 함수는 정적으로 바인딩되므로 상위 스코프의 this를 따름)

# 새로 알게 된 점

이번 데이터 처리 객체와 빌트인 객체 그리고 매커니즘 파트가 끝이 났다

양도 많고 처음 배우는 개념이 많아서 이해하는 데 시간이 오래 걸렸다

그렇다고 완벽히 이해된 것도 아니라 반복해서 복습이 필수인 것 같다

이번 강의에서 가장 기억에 남는 개념은 Class 문법이었다

Class 를 만들어보고 자식 Class에 상속하는 코드를 구성하면서 Class 문법에 대해 이해할 수 있었다

또한 Class 간에 속성을 상속하고 메서드를 호출하는 과정이 신기했다

프로토타입 chain의 개념 역시 이번 강의를 통해서 확실하게 배우게 되었다

헷갈리는 개념들은 이해가 될 때까지 다시 공부를 해야겠다

저작자표시 비영리 변경금지 (새창열림)

'TIL > 프로그래머스 데브코스' 카테고리의 다른 글

클라우딩 어플리케이션 엔지니어링 TIL Day 13 - 가계부 구현하기  (0) 2024.01.17
클라우딩 어플리케이션 엔지니어링 TIL Day 12 - 가계부 구현하기 요구사항 분석 및 기본 세팅  (1) 2024.01.16
클라우딩 어플리케이션 엔지니어링 TIL Day 11 (1)  (2) 2024.01.12
클라우딩 어플리케이션 엔지니어링 TIL Day 9  (1) 2024.01.11
클라우딩 어플리케이션 엔지니어링 TIL Day 10 (2)  (1) 2024.01.08
  1. # 객체
  2. # 문자열
  3. # Collection
  4. # 프로토타입
  5. # Class 문법
  6. # this 와 화살표 함수
  7. # 새로 알게 된 점
'TIL/프로그래머스 데브코스' 카테고리의 다른 글
  • 클라우딩 어플리케이션 엔지니어링 TIL Day 13 - 가계부 구현하기
  • 클라우딩 어플리케이션 엔지니어링 TIL Day 12 - 가계부 구현하기 요구사항 분석 및 기본 세팅
  • 클라우딩 어플리케이션 엔지니어링 TIL Day 11 (1)
  • 클라우딩 어플리케이션 엔지니어링 TIL Day 9
개발자 정지은
개발자 정지은
프로그래밍 공부 기록
개발자 정지은
PROGRAMMING DIARY
개발자 정지은
전체
오늘
어제
  • 분류 전체보기 (107)
    • 알고리즘 (49)
      • BeakJoon (27)
      • SWEA (9)
      • Inflearn (2)
      • CodeSignal (1)
      • Programmers (10)
    • FE (0)
      • Javascript (0)
      • React (0)
    • BE (0)
    • CS공부 (13)
      • Database (7)
      • IT기본지식 (6)
    • TIL (45)
      • 프로그래머스 데브코스 (45)
    • Project (0)
      • DreamHi (0)
      • 인사관리시스템 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 국비지원교육
  • 알고리즘
  • 프론트엔드
  • 리액트
  • 피그마
  • 코딩부트캠프
  • 프로그래머스 데브코스
  • ReactNative
  • figma
  • React.JS
  • javascript
  • 자바스크립트

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
개발자 정지은
클라우딩 어플리케이션 엔지니어링 TIL Day 11 (2)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.