<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title> </title>
    <link>https://torobbb.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 18 Aug 2026 14:41:28 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>벼리01</managingEditor>
    <item>
      <title>[React] Can't resolve 'queryString' in ...</title>
      <link>https://torobbb.tistory.com/entry/queryString-error</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2486&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfDqdr/btsMKH6eMBf/jMt3SB4IbEAKZp1mIQotB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfDqdr/btsMKH6eMBf/jMt3SB4IbEAKZp1mIQotB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfDqdr/btsMKH6eMBf/jMt3SB4IbEAKZp1mIQotB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfDqdr%2FbtsMKH6eMBf%2FjMt3SB4IbEAKZp1mIQotB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2486&quot; height=&quot;1016&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2486&quot; data-origin-height=&quot;1016&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갑자기 이 오류가 뜨면서 웹 애플리케이션이 실행되지 않음&lt;/p&gt;
&lt;pre id=&quot;code_1741854988479&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {enabled} from &quot;express/lib/application&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 내 `enabled`를 사용하기 위해 코드를 작성하던 도중 import 문이 잘못 작성되면서 생긴 오류.&lt;/p&gt;</description>
      <category>React</category>
      <author>벼리01</author>
      <guid isPermaLink="true">https://torobbb.tistory.com/228</guid>
      <comments>https://torobbb.tistory.com/entry/queryString-error#entry228comment</comments>
      <pubDate>Thu, 13 Mar 2025 14:25:19 +0900</pubDate>
    </item>
    <item>
      <title>[React] 리덕스(Redux)</title>
      <link>https://torobbb.tistory.com/entry/Redux</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRA1dN/btsMBQWS0ru/YBgtJKkU9O7BGDlXFLpYk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRA1dN/btsMBQWS0ru/YBgtJKkU9O7BGDlXFLpYk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRA1dN/btsMBQWS0ru/YBgtJKkU9O7BGDlXFLpYk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRA1dN%2FbtsMBQWS0ru%2FYBgtJKkU9O7BGDlXFLpYk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;106&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;리덕스(Redux)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트에서 사용되는 상태 관리 라이브러리. 주요 개념은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;읽기 전용 상태&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;리덕스에서 전역으로 관리하는 값은 읽기 전용으로, 직접 변경할 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단일 스토어&lt;/b&gt;&amp;nbsp;전체 애플리케이션에서 접근 가능한 상태들을 저장하고 있는 하나의 객체.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;액션 &lt;/b&gt;상태의 변경을 요청하기 위한 객체.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리듀서 &lt;/b&gt;액션과 이전 상태를 받아 새로운 상태를 반환하는 순수 함수.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;흐름&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 - 액션 생성 - 디스패치 - 스토어 - 리듀서 - 새 상태 - 컴포넌트 리렌더링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  상태(State)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 애플리케이션 어디서든 접근하고 공통으로 사용할 수 있도록 선언된 전역변수와 유사하다. 단, 리덕스는 단방향 데이터 흐름을 가지므로 읽기는 어디서든 자유롭게 가능하지만 수정은 반드시 액션을 통해서만 이루어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;스토어&lt;/b&gt;&lt;b&gt;(Store)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태를 보관하는 중앙 관리자 객체.&amp;nbsp; 액션이 스토어에게 &lt;b&gt;&lt;i&gt;&quot;이런 변경이 필요해&quot;&lt;/i&gt; &lt;/b&gt;라는 정보와 변경에 필요한 값을 들고오면 그 요청을 처리할 수 있는 리듀서를 찾아 처리를 위임한다. 액션은 리듀서에게 직접 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;상태 변경을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;요청할 수 없고, 스토어라는 중앙 관리자를 통해 간접적으로 상호작용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741068384392&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// store.js

import { createStore, combineReducers } from 'redux';
import userReducer from './reducers/userReducer';
import todoReducer from './reducers/todoReducer';

// 여러 리듀서 결합
const rootReducer = combineReducers({
  user: userReducer,
  todos: todoReducer
});


const store = createStore(
  rootReducer,
);

export default store;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;액션&lt;b&gt;(Action)&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 변경을 요청하기 위해 필요한 객체. 반드시 타입(type)이라는 프로퍼티를 포함하는데, 이는 고유 식별자라고 할 수 있다. '무엇을 해야하는지' 에 대한 정보를 담고 있으며 이를 `dispatch()` 함수를 통해 스토어에게 전달한다. 타입을 문자열 상수로 저장하기 위해 `contants` 객체를 따로 관리하기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;증가 시켜줘! 라는 뜻을 담은 `type` 과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 변화에 필요한 값인 `payload` 에 1을 담아 들고 온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스토어에게&amp;nbsp;&lt;i&gt;&lt;b&gt;&quot;1을 증가시켜줘&quot;&lt;/b&gt;&lt;/i&gt; 상태 변경을 요청하면 스토어가 해당 액션을 처리할 수 있는 리듀서를 찾아 실행시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741053567052&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export const increment = (value) =&amp;gt; ({
  type: 'INCREMENT',	// Action의 고유 식별자
  payload: value,	// 상태 업데이트에 필요한 추가 데이터 (선택 사항)
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;리듀서(Reducer)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입과 값을 받아 상태 변경을 처리한다. 액션이 `INCREMENT` 타입과 `1`을 가져왔다면 실제로 상태를 1 증가시키는 로직을 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741055364066&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Reducer

// 초기 상태 정의
const initialState = {
  count: 0
};

const counterReducer = (state = initialState, action) =&amp;gt; {
  switch (action.type) {
    case 'INCREMENT':
      return {
        ...state, // 기존 상태 복사
        count: state.count + action.payload
      };
    default:
      return state;
  }
};

export default counterReducer;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741055470776&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dispatch({ type: 'INCREMENT', payload: 1 });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1741069986511&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// todoAction.js

// 액션 타입 상수(constant.js로 따로 분리할 수 있음)
export const ADD_TODO = 'ADD_TODO';
export const TOGGLE_TODO = 'TOGGLE_TODO';
export const DELETE_TODO = 'DELETE_TODO';


export const addTodo = (text) =&amp;gt; ({
  type: ADD_TODO,
  payload: {
    id: Date.now(),
    text,
    completed: false
  }
});

export const toggleTodo = (id) =&amp;gt; ({
  type: TOGGLE_TODO,
  payload: id
});

export const deleteTodo = (id) =&amp;gt; ({
  type: DELETE_TODO,
  payload: id
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741070222861&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// todoReducers.js

import { ADD_TODO, TOGGLE_TODO, DELETE_TODO } from './todoActions';

// 초기 상태
const initialState = [];

// 할일 리듀서
const todoReducer = (state = initialState, action) =&amp;gt; {
  switch (action.type) {
    case ADD_TODO:
      // 새 할일 항목 추가
      return [...state, action.payload];
    
    case TOGGLE_TODO:
      // 특정 할일의 완료 상태 토글
      return state.map(todo =&amp;gt; 
        todo.id === action.payload 
          ? { ...todo, completed: !todo.completed } 
          : todo
      );
    
    case DELETE_TODO:
      // 특정 할일 삭제
      return state.filter(todo =&amp;gt; todo.id !== action.payload);
    
    default:
      return state;
  }
};

export default todoReducer;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741070247824&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// store.js

import { createStore, combineReducers } from 'redux';
import todoReducer from './todoReducers';

// 루트 리듀서 (여러 리듀서를 결합할 수 있음)
const rootReducer = combineReducers({
  todos: todoReducer,
  // 다른 리듀서들도 여기에 추가 가능
  // user: userReducer,
  // posts: postsReducer
});

// 스토어 생성
const store = createStore(
  rootReducer,
  // Redux DevTools 확장 프로그램 연결 (선택 사항)
  window.__REDUX_DEVTOOLS_EXTENSION__ &amp;amp;&amp;amp; window.__REDUX_DEVTOOLS_EXTENSION__()
);

export default store;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741070272275&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// App.js - 리액트 앱에 리덕스 스토어 연결

import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import TodoComponent from './TodoComponent';

function App() {
  return (
    &amp;lt;Provider store={store}&amp;gt;
      &amp;lt;div className=&quot;App&quot;&amp;gt;
        &amp;lt;h1&amp;gt;할일 관리 앱&amp;lt;/h1&amp;gt;
        &amp;lt;TodoComponent /&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/Provider&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741070089964&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// TodoComponent.js 컴포넌트

import React, { useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { addTodo, toggleTodo, deleteTodo } from './actions';

function TodoComponent() {
  const [todoText, setTodoText] = useState('');
  const todos = useSelector(state =&amp;gt; state.todos);
  const dispatch = useDispatch();
  
  const handleAddTodo = () =&amp;gt; {
    if (todoText.trim()) {
      dispatch(addTodo(todoText));
      setTodoText('');
    }
  };
  
  const handleToggleTodo = (id) =&amp;gt; {
    dispatch(toggleTodo(id));
  };
  
  const handleDeleteTodo = (id) =&amp;gt; {
    dispatch(deleteTodo(id));
  };
  
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;input
          type=&quot;text&quot;
          value={todoText}
          onChange={(e) =&amp;gt; setTodoText(e.target.value)}
          placeholder=&quot;할일을 입력하세요&quot;
        /&amp;gt;
        &amp;lt;button onClick={handleAddTodo}&amp;gt;할일 추가&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      
      &amp;lt;ul&amp;gt;
        {todos.map(todo =&amp;gt; (
          &amp;lt;li key={todo.id}&amp;gt;
            &amp;lt;span
              style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}
              onClick={() =&amp;gt; handleToggleTodo(todo.id)}
            &amp;gt;
              {todo.text}
            &amp;lt;/span&amp;gt;
            &amp;lt;button onClick={() =&amp;gt; handleDeleteTodo(todo.id)}&amp;gt;삭제&amp;lt;/button&amp;gt;
          &amp;lt;/li&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default TodoComponent;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1741072206592&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;리덕스는 무엇이고, 왜 사용하는가?&quot; data-og-description=&quot;  리덕스 리덕스란, 자바스크립트 애플리케이션에서 상태를 효율적으로 관리할 수 있게 도와주는 도구입니다. 복잡한 상태관리가 이루어지는 SPA(Single Page Application)에서 특히 유용하게 사용됩&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@youthfulhps/What-is-Redux-and-why-use-it&quot; data-og-url=&quot;https://velog.io/@youthfulhps/What-is-Redux-and-why-use-it&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNwSdP/hyYmJZt8uv/kkjkiHY73D7THEN8udw9cK/img.png?width=1433&amp;amp;height=796&amp;amp;face=0_0_1433_796,https://scrap.kakaocdn.net/dn/cDFSMK/hyYmXcnOpW/4XvSqi9Q7qs1G4r1Sox4yk/img.png?width=1433&amp;amp;height=796&amp;amp;face=0_0_1433_796,https://scrap.kakaocdn.net/dn/BIdjL/hyYmRb8HCR/jhitWq52isOYAvJyuVM5s0/img.png?width=1430&amp;amp;height=801&amp;amp;face=0_0_1430_801&quot;&gt;&lt;a href=&quot;https://velog.io/@youthfulhps/What-is-Redux-and-why-use-it&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@youthfulhps/What-is-Redux-and-why-use-it&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNwSdP/hyYmJZt8uv/kkjkiHY73D7THEN8udw9cK/img.png?width=1433&amp;amp;height=796&amp;amp;face=0_0_1433_796,https://scrap.kakaocdn.net/dn/cDFSMK/hyYmXcnOpW/4XvSqi9Q7qs1G4r1Sox4yk/img.png?width=1433&amp;amp;height=796&amp;amp;face=0_0_1433_796,https://scrap.kakaocdn.net/dn/BIdjL/hyYmRb8HCR/jhitWq52isOYAvJyuVM5s0/img.png?width=1430&amp;amp;height=801&amp;amp;face=0_0_1430_801');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;리덕스는 무엇이고, 왜 사용하는가?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  리덕스 리덕스란, 자바스크립트 애플리케이션에서 상태를 효율적으로 관리할 수 있게 도와주는 도구입니다. 복잡한 상태관리가 이루어지는 SPA(Single Page Application)에서 특히 유용하게 사용됩&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <author>벼리01</author>
      <guid isPermaLink="true">https://torobbb.tistory.com/226</guid>
      <comments>https://torobbb.tistory.com/entry/Redux#entry226comment</comments>
      <pubDate>Tue, 4 Mar 2025 10:48:45 +0900</pubDate>
    </item>
    <item>
      <title>[HTML/CSS] 자주 쓰는 태그/스타일</title>
      <link>https://torobbb.tistory.com/entry/HTML-CSS-favorite</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;말줄임&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1729127833960&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.review {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  word-break: break-all;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732147858270&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;p {
	text-align: center;
    width: 100%;
    overflow: hidden;
    word-wrap: break-word;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`overflow: hidden;` 박스에서 넘쳐난 텍스트 숨기기&lt;br /&gt;`white-space: nowrap;` 줄바꿈이 없어짐&lt;br /&gt;`text-overflow: ellipsis;` ... 말줄임 효과&lt;br /&gt;`word-break: break-all;` 어절이 유지되지 않고 끊어져서 줄바꿈 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`word-wrap : break-word;` width를 초과하면 줄바꿈&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;배경 블러(반투명)&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1729127908409&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.goTop{
	backdrop-filter: blur(50px);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;input 박스 테두리 없애기&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1729128021359&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;input {
        outline: none;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;기호 태그&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`&amp;amp;nbsp;` 띄어쓰기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`&amp;amp;copy&lt;b&gt;;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;` copyright&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;`&amp;amp;lt;` &amp;lt;&amp;nbsp; less than&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;`&amp;amp;gt;` &amp;gt; greater than&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;`&amp;amp;amp;` &amp;amp; 앰퍼센트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`&amp;amp;#035;` #&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`&amp;amp;#039;` ' 작은따옴표&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1729129518117&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot; ️ ＆nbsp /＆amp /＆lt /＆gt /＆quot 기호 의미&quot; data-og-description=&quot;＆nbsp /＆amp /＆lt /＆gt /＆quot 가끔 HTML문서에 텍스트를 작성하고 웹으로 확인하면 꺽쇠 &amp;lt; &amp;gt; 로 둘러싸인 부분은 표기가 되지 않는 경우가 있다. 그 책의 제목은 이다. 와 같이 입력하면, 아래와 같&quot; data-og-host=&quot;inpa.tistory.com&quot; data-og-source-url=&quot;https://inpa.tistory.com/entry/HTML-%F0%9F%93%9A-%EF%BC%86nbsp-%EF%BC%86amp-%EF%BC%86lt-%EF%BC%86gt-%EF%BC%86quot-%EC%9D%98%EB%AF%B8&quot; data-og-url=&quot;https://inpa.tistory.com/entry/HTML-%F0%9F%93%9A-%EF%BC%86nbsp-%EF%BC%86amp-%EF%BC%86lt-%EF%BC%86gt-%EF%BC%86quot-%EC%9D%98%EB%AF%B8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHnx8l/hyXhZbUCzQ/dsvM0T2ccppdKwhWqVsU3k/img.jpg?width=800&amp;amp;height=560&amp;amp;face=0_0_800_560,https://scrap.kakaocdn.net/dn/cfT4hb/hyXlS3hBpc/GkG1CKkLpuErvfvN8OM030/img.jpg?width=800&amp;amp;height=560&amp;amp;face=0_0_800_560&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/HTML-%F0%9F%93%9A-%EF%BC%86nbsp-%EF%BC%86amp-%EF%BC%86lt-%EF%BC%86gt-%EF%BC%86quot-%EC%9D%98%EB%AF%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inpa.tistory.com/entry/HTML-%F0%9F%93%9A-%EF%BC%86nbsp-%EF%BC%86amp-%EF%BC%86lt-%EF%BC%86gt-%EF%BC%86quot-%EC%9D%98%EB%AF%B8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHnx8l/hyXhZbUCzQ/dsvM0T2ccppdKwhWqVsU3k/img.jpg?width=800&amp;amp;height=560&amp;amp;face=0_0_800_560,https://scrap.kakaocdn.net/dn/cfT4hb/hyXlS3hBpc/GkG1CKkLpuErvfvN8OM030/img.jpg?width=800&amp;amp;height=560&amp;amp;face=0_0_800_560');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt; ️ ＆nbsp /＆amp /＆lt /＆gt /＆quot 기호 의미&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;＆nbsp /＆amp /＆lt /＆gt /＆quot 가끔 HTML문서에 텍스트를 작성하고 웹으로 확인하면 꺽쇠 &amp;lt; &amp;gt; 로 둘러싸인 부분은 표기가 되지 않는 경우가 있다. 그 책의 제목은 이다. 와 같이 입력하면, 아래와 같&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;inpa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>HTML, CSS</category>
      <author>벼리01</author>
      <guid isPermaLink="true">https://torobbb.tistory.com/221</guid>
      <comments>https://torobbb.tistory.com/entry/HTML-CSS-favorite#entry221comment</comments>
      <pubDate>Thu, 17 Oct 2024 10:21:18 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 문자열 비교</title>
      <link>https://torobbb.tistory.com/entry/JavaScript-String-comparison</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문자열 상수 풀(string constant pool)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바가 문자열을 string pool에서 관리하듯이 자바스크립트는 string constant pool에서 문자열 메모리를 관리한다. 만약 이미 메모리에 할당된 문자열이 있다면, 새 변수에 해당 문자열을 할당하더라도 메모리를 새로 생성하지 않고 주소값을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1728267713264&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;How are strings stored in JavaScript ? - GeeksforGeeks&quot; data-og-description=&quot;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&quot; data-og-host=&quot;www.geeksforgeeks.org&quot; data-og-source-url=&quot;https://www.geeksforgeeks.org/how-are-strings-stored-in-javascript/&quot; data-og-url=&quot;https://www.geeksforgeeks.org/how-are-strings-stored-in-javascript/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TChUU/hyXd7AeaUJ/H1W00kAmGp9CN8dLZfklK1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/9rlz8/hyXd86X2cD/PVK7McyDKgG4wsG2BPjK0k/img.png?width=905&amp;amp;height=501&amp;amp;face=0_0_905_501,https://scrap.kakaocdn.net/dn/RGy1f/hyXd6nLhG0/3Qlcx0E5PxbULmlHuT0GVK/img.png?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500&quot;&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/how-are-strings-stored-in-javascript/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.geeksforgeeks.org/how-are-strings-stored-in-javascript/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TChUU/hyXd7AeaUJ/H1W00kAmGp9CN8dLZfklK1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/9rlz8/hyXd86X2cD/PVK7McyDKgG4wsG2BPjK0k/img.png?width=905&amp;amp;height=501&amp;amp;face=0_0_905_501,https://scrap.kakaocdn.net/dn/RGy1f/hyXd6nLhG0/3Qlcx0E5PxbULmlHuT0GVK/img.png?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How are strings stored in JavaScript ? - GeeksforGeeks&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.geeksforgeeks.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문자열 비교 연산&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1728267741356&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str1 = &quot;Hello&quot;;
let str2 = &quot;Hello&quot;;

console.log(`str1 === str3 : ${str1 === str2}`);

// str1 === str3 : true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728267750953&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str1 = &quot;Hello&quot;;
let str2 = new String(&quot;Hello&quot;);

console.log(`str1 == str3 : ${str1 == str2}`);
console.log(`str1 === str3 : ${str1 === str2}`);

// str1 == str3 : true
// str1 === str3 : false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`===` 는 주소값과 자료형까지 검사한다. `str2` 를 `new` 연산자 없이 사용했을 경우 같은 문자열 리터럴의 주소를 참조하기 때문에 참이 되지만, `new String()` 생성자를 사용해 객체를 생성하면 다른 주소값을 가진 문자열 리터럴이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728267762812&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(`2024 == '2024' : ${2024 == &quot;2024&quot;}`);
console.log(`2024 === '2024' : ${2024 === &quot;2024&quot;}`);

// 2024 == '2024' : true
// 2024 === '2024' : false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`localeCompare()`&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문자열 비교 시 정렬 순서를 결정하는 데에 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;`-1` `a`가 `b`보다 사전순으로 앞에 위치함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;`0` `a`와 `b`가 같음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;`1` `a`가 `b`보다 사전순으로 뒤에 위치함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스의 [Lv.1][문자열 내 마음대로 정렬하기] 문제에서, 주어진 문자열 배열을 문자열의 사전순이 아닌 두번째 알파벳 순서대로 정렬하고자 할 때(단, 동일하면 문자열 전체의 사전순으로 정렬한다.) 다음과 같이 코드를 작성할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728268070555&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function solution(strings, n) {
    return strings.sort( (a, b) =&amp;gt; {

        if(a.charAt(n) &amp;lt; b.charAt(n)){
            return -1;
        }else if(a.charAt(n) &amp;gt; b.charAt(n)){
            return 1;
        }

        return a.localeCompare(b);

    });

}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>JavaScript</category>
      <author>벼리01</author>
      <guid isPermaLink="true">https://torobbb.tistory.com/219</guid>
      <comments>https://torobbb.tistory.com/entry/JavaScript-String-comparison#entry219comment</comments>
      <pubDate>Mon, 7 Oct 2024 11:23:17 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] Kakao Map API</title>
      <link>https://torobbb.tistory.com/entry/JavaScript-Kakao-Map-API</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  카카오맵 api 시작하기&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1726727359599&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Kakao Developers&quot; data-og-description=&quot;카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.&quot; data-og-host=&quot;developers.kakao.com&quot; data-og-source-url=&quot;https://developers.kakao.com/docs/latest/ko/local/common&quot; data-og-url=&quot;https://developers.kakao.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XT1tg/hyW6GhYdW1/Q7j4B4rCuQrseAiCi3paU0/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/j98he/hyW24x39vU/5IKtqtPjmYdhusavQKwV51/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000,https://scrap.kakaocdn.net/dn/oOj6w/hyW203srhs/1rzDObsJV69cloqqUbbtO0/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000&quot;&gt;&lt;a href=&quot;https://developers.kakao.com/docs/latest/ko/local/common&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.kakao.com/docs/latest/ko/local/common&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XT1tg/hyW6GhYdW1/Q7j4B4rCuQrseAiCi3paU0/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/j98he/hyW24x39vU/5IKtqtPjmYdhusavQKwV51/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000,https://scrap.kakaocdn.net/dn/oOj6w/hyW203srhs/1rzDObsJV69cloqqUbbtO0/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Kakao Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.kakao.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  지도 띄우기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kakao Map API를 발급 받았다면 이제 지도를 사용할 수 있다. `html` 파일에 다음과 같은 스크립트를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1726727643280&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;script type=&quot;text/javascript&quot; src=&quot;//dapi.kakao.com/v2/maps/sdk.js?appkey=YOUR_API_KEY&amp;amp;libraries=services&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`html`에 `map`을 띄울 적당한 요소를 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1726727754449&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;div class=&quot;map&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 js 코드를 작성하면 지도를 띄울 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1726727788347&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  const mapContainer = document.querySelector(&quot;.map&quot;); // 지도를 표시할 div

  const mapOption = {
    center: new kakao.maps.LatLng(latitude, longitude), // 지도의 중심좌표 (위도, 경도)
    level: 6, // 지도의 확대 레벨. 클수록 멀리 보임
  };

  // 지도 생성
  const map = new kakao.maps.Map(mapContainer, mapOption);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djq7wd/btsJGIG1Bqf/dC4BZUjYBdW6Wmv0vA8LG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djq7wd/btsJGIG1Bqf/dC4BZUjYBdW6Wmv0vA8LG0/img.png&quot; data-alt=&quot;쨘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djq7wd/btsJGIG1Bqf/dC4BZUjYBdW6Wmv0vA8LG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdjq7wd%2FbtsJGIG1Bqf%2FdC4BZUjYBdW6Wmv0vA8LG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;492&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쨘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[지도 생성하기]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://apis.map.kakao.com/web/sample/basicMap/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://apis.map.kakao.com/web/sample/basicMap/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &amp;nbsp; 지도에 마커 추가하기&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1726728057686&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const mapContainer = document.querySelector(&quot;.map&quot;); // 지도를 표시할 div

const mapOption = {
center: new kakao.maps.LatLng(latitude, longitude), // 지도의 중심좌표 (위도, 경도)
level: 6, // 지도의 확대 레벨. 클수록 멀리 보임
};

// 지도 객체 생성
const map = new kakao.maps.Map(mapContainer, mapOption);
  
  
const marker = new kakao.maps.Marker({
  map: map,
  position: new kakao.maps.LatLng(latitude, longitude),
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l3xa1/btsJGtQS7W9/BKYzJElxbCPy4ocG40Xpx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l3xa1/btsJGtQS7W9/BKYzJElxbCPy4ocG40Xpx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l3xa1/btsJGtQS7W9/BKYzJElxbCPy4ocG40Xpx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl3xa1%2FbtsJGtQS7W9%2FBKYzJElxbCPy4ocG40Xpx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;477&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;[마커 띄우기]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://apis.map.kakao.com/web/sample/basicMarker/&quot;&gt;https://apis.map.kakao.com/web/sample/basicMarker/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &amp;nbsp; 커스텀 마커 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1726728353071&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  const mapContainer = document.querySelector(&quot;.map&quot;); // 지도를 표시할 div

  const mapOption = {
    center: new kakao.maps.LatLng(latitude, longitude), // 지도의 중심좌표 (위도, 경도)
    level: 6, // 지도의 확대 레벨. 클수록 멀리 보임
  };

  // 지도 생성
  const map = new kakao.maps.Map(mapContainer, mapOption);


// 커스텀 마커 만들기
const customMarkerImage = new kakao.maps.MarkerImage(
  &quot;images/marker-red.png&quot;, // 마커 이미지 URL
  new kakao.maps.Size(35, 35), // 마커 이미지 크기
  {
    offset: new kakao.maps.Point(17, 35), // 마커의 중심점 위치
  }
);


// 내 위치 마커 추가
new kakao.maps.Marker({
  position: new kakao.maps.LatLng(
    latitude,
    longitude
  ),
  map: map,
  clickable: true,
  image: customMarkerImage,
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0c0bW/btsJDZRIxRb/h3lmHO9KFJe4u2ErXUyxRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0c0bW/btsJDZRIxRb/h3lmHO9KFJe4u2ErXUyxRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0c0bW/btsJDZRIxRb/h3lmHO9KFJe4u2ErXUyxRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0c0bW%2FbtsJDZRIxRb%2Fh3lmHO9KFJe4u2ErXUyxRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;449&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[커스텀 마커 만들기]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://apis.map.kakao.com/web/sample/basicMarkerImage/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://apis.map.kakao.com/web/sample/basicMarkerImage/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &amp;nbsp; 마커에 이벤트 추가하기&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1726728634186&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  kakao.maps.event.addListener(marker, &quot;mouseover&quot;, function () {
      infowindow.open(map, marker);
      spot.style.outline = &quot;solid 2px #96b9ff&quot;;
    });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726728928471&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    kakao.maps.event.addListener(marker, &quot;click&quot;, () =&amp;gt; {
      spot.style.backgroundColor = &quot;#96b9ff&quot;;
      spot.style.outline = &quot;&quot;;
      spot.style.color = &quot;white&quot;;

      const spotDiv = document.querySelector(`[data-id=&quot;${place.id}&quot;]`);
      if (spotDiv) {
        spotDiv.scrollIntoView({
          behavior: &quot;smooth&quot;, // 스크롤 애니메이션 (부드럽게)
          block: &quot;start&quot;, // 요소의 상단으로 스크롤 정렬
          inline: &quot;nearest&quot;, // 수평 위치도 맞춤
        });
      }
    });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 기록 2024-09-19 오후 3.52.47.gif&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/653GH/btsJGBH4L7F/LMidLnTtyCMH0AtjtdaYXK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/653GH/btsJGBH4L7F/LMidLnTtyCMH0AtjtdaYXK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/653GH/btsJGBH4L7F/LMidLnTtyCMH0AtjtdaYXK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/653GH/btsJGBH4L7F/LMidLnTtyCMH0AtjtdaYXK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;762&quot; height=&quot;438&quot; data-filename=&quot;화면 기록 2024-09-19 오후 3.52.47.gif&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[마커 마우스 이벤트 추가하기]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://apis.map.kakao.com/web/sample/addMarkerMouseEvent/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://apis.map.kakao.com/web/sample/addMarkerMouseEvent/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[마커 클릭 이벤트 추가하기]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://apis.map.kakao.com/web/sample/addMarkerClickEvent/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://apis.map.kakao.com/web/sample/addMarkerClickEvent/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &amp;nbsp; 지도 중심 변경하기&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1726729020910&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 이동할 위도 경도 위치를 생성
var moveLatLon = new kakao.maps.LatLng(latitude, longitude);
// 지도 중심 이동
map.panTo(moveLatLon); // 부드럽게 이동. 단, 지도 내에 해당 위치가 없다면 일반 이동&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 기록 2024-09-19 오후 3.58.37.gif&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nuv9l/btsJGkmmjz7/HApXcbKS31iqXbIRXfgcFK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nuv9l/btsJGkmmjz7/HApXcbKS31iqXbIRXfgcFK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nuv9l/btsJGkmmjz7/HApXcbKS31iqXbIRXfgcFK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/Nuv9l/btsJGkmmjz7/HApXcbKS31iqXbIRXfgcFK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;429&quot; data-filename=&quot;화면 기록 2024-09-19 오후 3.58.37.gif&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &amp;nbsp; 키워드로 검색하기&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1726729447966&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  // 장소 검색 객체 생성
  const ps = new kakao.maps.services.Places();

  // 키워드 검색
  ps.keywordSearch(
    // keywordSearch(keyword, callback(data, status, pagination), locationInfo)
    &quot;키워드&quot;,
    (data, status, pagination) =&amp;gt; {
     // 여기에 검색 후 로직
    }, // callback 함수
    {
      location: new kakao.maps.LatLng(
        myLocation.latitude,
        myLocation.longitude
      ), // 중심 위치
      radius: 1000, // 반경 1km
      sort: &quot;distance&quot;, // 거리순 정렬
    } // 중심이 될 위치 정보
  );&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`radius` 찾고자 하는 중심 위치와 반경을 설정할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`sort` 거리순, 이름순, 관련도순으로 정렬할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`keywordSearch` 는 `data` `status` `pagination`을 반환한다. `data`에는 검색 결과 15개가 담겨있고, 결과가 15개 이상일 경우 `pagination` 을 통해 접근해야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 조건문으로 상태가 올바를 때만 로직을 수행할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1726729583259&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (status === kakao.maps.services.Status.OK)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`data` 에는 검색 결과(1페이지)가 담겨있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nAHzM/btsJD7oCxK8/tSCYodBwjMAwdn2QumJ00K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nAHzM/btsJD7oCxK8/tSCYodBwjMAwdn2QumJ00K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nAHzM/btsJD7oCxK8/tSCYodBwjMAwdn2QumJ00K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnAHzM%2FbtsJD7oCxK8%2FtSCYodBwjMAwdn2QumJ00K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;344&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`pagination` 은 검색 결과의 페이지 객체다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`hasNextPage`는 다음 페이지의 존재 여부를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`nextPage()` 를 호출하면 다음 페이지를 볼 수 있으며 해당 메서드는 `keywordSearch`의 콜백함수를 자동으로 다시 호출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[키워드로 장소 검색하기]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://apis.map.kakao.com/web/sample/keywordBasic/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://apis.map.kakao.com/web/sample/keywordBasic/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>벼리01</author>
      <guid isPermaLink="true">https://torobbb.tistory.com/216</guid>
      <comments>https://torobbb.tistory.com/entry/JavaScript-Kakao-Map-API#entry216comment</comments>
      <pubDate>Thu, 19 Sep 2024 16:12:19 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 스마트 포인터</title>
      <link>https://torobbb.tistory.com/entry/Cpp-Smart-pointer</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;포인터가 가리키는 메모리를 자동으로 해제하는 포인터. 개발자는 메모리 관리에 크게 신경 쓸 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++은 객체 생성 시 사용했던 동적 메모리 또는 시스템 자원을 소멸 시 자동으로 소멸시키는 매커니즘을 제공한다. 범위를 벗어난 변수는 스택에서 제거되며, 객체의 소멸자가 호출되어 자신이 사용하던 자원을 알아서 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`auto_ptr` 동적으로 할당된 메모리도 자동으로 해제하는 래퍼 클래스. // deprecated. use unique_ptr instead.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`template&amp;lt;typename T&amp;gt; class auto_ptr`&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터가 가리키는 대상의 타입 T 를 인자로 받아 `T*` 형 포인터를 관리한다. 생성자로 전달된 포인터는 소멸자에서 delete 로 해제한다.&lt;/p&gt;
&lt;pre id=&quot;code_1726730244063&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  unique_ptr&amp;lt;double&amp;gt; rate(new double);
  *rate = 3.14;
  
  cout &amp;lt;&amp;lt; *rate &amp;lt;&amp;lt; endl;  // 3.14&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수가 종료되면 객체의 소멸자를 호출하기 때문에, `unique_ptr` 클래스 내 소멸자에 작성된 `delete` 가 포인터를 해제하면서 자동으로 해제되는 것처럼 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 구현&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1726730253212&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;memory&amp;gt;

using namespace std;

template&amp;lt;typename T&amp;gt;
class my_smart_ptr {
    
    public:
    my_smart_ptr(T* ptr){
        this-&amp;gt;my_ptr = ptr;
    }
    
    ~ my_smart_ptr(){
        delete this-&amp;gt;my_ptr;
    }
    
    T* operator-&amp;gt;() const{
        return my_ptr;
    }
    
    T operator*() const{
      return *my_ptr;  
    }
    
    
    private:
    T* my_ptr;
};

int main()
{
    my_smart_ptr&amp;lt;string&amp;gt; str(new string(&quot;test&quot;));
  
    cout &amp;lt;&amp;lt; *str &amp;lt;&amp;lt; endl; // test  
    cout &amp;lt;&amp;lt; str-&amp;gt;size() &amp;lt;&amp;lt; endl; // 4
  
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`shared_ptr` (C++ 11 이후부터 표준 라이브러리에 포함되었음. C++ 11 이전에서 사용하려면 boost 라이브러리) 하나의 객체를 여러 포인터가 참조할 수 있도록 구현된 스마트 포인터 래퍼 클래스. 내부적으로 레퍼런스 카운팅을 수행하여 메모리를 가리키는 인스턴스의 수를 추적한다. 레퍼런스 카운터가 0이 되었을 때 메모리가 해제된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1726730279241&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[C/C++ 프로그래밍 : 중급] 11. 스마트 포인터&quot; data-og-description=&quot;Chapter 11. 스마트 포인터 스마트 포인터는 C++에서 동적 메모리 관리를 단순화하는 도구입니다. 그들은 기본 포인터와 비슷하게 동작하지만, 적절한 시점에 자동으로 메모리를 해제하여 메모리 &quot; data-og-host=&quot;gdngy.tistory.com&quot; data-og-source-url=&quot;https://gdngy.tistory.com/183&quot; data-og-url=&quot;https://gdngy.tistory.com/183&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pd2In/hyW2XFFaww/oLHTHQkGABLccsf4Da2Aik/img.png?width=206&amp;amp;height=116&amp;amp;face=0_0_206_116,https://scrap.kakaocdn.net/dn/vA0OC/hyW2UvqBGX/CHWdw4KSj8WI9lyrGw4IE1/img.png?width=206&amp;amp;height=116&amp;amp;face=0_0_206_116&quot;&gt;&lt;a href=&quot;https://gdngy.tistory.com/183&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gdngy.tistory.com/183&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pd2In/hyW2XFFaww/oLHTHQkGABLccsf4Da2Aik/img.png?width=206&amp;amp;height=116&amp;amp;face=0_0_206_116,https://scrap.kakaocdn.net/dn/vA0OC/hyW2UvqBGX/CHWdw4KSj8WI9lyrGw4IE1/img.png?width=206&amp;amp;height=116&amp;amp;face=0_0_206_116');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[C/C++ 프로그래밍 : 중급] 11. 스마트 포인터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Chapter 11. 스마트 포인터 스마트 포인터는 C++에서 동적 메모리 관리를 단순화하는 도구입니다. 그들은 기본 포인터와 비슷하게 동작하지만, 적절한 시점에 자동으로 메모리를 해제하여 메모리&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gdngy.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C, C++</category>
      <author>벼리01</author>
      <guid isPermaLink="true">https://torobbb.tistory.com/215</guid>
      <comments>https://torobbb.tistory.com/entry/Cpp-Smart-pointer#entry215comment</comments>
      <pubDate>Thu, 19 Sep 2024 09:54:19 +0900</pubDate>
    </item>
    <item>
      <title>[C++] STL</title>
      <link>https://torobbb.tistory.com/entry/Cpp-STL</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; STL(Standard Template Library)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 템플릿 라이브러리. 자료구조(컨테이너, 이터레이터, 알고리즘)를 모아놓은 라이브러리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너(자료구조), 반복자(iterator), 알고리즘, 수치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능을 제공하고 손쉽게 구현할 수 있도록 재사용을 목적으로 만들어진 라이브러리. C언어는 CRT(C Runtime Library)라는 이름의 라이브러리를, C++은 C++ Standard Library를 가지고 있다. 1994년 C++ 표준 라이브러리에 STL이 추가되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 템플릿 라이브러리라는 뜻 그대로 일반화 프로그래밍(Generic Programming)을 기반으로 무분별한 여러가지 형태의 코드를 지양하고 표준화된 코드를 지향한다. 표준이므로 이식성이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 자료구조마다 성능의 차이가 있으므로 검색, 정렬, 삽입, 삭제에 최적화된 자료구조를 적절히 골라 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외 처리가 쉽지 않다는 단점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 컨테이너(Container)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java의 컬렉션과 유사한 개념으로 데이터의 집합을 저장하고 관리하는데 사용한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;시퀀스 컨테이너(순차 컨테이너) (Sequence Containers)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;vector&lt;/b&gt; &lt;b&gt;동적 배열&lt;/b&gt;로, 크기가 자동으로 조정된다. 인덱스를 통해 접근할 수 있으며, 효율적인 끝에 요소 추가/제거를 지원한다. 중간 삽입 삭제는 요소 개수에 따라 처리 속도가 비례한다. 모든 요소를 뒤로 밀거나 앞으로 당기기 때문. 유사) 동적배열, arraylist&lt;/li&gt;
&lt;li&gt;&lt;b&gt;deque&lt;/b&gt; 양쪽 끝에서 빠르게 삽입/삭제가 가능한 데큐(더블 엔디드 큐). 성능 또한 벡터와 마찬가지로 요소 개수에 따라 처리 속도가 비례한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;list&lt;/b&gt; 양방향 &lt;b&gt;연결 리스트&lt;/b&gt;로, 임의의 위치에서의 삽입과 삭제가 효율적. 요소의 삽입 및 삭제가 위치와 상관없이 같은 속도. 각각의 노드가 포인터로 연결되어있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;array&lt;/b&gt; 고정 크기의 배열. std::array는 크기가 컴파일 타임에 결정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정렬 연관 컨테이너 (Sort Associative Containers)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연관된 다른 타입들을 담을 수 있는 컨테이너. 키를 사용하여 데이터를 신속하게 찾아낼 수 있음. 실행 시 크기를 동적으로 변경할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;set&lt;/b&gt; 고유한 요소들을 정렬된 상태로 저장한. 키의 중복은 허용하지 않는다. 원하는 키를 빠르게 찾아낸다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;map&lt;/b&gt; 키-값 쌍을 저장하며, 키를 통해 값을 빠르게 조회할 수 있다. &lt;b&gt;키의 중복은 허용하지 않는다.&lt;/b&gt; 키를 사용하여 원하는 값, 즉 객체를 빠르게 찾아낸다. key:value&lt;/li&gt;
&lt;li&gt;&lt;b&gt;multiset&lt;/b&gt; 중복을 허용하는 정렬된 집합.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;multimap&lt;/b&gt; 중복된 키를 허용하는 키-값 쌍의 집합.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비순차 컨테이너 (Unordered Containers)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;unordered_set&lt;/b&gt; 해시 기반의 집합으로, 요소들은 정렬되지 않음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;unordered_map&lt;/b&gt; 해시 기반의 키-값 쌍의 집합.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;unordered_multiset&lt;/b&gt; 해시 기반의 중복을 허용하는 집합.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;unordered_multimap&lt;/b&gt; 해시 기반의 중복된 키를 허용하는 키-값 쌍의 집합.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;반복자(Iterator)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너(또는 배열)의 요소를 순차적으로 읽기 위해서는 요소의 타입이 무엇인지 알아야한다. 요소의 메모리 크기만큼을 이동하며 읽어야 올바른 데이터를 읽을 수 있기 때문이다. 사용자가 크기나 타입을 신경쓰지 않고도 모든 요소를 순차적으로 읽을 수 있도록 제공해주는 것이 바로 반복자다. 컨테이너의 요소를 가리키는 객체. 컨테이너의 시작부터 끝까지 이동하면서 요소를 읽거나 쓰기 위해 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;알고리즘(algorithm)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정렬 및 검색하는 알고리즘을 구현한 함수.&lt;/li&gt;
&lt;li&gt;변경 불가 순차 알고리즘&lt;/li&gt;
&lt;li&gt;변경 가능 순차 알고리즘&lt;/li&gt;
&lt;li&gt;정렬 알고리즘&lt;/li&gt;
&lt;li&gt;범용 수치 알고리즘&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기타&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;stack&lt;/b&gt;: LIFO(Last In First Out) 방식의 컨테이너.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;queue&lt;/b&gt;: FIFO(First In First Out) 방식의 컨테이너.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;priority_queue&lt;/b&gt;: 우선순위가 있는 큐로, 가장 높은 우선순위를 가진 요소를 우선적으로 꺼낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;벡터(Vector)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반화된 컨테이너 중 가장 많이 사용된다. 필요한 크기만큼 메모리를 자동으로 재할당하여 늘릴 수 있다.(동적 배열) 템플릿 기반으로 타입에 무관함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 생성된 길이만큼 데이터가 꽉 차있을 때 더 넣으려고 시도하면 내부에서 크기를 늘린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`vector&amp;lt;T&amp;gt; vectorName;` `vector&amp;lt;int&amp;gt; intVector;` `vector&amp;lt;int&amp;gt; intVector(5);`&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열처럼 인덱스로 요소를 가져올 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725933146302&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	for (int i = 0; i &amp;lt; vec.size(); i++) {
		cout &amp;lt;&amp;lt; vec[i] &amp;lt;&amp;lt; endl;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;데크(Deque)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터와 유사하나 양쪽 끝에서 데이터를 삽입 삭제할 수 있는 컨테이너. 앞/중간 인덱스에 데이터를 삽입할 경우 모든 요소의 인덱스가 뒤로 밀리면서 성능이 떨어지는 벡터의 단점을 보완하기 위해 만들어진 컨테이너.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`deque&amp;lt;T&amp;gt; dqName; deque&amp;lt;int&amp;gt; dq;`&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;리스트(List)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이중 연결 리스트로 구현된 컨테이너. 각각의 요소가 포인터로 연결되어있다. 데이터가 물리적으로 인접해 있지 않고, 논리적인 순서를 기억하여 포인터로 이전 또는 다음 노드를 가리키고 있기 때문에 데이터 삽입 및 삭제 속도가 일정하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list&amp;lt;T&amp;gt; li; list&amp;lt;int&amp;gt; li;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;연결리스트(Linked-List)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요소들이 인접해있는 것이 아니라 메모리 도처에 흩어져서 자신의 이전 또는 다음 요소의 위치를 포인터로 가리키고 있는 리스트. 추상적 순서와 물리적 순서가 일치하는 배열과 달리 연결리스트는 물리적인 순서와 상관이 없다. 임의의 위치에 대한 요소의 삽입 및 삭제 속도가 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결리스트에서 원소는 데이터(값)와 링크(메모리 주소값)를 동시에 가지며 링크는 후행 원소의 주소값이다. 이러한 단위 구조를 노드(node)라고 한다. 각 요소는 데이터 외에 이전/다음 노드의 링크를 추가로 가지고 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 노드의 정보만을 가진 리스트를 단일 연결 리스트(Single Linked List), 이전과 다음 노드의 정보를 둘 다 가지고 있는 리스트를 이중 연결 리스트(Double Linked Llist)라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725933139285&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Node{
	T value;
	Node* next;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725933131558&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

struct Node {
	int value;
	Node* next;
};

Node* head;
Node* now;

void InitLinkedList() {
	head = (Node*)malloc(sizeof(Node));
	
	head-&amp;gt;value = NULL;
	head-&amp;gt;next = NULL;
	now = head;
}

Node* InsertNode(Node* now, int value) {

	Node* newNode = (Node*)malloc(sizeof(Node));
	newNode-&amp;gt;value = value;
	
	newNode-&amp;gt;next = now-&amp;gt;next;
	now-&amp;gt;next = newNode;

	return newNode;
}

bool DeleteNode(int index) {
	
	Node* prev = head;
	Node* del;

	for (int i = 0; i &amp;lt; index; i++) {
		prev = prev-&amp;gt;next;

		if (prev == NULL) {
			return false;
		}
	}

	del = prev-&amp;gt;next;
	if (del == NULL) {
		return false;
	}

	prev-&amp;gt;next = del-&amp;gt;next;
	free(del);

	return true;

}

bool DeleteNode(Node* targetPrev) {

	Node* del; 

	del = targetPrev-&amp;gt;next;

	if (del-&amp;gt;next == NULL) {
		return false;
	}

	targetPrev-&amp;gt;next = del-&amp;gt;next;
	free(del);

	return true;

}

void DeleteList() {
	free(head);
	head = NULL;
}

int main() {

	InitLinkedList();

	for (int i = 0; i &amp;lt; 10; i++) {
		InsertNode(now, i + 1);
		now = now-&amp;gt;next;
	}

	for (now = head-&amp;gt;next; now; now = now-&amp;gt;next) {
		cout &amp;lt;&amp;lt; now-&amp;gt;value &amp;lt;&amp;lt; endl;
	}

	cout &amp;lt;&amp;lt; endl;

	//bool result = DeleteNode(head);
	bool result = DeleteNode(9);

	cout &amp;lt;&amp;lt; endl;

	cout &amp;lt;&amp;lt; &quot;result : &quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; endl;
	
	for (now = head-&amp;gt;next; now; now = now-&amp;gt;next) {
		cout &amp;lt;&amp;lt; now-&amp;gt;value &amp;lt;&amp;lt; endl;
	}

	DeleteList();

}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;Set&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬 연관 컨테이너. 순서가 없고 중복을 허용하지 않는 자료구조. &lt;b&gt;값을 오름차순으로 정렬한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725933121086&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;set&amp;gt;

using namespace std;

int main() {

	int arr[] =  {1, 2, 3, 2, 5, 6, 3};
	
	
	set&amp;lt;int&amp;gt; scon;

	set&amp;lt;int&amp;gt;::iterator it;

	for (int i = 0; i &amp;lt; sizeof(arr) / sizeof(arr[0]); i++) {
		scon.insert(arr[i]);
	}

	for (it = scon.begin(); it != scon.end(); it++) {
		cout &amp;lt;&amp;lt; *it &amp;lt;&amp;lt; endl;
	}
	
	return 0;

}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;Map&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키:값 형태로 하나의 쌍을 이루어 관리된다. &lt;b&gt;값을 오름차순으로 정렬한다.&lt;/b&gt; 검색 속도가 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대용량 데이터를 검색할 경우 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삽입 및 삭제 시 데이터의 이동이 발생하므로 상대적으로 느리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`map&amp;lt;keyType, dataType&amp;gt; m; map&amp;lt;string, int&amp;gt; ageList;`&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`first` 는 키, `second` 는 값.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725933114030&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	map&amp;lt;string, int&amp;gt; phoneBook;
	map&amp;lt;string, int&amp;gt;::iterator it;

	string name;

	for (int i = 0; i &amp;lt; sizeof(phoneList) / sizeof(phoneList[0]); i++) {
		phoneBook[phoneList[i].name] = phoneList[i].phone;
	}

	while (true) {
		cout &amp;lt;&amp;lt; &quot;종료: [q]&quot;;
		cout &amp;lt;&amp;lt; &quot;이름을 입력하세요: &quot;;
		cin &amp;gt;&amp;gt; name;

		if (name == &quot;q&quot;) {
			break;
		}

		// phoneBook[name]은 value만을 불러오지만,
		// 반복자로 it = phoneBook.find(name);를 사용하면
		// 요소의 주소값을 가져오기 때문에 키와 값을 모두 사용할 수 있다!
		if (phoneBook[name]) {
			cout &amp;lt;&amp;lt; &quot;번호는 &quot; &amp;lt;&amp;lt; phoneBook[name] &amp;lt;&amp;lt; &quot;입니다.&quot; &amp;lt;&amp;lt; endl;
		}
		else {
			cout &amp;lt;&amp;lt; &quot;찾을 수 없습니다.  [&quot; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &quot;]&quot; &amp;lt;&amp;lt; endl;
		}

	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;해시맵(hashMap)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STL에서는 해시맵을 지원한다. hash 자료구조를 사용하기 때문에 검색 속도가 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* `hash_map` 이 deprecated 되었습니다. `unordered_map` 을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725933104254&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;unordered_map&amp;lt;string, int&amp;gt; coffee;
coffee[&quot;아메리카노&quot;] = 2000;

unordered_map&amp;lt;string, int&amp;gt;::iterator it;

for (it = coffee.begin(); it != coffee.end(); it++) {
	cout &amp;lt;&amp;lt; &quot;[&quot; &amp;lt;&amp;lt; it-&amp;gt;first &amp;lt;&amp;lt; &quot;] &quot; &amp;lt;&amp;lt; it-&amp;gt;second &amp;lt;&amp;lt; &quot;원&quot; &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725933098638&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	unordered_map&amp;lt;string, vector&amp;lt;string&amp;gt;&amp;gt; devLang;

	vector&amp;lt;string&amp;gt; c;
	c.push_back(&quot;C&quot;);
	c.push_back(&quot;C++&quot;);
	c.push_back(&quot;C#&quot;);

	vector&amp;lt;string&amp;gt; script;

	devLang[&quot;C 계열&quot;] = c;

	vector&amp;lt;string&amp;gt; scr;
	scr.push_back(&quot;JavaScript&quot;);
	scr.push_back(&quot;TypeScript&quot;);

	devLang[&quot;Script 계열&quot;] = scr;

	unordered_map&amp;lt;string, vector&amp;lt;string&amp;gt;&amp;gt;::iterator mapIt;
	vector&amp;lt;string&amp;gt;::iterator it;

	for (mapIt = devLang.begin(); mapIt != devLang.end(); mapIt++) {
		cout &amp;lt;&amp;lt; &quot;[&quot; &amp;lt;&amp;lt; mapIt-&amp;gt;first &amp;lt;&amp;lt; &quot;]&quot; &amp;lt;&amp;lt; endl;
		for (it = mapIt-&amp;gt;second.begin(); it != mapIt-&amp;gt;second.end(); it++) {
			cout &amp;lt;&amp;lt; *it &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; endl;
		}

		cout &amp;lt;&amp;lt; endl;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1725933089767&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Script 계열]
JavaScript
TypeScript

[C 계열]
C
C++
C#&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;반복자(Iterator)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너의 구간에 대해 값을 읽어올 수 있도록 기능을 제공한다. 모든 컨테이너에 동일하게 동작한다.(내부 구조를 모르더라도 같은 함수로 값을 읽을 수 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`list::iterator listIter; vector::iterator vectorIter;`&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터와 유사함. `listIter++` 처럼 반복자를 증가시키는 것은 그 다음 요소를 읽어오는 것을 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료구조의 `begin()` 은 시작 요소를 의미한다. `end()` 는 &lt;b&gt;마지막값이 아니라 마지막값의 다음&lt;/b&gt;을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열은 다음과 같이 문자 포인터로 각 문자를 읽을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1725933083422&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char arr[] = &quot;Hello!&quot;;

char* ptr = arr;

while (*ptr) // ptr != NULL
{
    cout &amp;lt;&amp;lt; *ptr;
    ptr++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너도 이처럼 반복자를 사용하면 내부 구조를 모르더라도 동일한 함수를 사용하여 컨테이너 내 포함된 요소를 순차적으로 가리킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너의 타입에 따라 반복자를 선언하고 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725933077830&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int intArr[] = { 1, 2, 3, 4, 5 };

vector&amp;lt;int&amp;gt; vec(&amp;amp;intArr[0], &amp;amp;intArr[sizeof(intArr) / sizeof(intArr[0])]);
vector&amp;lt;int&amp;gt;::iterator it;

for (it = vec.begin(); it != vec.end(); it++) {
    cout &amp;lt;&amp;lt; *it &amp;lt;&amp;lt; &quot; &quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1725933072896&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list&amp;lt;int&amp;gt; li;
list&amp;lt;int&amp;gt;::iterator it;

for (int i = 0; i &amp;lt; 5; i++) {
    li.push_back(i + 1);
}

for (it = li.begin(); it != li.end(); it++) {
    cout &amp;lt;&amp;lt; *it &amp;lt;&amp;lt; &quot; &quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;알고리즘(Algorithm)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너에 적용할 수 있는 기능들을 체계적으로 정리해둔 함수. 정렬, 검색, 조작 등의 연산을 수행한다. 특정 컨테이너에 종속된 것이 아니라 일반적으로 적용할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) `find()` `first`와 `last` 사이에 `value`가 있는지 검사하고 찾는 값이 있다면 해당 위치의 반복자를 리턴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) `for_each()` 전 구간을 순회하면서 인자로 받은 함수를 호출한다. `for_each`는 루프를 돌리는 역할만 하므로 구체적인 동작을 하는 함수 객체가 반드시 필요하다. 내부에서 반복자를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) `copy()` 컨테이너의 범위값을 대상이 되는 컨테이너에 복사하는 함수.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) `sort()` 기본은 오름차순 정렬. 내림차순으로 정렬하려면 `greator&amp;lt;int&amp;gt;()` 를 전달해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725933064551&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	int intArr[] = { 1, 2, 3, 4, 5 };

	vector&amp;lt;int&amp;gt; vec(&amp;amp;intArr[0], &amp;amp;intArr[sizeof(intArr) / sizeof(intArr[0])]);
	vector&amp;lt;int&amp;gt;::iterator it;

	if (find(vec.begin(), vec.end(), 5) != vec.end()) {
		cout &amp;lt;&amp;lt; &quot;Found Five!&quot;;
	}
	else {
		cout &amp;lt;&amp;lt; &quot;Not Found&quot;;
	}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>C, C++</category>
      <author>벼리01</author>
      <guid isPermaLink="true">https://torobbb.tistory.com/209</guid>
      <comments>https://torobbb.tistory.com/entry/Cpp-STL#entry209comment</comments>
      <pubDate>Thu, 5 Sep 2024 14:44:40 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 템플릿(Template)</title>
      <link>https://torobbb.tistory.com/entry/cpp-Template</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 템플릿&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료형으로 사용할 수 있도록 만들어놓은 틀. 여러 타입에서 동작할 수 있는 함수를 찍어내는 틀. 다양한 타입에 대해서 하나의 함수만 정의하여 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 형태의 함수가 있다는 것만 약속해두고,&amp;nbsp;함수가 호출되는 시점에 인자의 타입에 따라 실제 함수인 템플릿 인스턴스 함수를 만든다.(컴파일러가 전달된 타입을 검사하여 그에 해당하는 함수를 생성한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724982510625&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 함수 템플릿
template &amp;lt;typename T&amp;gt; 
T FunctionTemplate(T a, T b) {
	...
}

// 클래스 템플릿
template &amp;lt;class T&amp;gt;
class MyClass {

public: 
    MyClass(T a) {
        this-&amp;gt;a = a;
    }

private :
	T a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 함수 템플릿(Function Template)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범용형을 다룰 수 있는 함수의 정의. 어떤 타입이든 이러한 형태를 가진다고 사전에 정의해두는 틀.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 수를 비교하는 함수 `Max()`를 정의한다. 이때 정수가 아닌 자료형이 들어올 수 있으므로 오버로딩 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724982092889&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int Max(int a, int b) {
	return a &amp;gt; b ? a :  b;
}

double Max(double a, double b) {
	return a &amp;gt; b ? a : b;
}

char Max(char a, char b) {
	return a &amp;gt; b ? a : b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수 타입과 리턴 타입만 다를 뿐 함수의 내부가 모두 중복되는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 타입만 빼고 코드가 모두 동일할 때, 오버로딩 대신 템플릿을 정의할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724982023324&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template &amp;lt;typename T&amp;gt; 
T Max(T a, T b) {
	return a &amp;gt; b ? a : b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 클래스 템플릿(Class Template)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 스택을 구현해보자. 이때 어떤 자료형이 들어올지 알 수 없으므로 템플릿으로 클래스를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724987451870&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template &amp;lt;class T&amp;gt;
class MyStack {

public:
	MyStack(int size) {
		this-&amp;gt;ptr = new T[size];
		this-&amp;gt;size = size;
	}

	~MyStack() {
		delete[] ptr;
	}

	void Push(T a) {
		*ptr++ = a;
	}

	T Pop() {
		T temp = *--ptr;
		*ptr = NULL;

		return temp;
	}

	int Size() const {
		return this-&amp;gt;size;
	}

private:
	T* ptr;
	int size;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724987459270&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main() {

	MyStack&amp;lt;int&amp;gt; testStack(5);
	testStack.Push(1);
	testStack.Push(15);
	testStack.Push(29);

	cout &amp;lt;&amp;lt; testStack.Pop() &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; testStack.Pop() &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; testStack.Pop() &amp;lt;&amp;lt; endl;

	return 0;
}


// 출력값
// 29
// 15
// 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 서로 다른 타입을 2개 이상 갖는 템플릿&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범용 타입을 위해 타입 이름을 `T` 로 정의했었다. 이때 `T` 는 치환되는 단어와 같으므로 다음과 같이 두 개 이상 정의할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725238492023&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template &amp;lt;class Key, class Value&amp;gt;
class Map {
public:
    Map() {}

    void insert(const Key&amp;amp; key, const Value&amp;amp; value) {

    }

    bool find(const Key&amp;amp; key, Value&amp;amp; value) const {
		...
    }


    bool delete(const Key&amp;amp; key) {
		...
    }
    
private:
	...
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C, C++</category>
      <author>벼리01</author>
      <guid isPermaLink="true">https://torobbb.tistory.com/205</guid>
      <comments>https://torobbb.tistory.com/entry/cpp-Template#entry205comment</comments>
      <pubDate>Thu, 29 Aug 2024 12:13:35 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 상속(Inheritance)</title>
      <link>https://torobbb.tistory.com/entry/cpp-inheritance</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 상속&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드의 중복을 줄이고 재사용성을 높이기 위해 클래스 간의 상속 관계를 정의할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 `name`과 `address`를 갖는 `RagularEmployee`와 `TemporaryEmployee`가 있을 때, 둘을 ` Employee`로 일반화하여 정의하고 상속받아 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724891521302&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

class Employee {

public : 
	Employee() {

	}

	Employee(const char* name, const char* address) {
		this-&amp;gt;name = new char[strlen(name) + 1];
		this-&amp;gt;address = new char[strlen(address) + 1];

		strcpy_s(this-&amp;gt;name, strlen(name) + 1, name);
		strcpy_s(this-&amp;gt;address, strlen(address) + 1, address);
	}

	~Employee() {
		delete[] name;
		delete[] address;
	}

	char* getName() {
		return this-&amp;gt;name;
	}

	char* getAddress() {
		return this-&amp;gt;address;
	}

	void print() {
		cout &amp;lt;&amp;lt; &quot;이름: &quot; &amp;lt;&amp;lt; this-&amp;gt;getName() &amp;lt;&amp;lt; &quot;, 주소: &quot; &amp;lt;&amp;lt; this-&amp;gt; getAddress() &amp;lt;&amp;lt; endl;
	}

protected:
	char* name;
	char* address;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724891530068&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class RegularEmployee : public Employee {

private :
	int 연봉;

};

class TemporaryEmployee : public Employee {

private :
	int 주급;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘은 클래스 내부에 또 다시 속성을 정의하지 않더라도 상속을 받았기 때문에 이름과 주소를 가진다. 멤버 함수도 함께 상속받으므로 `getter()` 와 `print()` 도 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 `private` 으로 선언된 멤버 변수는 상속이 되더라도 접근 제한을 받기 때문에, 만약 자식에게 접근 권한을 주고 싶다면 `protected` 로 설정해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 생성 시에는 무조건 부모의 생성자를 먼저 호출한다.(부모가 존재하는지 확인한 후 부모를 먼저 만들기 때문이다.) 부모의 어떤 생성자를 호출할지 명시하지 않으면 &lt;b&gt;무조건 기본 생성자를 호출한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 부모의 생성자를 사용하기 위해서는 부모의 생성자 중 어떤 생성자를 호출할지 &lt;b&gt;생성자의 시그니처에 명시해야한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체가 스택에 생성되기 때문에, 하위 클래스가 먼저 소멸되고 상위 클래스가 소멸된다. 이때 자식 클래스의 소멸자를 먼저 호출하고, 부모 클래스의 소멸자를 호출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724891547804&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class RegularEmployee : public Employee {

public : 

	RegularEmployee() {
		cout &amp;lt;&amp;lt; &quot;reg 디폴트 생성자 &quot; &amp;lt;&amp;lt; endl;
	}

	RegularEmployee(const char* name, const char* address, double salary) 
	: Employee(name, address) {
		cout &amp;lt;&amp;lt; &quot;reg 인자 세개 생성자 &quot; &amp;lt;&amp;lt; endl;
		
		this-&amp;gt;salary = salary;
	}

	~RegularEmployee() {
		cout &amp;lt;&amp;lt; &quot;rag 소멸자 호출&quot; &amp;lt;&amp;lt; endl;
	}

	double PayCheck() {
		return this-&amp;gt;salary;
	}

private :
	double salary;

};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724891555212&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main() {

	Employee e(&quot;회사원&quot;, &quot;회사원 주소&quot;);
	e.print();

	RegularEmployee re(&quot;정규직원&quot;, &quot;정규직원 주소&quot;, 5500);
	cout &amp;lt;&amp;lt; re.PayChack() &amp;lt;&amp;lt; endl;

	TemporaryEmployee te(&quot;계약직&quot;, &quot;계약직 주소&quot;, 10, 20);
	cout &amp;lt;&amp;lt; te.PayCheck() &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724891565061&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;emp 인자 두개 생성자
이름: 회사원, 주소: 회사원 주소
emp 인자 두개 생성자
reg 인자 세개 생성자
5500
emp 인자 두개 생성자
temp 인자 세개 생성자
2400
temp 소멸자 호출
emp 소멸자 호출
rag 소멸자 호출
emp 소멸자 호출
emp 소멸자 호출&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt; 다형성(Polymorphism)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전: 같은 종의 생물이면서도 어떤 형태나 성질이 다양하게 나타나는 현상. 'poly(많은)' 과 'morphism(형태)'의 합성어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 객체를 다른 자료형의 변수로 참조하여 다양한 결과를 얻어낼 수 있는 성질. 클래스가 상속 관계에 있을 때 나타나는 다채로운 성질을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동적 결합/동적 바인딩(Dynamic Binding)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 도중에 결합(바인딩)이 이루어지는 것을 동적 결합이라고 한다. 동적 바인딩으로 인해 포인터가 어떤 타입이든 상관 없이 그 실제 객체를 기준으로 함수를 호출한다. 이 동적 바인딩 덕분에 다형성이 적용되는 것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 오버라이딩(Overriding)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전적 의미: '~에 덮어쓰다.', '~에 우선한다.'&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 클래스로부터 상속 받은 멤버 함수를 자식 클래스에서 재정의하여 새로운, 또는 수정 및 확장된 기능을 만드는 것. 함수의 시그니처가 동일해야한다. (이름 동일, 매개변수의 타입 및 개수 동일, 반환 타입 동일)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 클래스의 객체 포인터는 자식 클래스 객체에 접근이 가능하다. 즉, 부모 타입으로 선언된 포인터로 자식 타입의 객체를 다룰 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;가상 함수(Virtual Function)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다형성을 지원하기 위해 자식 클래스의 객체가 재정의한 함수로 동작할 수 있도록 하는 것. C++에서는 함수를 가상함수로 등록하지 않으면 자식 객체에서 함수를 오버라이딩 했더라도, 부모 타입의 변수로 자식 객체를 참조했을 때 부모 타입에 정의된 함수로 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 함수가 포함된 클래스는 추상 클래스로 객체를 생성할 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서는 모든 함수가 가상함수로 선언되어 있기 때문에, 부모 타입의 변수로 자식 타입의 객체를 참조하더라도 자식 객체에서 재정의된 함수로 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상함수 미사용&lt;/p&gt;
&lt;pre id=&quot;code_1724895631569&quot; class=&quot;arduino&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class Base {
public:
    void display() {  // 비가상 함수
        std::cout &amp;lt;&amp;lt; &quot;Base display&quot; &amp;lt;&amp;lt; std::endl;
    }
};

class Derived : public Base {
public:
    void display() {  // 함수 재정의 (오버라이딩이 아님)
        std::cout &amp;lt;&amp;lt; &quot;Derived display&quot; &amp;lt;&amp;lt; std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();  // 부모 타입 포인터로 자식 객체 참조
    basePtr-&amp;gt;display();  // Base의 display 호출
    delete basePtr;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상함수 사용&lt;/p&gt;
&lt;pre id=&quot;code_1724895631572&quot; class=&quot;arduino&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class Base {
public:
    virtual void display() {
        std::cout &amp;lt;&amp;lt; &quot;Base display&quot; &amp;lt;&amp;lt; std::endl;
    }
};

class Derived : public Base {
public:
    void display() override {  // 가상 함수 재정의
        std::cout &amp;lt;&amp;lt; &quot;Derived display&quot; &amp;lt;&amp;lt; std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();  // 부모 타입 포인터로 자식 객체 참조
    basePtr-&amp;gt;display();  // Derived의 display 호출
    delete basePtr;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C#에서의 가상함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상함수 미사용&lt;/p&gt;
&lt;pre id=&quot;code_1724895631574&quot; class=&quot;arduino&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;using System;

class Base
{
    public void Display()  // 비가상 메서드
    {
        Console.WriteLine(&quot;Base display&quot;);
    }
}

class Derived : Base
{
    public new void Display()  // 메서드 숨기기
    {
        Console.WriteLine(&quot;Derived display&quot;);
    }
}

class Program
{
    static void Main()
    {
        Base baseRef = new Derived();  // 부모 타입 참조로 자식 객체 참조
        baseRef.Display();  // Base의 Display 호출
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상함수 사용&lt;/p&gt;
&lt;pre id=&quot;code_1724895631575&quot; class=&quot;arduino&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;using System;

class Base
{
    public virtual void Display()  // 가상 메서드로 변경
    {
        Console.WriteLine(&quot;Base display&quot;);
    }
}

class Derived : Base
{
    public override void Display()  // 재정의된 가상 메서드
    {
        Console.WriteLine(&quot;Derived display&quot;);
    }
}

class Program
{
    static void Main()
    {
        Base baseRef = new Derived();  // 부모 타입 참조로 자식 객체 참조
        baseRef.Display();  // Derived의 Display 호출
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1 style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  상속 &lt;/b&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1724898634546&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

class Employee {

public : 
	Employee() {
		cout &amp;lt;&amp;lt; &quot;emp 디폴트 생성자 &quot; &amp;lt;&amp;lt; endl;
	}

	Employee(const char* name, const char* address) {
		cout &amp;lt;&amp;lt; &quot;emp 인자 두개 생성자 &quot; &amp;lt;&amp;lt; endl;
		this-&amp;gt;name = new char[strlen(name) + 1];
		this-&amp;gt;address = new char[strlen(address) + 1];

		strcpy_s(this-&amp;gt;name, strlen(name) + 1, name);
		strcpy_s(this-&amp;gt;address, strlen(address) + 1, address);
	}

	~Employee() {
		cout &amp;lt;&amp;lt; &quot;emp 소멸자 호출&quot; &amp;lt;&amp;lt; endl;
		delete[] name;
		delete[] address;
	}


	char* getName() {
		return this-&amp;gt;name;
	}

	char* getAddress() {
		return this-&amp;gt;address;
	}

	void Print() {
		cout &amp;lt;&amp;lt; &quot;이름: &quot; &amp;lt;&amp;lt; this-&amp;gt;getName() &amp;lt;&amp;lt; &quot;, 주소: &quot; &amp;lt;&amp;lt; this-&amp;gt; getAddress() &amp;lt;&amp;lt; endl;
	}

	virtual double PayCheck() const = 0;

protected :
	char* name;
	char* address;
};

class RegularEmployee : public Employee {


public : 

	RegularEmployee() {
		cout &amp;lt;&amp;lt; &quot;reg 디폴트 생성자 &quot; &amp;lt;&amp;lt; endl;
	}

	RegularEmployee(const char* name, const char* address, double salary)
		: Employee(name, address) {
		cout &amp;lt;&amp;lt; &quot;reg 인자 세개 생성자 &quot; &amp;lt;&amp;lt; endl;
		
		this-&amp;gt;salary = salary;
	}

	~RegularEmployee() {
		cout &amp;lt;&amp;lt; &quot;rag 소멸자 호출&quot; &amp;lt;&amp;lt; endl;
	}

	double PayCheck() const override {
		return salary * 12;
	}

private :
	double salary;

};

class TemporaryEmployee : public Employee {


public : 

	TemporaryEmployee() {
		cout &amp;lt;&amp;lt; &quot;temp 디폴트 생성자 &quot; &amp;lt;&amp;lt; endl;
	}

	TemporaryEmployee(const char* name, const char* address, double dailyPayCheck, int days)
		: Employee(name, address) {
		cout &amp;lt;&amp;lt; &quot;temp 인자 세개 생성자 &quot; &amp;lt;&amp;lt; endl;

		this-&amp;gt;dailyPayCheck = dailyPayCheck;
		this-&amp;gt;days = days;
	}


	~TemporaryEmployee() {
		cout &amp;lt;&amp;lt; &quot;temp 소멸자 호출&quot; &amp;lt;&amp;lt; endl;
	}

	double PayCheck() const override {
		return this-&amp;gt;dailyPayCheck * days * 12;
	}

private :
	double dailyPayCheck;
	int days;
};

class SalesMan : public RegularEmployee {

public : 

	SalesMan() {
		cout &amp;lt;&amp;lt; &quot;sales 디폴트 생성자 &quot; &amp;lt;&amp;lt; endl;
	}

	SalesMan(const char* name, const char* address, double salary, double allowance) 
		: RegularEmployee(name, address, salary) {
		cout &amp;lt;&amp;lt; &quot;sales 인자 네개 생성자 &quot; &amp;lt;&amp;lt; endl;
		this-&amp;gt;allowance = allowance;
	}

	~SalesMan() {
		cout &amp;lt;&amp;lt; &quot;sales 소멸자 호출&quot; &amp;lt;&amp;lt; endl;
	}

	double PayCheck() const override {
		return RegularEmployee::PayCheck() + (allowance * 12);
	}

private:
	double allowance;
};

// Employee 관리 클래스
class Department {
public :
	Department() {
		this-&amp;gt;count = 0;
	}

	~Department() {
	}

	// 객체를 전달 인자로 받아 객체 배열에 넣어 관리
	void Insert(Employee&amp;amp; emp) {
		this-&amp;gt;emp[count] = &amp;amp;emp;
		count++;
	}

	// 현재 관리 중인 객체의 급여 출력
	void Print() const {
		for (int i = 0; i &amp;lt; count; i++) {
			cout &amp;lt;&amp;lt;&quot;[&quot; &amp;lt;&amp;lt; this-&amp;gt;emp[i]-&amp;gt;getName() &amp;lt;&amp;lt; &quot;] &quot;;
			cout &amp;lt;&amp;lt; this-&amp;gt;emp[i]-&amp;gt;PayCheck() &amp;lt;&amp;lt; endl;
		}
	}

private:
	Employee* emp[10];
	int count;
};


void main() {

	//Employee e(&quot;회사원&quot;, &quot;회사원 주소&quot;);
	//e.print();

	RegularEmployee re(&quot;정규직원&quot;, &quot;정규직원 주소&quot;, 550);
	//cout &amp;lt;&amp;lt; re.PayCheck() &amp;lt;&amp;lt; endl;

	TemporaryEmployee te(&quot;계약직&quot;, &quot;계약직 주소&quot;, 10, 20);
	//cout &amp;lt;&amp;lt; te.PayCheck() &amp;lt;&amp;lt; endl;

	SalesMan sm(&quot;jung&quot;, &quot;분당&quot;, 300, 50);
	//cout &amp;lt;&amp;lt; sm.PayCheck() &amp;lt;&amp;lt; endl;

	/*Employee* salesMan = (Employee*) new SalesMan(&quot;정영업&quot;, &quot;분당&quot;, 500, 50);
	cout &amp;lt;&amp;lt; salesMan-&amp;gt;PayCheck() &amp;lt;&amp;lt; endl;*/

	Department dpt;
	dpt.Insert(re);
	dpt.Insert(te);
	dpt.Insert(sm);

	dpt.Print();

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 참고&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1724898286816&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[C++] 동적 바인딩, 정적 바인딩&quot; data-og-description=&quot;동적 정적 바인딩 사전 준비 * 먼저 다형성에 대한 개념을 알고 있어야 한다. https://licktwice.tistory.com/59https://licktwice.tistory.com/59 [JAVA]자바 - 다형성 Polymorphism 다형성 Polymorphism OOP의 4대 특성 * 다형&quot; data-og-host=&quot;licktwice.tistory.com&quot; data-og-source-url=&quot;https://licktwice.tistory.com/71#google_vignette&quot; data-og-url=&quot;https://licktwice.tistory.com/71&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dPJdMB/hyWVXY7d2U/TxphfYfpjdmdkBZyd3wXlk/img.jpg?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360,https://scrap.kakaocdn.net/dn/IVfSK/hyWVSDxjss/kqg2AvoSNRyB1csykgqmj0/img.jpg?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360,https://scrap.kakaocdn.net/dn/Y3x6E/hyWV4KIEw7/peTk7ugq8efm7e3vDHSkPK/img.png?width=1228&amp;amp;height=677&amp;amp;face=0_0_1228_677&quot;&gt;&lt;a href=&quot;https://licktwice.tistory.com/71#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://licktwice.tistory.com/71#google_vignette&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dPJdMB/hyWVXY7d2U/TxphfYfpjdmdkBZyd3wXlk/img.jpg?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360,https://scrap.kakaocdn.net/dn/IVfSK/hyWVSDxjss/kqg2AvoSNRyB1csykgqmj0/img.jpg?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360,https://scrap.kakaocdn.net/dn/Y3x6E/hyWV4KIEw7/peTk7ugq8efm7e3vDHSkPK/img.png?width=1228&amp;amp;height=677&amp;amp;face=0_0_1228_677');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[C++] 동적 바인딩, 정적 바인딩&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;동적 정적 바인딩 사전 준비 * 먼저 다형성에 대한 개념을 알고 있어야 한다. https://licktwice.tistory.com/59https://licktwice.tistory.com/59 [JAVA]자바 - 다형성 Polymorphism 다형성 Polymorphism OOP의 4대 특성 * 다형&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;licktwice.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C, C++</category>
      <author>벼리01</author>
      <guid isPermaLink="true">https://torobbb.tistory.com/204</guid>
      <comments>https://torobbb.tistory.com/entry/cpp-inheritance#entry204comment</comments>
      <pubDate>Thu, 29 Aug 2024 09:29:05 +0900</pubDate>
    </item>
    <item>
      <title>[CSS] Flex box</title>
      <link>https://torobbb.tistory.com/entry/CSS-Flex-box</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; Flex box&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행과 열 형태로 자식 요소를 배치하는 레이아웃 속성. 부모 요소 내부에 포함된 자식 요소들을 세로, 가로 중심부에 정렬하거나, 자식 요소의 너비를 동일하게 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 속성&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1724849503073&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;wrap&quot;&amp;gt;
        &amp;lt;div class=&quot;parent&quot;&amp;gt;
            &amp;lt;div class=&quot;child&quot;&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;child&quot;&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;child&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724819526744&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;html, body{
    margin : 0;
    padding: 0;
}

.parent{
    width: 500px;
    height: 600px;
    background-color: pink;

    display: flex;
    flex-direction: column;
    align-items: center;
    
}

.child{
    width: 100px;
    height: 100px;
    border: 1px solid #000;
    background-color: wheat;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lbq7x/btsJhmZ3SZg/qWke23faf2InnlLxQdOBR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lbq7x/btsJhmZ3SZg/qWke23faf2InnlLxQdOBR0/img.png&quot; data-alt=&quot;초기 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lbq7x/btsJhmZ3SZg/qWke23faf2InnlLxQdOBR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flbq7x%2FbtsJhmZ3SZg%2FqWke23faf2InnlLxQdOBR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;333&quot; height=&quot;399&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초기 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;flex-direction&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 부모 요소 내에 여러 자식 요소가 있을 때, 스타일에 `display: flex` 를 작성하면 flex box로 요소를 다룰 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 자식 요소가 가로로 정렬된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`flex-direction` 을 열 또는 행 방향으로 설정할 수 있다. 기본 값은 `flex-direction: row`으로 속성값을 작성하지 않으면 열 방향으로 설정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724814298964&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.parent{
    width: 500px;
    height: 600px;
    background-color: pink;
    display: flex;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x0RGw/btsJhiKrPXE/nBLLMK1Yqx7hjHYomzJO2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x0RGw/btsJhiKrPXE/nBLLMK1Yqx7hjHYomzJO2k/img.png&quot; data-alt=&quot;flex-direction : row(default)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x0RGw/btsJhiKrPXE/nBLLMK1Yqx7hjHYomzJO2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx0RGw%2FbtsJhiKrPXE%2FnBLLMK1Yqx7hjHYomzJO2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;392&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flex-direction : row(default)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z1451/btsJi2MTlY7/7n1wHwRo89Jy9WO3Sa5kYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z1451/btsJi2MTlY7/7n1wHwRo89Jy9WO3Sa5kYk/img.png&quot; data-alt=&quot;flex-direction: column;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z1451/btsJi2MTlY7/7n1wHwRo89Jy9WO3Sa5kYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ1451%2FbtsJi2MTlY7%2F7n1wHwRo89Jy9WO3Sa5kYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;332&quot; height=&quot;398&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flex-direction: column;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;align-items&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 flex-box의 방향이 열(row)로 되어있으므로, `align-items: center` 를 적용하면 수직 정렬할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724819503975&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.parent{
    width: 500px;
    height: 600px;
    background-color: pink;

    display: flex;
    align-items: center;
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;1194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czdZpF/btsJhXZ5Ke1/yFk3QwPmY3UEJM1cJPiVo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czdZpF/btsJhXZ5Ke1/yFk3QwPmY3UEJM1cJPiVo0/img.png&quot; data-alt=&quot;align-items: center&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czdZpF/btsJhXZ5Ke1/yFk3QwPmY3UEJM1cJPiVo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczdZpF%2FbtsJhXZ5Ke1%2FyFk3QwPmY3UEJM1cJPiVo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;311&quot; height=&quot;374&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;1194&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;align-items: center&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 방향이 열(row)이므로, `align-item : flex-end`를 설정하면 부모 요소의 가장 끝단에 배치할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기본값은 `flex-start` (상단 고정)&lt;/p&gt;
&lt;pre id=&quot;code_1724821340353&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.parent{
    width: 500px;
    height: 600px;
    background-color: pink;

    display: flex;
    align-items: flex-end;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;1194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8DYW0/btsJhQUqonO/CbJgPRqcdE9i07XKlm3zY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8DYW0/btsJhQUqonO/CbJgPRqcdE9i07XKlm3zY0/img.png&quot; data-alt=&quot;align-item : flex-end&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8DYW0/btsJhQUqonO/CbJgPRqcdE9i07XKlm3zY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8DYW0%2FbtsJhQUqonO%2FCbJgPRqcdE9i07XKlm3zY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;305&quot; height=&quot;366&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;1194&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;align-item : flex-end&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;justify-content&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 flex-box 방향이 열(row)로 되어있으므로, `justify-content: center` 를 적용하면 수평 정렬할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724819948802&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.parent{
    width: 500px;
    height: 600px;
    background-color: pink;

    display: flex;
    justify-content: center;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;1194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H8afC/btsJhY5LRU2/3Ml6vxi0NlhKavKk4ulEXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H8afC/btsJhY5LRU2/3Ml6vxi0NlhKavKk4ulEXK/img.png&quot; data-alt=&quot;row일 때 justify-content : center&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H8afC/btsJhY5LRU2/3Ml6vxi0NlhKavKk4ulEXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH8afC%2FbtsJhY5LRU2%2F3Ml6vxi0NlhKavKk4ulEXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;288&quot; height=&quot;346&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;1194&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;row일 때 justify-content : center&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 방향이 열(row)이므로, `justify : flex-end`를 설정하면 부모 요소의 가장 끝단에 배치할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본값은 `flex-start` (상단 고정)&lt;/p&gt;
&lt;pre id=&quot;code_1724820421347&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.parent{
    width: 500px;
    height: 600px;
    background-color: pink;

    display: flex;
    justify-content: flex-end;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lQLaD/btsJhY5PIKD/Y6SWUiDXKQOdpX0tuN6xV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lQLaD/btsJhY5PIKD/Y6SWUiDXKQOdpX0tuN6xV1/img.png&quot; data-alt=&quot;justify : flex-end&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lQLaD/btsJhY5PIKD/Y6SWUiDXKQOdpX0tuN6xV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlQLaD%2FbtsJhY5PIKD%2FY6SWUiDXKQOdpX0tuN6xV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;282&quot; height=&quot;341&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;justify : flex-end&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 방향이 열(row)이므로, `justify-content: space-around;`를 작성하면 부모 요소에 맞춰 좌우 마진을 동일하게 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1724820953992&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.parent{
    width: 500px;
    height: 600px;
    background-color: pink;

    display: flex;
    justify-content: space-around;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;1196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pplwl/btsJjnQLKqa/SjswGt9YNKh6ppMqyv2hs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pplwl/btsJjnQLKqa/SjswGt9YNKh6ppMqyv2hs0/img.png&quot; data-alt=&quot;justify-content: space-around&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pplwl/btsJjnQLKqa/SjswGt9YNKh6ppMqyv2hs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPplwl%2FbtsJjnQLKqa%2FSjswGt9YNKh6ppMqyv2hs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;291&quot; height=&quot;349&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;1196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;justify-content: space-around&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 방향이 열(row)이므로, `justify-content: space-between;`를 작성하면 요소 사이의 좌우 공간을 동일하게 배치한다. 단, 맨 처음 요소와 마지막 요소는 마진 없이 딱 붙인다.&lt;/p&gt;
&lt;pre id=&quot;code_1724821085044&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.parent{
    width: 500px;
    height: 600px;
    background-color: pink;

    display: flex;
    justify-content: space-between;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;1204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A5Mhw/btsJhasrkBG/dRIhKcqHDSp4W8j6LqGhVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A5Mhw/btsJhasrkBG/dRIhKcqHDSp4W8j6LqGhVK/img.png&quot; data-alt=&quot;justify-content: space-between&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A5Mhw/btsJhasrkBG/dRIhKcqHDSp4W8j6LqGhVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA5Mhw%2FbtsJhasrkBG%2FdRIhKcqHDSp4W8j6LqGhVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;308&quot; height=&quot;372&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;1204&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;justify-content: space-between&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 방향이 열(row)이므로, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;`justify-content: space-around;`&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;를 작성하면 요소 사이의 공간을 동일하게 배치한다. 이때&amp;nbsp; `justify-content: space-between;`와 달리 맨 첫 요소와 마지막 요소의 좌우 여백도 동일한 공간으로 맞춘다.&lt;/p&gt;
&lt;pre id=&quot;code_1724821359605&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.parent{
    width: 500px;
    height: 600px;
    background-color: pink;

    display: flex;
    justify-content: space-around;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;1206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ec5m9v/btsJhK1bJe9/b81jY3JAJP5DJ6PDyio0q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ec5m9v/btsJhK1bJe9/b81jY3JAJP5DJ6PDyio0q0/img.png&quot; data-alt=&quot;justify-content: space-around;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ec5m9v/btsJhK1bJe9/b81jY3JAJP5DJ6PDyio0q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fec5m9v%2FbtsJhK1bJe9%2Fb81jY3JAJP5DJ6PDyio0q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;357&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;1206&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;justify-content: space-around;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;gtx-trans&quot; style=&quot;position: absolute; left: 329px; top: 9785.94px;&quot;&gt;
&lt;div class=&quot;gtx-trans-icon&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>HTML, CSS</category>
      <author>벼리01</author>
      <guid isPermaLink="true">https://torobbb.tistory.com/203</guid>
      <comments>https://torobbb.tistory.com/entry/CSS-Flex-box#entry203comment</comments>
      <pubDate>Wed, 28 Aug 2024 12:05:44 +0900</pubDate>
    </item>
  </channel>
</rss>