본문 바로가기
Study/코딩테스트(JS)

04.코딩테스트 필수 문법

by dailycoding777 2025. 2. 11.

04.1 빌트인 데이터 타입

자바스크립트의 빌트인 데이터 타입은 언어 자체에서 제공하는게 두가지다.

  • 원시 타입 (primitive type)
  • 참조 타입 (reference type)

04.2 참조타입

🔹 원시 타입 vs 참조 타입

JS의 데이터 타입은 크게 두 가지로 나뉨:

  1. 원시 타입 (Primitive Type)
    • 값 자체를 메모리에 저장함.
    • 변수에 값을 직접 할당함.
    • number, string, boolean, undefined, null, symbol, bigint
  2. 참조 타입 (Reference Type)
    • 메모리 주소를 저장하고, 실제 데이터는 **Heap(힙 메모리)**에 저장됨.
    • 변수가 값을 직접 저장하는 게 아니라, **메모리 주소(참조값)**를 저장함.
    • object, array, function, date, map, set

타입이 어떤 거냐면

number

부동 소수점이란(Floating ponint)

👉 컴퓨터가 실수를 표현하는 방식

👉 **"고정된 자리수를 쓰는 정수 표현"**과 달리, 소수점이

"떠다닐(floating)" 수 있는 숫자 표현 방식

숫자에서 엡실론이란

Number.EPSILON

JS에서 표현할 수 있는 두 숫자 간 가장 작은 차이임.

👉 이걸 활용하면 부동소수점 오차를 방지할 수 있음!

🔹 왜 부동소수점이 필요할까?

컴퓨터는 0과 1(이진수)로 모든 숫자를 표현해야 하는데,

소수를 정확하게 저장할 수 있는 완벽한 방법이 없음.

그래서 IEEE 754 부동소수점 표준이라는 방식을 사용함.

🎯 이제 Number.EPSILON이 등장할 차례!

  • *Number.EPSILON*은 JS에서 표현할 수 있는 두 숫자 간 가장 작은 차이임.

👉 이걸 활용하면 부동소수점 오차를 방지할 수 있음!

🔹 Number.EPSILON의 역할

console.log(Number.EPSILON); // 2.220446049250313e-16

0.1 + 0.2의 연산을 비교할 때 Number.EPSILON을 활용하면 정확한 비교 가능!

function isEqual(a, b) {
  return Math.abs(a - b) < Number.EPSILON;
}

console.log(isEqual(0.1 + 0.2, 0.3)); // true 🎉

🔥 최종 요약

개념 설명

부동소수점 (Floating Point) 컴퓨터가 실수를 표현하는 방식 (IEEE 754 표준)
부동소수점 문제 0.1 + 0.2 !== 0.3 같은 오차 발생
Number.EPSILON 가장 작은 소수 차이를 나타내는 값 (2.220446049250313e-16)
해결 방법 Math.abs(a - b) < Number.EPSILON으로 비교
  • 부동소수점(Floating Point)
    • *이진법(0과 1)**으로 소수를 표현하는 방식
    • 소수점 위치를 유동적으로 조절해서 표현
    • 완벽한 표현이 불가능한 경우가 많음 → 0.1 + 0.2 !== 0.3 같은 오류 발생
  • Number.EPSILON(앱실론)
    • 부동소수점 연산의 오차를 보완하는 방법 중 하나
    • JS에서 표현할 수 있는 가장 작은 차이값 (2.220446049250313e-16)
    • 소수 계산 비교 시 오차를 줄이는 역할
    • 하지만 "부동소수점을 보완한 방법"이라기보단, 오차를 감안해서 비교할 수 있도록 만든 보조 수단
    앱실론 없이 비교하면?앱실론을 사용하면?
    • Math.abs(a - b) < Number.EPSILON → 두 숫자의 차이가 너무 작으면 같은 것으로 간주!
    • 정확한 반올림이 아니라, 오차를 감안한 비교를 위한 것!
  • function isEqual(a, b) { return Math.abs(a - b) < Number.EPSILON; } console.log(isEqual(0.1 + 0.2, 0.3)); // true 🎉
  • console.log(0.1 + 0.2 === 0.3); // false (부동소수점 오차 때문에 틀림!)

정리

부동소수점으로 인한 오차가 있고 그 오차가 적으면 맞다고 해주는게 앱실론이다.

string

JS는 C++이나 자바와 다르게 글자 하나만 저장하는 자료형이 따로 없다.

글자와 관련된 모든 자료는 문자열 타입으로 저장된다.

문자열을 지정하는 방법은 세가지로 작은따옴표(') , 큰따옴표 (") , 백틱 ``` 으로 감싸는 방법이 있다.

const c = `1 + 2 = ${a+b}` // 1 + 2 = 3 백틱예시

문자열 타입 연산

let a = "Heelo, ";
let b = "World!" ;
console.log(a + b); // 문자열끼리 더하기, "Hello World!"
console.log(a + 126); // 문자열과 숫자 더하기 , "Hello,126"
console.log(a + true) // 문자열과 불리언 더하기, "Hello true"

📝 문자열 빌트인 메서드 정리

메서드 설명 예제 결과

.length 문자열 길이 반환 "Hello, World!".length 13
.split(separator) 특정 구분자로 문자열 나누기 (배열 반환) "Hello, World!".split(",") ["Hello", " World!"]
.startsWith(prefix) 특정 문자열로 시작하는지 확인 "Hello, World!".startsWith("Hello") true
.endsWith(suffix) 특정 문자열로 끝나는지 확인 "Hello, World!".endsWith("World!") true
.includes(substring) 특정 문자열 포함 여부 확인 "Hello, World!".includes("llo, ") true
.indexOf(substring) 특정 문자열이 처음 등장하는 위치 반환 "Hello, World!".indexOf("World") 7
.lastIndexOf(substring) 특정 문자열이 마지막으로 등장하는 위치 반환 "Hello, World!".lastIndexOf("o") 8
.replace(old, new) 특정 문자열을 다른 문자열로 대체 "Hello, World!".replace("World", "JavaScript") "Hello, JavaScript!"
.toUpperCase() 모든 문자를 대문자로 변환 "Hello, World!".toUpperCase() "HELLO, WORLD!"
.toLowerCase() 모든 문자를 소문자로 변환 "Hello, World!".toLowerCase() "hello, world!"
.trim() 문자열 양쪽 공백 제거 " Hello, World! ".trim() "Hello, World!"
.concat(string) 문자열 연결 "Hello".concat(", World!") "Hello, World!"

🔥 추가 꿀팁

1️⃣ trim()의 변형

  • .trimStart() → 앞쪽 공백만 제거
  • .trimEnd() → 뒤쪽 공백만 제거
let str = "   JavaScript   ";
console.log(str.trimStart()); // "JavaScript   "
console.log(str.trimEnd());   // "   JavaScript"

2️⃣ replaceAll() (ES2021)

  • replace()는 첫 번째 일치하는 문자열만 변경하지만,
  • replaceAll()은 모든 일치하는 문자열을 변경함!
let text = "apple banana apple";
console.log(text.replace("apple", "orange"));  // "orange banana apple"
console.log(text.replaceAll("apple", "orange")); // "orange banana orange"

🎯 최종 정리

length → 문자열 길

split() → 특정 문자 기준으로 나누기

startsWith() / endsWith() → 특정 문자로 시작/끝 확인

includes() → 특정 문자열 포함 여부 확인

indexOf() / lastIndexOf() → 문자열 위치 찾기

replace() / replaceAll() → 특정 문자열 치환

toUpperCase() / toLowerCase() → 대소문자 변환

trim() → 양쪽 공백 제거

concat() → 문자열 연결

그 외 타입

1. Boolean (불리언)

👉 true 또는 false 값만 가질 수 있는 논리 타입

👉 조건문, 비교 연산 등에 많이 사용됨

예제

let isDev = true;
let isNight = false;

console.log(typeof isDev); // "boolean"
console.log(10 > 5); // true
console.log(3 === 4); // false
  • true → 참 (예: "개발자다")
  • false → 거짓 (예: "밤이 아니다")

2. BigInt (빅인트)

👉 일반적인 Number 타입보다 큰 정수를 표현하는 타입

👉 n을 붙여서 사용해야 함

👉 2⁵³ - 1 (9007199254740991) 이상의 숫자를 다룰 때 필요

예제

javascript
복사편집
let bigNumber = 1234567890123456789012345678901234567890n;
console.log(typeof bigNumber); // "bigint"

// 일반 숫자(Number)와는 연산이 불가능함!
let num = 10;
// console.log(bigNumber + num); // ❌ 에러 발생!

// 같은 BigInt 타입끼리만 연산 가능
console.log(bigNumber + 100n); // 정상 작동

📌 BigInt 특징

  1. n을 붙여야 BigInt 타입이 됨 (123n)
  2. Number와 연산할 수 없음 (둘 다 BigInt여야 함)
  3. Math 객체와 함께 사용할 수 없음 (Math.sqrt(100n) ❌)

3. Null (널)

👉 "값이 없음"을 나타내는 값

👉 명확하게 "비어있음"을 의도적으로 표현할 때 사용

👉 typeof가 "object"인 건 JS의 역사적인 버그 🤯

예제

let emptyValue = null;
console.log(typeof emptyValue); // "object" (버그지만 고쳐지지 않음)
console.log(emptyValue); // null

📌 null 특징

  1. 변수에 의도적으로 "값이 없음"을 나타낼 때 사용
  2. 객체(Object) 같은 것의 초기 상태를 표현할 때 사용
  3. typeof로 확인하면 "object"가 나옴 (JS의 오래된 버그 😅)

4. Undefined (언디파인드)

👉 변수가 선언만 되고 값이 할당되지 않았을 때의 기본값

👉 "아직 값이 정해지지 않음"을 의미

예제

let notAssigned;
console.log(notAssigned); // undefined
console.log(typeof notAssigned); // "undefined"

📌 undefined 특징

  1. 변수를 선언했지만 값을 할당하지 않으면 자동으로 undefined가 됨.
  2. 함수에서 아무 값도 return하지 않으면 undefined 반환됨
  3. function hello() {} console.log(hello()); // undefined
  4. 객체에 존재하지 않는 속성을 읽으면 undefined
  5. let obj = {}; console.log(obj.name); // undefined

🔥 최종 정리

타입 설명 예제

Boolean true 또는 false let isReady = true;
BigInt 매우 큰 정수를 표현 let big = 1000000000000n;
Null 의도적으로 "없음"을 표현 let empty = null;
Undefined 값이 정의되지 않음 let notSet; // undefined

boolean → 참(true) / 거짓(false)

bigint → 큰 정수 (123n)

null → 값이 없음을 의도적으로 표시

undefined → 값이 아직 할당되지 않음

 

 

참조 타입

참조타입은 오브젝트 타입과 함수타입만 있다.

원시타입과 참조타입은 메모리 참조 방식이 다르다.

  • 원시타입 : 메모리에 할당될 때는 값 자체를 저장
  • 참조타입 : 메모리 주소 저장(힙 메모리 영역에 저장된 값을 가르키는 주소)

원시타입의 동작 원리

근데 여기서 변수2에 127을 할당하면?

-

참조타입의 동작원리

 

배열 값에 [1, 2] 가 들어가는 것으로 보이지만 실제로 메모리에 저장된 값은 메모리 주소다.

이 메모리 주소는 힙 메모리에 저장된 실제 값을 가리킨다.

참조 타입은 원시 타입과 다르게 요소의 값을 변경하더라도 새 메모리 주소를 할당하지 않는다. 그렇기 때문에 variable[이 ]의 값을 3 으로 바꾸면 variable2[0]의 값도 3 으로 반영된다.

 

즉, 얕은복사다.


📌 1. 객체(Object)

1-1. 객체 선언

객체는 중괄호 {} 안에 **키(key)와 값(value)**을 설정하여 선언

const obj = {
  name: 'Sunhyoup',
  age: 30,
  'full-name': 'Sunhyoup Lee'
};

⚠️ 주의:

  • 키 이름에 특수 문자(예: ``)가 포함될 경우, 따옴표로 감싸야 함
  • 키에 접근하는 방법:
    • .(dot notation): obj.name
    • [](bracket notation): obj['age']
    • 특수문자가 포함된 키는 []만 사용 가능: obj['full-name']

1-2. 객체 속성 접근

console.log(obj.name);     // Sunhyoup
console.log(obj['age']);   // 30
console.log(obj['full-name']); // Sunhyoup Lee

1-3. 객체 요소 추가

값을 대입하는 것만으로 새로운 속성을 추가할 수 있다.

const obj = { name: "Sunhyoup" };
obj.age = 30;

console.log(obj.age); // 30

1-4. 객체 요소 삭제

delete 키워드를 사용하면 객체의 특정 속성을 삭제할 수 있다.

const obj = { name: 'Sunhyoup' };
obj.age = 30;
delete obj.age;

console.log(obj.age); // undefined

📌 2. 배열(Array)

2-1. 배열 선언

배열은 대괄호 [] 를 사용하여 선언

const arr = [1, 2, 3];

2-2. 배열 요소 접근

배열은 0부터 시작하는 **인덱스(index)**를 사용하여 요소에 접근

console.log(arr[0]); // 1
console.log(arr[1]); // 2

2-3. 배열 길이 확인

배열의 길이(요소 개수)를 length 속성으로 확인

console.log(arr.length); // 3

2-4. 배열 요소 추가

(1) push() → 배열 끝에 요소 추가

const arr = [1, 2, 3];
arr.push(4);

console.log(arr); // [1, 2, 3, 4]
console.log(arr[3]); // 4

2-5. 배열 요소 삭제

(1) pop() → 배열 마지막 요소 제거

  • pop() 메서드는 배열의 마지막 요소를 제거하고 그 값을 반환
const arr = [1, 2, 3];
const value = arr.pop();

console.log(value); // 3 (삭제된 값)
console.log(arr.length); // 2 (배열 길이 감소)

✅ 정리

기능 객체(Object) 배열(Array)

선언 {} 사용 [] 사용
요소 접근 obj.key 또는 obj['key'] arr[index]
요소 추가 obj.newKey = value arr.push(value)
요소 삭제 delete obj.key arr.pop()

객체는 "키-값" 형태로 데이터를 저장할 때 사용

배열은 "순서가 있는 리스트"를 저장할 때 사용



04.3 함수

자바스크립트에서 객체는 일반적으로 정의하는 것도 가능하지만 일급 객체이자 타입이기도 하다.

일급객체란?(First-Class Citizen)

즉, 함수를 변수에 저장하거나, 함수의 인자로 전달하거나, 함수에서 함수를 반환할 수 있음을 의미

그러니까 객체(특히 함수)가 다음 조건을 만족하면 일급 객체다.

  • 변수에 저장 가능
  • 함수의 매개변수로 전달 가능
  • 함수의 반환값으로 사용 가능

대표적인 예: 함수 (JavaScript, Python, etc.)

 

 


이급 객체란? (Second-Class Citizen)

 

  • 일급 객체의 조건을 만족하지 않는 객체
  • 즉, 함수의 인자로 전달되거나 반환될 수 없는 것
  • 주로 C,Java에서 함수(메서드) 가 이에 해당함

Java에서는 함수(메서드) 자체를 변수에 담거나, 다른 함수의 매개변수로 전달하는 게 안된다. 그래서 이급 객체라고 부름

 

익명함수는 변수명 안쓰고 함수 만들면 익명함수(이름없는 함수)다.


04.4 코딩테스트 구현 노하우

📌 1. 구조 분해 할당 (Destructuring Assignment)

객체나 배열에서 값을 쉽게 추출하는 문법

(일일이 obj.key 안 해도 됨!)

✅ 배열 구조 분해

const arr = [1, 2, 3];
const [a, b, c] = arr;

console.log(a); // 1
console.log(b); // 2
console.log(c); // 3

✔ arr[0], arr[1] 안 써도 알아서 변수에 들어감.

✅ 객체 구조 분해

const obj = { name: "Minho", age: 27 };
const { name, age } = obj;

console.log(name); // Minho
console.log(age);  // 27

✔ obj.name, obj.age 안 써도 바로 꺼낼 수 있음!


📌 2. 값 교환하기 (Swap Variables)

두 변수의 값을 교환할 때, 임시 변수 없이 가능!

✅ 구조 분해 할당으로 값 교환

let a = 10, b = 20;
[a, b] = [b, a]; // Swap!

console.log(a); // 20
console.log(b); // 10

✔ temp 변수 없이 한 줄로 값 교환 가능! 🔥


📌 3. 비구조화 할당 (Destructuring Assignment)

➡ 구조 분해 할당과 같은 개념!

"비구조화 할당"은 한국식 용어, 원래 영어로는 Destructuring Assignment

✅ 객체 비구조화 할당 예시

const person = { name: "Minho", age: 27 };
const { name, age } = person;

console.log(name); // Minho
console.log(age);  // 27

✔ 구조 분해 할당 == 비구조화 할당 (같은 개념!)


📌 4. 스프레드 연산자 (Spread Operator)

...(점 3개)로 배열이나 객체를 펼쳐서 복사하는 문법!

✅ 배열 복사

const arr1 = [1, 2, 3];
const arr2 = [...arr1]; // 배열 복사

console.log(arr2); // [1, 2, 3]

✔ arr1을 arr2로 복사하면서 독립적인 배열 생성

✅ 배열 합치기

const arrA = [1, 2];
const arrB = [3, 4];
const combined = [...arrA, ...arrB];

console.log(combined); // [1, 2, 3, 4]

✔ 두 배열을 쉽게 합칠 수 있음!

✅ 객체 복사

const obj1 = { name: "Minho" };
const obj2 = { ...obj1, age: 27 };

console.log(obj2); // { name: "Minho", age: 27 }

✔ obj1을 복사하고, age 추가 가능!


📌 5. 배열 내 같은 요소 제거하기 (Remove Duplicates in Array)

Set을 활용해서 중복 요소 제거 가능!

const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = [...new Set(arr)];

console.log(uniqueArr); // [1, 2, 3, 4, 5]

✔ Set은 중복을 허용하지 않음 → ...으로 다시 배열화하면 끝!


📌 6. && 와 || 연산자로 조건문 대체하기

조건문을 줄이는 테크닉!

✅ && (AND) 연산자

const isLoggedIn = true;
isLoggedIn && console.log("Welcome!"); // 실행됨

✔ && 연산자는 앞이 true일 때만 뒤 코드 실행

if 대체 가능!

if (isLoggedIn) {
  console.log("Welcome!");
}
// ↓ 줄이면?
isLoggedIn && console.log("Welcome!")

✅ || (OR) 연산자

const username = "";
const displayName = username || "Guest";

console.log(displayName); // "Guest"

✔ || 연산자는 앞이 falsy 값이면 뒤 값 반환

(falsy 값: null, undefined, "", 0, false)

?? (Nullish Coalescing) 연산자도 있음!

const username = "";
const displayName = username ?? "Guest"; // 빈 문자열도 유지

console.log(displayName); // ""

✔ ??는 null이나 undefined만 체크 (빈 문자열은 유지!)


✅ && + || 활용 예제

const user = { name: "Minho" };

console.log(user.name || "Guest"); // Minho
console.log(user.age || "Not specified"); // Not specified

user.isAdmin && console.log("Admin Mode"); // 실행 안 됨 (false)

✔ ||로 기본값 설정

✔ &&로 조건 만족 시 실행


📌 정리 요약 🚀

구조 분해 할당 배열/객체에서 쉽게 값 꺼내기 const [a, b] = arr;
값 교환하기 변수 값 바꾸기 (temp 없이) [a, b] = [b, a];
비구조화 할당 구조 분해 할당과 같은 개념 const { name, age } = obj;
스프레드 연산자 배열/객체 펼치기 (...) [...arr1, ...arr2]
배열 중복 제거 Set 활용 [...new Set(arr)]
**&& / `   ` 연산자**

 

 

'Study > 코딩테스트(JS)' 카테고리의 다른 글

08.해시  (0) 2025.02.25
07. 큐  (0) 2025.02.25
06. 스택  (0) 2025.02.25
05.배열  (0) 2025.02.18
03.알고리즘의 효율 분석(BigO,시간&공간 복잡도)  (0) 2025.01.21