반응형
반응형

0. 요약

  1. C++을 4가지 하위 언어의 엽합체로 이해하자!

    • C, 객체 지향 C++, 템플릿 C++, STL C++
  2. 사용자 정의 타입의 경우 상수 객체 참조자 전달을 사용하자!

    • const + &

1. C++ 역사?

  1. 초창기에는 C에 객체 지향 기능 몇가지가 결합된 형태
    • 클래스를 쓰는 C 였음
  2. 그 후 C++은 꾸준한 성장
    • 예외 : 함수 구성방식의 헤게모니를 크게 변경
    • 템플릿 : 프로그램 설계에 대한 새로운 사고 방식 제공
    • STL : 확장성에 대한 지평을 염
  3. 오늘 날의 C++
    • 다중패러다임 프로그래밍 언어(multiparadigm programming language)
    • 절차적 프로그래밍 기본 장착
    • 객체 지향 프로그래밍
    • 함수식 프로그래밍
    • 일반화 프로그래밍
    • 메타 프로그래밍

2. C++을 어떻게 이해 해야 하는가?

  1. 상관관계가 있는 여러 언어들의 연합체로 보라!
    • 여러 개의 하위 언어들이 C++을 이루고 있다!
  2. 그 후 각 언어에 대한 규칙을 각개 격파!

3. C++를 구성하는 하위 언어 4가지

  1. C
    • C++은 C를 기본으로 함(블록, 문장, 선행 처리자, 기본제공 데이터 타입, 배열, 포인터 등)
  2. 객체 지향 개념의 C++
    • 클래스를 쓰는 C에 관한 모든 것이 여기에 해당
  3. 템플릿 C++
    • C++의 일반화 프로그래밍 부분
    • 템플릿 메타프로그래밍이라는 새로운 패러다임 파생됨
  4. STL
    • 템플릿 라이브러리

4. 효과적인 프로그램 개발을 위한 예

  1. 한 하위 언어에서 다른 하위 언어로 옮길 때 당황하지 마라!
  2. C스타일
    • 값 전달이 참조 전달보다 효율이 더 좋다
  3. 객체 지향 C++ 과 템플릿 C++
    • 사용자 정의 생성자/소멸자 개념이 생김
    • 상수 객체 참조자에 의한 전달 방식이 더 효율이 좋음
  4. STL C++
    • 반복자와 함수 객체는 C의 포인터를 본떠 만든 것
    • 반복자 및 함수 객체에 대해 값 전달이 효율이 더 좋음

참고

  1. Effective C++
반응형
반응형

안녕하세요. PSYda 입니다.

본 포스팅은 Nomad Coders 의 "React JS로 웹서비스 만들기"를 통해 학습한 내용을 정리한 것입니다.

이번 포스팅에서는 지금까지 배운 내용을 바탕으로 실제 여기 형태를 가지는 Movie App을 만들어 볼 예정입니다. 세부적으로 알아볼 내용은 아래와 같습니다.


  1. API로 부터 Movie 데이터 가져오기
  2. Movies App 화면에 띄우기
  3. Movies App에 스타일 입히기
  4. Github page에 Movie App 표시

1. API로 부터 Movie 데이터 가져오기

Javascript를 이용해 외부의 데이터를 가지고 오는 방법에는 jquery, fetch, Axios 등의 방법이 있는데, 그 중 Axios를 이용하겠습니다.

1.1 Axios

1) Axios 설치

  • cmd(터미널) 창에서 npm i axios 입력
movie_app_2019>npm i axios

2) Axios import

import axios from "axios"

1.2 API(yts) 사용하기

1) Data를 가져올 API URL 정보

2) Axios를 이용해 Data 가져오기

//App class
  getMovies = async () => {
    const { data: { data: { movies }}} = await axios.get("https://yts-proxy.now.sh/list_movies.json?sort_by=rating");list_movies.json");
  }
  componentDidMount(){
    this.getMovies();
  }
  • getMovies 라는 함수를 비동기 방식(async, await)으로 생성
  • getMovies 함수에서 movies라는 변수에 가져온 영화 데이터 저장
  • movies 라는 데이터는 data 안의 data 안에 있음.
  • rending 후에(componentDidMount함수에서) getMovies 함수 실행

2. Movies Rendering

2.1 Movie Component 생성

Movie 데이터를 rendering 하기 위한 Component를 생성합니다.

//Movie.js
import React from "react"
import PropTypes from "prop-types"

function Movie({ id, year, title, summary, poster, genres }) {
  return <h5>{title}</h5>
}

Movie.propTypes = {
  id: PropTypes.number.isRequired,
  year: PropTypes.number.isRequired,
  title: PropTypes.string.isRequired,
  summary: PropTypes.string.isRequired,
  poster: PropTypes.string.isRequired,
  genres: PropTypes.arrayOf(PropTypes.string).isRequired,
}

export default Movie

1) props 설정

function Movie({id, year, title, summary, poster, genres})
  • id, year, title, summary, poster 를 props로 받음

2) title을 rendering

return <h5>{title}</h5>

3) PropTypes를 이용해 props의 type check

Movie.propTypes = {
  id: PropTypes.number.isRequired,
  year: PropTypes.number.isRequired,
  title: PropTypes.string.isRequired,
  summary: PropTypes.string.isRequired,
  poster: PropTypes.string.isRequired,
  genres: PropTypes.arrayOf(PropTypes.string).isRequired,
}
  • id, year 는 숫자형
  • title, summary, poster 는 string 형
  • genres는 array형

2.2 state 사용

가져온 movies 데이터를 state에 저장합니다.

1) state 생성

//App Class
state = {
  isLoading: true,
  movies: [],
}
  • movies : [] 라는 state Object 정의

2) state 저장

//App class
getMovies = async () => {
  const {
    data: {
      data: { movies },
    },
  } = await axios.get(
    "https://yts-proxy.now.sh/list_movies.json?sort_by=rating"
  )
  this.setState({ movies, isLoading: false })
}
  • 가져온 데이터(movies) 를 State에 저장
  • movies : movies 를 써야하나 위와 같이 movies 형태로 사용 가능

2.3 Rendering

state에 값이 저장되면 rendering 을 시작합니다.

//App class
  render(){
    const { isLoading, movies } = this.state;
    return (
    <div>
      { isLoading ? "Loading..." : movies.map( movie => (
        <Movie
          key={movie.id}
          id={movie.id}
          year={movie.year}
          title={movie.title}
          summary={movie.summary}
          poster={movie.medium_cover_image}
          genres = {movie.genres} />
    )) }</div>);

1) 최초 rendering

  • isLoading 은 True 이기 때문에 "Loading..." 을 출력

2)State에 저장

  • isLoading 이 False 로 변경됨
  • 조건문에 따라 movies.map() 함수가 실행

3) Movie Component를 사용

2.4 동작 확인

3. Movie App Styling

3.1 Movie App 의 구조화

위에서 작성한 Movie App은 단순히 데이터만 들어가 있기 때문에 Style을 입히기 힘듭니다. HTML Tag와 Class를 이용해 구조화 해줌으로서 CSS 파일을 이용해 Styling 할 수 있습니다. 여기서 HTML 의 class 를 JSX에서 사용할 때는 className 을 써야합니다.

위의 Component의 return 부분을 수정하여 구조화 된 형태로 변경하겠습니다.

1) Movie Component의 return 변경

//Movie Component
function Movie({ id, year, title, summary, poster }) {
  return (
    <div className="movie">
      <img src={poster} alt={title} title={title} />
      <div className="movie__data">
        <h3 className="movie__title">{title}</h3>
        <h5 className="movie__year">{year}</h5>
        <ul className="genres">
          {genres.map((genre, index) => (
            <li key={index} className="genres__genre">
              {genre}
            </li>
          ))}
        </ul>
        <p className="movie__summary">{summary}</p>
      </div>
    </div>
  )
}
  • genres는 array형태 이기 때문에 map 함수를 이용해 li 태그 생성

2) App Component render함수의 return 변경

//App Component render 함수
 render(){
    const { isLoading, movies } = this.state;
    return (
    <section className ="container">
      { isLoading
      ? <div className = "loader">
        <span className="loader__text">Loading...</span>
        </div>
      :(
        <div className = "movies">
          {movies.map(movie =>
          (
            <Movie
              key = {movie.id}
              id = {movie.id}
              year = {movie.year}
              title = {movie.title}
              summary = {movie.summary}
              poster = {movie.medium_cover_image}
              genres = {movie.genres}
            />
          )
          )
          }
        </div>
      )}
      </section>);
  }

3) 동작 확인

3.2 css 파일로 Movie App Styling

1) css 파일 생성

  • Movie.css 파일 생성
  • App.css 파일 생성

2) css 파일 import

  • Movie.js 에서 상단에 import "./Movie.css" 입력
  • App.js 에서 상단에 import "./App.css" 입력

3) css 파일에 Style 내용 입력
입력한 css 내용은 아래 github 에서 참고하실 수 있습니다.

3.3 동작 확인

3.4 기타 작업

위의 결과물을 확인해보면 summary 글자 수의 차이에 따라 영화 소개 박스의 크기가 차이 나는 것을 확인 할 수 있습니다. 이는 slice 라는 함수를 통해 summary 의 글자 수를 고정함으로서 해결할 수 있습니다.

1) slice를 통한 string 의 글자수 고정

//Movie function(component)의 return
<p className="movie__summary">{summary.slice(0, 140)}</p>

2) 최종 결과물 확인

4. Github page 에 Movie App 표시

Github에서 우리가 만든 Movie App을 화면에 표시할 수 있습니다. 이는 온라인 상에서 다른 사람이 우리가 만든 결과물을 볼 수 있음을 의미합니다. 그 방법에 대해 알아보겠습니다.

4.1 gh-pages 설치

Github page 에 표시하기 위해서는 gh-pages를 설치해야합니다.

  • cmd(터미널)에서 npm i gh-pages
movie_app_2019>npm i gh-pages

4.2 package.json 수정

1) homepage 설정

//package.json
"homepage":"https://psyssai.github.io/movie_app_2019"
  • psyssai 대신 본인의 github ID 입력
  • movie_app_2019 대신 본인의 react project 명 입력

2) scripts에 내용 추가

//package.json
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "deploy": "gh-pages -d build",
    "predeploy": "npm run build"
  }
  • deploy 와 predeploy 내용 추가

3) movie_app 빌드

  • cmd(터미널)에서 npm run build 입력
movie_app_2019>npm run build

4) movie_app을 github page에 발행

  • cmd(터미널)에서 npm run deploy" 입력
movie_app_2019>npm run deploy
  • scripts에 따라 predeploy(npm run build) 가 먼저 실행됨
  • 그 후에 script의 deploy(gh-pages -d build) 가 실행

5) github사이트에서 결과물 확인

감사합니다.

반응형

'FrontEnd > React' 카테고리의 다른 글

[React]3.State & Component Life Cycle  (0) 2021.03.15
[React]2.Component, JSX, Props  (0) 2021.03.15
[React]1.React 소개와 설치  (0) 2021.03.15
[React 기초] 0. 개요  (0) 2019.08.16
반응형

안녕하세요. PSYda 입니다.

본 포스팅은 Nomad Coders 의 "React JS로 웹서비스 만들기"를 통해 학습한 내용을 정리한 것입니다.

이번 포스팅에서 알아볼 내용은 아래와 같습니다.


  1. Class Component
  2. State
  3. Component LifeCycle

1. Class Component

Component는 함수 Component와 Class Component과 있으며, 이전 포스팅에 이어 이번에는 Class Component에 대해 알아보겠습니다.

1.1 Class Component 생성

//App.js
import React from "react"

class App extends React.Component {
  render() {
    return <div>Hello</div>
  }
}

export default App

1) react import

import React from "react"

2) React.Component Class로 부터 상속받은 App Class(Component) 생성

class App extends React.Component {}

3) render 함수의 return에 rendering 할 내용을 JSX로 작성

render(){ return <div>Hello</div> }

4) Component export

export defualt App;

2.State

  • State = Object
  • Component 내부에서 동적인 데이터를 다루고 싶을 때 사용
  • State가 변경되면 자동으로 render 함수 수행

2.1 State 생성 및 사용

//App Class
class App extends React.Component {
  state = { count: 0 }
  render() {
    return <div>The number is {this.state.count}</div>
  }
}

1) State 만들기

  • Class 내부에 state = { 변수 : 값 }" 형태로 생성
  • 미래에 사용할 모든 변수를 정의할 필요는 없음. 계획단계의 변수만 정의

2) State 사용

  • {this.state.변수명}" 형태로 사용
  • 또는 const {변수명} = this.state" 로 정의하고, 변수명" 을 대신 사용

2.2 State 의 값 변경

  • this.state.count = 1 과 같은 형태로 직접 state를 변경할 수 없음
  • State의 값을 변경하기 위해서는 "setState()" 함수를 반드시 사용!
  • setState를 통해 State의 값이 변경되면 "render() 함수를 자동으로 실행"
  • Virtual DOM 을 통해 "변경된 부분(State가 변한 부분) 만 다시 Rendering"

예제 코드 입니다.

//App Class
class App extends React.Component {
  state = {
    count: 0,
  }

  // add, minus 함수
  add = () => {
    this.setState({ count: this.state.count + 1 })
  }
  minus = () => {
    this.setState({ count: this.state.count - 1 })
  }

  // render 함수
  render() {
    return (
      <div>
        <h1>The number is : {this.state.count}</h1>
        <button onClick={this.add}>Add</button>
        <button onClick={this.minus}>Minus</button>
      </div>
    )
  }
}

위의 예제는 두 개의 Button(Add, Minus)을 생성합니다. Add Button을 누르면 State의 Count가 +1, Minus Button을 누르면 State의 Count가 -1 이 됩니다. State가 Undate되면서 render() 함수에 있는 내용이 자동으로 rendering 되어 브라우저에서 변경된 내용을 바로 볼 수 있습니다. 세부적으로 알아보겠습니다.

1) render 함수에 Button 생성

<button onClick="{this.add}">Add</button>
<button onClick="{this.minus}">Minus</button>
  • Add/Minus Button을 클릭(onClick) 하면 add/minus 함수 호출
  • 이벤트 이름 설정시 반드시 camelCase로 작성(onClick, onChange 등)
  • 이벤트에 전달해주는 값은 반드시 함수(함수를 호출 하면 안됨, ex Add())

2) add, minus 함수 생성

add = () => {
  this.setState({ count: this.state.count + 1 })
}
  • setState를 통해 state의 count 값을 update를 하고 rendering 수행

3) 동작 확인

4) 기타 사항

  1. 에서 setState를 통해 state를 변경 할 때 예제와 같이 this.state.count 형태로 사용할 경우 this.state를 한번 더 조회해야 하는 문제를 가지고 있습니다. 그래서 아래와 같이 함수형태로 바꿔서 사용합니다.
add = () => {
  this.setState(current => ({ count: current.count + 1 }))
}

3. Component Life Cycle

React Component 생성(Mounting), 업데이트(Updating), 파괴(Unmounting) 될 수 있습니다.
그 과정에서 호출되는 함수들이 있으며, 호출 시점에 따라 필요한 사용자 코드를 추가할 수 있습니다.

3.1 Mounting

Component가 Mounting 될 때 호출 되는 함수 및 호출 순서는 아래와 같습니다.

  1. cunstructor() : Component 생성자로 가장 먼저 호출

  2. static getDerivedStateFromProps() : 지금 수준에서 몰라도 됨

  3. render() : Rendering 하는 내용 작성

  4. componentDidMount() : Rendering 후에 필요한 내용을 작성

3.2 updating

Component가 변경 될 때 호출 되는 함수 및 호출 순서

  1. static getDerivedStateFromProps() : 지금 수준에서 몰라도 됨

  2. shouldComponentUpdate() : Component 최적화내용 작성

  3. render() : Rendering 하는 내용 작성

  4. getSnapshotBeforeUpdate() : DOM 업데이트 하기 직전에 해야할 내용을 작성

  5. componentDidUpdate() : Redering 후에 필요한 내용을 작성

3.3 unmounting

Component가 unmounting 될 떄 호출 되는 함수 및 호출 순서

  1. componentWillUnmount() : 이벤트 제거 및 기타 사용자 코드 제거 내용 작성

3.4 (Mounting)Life Cycle을 사용한 예제

//App Class
class App extends React.Component {
  state = {
    isLoading: true,
  }
  componentDidMount() {
    setTimeout(() => {
      this.setState({ isLoading: false })
    }, 6000)
  }
  render() {
    const { isLoading } = this.state
    return <div>{isLoading ? "Loading..." : "We are ready"}</div>
  }
}

1) isLoading 은 true

state = { isLoading: true }

2) render함수에서 isLoading에 따라 화면 표시

  render(){
    const { isLoading } = this.state;
    return <div>{ isLoading ? "Loading..." : "We are ready" }</div>;
  }
  • isLoading 이 True 이면 "Loading..." 출력
  • isLoading 이 false이면 "We are ready" 출력

3) componentDidMount() 함수를 이용한 rendering 이후 처리

  componentDidMount(){
    setTimeout( () => {
      this.setState({isLoading:false});
    }, 6000)
  }
  • componentDidMount() 는 render() 함수 이후에 실행됨
  • 6초(6000ms) 후에 state의 isLoading을 false로 변경

4) setState가 실행되어 render() 가 다시 실행

  • isLoading이 false로 변경되었기 때문에 "We are ready" 출력

5) 동작확인

감사합니다.

반응형

'FrontEnd > React' 카테고리의 다른 글

[React]4.영화 App 만들기  (0) 2021.03.15
[React]2.Component, JSX, Props  (0) 2021.03.15
[React]1.React 소개와 설치  (0) 2021.03.15
[React 기초] 0. 개요  (0) 2019.08.16
반응형

안녕하세요. PSYda 입니다.

본 포스팅은 Nomad Coders 의 "React JS로 웹서비스 만들기"를 통해 학습한 내용을 정리한 것입니다.

이번 포스팅에서는 Component와 JSX에 대해 알아볼 예정이며 목차는 아래와 같습니다.


  1. (함수)Component
  2. JSX & props
  3. 동적인 Component 사용(Map함수 이용)
  4. 유효한 Props 인지 Check하기

1. Component

1.1 Component란?

  • HTML을 반환해주는 함수 또는 클래스
  • 함수 컴포넌트와 클래스 컴포넌트가 있음
  • 독립적인 단위로서 재사용성이 높음

1.2 Component 만들기

별도의 Javascript 파일을 생성하여 아래와 같이 간단하게 Component를 만들 수 있습니다.

//App.js
import React from "react"
function App() {
  return (
    <div>
      <h1>Hello</h1>
    </div>
  )
}
export default App

세부적으로 파헤쳐 보면 아래와 같습니다.

1) react import

import react from "react"

2) 함수(Component)를 생성하고 HTML을 return하도록 작성

function App() {
  return (
    <div>
      <h1>Hello</h1>
    </div>
  )
}

3) export할 Component명 명시

export default App

1.3 Component 사용하기

위에서 생성한 Component를 다른 javascript 파일에서 import하여 아래와 같이 사용할 수 있습니다.

//index.js
import React from "react"
import ReactDOM from "react-dom"
import App from "./App"
ReactDOM.render(<App />, document.getElementById("root"))

세부적으로 살펴보겠습니다.

1) import

  • react import
  • rendering을 위한 "react-dom import"
  • "Component"가 있는 Javascript import

2) ReactDOM.render 함수 호출

  • 사용될 Component 명 명시 : "<App />"
  • rendering 할 DOM 선택 : "document.getElementById('root')"

3) index.html에서 rendering

  • index.html의 dom에 해당하는 부분에 작성된 Component가 저장되어 표출

4) 동작 확인

1.4 여러 개의 Component를 만들기

하나의 File에 여러 개의 Component를 만들어 사용 할 수 있습니다. 위의 App.js에 Food라는 Component를 하나 더 생성해보겠습니다.

//App.js
import React from "react"
//Food Component
function Food() {
  return <h2>Apple</h2>
}
//App Component
function App() {
  return (
    <div>
      <h1>Hello!!!!!</h1>
      <Food />
    </div>
  )
}

export default App

1) App.js 에 Food Component 추가

function Food() {
  return <h2>Apple</h2>
}

2) App Component에서 Food Component 사용

function App(){ return ... <Food /> ... }

3) 동작 확인

2. JSX & Props

2.1 JSX(Javascript XML)란?

위에서 Component를 return 할 때 사용한 HTML과 비슷한 부분을 JSX라고 합니다. JSX는 HTML 뿐만 아니라 Javascript를 이용한 동적인 부분도 작성할 수 있습니다. 간단히 JSX를 알아보면 아래와 같습니다.

  • XML과 유사한 Javascript를 확장한 문법
  • Javascript와 HTML의 조합으로 작성
  • React가 필요로하는 유일한 추가적인 개념(JSX 이외에는 Javascript 개념만 알면 됨)

2.2 Props(Properties)

  • Component에 Data를 전달하기 위한 방법으로 Component의 속성값을 의미
  • Component명({Props}) 의 형태로 사용

예를 들어 App Component에서 Food Component로 특정 데이터를 보내고, Food Component에서 전달받은 데이터를 사용하는 예시를 알아보겠습니다.

//App.js
import React from "react"
function Food({ name }) {
  return <h2>I like {name}</h2>
}
function App() {
  return (
    <div>
      <Food name="apple" />
      <Food name="banana" />
    </div>
  )
}

export default App

1)Food Component에서 props 설정

function Food({ name }) {
  return <h2>I like {name}</h2>
}
  • name이라는 값을 props로 설정
  • name의 형태로 props 사용

2)App Component에서 Food Component에 props 전달

//apple props을 가지는 Food Component
    <Food name = "apple"/>
//banana props을 가지는 Food Component
    <Food name = "banana"/>

3) 동작 확인

3. 동적인 Component 사용(Map함수 이용)

위의 예시에서 Component를 만들어 보았고, 만든 Component를 하나씩 입력하여 사용해보았습니다. 이런 경우에 만약 같은 Component를 5번 사용할 경우 5번을 입력해야할 것입니다.
이런 경우 Map 함수를 이용하면 동적으로 Component를 사용 할 수 있습니다.

3.1 Map 함수란?

  • Map 함수의 인자로 입력 된 함수를 Object의 각 요소에 적용하는 함수
  • 사용방법 : Ojbect.Map(func)

3.2 동적인 Component 사용 예시

import React from "react"

//Food Component
function Food({ name, evaluation }) {
  return (
    <h2>
      I like {name}. It is {evaluation}.
    </h2>
  )
}

//Object
const foodILike = [
  {
    name: "Pizza",
    evaluation: "Good",
  },
  {
    name: "Steak",
    evaluation: "Excellent",
  },
]

//food Render 함수
function foodRender(food) {
  return <Food name={food.name} evaluation={food.evaluation} />
}

//App Component
function App() {
  return <div>{foodILike.map(foodRender)}</div>
}

export default App

세부적으로 살펴보겠습니다.

1) Javascript Object 생성

  • foodILike Object를 생성(name, evaluation으로 구성)

2) food Component에서 2개 props 받기

function Food({ name, evaluation }) {
  return (
    <h2>
      I like {name}. It is {evaluation}.
    </h2>
  )
}
  • Object의 name 과 evaluation를 입력받아 h2 Tag로 출력

3) Component를 생성하는 함수 만들기

function foodRender(food) {
  return <Food name={food.name} evaluation={food.evaluation} />
}
  • food : foodILike Object 여러 요소 중 하나의 요소
  • 함수 역할 : name 과 evaluation props를 가지는 Food Component 생성

4) Object의 Map 함수를 이용해 Component 동적 생성

{
  foodILike.map(foodRender)
}
  • foodILike : Map을 적용할 object명
  • foodRender : foodILike Object의 각각의 요소에 적용할 함수
  • map 함수 적용 결과 : 각 Ojbect의 name 과 evaluation props를 가지는 Food Component 생성

5) 동작 확인

6) 기타 사항

브라우저를 실행시키면 위와 같이 동작하는 것을 확인 할 수 있지만, 개발자도구(F12)를 실행시켜서 콘솔창을 보면 아래와 같은 Warning Message를 확인 할 수 있습니다.

이는 Ojbect의 각각의 값에 id라는 props를 저장하고, Component를 사용할 때 이 id를 key값으로 설정해줌으로서 해결할 수 있습니다.

//Ojbect
const foodILike = [
  {
    id: 1,
    name: "Pizza",
    evaluation: "Good",
  },
  {
    id: 2,
    name: "Steak",
    evaluation: "Excellent",
  },
]

//food Render 함수
function foodRender(food) {
  return <Food key={food.id} name={food.name} evaluation={food.evaluation} />
}
  • foodILike Object의 각각의 요소에 id값 저장
  • Component에 key값으로 food.id값 사용

4. 유효한 Props 인지 Check하기

Component에서 전달받은 props는 우리의 의도와는 다른 props가 전달 될 수 있습니다.
그러므로 우리는 전달받은 props가 유효한 props인지 확인해야합니다.
props types 라는 것을 통해 유효성을 check할 수 있습니다.

4.1 props types 설치하기

  • cmd(터미널)에서 npm i prop-types 입력
  • package.json 의 "dependencies" 항목에서 설치 되었는지 확인
movie_app_2019>nmp i prop-types

4.2 props types 사용하기

1) props types import

import PropTypes from "prop-types"

2) 확인할 props와 유효성 체크항목 명시

Food.PropTypes = {
  name: PropTypes.string.isRequired,
  evaluation: PropTypes.string.isRequired,
}

3) 유효성이 어긋나는 경우 확인

위에서 작성한 유효성에 어긋날 경우 개발자 도구 -> 콘솔창에서 Warning을 확인 할 수 있습니다.

감사합니다.

반응형

'FrontEnd > React' 카테고리의 다른 글

[React]4.영화 App 만들기  (0) 2021.03.15
[React]3.State & Component Life Cycle  (0) 2021.03.15
[React]1.React 소개와 설치  (0) 2021.03.15
[React 기초] 0. 개요  (0) 2019.08.16
반응형

안녕하세요. PSYda 입니다.

오늘은 React에 대해 간략하게 소개하고, 설치하는 과정을 포스팅할 예정입니다.
이전 시간에 말씀드린 것 처럼 Nomad Coders 의 "React JS로 웹서비스 만들기"를 통해 학습한 내용을 정리하였으며, 이번 포스팅에서 알아볼 내용은 아래와 같습니다.


  1. React에 대한 소개
  2. React Setup
  3. React App 구조 및 동작 원리

1. React 소개

1.1 Why React?

1) 많은 회사들이 React를 사용

  • React는 Facebook이 만들었고, 모든 Facebook은 React로 구현
  • Airbnb, npm, Netflix 등 유명한 서비스들이 React로 구현

2) 많은 개발자가 React를 사용

  • npm에서 react library 다운로드 정보를 살펴보면 500만건/1주

  • 2018년 프론트엔드 개발 생태계 설문조사에서 React가 압도적 1등

3) 활성화가 잘 된 커뮤니티

4) Javascript 기반의 언어(라이브러리)

  • React가 사라지더라도 Javascript에 대한 Skill은 향상 가능
  • Angular의 경우 자체적인 문법을 사용하기 때문에 배우기 어렵고, 망하면 남는게 없음

5) 그 외 이유는 아래 그림 및 링크 참고

1.2 필요한 사전 지식

React를 배우기 전에 알고 있으면 좋은 Skill 들은 아래와 같습니다.

1) HTML
2) CSS
3) Javascript
4) node.js

1.3 설치할 프로그램들

1) node.js : node.js 공식 홈페이지에서 설치

  • 설치 후 cmd창(터미널)에서 node -v 입력하여 version 확인
>node-v
v10.16.2

2) npm: node.js를 설치하면 자동으로 설치

  • 설치 후 cmd창(터미널)에서 npm -v 입력하여 version 확인
>npm -v
6.10.3

3) npx : npm을 통해서 설치

  • cmd창(터미널)에서 npm install npx -g 명령어 입력하여 설치
>npm install npx -g

4) git : git 공식 홈페이지에서 자신의 OS에 맞게 설치

  • 설치 후 cmd창(터미널)에서 git --version 입력하여 version 확인
>git --version
git version 20.22.0.windows.1

5) vscode : 요즘 많이들 쓰는 IDE(코드 편집기)

  • 원래 쓰는 IDE가 있으면 굳이 설치할 필요 없음

2.React Setup

2.1 React App 만들기

React는 아름다운(?) Component를 만들 수 있는 언어이지만, Browser에서 React 코드를 이해하지 못하기 때문에, 못생긴(이해 가능한) 코드로 변경해줘야합니다. 이를 위해 Webpack, Babel을 다운로드 해야 하고 React 코드를 컴파일을 해야 하는 등 번거로운 작업들이 필요했었습니다. 하지만 2016년 이후부터는 'create react app' 을 통해 간단하게 React Wep App을 만들 수 있습니다.

1) App 설치

  • cmd(터미널)창에서 npx create-react-app APP이름 을 입력
    >npx create-react-app movie_app_2019
    npx: installed 91 in 9.768s
    creating a new React app in path\moview_app_2019
    installing packages. This might take a couple of minues.

2) VS code 열기

  • cmd(터미널)창에서 code moview_app_2019 입력
    >code movie_app_2019

3) APP 실행

  • VS code 상의 Terminal에서 npm start 입력
    movie_app_2019> npm start

4) APP 구동 확인

2.2 Github Repository 만들기

React App 을 git으로 관리하며 원격 서버는 Github를 이용할 예정입니다. 따라서 Github Repository를 만들어 git과 연동하는 방법을 설명합니다. Repository 생성을 위해서는 Github에 별도의 가입이 필요하며, 계정이 있다는 가정하에 진행합니다.

1) Gitgub 사이트에서 새로운 Repository 생성

2) git 저장소 생성
생성된 React App 폴더에 git 저장소를 생성합니다.

  • cmd창(터미널)에서 git init 입력
    movie_app_2019> git init
    initialized empty Git repository in movie_app_2019/.git/

3) git에게 원격 서버 알려주기
1번에서 생성한 Repository 주소를 입력합니다.

  • cmd창(터미널)에서 git remote add origin 원격서버주소 입력
movie_app_2019>git remote add origin https://github.com/psyssai/movie_app_2019.git

4) 원격 서버에 프로젝트 저장

  • cmd창(터미널)에서 아래와 같이 순서대로 입력
  • git add.
  • git commit -m '입력할 메시지'
  • git push origin master
movie_app_2019>git add.
movie_app_2019>git commit -m "#1.0 Creating Your React App"
movie_app_2019>git push origin master

5) 원격저장소 확인
Github 사이트로 이동하여 원격 저장소에 잘 발행되었는지 확인합니다.

3. React App 구조 및 동작 원리

3.1 React App Project 구조

위의 그림과 같이 React App Project는 3개의 폴더를 가집니다.
1) node_modules
2) public

  • favicon.ico : Browser Tab에 나오는 아이콘
  • index.html : index만 가지고 있는 html
  • manifest.json : (추후 설명)

3) src : 각종 소스가 모여 있는 폴더

  • App.js와 Index.js를 제외하고 모두 삭제(처음부터 새로 만들기 위해)
  • App.js : 컴포넌트에 해당하는 부분
  • index.js : 컴포넌트를 그려주는 부분

3.2 React의 특징

1) 실시간 적용

  • App.js 를 수정하면 그 결과가 바로 적용되어 확인 가능

2) Virtual DOM

  • Application이 Load할 때 빈 html을 로드 하고, react가 HTML에 정보를 밀어 넣음

3.3 ReactApp 실행

  • cmd창(터미널)에서 npm start 입력
movie_app_2019>npm start
Starting the development server...
complied successfully!

3.4 동작 원리

1) App.js에 있는 App 함수에서 생성하고 싶은 부분을 명시
2) index.js 에서 App을 불러오고 index.html에서 찾을 요소를 명시
3) index.html 에서 찾아진 요소 부분에 App에서 명시한 것이 생성

아래와 같이 코드를 입력하고, 결과를 확인합니다.

//App.js
import React from 'react';

function App() {
    return <div>Hello!!!!!</div>
}

export default App
//index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App />, document.getElementByID('root'))
<!-- index.html 의 body 부분 -->
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>

  • 실제로 index.html은 비어 있지만, 아래와 같이 Browser에 표시됨
  • F12(개발자 도구)를 눌러보면 Hello!!!! 가 id root에 생성되어 있음

감사합니다.

반응형

'FrontEnd > React' 카테고리의 다른 글

[React]4.영화 App 만들기  (0) 2021.03.15
[React]3.State & Component Life Cycle  (0) 2021.03.15
[React]2.Component, JSX, Props  (0) 2021.03.15
[React 기초] 0. 개요  (0) 2019.08.16
반응형

1. string의 주요 인터페이스와 특징

  1. 시퀀스 컨테이너, 배열 기반 컨테이너

  2. string, wstring 제공

    • string : char 형식 문자 관리
    • wstring : wchar_t 형식 문자 관리
  3. 멤버 정의 형식

    멤버 정의 형식 내용
    allocator_type 메모리 관리자 형식
    const_iterator const 반복자 형식
    const_pointer const value_type* 형식
    const_reference const vluae_type& 형식
    const_reverse_iterator const 역 반복자 형식
    difference_type 두 반복자 차이의 형식
    iterator 반복자 형식
    npos 찾기 관련 '실패' 정의 값, 일반적으로 -1
    pointer value_type* 형식
    reference value_type& 형식
    reverse_iterator 역 반복자 형식
    size_type 첨자나 원소 개수 등 형식
    traits_type 문자의 특성 형식
    value_type 원소의 형식
  4. 생성자

string s;              // 기본 생성자
string s(sz);          // sz 문자열로 s 생성
string s(sz,n);        // sz 문자열에서 n개 문자로 s 생성
string s(n,c);         // n개의 c 문자로 s 생성
string s(iter1,iter2); // 반복자 구간 [iter1,iter2)의 문자로 s 생성
string s(p1, p2);      // 포인터 구간 [p1, p2)의 문자로 s 생성
  1. 멤버 함수
s.append(sz)        // s에 sz를 붙임
s.assign(sz)        // s에 sz문자열을 할당
s.at(i)             // s의 i번째 문자를 참조
p=s.begin()         // p는 s의 첫문자를 가리키는 반복자
p=s.end()           // p는 s의 끝을 표식하는 반복자
p=s.rbegin()        // p는 s 역순차열의 첫문자를 가리키는 반복자
p=s.rend()          // p는 s 역순차열의 끝을 표식하는 반복자
s.c_str()           // C 스타일의 문자열 주소 반환(null문자 포함)
n=s.capacity()      // n은 s에 할당된 메모리 공간 크기
s.clear()           // s를 비움
s.compare(s2)       // s와 s2를 비교
s.copy(buf,n)       // buf로 n 개의 문자를 복사
s.data()            // 문자열의 배열 주소를 반환
s.empty()           // s가 비었는지 조사
q=s.erase(p)        // p가 가리키는 문자를 제거, q는 다음 원소 가리킴
q=s.erase(b,e)      // 반복자 구간 [b,e)의 모든 문자 제거, q는 다음 원소
s.find(c)           // c 문자를 검색
s.rfind(c)          // c 문자를 끝부터 찾음
s.insert(n,sz)      // n의 위치에 sz를 삽입
s.length()          // 문자의 개수
n=s.max_size()      // n은 s가 담을 수 있는 최대 문자 개수(메모리 크기)
s.push_back(c)      // s의 끝에 c를 추가
s.replace(pos,n,sz) // pos 위치의 n개 문자를 sz로 바꿈
s.reserve(n)        // b개의 문자를 저장할 공간 예약
s.resize(n)         // s의 크기를 n으로 변경하고 확장되는 공간의 값을 기본값으로 초기화
s.resize(n,c)       // s의 크기를 n으로 변경하고 확장되는 공간의 값을 c로 초기화
s.size()            // s의 원소 개수
s2=s.substr(pos)    // s2는 pos부터 s의 문자열
s.swap(s2)          // s와 s2를 swap
  1. 연산자

    연산자 내용
    s[i] i 번째 위치 문자
    s+=s2 s와 s2의 합을 s에 할당
    s+s2 s와 s2를 합한 string 객체
    s=s2 s2에 s 할당
    out<<s s를 스트림에 씀
    in>>s 스트림에서 s로 읽음
    getline(in,s) 스트림에서 s로 한줄을 읽음
    그 외 비교연산 ==, !=, <, >, <=, >=

참고

2. 상세 예제

  1. 문자열 초기화 예제
string t("Hello!");
const char* p1 = "Hello!";
const char* p2 = p1 + 6;

string s1;
string s2("Hello!");
string s3("Hello!", 2);
string s4(5, "H");
string s5(t.begin(), t.end());
string s6(p1, p2);
// s1 =
// s2 = Hello!
// s3 = He
// s4 = HHHHH
// s5 = Hello!
// s6 = Hello!
  1. 문자열 붙이기 예제
    • append : 부분 또는 전체 붙일 때
    • += : 전체 붙일 때
string s("He");
string t("llo!");
const char* p1 = "llo!";
const char* p2 = p1+4;

s.append(t);
// Hello!
s.append(t,0,4);
// Hello! ( [0,4) 구간 합치기 )
s.append("llo!");
// Hello!
s.append("llo!", 4);
// Hello!
s.append(t.begin(), t.end());
// Hello!
s.append(p1,p2);
// Hello!
s.append(5, 'H');
// HeHHHHH
s += t;
// Hello!
s += "llo!"
// Hello!
for(string::iterator iter=t.begin(); iter != t.end(); ++iter){
   s.push_back(*iter);
}
// Hello!
  1. 문자열 대입 예제
    • assign : 부분 또는 전체 문자열 할당
    • = : 전체 문자열 할당
string t("Hello!");
const char* p1 = "Hello!";
const char* p2 = p1 + 6;

string s;

s.assign(t);
// Hello!;
s.assign(t,0,6);
// Hello!(t의 [0,6) 구간 할당)
s.assign("Hello!");
// Hello!;
s.assing("Hello!", 6);
// Hello! ( 앞에서 부터 6개 문자열 할당 )
s.assign(6, 'H');
// HHHHHH ( H 6개 문자열 할당 )
s.assign(t.begin(), t.end());
// Hello!
s.assign(p1, p2)
// Hello!
s = t;
// Hello!
s = "Hello!";
// Hello!
  1. c_str(), data()
    • c_str : null 문자 포함한 C-style 문자열 반환
    • data : null 문자 포함하지 않는 C-style 문자열 반환
string s("Hello!");
const char *sz = s.c_str();
// \0 문자로 끝나는 문자열
const char *buf = s.data();
// \0 문자 포함하지 않는 문자열
  1. compare()
    • 문자열을 비교(부분 문자열 비교 가능)
    • s1 > s2 이면 1을 반환
    • s1 < s2 이면 -1을 반환
    • s1 == s2 이면 0을 반환
string s1("ABCDE");
string s2("AKABC");
const char* sz = "AKABC";

s1.compare(s2);
// -1 반환 ("ABCDE" 와 "AKABC" 비교)
s1.compare(2,3,s2);
// 1 반환 ( s1과 s2의 2 위치부터 3개 비교, "CDE", "ABC" 비교)
s1.compare(0,3,s2,2,3);
// 0 반환 (s1의 0 위치부터 3개["ABC"]와 s2의 2 위치부터 3개["ABC"]를 비교)
s1.compare(sz);
// -1 반환 ( "ABCDE" 와 "AKABC" 비교 )
s1.compare(2,3,sz);
// 1 반환 ( s1과 sz의 2 위치부터 3개 비교, "CDE", "ABC" 비교)
s1.compare(0,1,sz,1)
// 0 반환
  1. copy()
    • null 문자 없는 문자열 복사
string s("Hello!");
char buf[100];

s.copy(buf, s.length());
// buf = Hello!
buf[s.length()] = '\0';
// buf = Hello!\0
s.copy(buf,4,2);
// buf = llo! ( 2위치 부터 4개 복사 )
buf[4] = '\0';
// buf = llo!\0
  1. find() , rfind()
const char *sz = "Be careful in Uncle Randy's new car";
string t("Randy");
string s = sz;

s.find("e");
// 1 출력( e가 처음 발견된 위치 )
s.find("e", 10);
// 18 (10위치 부터 검색하여 e가 처음 발견된 위치)
s.find("new car");
// 28 (new car 가 처음 발견된 n의 위치)
s.find("new car", 10);
// 28 (10위치 부터 new car 가 처음 발견된 n의 위치)
s.find("new car", 0, 1);
// 12 (0 위치 부터 new car의 1개 값(n)이 처음 발견된 위치)
s.find(t, 0);
// 20 ( 0위치 부터 t("Randy")가 발견된 첫 위치)
  1. insert()
    • 문자열 삽입
string t("ABC");
string s("Hello");

s.insert(1, "ABC");
// "HABCeelo"(S의 1위치에 ABC 삽입)
s.insert(1, "ABC", 2);
// "HABeelo"(S의 1위치에 ABC에서 2개문자[AB] 삽입)
s.insert(1, t);
// "HABCello" ( s의 1위치에 t["ABC"] 삽입)
s.insert(1, t, 0, 2);
// "HABeelo" ( s의 1위치에 t의 0번째 위치 부터 2개 문자["AB"] 삽입)
s.insert(1, 3, "A");
// "HAAAello" ( s의 1위치에 "A"를 3개 삽입)
s.insert(s.begin() + 1);
// "H ello" ( s의 1위치에 공백 삽입 )
s.insert(s.begin() + 1, 'A');
// "HAello" ( s의 1위치에 'A' 삽입)
s.insert(s.begin() + 1, 3, 'A');
// "HAAAello" ( s의 1위치에 'A'를 3개 삽입)
s.insert(s.begin() + 1, t.begin(), t.end());
// "HABCello" ( s의 1위치에 t[begin,end) 삽입)
  1. replace()

    • 문자열을 교체
string t("ABC");
string s("Hello!");

s.replace(0,3,"ABC");
// "ABClo!" (s의 0번째 부터 3개 문자를 "ABC" 로 변경)
s.replace(0,3,t);
// "ABClo!" (s의 0번째부터 3개 문자를 t["ABC"]로 변경)
s.replace(0,3,"ABC",2);
// "ABlo! ( s의 0번째부터 3개 문자를 "ABC"의 앞 2개 문자로 변경)
s.replace(0,3,t,0,2);
// "ABlo! ( s의 0번째부터 3개 문자를 t의 0번째부터 2개 문자["AB"]로 변경)
s.replace(0,3,2,'A');
// "AAlo!" ( s의 0번째부터 3개 문자를 'A' 2개로 변경)
s.replace(s.begin(), s.begin()+3, "ABC");
// "ABClo!" (s의 0번째 부터 3개 문자를 "ABC" 로 변경)
s.replace(s.begin(), s.begin()+3, t);
// "ABClo!" (s의 0번째부터 3개 문자를 t["ABC"]로 변경)
s.replace(s.begin(), s.begin()+3, "ABC", 2);
// "ABlo! ( s의 0번째부터 3개 문자를 "ABC"의 앞 2개 문자로 변경)
s.replace(s.begin(), s.begin()+3, 3, 'A');
// "AAAlo!" ( s의 0번째부터 3개 문자를 "A" 3개로 변경)
s.replace(s.begin(), s.end(), t.begin(), t.end());
// "ABC" (s의 문자를 t의 [begin,end) 구간 문자["ABC"]로 변경)
  1. substr()
  • 일부 문자열을 추출할 때 사용
string t("Hello!");
string s;

s = t.substr(0);
// "Hello!" ( 0 부터 끝까지 )
s = t.substr(0, string::npos);
// "Hello!" ( 0 부터 끝까지 )
s = t.substr(0, 2);
// "He" ( 0부터 2개 )
s = t.substr(2,3);
// "llo" ( 2부터 3개 )
s = t.substr(2, string::npos);
// "llo!" ( 2부터 끝까지)
  1. 스트림으로 부터 입력
string s;
getline(cin, s);
// 문자열을 입력 받는다.
getline(cin, s ,'\n');
// 문자열을 입력 받는다. 종료 문자열 저장 가능
  1. 뇌를 자극하는 C++ STL
반응형
반응형

1.stack

  1. 기본 컨테이너는 deque
  2. 템플릿 형식
    • T : 원소 형식
    • Conatiner : stack에 사용될 컨테이너
template<typename T,
         typename Container=deque<T>>
class stack
  1. 멤버 형식
멤버 형식 내용
value_type Container::value_type, T형식
size_type Container::size_type, 첨자 또는 원소 개수 등의 형식
container_type Container 형식, 기본 deque
  1. 생성자
explicit stack(const Container& = Container())
// 컨테이너 기본 생성자 호출해 stack을 생성하거나
//인자로 받아 stack을 생성
  1. 멤버 함수
bool empty() const             // 원소가 없는가?
size_type size() const         // 원소의 개수
void push(const vluae_type& x) // 원소 추가
void pop()                     // 원소 제거
value_type& top()              // Top 원소의 참조
const value_type& top() const  // const 객체 Top 원소 참조
  1. 예제
#include<stack>
stack<int> st;
st.push(10);   // 원소 추가
st.push(20);
st.push(30);

while(!st.empty()){
   cout<< st.top() << endl; // Top 원소 꺼내기
   st.pop(); // 원소 제거
}

2. queue 컨테이너

  1. 기본 컨테이너는 deque
  2. 템플릿 형식
    • T : 원소 형식
    • Conatiner : queue에 사용될 컨테이너
template<typename T,
         typename Container=deque<T>>
class queue
  1. 멤버 형식
멤버 형식 내용
value_type Container::value_type, T형식
size_type Container::size_type, 첨자 또는 원소 개수 등의 형식
container_type Container 형식, 기본 deque
  1. 생성자
explicit queue(const Container& = Container())
// 컨테이너 기본 생성자 호출해 queue을 생성하거나
//인자로 받아 queue를 생성
  1. 멤버 함수
bool empty() const             // 원소가 없는가?
size_type size() const         // 원소의 개수
void push(const vluae_type& x) // 원소 추가
void pop()                     // 원소 제거
value_type& front()            // 첫 원소 참조
value_type& back()              // 마지막 원소의 참조
const value_type& front() const // const 객체 첫 원소 참조
const value_type& back() const   // const 객체 마지막 원소 참조
  1. 예제
#include<queue>
queue<int, list<int>> q;
q.push(10);   // 원소 추가
q.push(20);
q.push(30);

while(!q.empty()){
   cout<< q.front() << endl; // Top 원소 꺼내기
   q.pop(); // 원소 제거
}

3. priority_queue 컨테이너

  1. 들어간 순서에 상관없이 우선순위가 높은 데이터나 나옴

  2. STL에서 priority_queue

    • STL의 힙 알고리즘(make_heap, push_heap, pop_heap)을 사용해 구현
    • 임의 접근 반복자를 제공해야함(vector 또는 deque)
  3. 기본 컨테이너는 vector

  4. 템플릿 형식

    • T : 원소 형식
    • Conatiner : priority_queue에 사용될 컨테이너, 기본 vector
    • Comp : 우선순위를 결정할 정렬 기준, 기본 less
template<typename T,
         typename Container=deque<T>,
         typename Comp=less<typename Container::value_type>>
class priority_queue
  1. 멤버 형식
멤버 형식 내용
value_type Container::value_type, T형식
size_type Container::size_type, 첨자 또는 원소 개수 등의 형식
container_type Container 형식, 기본 vector
  1. 생성자
explicit priority_queue(
   const Comp& = Comp(),
   const Container& = Container())
// 컨테이너 기본 생성자 호출해 queue을 생성하거나
//인자로 받아 priority_queue를 생성
  1. 멤버 함수
bool empty() const             // 원소가 없는가?
size_type size() const         // 원소의 개수
void push(const vluae_type& x) // 원소 추가
void pop()                     // 원소 제거
value_type& top()              // Top 원소의 참조
const value_type& top() const   // const 객체 Top 원소 참조
  1. 예제
#include<queue>
priority_queue<int> pq1;
pq1.push(40);   // 원소 추가
pq1.push(20);
pq1.push(30);
pq1.push(50);
pq1.push(10);

while(!pq1.empty()){
   cout<< pq1.top() << endl; // Top 원소 꺼내기
   // 50 40 30 20 10 (less)
   pq1.pop(); // 원소 제거
}

priority_queue<int, deque<int>, greater<int>> pq2;
pq2.push(40);   // 원소 추가
pq2.push(20);
pq2.push(30);
pq2.push(50);
pq2.push(10);

while(!pq2.empty()){
   cout<< pq2.top() << endl; // Top 원소 꺼내기
   // 10 20 30 40 50 (greater)
   pq2.pop(); // 원소 제거
}

참고

  1. 뇌를 자극하는 C++ STL
반응형

'C++ > STL' 카테고리의 다른 글

[STL-19] string  (0) 2021.03.14
[STL-17] 반복자  (0) 2021.03.14
[STL-16] 함수 객체 - 함수 어댑터  (0) 2021.03.14
[STL-15] 함수 객체 - 비교/논리 연산 조건자  (0) 2021.03.14
[STL-14] 함수 객체 - 산술 연산 함수 객체  (0) 2021.03.14
반응형

1. 반복자 개요

  1. 반복자란?
    • 포인터를 추상화한 클래스
    • 포인터가 하지 못하는 더 많은 동작 가능
  2. 반복자의 종류
    • 입력 반복자 : 전방향 읽기(istream)
    • 출력 반복자 : 전방향 쓰기(ostream)
    • 순방향 반복자 : 전방향 읽기,쓰기
    • 양방향 반복자 : 양방향 읽기, 쓰기(list, set, multiset, map, multimap)
    • 임의 접근 반복자 : 랜덤 읽기, 쓰기(vector, deque)
  3. 반복자 종류에 따른 가능 연산
반복자 가능 연산
입력 반복자 *iter, ->, ++, ==,!=, iterator(iter)
출력 반복자 *iter=x, ++, iterator(iter)
순방향 반복자 *iter, ->, ++, == , =, iterator(), iterator(iter)
양방향 반복자 순방향 반복자 기능 + --
임의 접근 반복자 양방향 반복자 기능 + , [], +=, -=, +, -, <, >, <=, >=
  1. 순차열

    • 순서 있는 원소의 집합
  2. 구간

    • 순차열의 시작과 끝을 나타내는 반복자의 쌍으로 표현
    • [begin, end) : begin은 순차열 원소에 포함되지만, end는 포함되지 않음
    • ex) 10, 20, 30, 40, 50, 60
    • iter = 30 일 경우
    • [begin, end) => 10, 20, 30, 40, 50
    • [begin, iter) => 10, 20
    • [iter, end) => 30, 40, 50

2. 반복자 상세

종류 방향 쓰기
iterator 정방향 O
const_iterator 정방향 X
reverse_iterator 역방향 O
const_ reverse_iterator 역방향 X
  1. const 키워드 + 반복자

    • 반복자가 가리키는 원소의 위치 변경 안할 때 사용
  2. 역방향 반복자

    • 반복자가 가리키는 다음 원소의 값을 참조함
    • ex) 10,20,30,40,50 일 때
    • rbegin 은 end()를 가리키고, 50을 참조
    • rend 는 10을 가리키고, 10 한칸 앞을 참조
vector<int> v = {10,20,30,40,50};
vector<int>::iterator iter = v.begin();
vector<int>::const_iterator citer = v.begin();
const vector<int>::iterator const_iter = v.begin();
const vector<int>::const_iterator const_citer = v.begin();

// 값 대입
*iter  = 100; *const_iter = 100;   // 가능
*citer = 100; *const_citer = 100;  // 불가능

// 반복자 변경
**iter; ++citer;              // 가능
++const_iter , ++const_citer; // 불가능

// 역방향 반복자
for(vector<int>::reverse_iterator riter v.rbegin(); riter != v.rend(), +riter){
   cout << *riter << " ";
}
cout << endl;
// 50,40,30,20,10 출력됨

3. 삽입 반복자

  1. 순차열에 원소를 삽입 할 수 있게 반복자를 변환하는 어댑터

    • 기본은 덮어쓰기 모드로 동작
  2. inserter()

    • insert_iterator 객체 생성
    • 컨테이너의 insert() 멤버 함수 호출
    • 삽입모드로 동작하게 함
    • 모든 컨테이너 사용 가능
vector<int> v1 = {10,20,30,40,50};
vector<int> v2;
copy(v1.begin(), v1.end(), v2.begin());
// copy 알고리즘은 덮어쓰기 모드로 동작하므로
// v2의 size가 0 이여서 오류 발생함

copy(v1.begin(), v1.end(), inserter<vector<int>>(v2, v2.begin()));
// 삽입 모드로 변경
// v2  = {10,20,30,40,50};
  1. back_inserter()

    • back_insert _iterator 객체 생성
    • 컨테이너의 push_back() 멤버 함수 호출
    • 뒤쪽에 삽입함
    • vector, deque, list 만 사용 가능
  2. front_inserter()

    • front_insert _iterator 객체 생성
    • 컨테이너의 push_front() 멤버 함수 호출
    • 앞쪽에 삽입함
    • deque, list만 사용 가능
vector<int> v = {10,20,30,40,50};
list<int> lt1 = {1,2,3};
list<int> lt2 = {1,2,3};

copy(v.begin(), v.end(), back_inserter<list<int>>(lt1));
// lt1 = {1,2,3,10,20,30,40,50}

copy(v.begin(), v.end(), front_inserter<list<int>>(lt2));
// lt2 = {50,40,30,20,10,1,2,3}

4. 입/출력 스트림 반복자

  1. istream_iterator<T>

    • 입력 스트림과 연결된 반복자
    • T 형식의 값을 스트림에서 읽을 수 있음
  2. ostream_iterator<T>

    • 출력 스트림과 연결된 반복자
    • T 형식의 값을 스트림에 쓸 수 있음
vector<int> v = {10,20,30,40,50};
copy(v.begin(), v.end(), ostream_iterator<int>(cout));
// 1020304050 이 출력됨
copy(v.begin(), v.end(), ostream_iterator<int>(cout, ","));
// 10,20,30,40,50 이 출력됨

list<int> lt = {100,200,300};
transform(
   lt.begin(), lt.end(), v.begin(),
   ostream_iterator<int>(cout, " "),
   plus<int>());
// 110 220 330 이 출력됨

//istream_iterator
vector<int> v2;
copy(
   istream_iterator<int>(cin),
   istream_iterator<int>(),
   back_inserter<vector<int>>(v));
// 사용자 입력을 받아 v 에 push_back

copy(
   istream_iterator<int>(cin),
   istream_iterator<int>(),
   ostream_iterator<int>(cout, " "));
// 사용자 입력을 받아 cout으로 출력
// ctrl + D 를 누르면 입력 종료

5. 반복자 특성과 보조 함수

  1. 반복자 특성이란?
    • 각 반복자의 특징을 저장하는 템플릿 클래스
    • 사용자 알고리즘 구현 할 때 STL 알고리즘 처럼 일반화하면서 반복자 종류의 특징에 따라 효율적인 동작을 하는 알고리즘을 구현하려면 STL이 제공하는 반복자 특성 활용 필요
  2. iterator_traits
    • 모든 반복자의 공통된 인터페이스
    • 모든 반복자가 제공하는 다섯 정보를 가지고 있음
template<class Iter>
struct iterator_traits{
   typedef typename Iter::iterator_category iterator_category
   typedef typename Iter::value_type value_type;
   typedef typename Iter::difference_type difference_type;
   typedef typename Iter::pointer pointer;
   typedef typename Iter::reference reference;
}
  1. 반복자 태그(5개)
    • 반복자의 종류를 구분하기 위해 사용
struct input_iterator_tag {...};
struct output_iterator_tag{...};
struct forward_iterator_tag
   :public input_iterator_tag{...};
struct bidirectional_iterator_tag
   :public forward_iterator_tag{...};
struct random_access_iterator_tag
   :public bidirectional_iterator_tag{...};
  1. 사용자 함수 구현 예시
//vector
template<typename T>
class Vector{
public:
   class Iterator{
      typedef random_access_iterator_tag iterator_category;
      typedef T value_type;
      typedef int difference_type;
      typedef T* pointer;
      typedef T& reference;
      void operator+=(int) { }
   }
      Iterator Begin() {
      return Iterator();
   }
}

//list
template<typename T>
class List{
public:
   class Iterator{
      typedef bidirectional_iterator_tag iterator_category;
      typedef T value_type;
      typedef int difference_type;
      typedef T* pointer;
      typedef T& reference;
      void operator++() { }
   }
   Iterator Begin() {
      return Iterator();
   }
}

// advance(양방향 반복자) 오버로딩
template<typename Iter>
void _Advance(Iter& iter,
            int n,
            bidirectional_iterator_tag category_tag){
   for(int i = 0; i < n; i++){
      ++iter;
   }
}

// advance(임의 접근 반복자) 오버로딩
template<typename Iter>
void _Advance(Iter& iter,
            int n,
            random_access_iterator_tag category_tag){
   iter += n;
}

// Advance() 반복자 보조 함수
template<typename Iter>
void Advance(Iter& iter, int n){
   _Advance(iter, n, iterator_traits<Iter>::iterator_category());
}

// 사용 예시
Vector<int> v = {10,20,30};
List<int> v = {10,20,30};

Vector<int>::Iterator viter(v.Begin());
List<int>::Iterator liter(lt.Begin());

Advance(viter, 2);
Advance(liter, 2);

6. 보조 함수

  1. advance(p, n)

    • p 반복자를 p += n의 위치로 이동
  2. n=distance(p1, p2)

    • n은 p2 - p1
    • distance(v.begin(),v.end()) = 원소 개수

참고

  1. 뇌를 자극하는 C++ STL
반응형
반응형

1. 바인더

  1. 이항 함수자를 단항 함수자로 변환
  2. STL은 두 가지 바인더 제공
    • bind1st : 첫번 째 인자 고정
    • bind2nd : 두번 째 인자 고정
  3. 예제
    • less 첫 번째 인자를 10으로 고정
   // less의 첫 인자를 10으로 고정한 binder
   binder1st<less<int>> binder = bind1st(less<int>(), 10);
   binder(5); // => less<int>()(10,5) 와 동일

   // 임시 객체로 사용
   bind1st(less<int>(), 10)(5);
  1. c++11 에서 비추 , c++17 에서 삭제됨
    • std::bind를 대신 사용하자.

2. 부정자(negator)

  1. 조건자를 반대의 조건자로 변환
  2. STL은 두 가지 부정자 제공
    • not1 : 단항 조건자를 변환
    • not2 : 이항 조건자를 변환
  3. 예제
    • less 조건자를 반대 조건자로 변환
less<int> oLess;
binary_negate<less<int>> negate = not2(less<int>());
// 아래 세 방법은 모두 동일
negate(5, 10);
not2(oLess)(5,10);
not2(less<int>())(5, 10);
// 5 < 10 의 반대는 5 => 10 이므로 false

3. 함수 포인터 어댑터

  1. 일반 함수를 어댑터 적용 가능한 함수 객체로 변환
    • 일반 함수는 STL 어댑터에 적용 안됨
    • 어댑터에 적용 가능한 함수 객체로 변환
  2. STL은 아래 함수 포인터 어댑터 제공
    • ptr_fun()
  3. 사용 예시
    • 사용자 정의 함수를 변환
bool Pred(int n){
   return 30 <= n && n <= 40;
}

vector<int> v = {10,20,30,40,50};
//30이상 40이하의 원소 개수 => 2
count_if(
   v.begin(),
   v.end(),
   Pred);

// 30이상 40이하가 아닌 원소 개수 => 3
count_if(
   v.begin(),
   v.end(),
   not1(ptr_fun(Pred)));
  1. 사용자 정의 ptr_fun 구현
template<typename RType, typename AType>
class Ptr_fun_class:public unary_function<AType, RType>{
   RType (*pf)(AType);
public:
   Ptr_fun_class(RType (*_pf)(AType))
      : pf(_pf) {}
   RType operator()(AType n) const{
      return pf(n);
   }
}

// 일반 함수를 함수 객체로 변환하는 Ptr_fun() 함수
template<typename RType, typename Atype>
Ptr_func_class<RType,AType> Ptr_fun(
   RType (*pf)(Atype) {
      return Ptr_fun_class<Rtpye, AType>(pf);
   }
)

4. 멤버 함수 포인터 어댑터

  1. 멤버 함수를 함수 객체로 변환
  2. 알고리즘이 객체 원소의 멤버 함수 호출 가능
  3. STL은 두 가지 멤버 함수 포인터 어댑터 제공
    • mem_fun_ref() : 객체로 멤버 함수 호출
    • mem_fun() : 객체의 주소로 멤버 함수 호출
  4. mem_fun_ref() 예시
vector<Point> v;
v.push_back(Point(1,1));
v.push_back(Point(2,2));
v.push_back(Point(3,3));
v.push_back(Point(4,4));
v.push_back(Point(5,5));

// 멤버 함수 호출 불가능
for_each(
   v.begin(), v.end(),
   &Point::Print);

// 멤버 함수 호출 가능
for_each(
   v.begin(), v.end(),
   mem_fun_ref(&Point::Print));
  1. 사용자 정의 Mem_fun_ref 예시
template<typename RType, typename CType>
class Mem_fun_ref_class:public unary_function<CType, RType>{
   RType (CType::*pf)() const;
public:
   Mem_fun_ref_class(RType (CType::*_pf)() const)
      : pf(_pf) {}
   RType operator()(const CType& o) const{
      return (o.*pf)();
   }
}

// 어댑터 함수 : 멤버 함수를 주소를 저장하는 함수 객체로 반환
template<typename RType, typename CType>
Mem_fun_ref_class<RType, CType> Mem_fun_ref(
   RType (CType::*pf() const){
      return Mem_fun_ref_class<RType,CType>(pf);
   }
)
  1. mem_fun() 어댑터 예시
    • 원소가 객체의 주소 일 때 사용
vector<Point*> v;
v.push_back(new Point(1,1));
v.push_back(new Point(2,2));
v.push_back(new Point(3,3));
v.push_back(new Point(4,4));
v.push_back(new Point(5,5));

for_each(
   v.begin(),
   v.end(),
   mem_fun(&Point::Print)
);

참고

  1. 뇌를 자극하는 C++ STL
반응형

'C++ > STL' 카테고리의 다른 글

[STL-18] 컨테이너 어댑터  (0) 2021.03.14
[STL-17] 반복자  (0) 2021.03.14
[STL-15] 함수 객체 - 비교/논리 연산 조건자  (0) 2021.03.14
[STL-14] 함수 객체 - 산술 연산 함수 객체  (0) 2021.03.14
[STL-13] 함수 객체 - 개요  (0) 2021.03.14
반응형

1. STL에서 제공하는 연산 조건자

  1. 비교 연산 조건자
    • 아래 함수 객체는 모두 이항 조건자
함수명 내용
equal_to<T> ==
not _equal_to<T> !=
less<T> <
less_equal<T> <=
greater<T> >
greater_equal<T> >=
  1. 논리 연산 조건자
함수명 내용 인자
logical_and<T> && 이항
logical_or<T> || 이항
logical_not<T> ! 단항

2. 연산 조건자 사용 법

  1. less<T>
    • 헤더 추가 : <functional>
    • 일반적으로 아래 방법 사용
    • less<int>()(10, 20);
less<int> oLess;   // 객체 생성

// 1. 암묵적 호출
oLess(10, 20);

// 2. 명시적 호출
oLess.operator()(10,20);

// 3. 임시 객체로 암묵적 호출(일반적인 사용)
less<int>()(10,20);

// 4. 임시 객체로 명시적 호출
less<int>().operator()(10,20);
  1. logical_and
    • 헤더 추가 : <functional>
int n = 30;
logical_and<bool> oAnd;

// 1. 암묵적 호출
oAnd(
   greator<int>()(n,10),
   less<int>()(n, 50)
);
// n이 10보다 크고, 50 보다 작은가? true

// 2. 명시적 호출
oAnd.operator()(
   greator<int>()(n,10),
   less<int>()(n, 50)
);

// 3. 임시 객체로 암묵적 호출(일반적 사용)
logical_and<bool>()(
   greator<int>()(n,10),
   less<int>()(n, 50)
);

// 4. 임시 객체로 명시적 호출
logical_and<bool>().operator()(
   greator<int>()(n,10),
   less<int>()(n, 50)
);

3. 사용자 정의 구현

  1. less
    • binary_function 상속
    • 첫번째 , 두번째 인자 : T
    • 리턴 인자 : bool
    • operator 함수는 const
template<typename T>
struct Less: public binary_function<T,T,bool>{
   bool operator()(const T& left, const T& right) const{
      return left < right;
   }
};

2. logical_and
```cpp
template<typename T>
struct Logical_and: public binary_function<T,T,bool>{
   bool operator()(const T& left, const T& right) const{
      return left && right;
   }
}

4. 알고리즘과 같이 사용하는 예

  1. count_if 로 같이 사용 예
    • count_if는 단항 조건자를 요구
    • bind2nd<T> 어댑터 사용하여 이항 조건자를 단항 조건자로 변경
vector<int> v = {10,20,30,40,50};
// 1. 20보다 작은 원소 개수
count_if(
   v.begin(),
   v.end(),
   bind2nd<less<int>>(
      less<int>(), 20
      )
);
// 1개

// 2. 20보다 작거나 같은 원소 개수
count_if(
   v.begin(),
   v.end(),
   bind2nd<less_equal<int>>(
      less_equal<int>(), 20
      )
);
// 2 개

// 3. 20보다 큰 원소 개수
count_if(
   v.begin(),
   v.end(),
   bind2nd<greater<int>>(
      greater<int>(), 20
      )
);
// 3개

// 4. 20보다 크거나 같은 원소 개수
count_if(
   v.begin(),
   v.end(),
   bind2nd<greater_equal<int>>(
      greater_equal<int>(), 20
      )
);
// 4개

// 5. 20과 같은 원소 개수
count_if(
   v.begin(),
   v.end(),
   bind2nd<equal_to<int>>(
      equal_to<int>(), 20
      )
);
// 1 개

// 5. 20과 다른 원소 개수
count_if(
   v.begin(),
   v.end(),
   bind2nd<not_equal_to<int>>(
      not_equal_to<int>(), 20
      )
);
// 4 개

참고

  1. 뇌를 자극하는 C++ STL
반응형

'C++ > STL' 카테고리의 다른 글

[STL-17] 반복자  (0) 2021.03.14
[STL-16] 함수 객체 - 함수 어댑터  (0) 2021.03.14
[STL-14] 함수 객체 - 산술 연산 함수 객체  (0) 2021.03.14
[STL-13] 함수 객체 - 개요  (0) 2021.03.14
[STL-12] 알고리즘7-수치 알고리즘  (0) 2021.03.14

+ Recent posts

반응형