H'academy
  • H'academy
  • Web
    • Back-end
      • Spring Framework
        • Spring 개발환경 구축
          • Project 생성
          • Maven 설정
          • Maven 저장소 위치 설정
          • Apache Tomcat 연동
          • Lombok 설정
        • Spring MVC Project
          • pom.xml
          • web.xml
          • root-context.xml
          • servlet-context.xml
          • DispatcherServlet
        • Controller
          • File Upload / Download
          • RestController(작성중)
        • Spring Test
          • Assert 단정문
          • Spring 환경 연동 테스트
          • MockMvc Test
        • Spring AOP
          • AOP 용어
          • Pointcut Expression
          • Filter
          • Interceptor
          • Filter vs Interceptor
          • Controller Advice(작성중)
        • Spring JDBC
          • DBCP
          • myBatis
            • ResultMap 활용
        • ETC
          • Logging
            • Tomcat Logging 설정
          • Property 관리
          • E-mail
            • Gmail 변경사항
          • Scheduler
          • Websocket
      • Spring Boot
        • STS 다운로드
        • 프로젝트 생성
        • 프로젝트 구조
        • Spring Devtools
        • Spring Controller
          • JSP 연동
            • * JSP 생성불가 문제
            • Spring Boot 3.x
          • Model
          • 요청 파라미터 처리
          • 경로 변수 처리
          • 요청 메소드
          • Redirect
          • Spring Actuator
        • Spring Boot JDBC
          • Database 정보
          • DAO Pattern
          • ORM Framework
            • myBatis
              • Mapper 생성
            • Spring Data JPA
        • Spring AOP
          • AspectJ
          • Filter
          • Interceptor
          • ControllerAdvice
        • REST API
        • Spring WebSocket
        • Send Mail
        • Logging
        • Spring Boot Test
        • Lombok
      • Java EE
        • 개발환경 구성
          • Server와 Client
          • Web Server와 WAS
        • Dynamic Web Project
      • Apache Tomcat
        • Apache Tomcat 구조
        • Tomcat User 생성
        • Tomcat Manager 설정
      • Maven
      • Jenkins
        • Installation
          • Github Webhook 설정
          • Maven 연동
        • Project setting
          • 소스 코드 관리 설정
          • 빌드 유발 설정
          • 빌드 작업 설정
      • OpenAPI(swagger)
        • swagger 2.x (legacy)
        • swagger 3.x (boot)
        • Swagger UI 꾸미기
        • SpringDoc
    • Front-end
      • HTML
        • Heading
        • <A>
        • <IMG>
        • <DIV>
        • <TABLE>
        • <FORM>
          • <INPUT>
          • <SELECT>
          • <TEXTAREA>
          • <FIELDSET>
        • List
      • CSS
        • CSS 적용 방식
          • 크기(size)
            • 픽셀(px)
          • 색상(color)
        • CSS 선택자
          • 스타일 우선순위
        • CSS 주요 속성
          • 크기 속성
            • border
            • margin
            • padding
            • box-sizing
          • 배경 속성
          • 글자 속성
            • font
            • text
          • 배치 속성
            • position
            • display
            • overflow
            • float
            • flexbox
        • CSS Reset
      • JS
        • syntax
          • let, const
          • 구조 분해 할당
          • spread operator
          • Object copy
          • this
          • module
        • jQuery
          • structure
          • function
          • ajax
            • ajax file upload
        • VueJS
          • CDN(Vue3)
            • 기본 구조
            • Vue Devtools
            • jQuery vs VueJS
            • Vue instance
              • data
                • IME issue
              • v-model
              • template
              • computed
              • watch
                • deep watch
                • vs Computed
              • methods
            • Vue directive
              • v-text
              • v-html
              • v-bind
                • v-bind style
                • v-bind class
              • v-on
                • once
                • prevent
              • v-show
              • v-if
              • v-for
          • Vue-cli 3
            • 프로젝트 구조
            • src
              • main.js
              • App.vue
              • HelloWorld.vue
            • Vue Router 4
              • History mode
              • 404 not found
              • Guard
                • beforeEach
            • Vuex
              • 이동 횟수 측정
            • axios
              • interceptor
          • Vue-electron
        • ReactJS
          • CDN(React18)
            • 템플릿 설명
            • JSX
            • render
            • Handling Events
              • onClick
              • onInput
            • Component
              • 클래스 컴포넌트
                • state
                • props
                • event
                  • Mouse
                  • Input
                • lifecycle
              • 함수형 컴포넌트
                • useState
                • useEffect
                • useReducer
                • useMemo
                • props
                • 조건부 렌더링
          • CRA
            • 자원 경로 설정
            • src 절대 경로 설정
            • react-router
            • Context API
            • Electron 설정
        • Webpack
          • NodeJS
          • Git
    • Ubuntu server
      • Jenkins
    • 테스트 도구
      • JMeter
        • Test Plan
        • Test Plan(with login)
        • Plugin 설치
    • WebRTC
  • Base Language
    • Java
      • Java 실행 과정
        • 개발 환경 구축
        • 샘플 코드 작성
        • 컴파일/실행
        • 환경 변수 설정
      • Java 초급
        • Hello world
        • 자료와 정보
        • 변수
          • 정수
            • 정수의 저장 원리
            • 정수형 변수 생성
          • 실수
            • 실수의 저장 원리
            • 실수형 변수 생성
          • 논리
            • 논리형 변수 생성
          • 문자
          • 문자열
            • 문자열 변수 생성
          • 사용자 정의 자료형
        • 연산자
          • 대입 연산
          • 부호 연산
          • 산술 연산
          • 복합 대입 연산
          • 증감 연산
          • 쉬프트 연산
          • 비트 연산
          • 비교 연산
          • 논리 연산
          • 삼항 연산
          • 변환 연산
        • 표준 입출력
          • 표준 출력
          • 표준 오류 출력
          • 표준 입력
            • Scanner 입력
        • 제어문
          • if 구문
            • 단일 조건
            • 두 가지의 조건
            • 여러 가지의 조건
          • switch~case 구문
          • while 구문
          • do~while 구문
          • for 구문
        • 랜덤(Random)
        • 배열
          • 1차원 배열
          • 2차원 배열
          • 다차원 배열
          • Sort
            • 선택 정렬
            • 버블 정렬
            • 삽입 정렬
      • Java 중급
        • 객체 지향 프로그래밍
        • 클래스
        • 인스턴스
        • 필드
        • 메소드
          • 설정(setter) 메소드
          • 반환(getter) 메소드
        • 생성자
        • 접근 제한
          • private
          • package
          • protected
          • public
        • 정적(static)
        • 불변(final)
        • 상수(constant)
        • 상속
          • this와 super의 이해
          • 멤버 변수 설정
          • 멤버 메소드 설정
          • 생성자 설정
        • 추상화
          • 추상 클래스
          • 인터페이스
        • 다형성
        • 중첩 클래스
          • 일반 중첩 클래스
          • static 중첩 클래스
          • 지역 중첩 클래스
          • 익명 중첩 클래스
      • Java API(작성중)
        • java.lang
        • java.util
        • java.text
        • java.time
        • java.io
        • java.net
        • java.sql
        • java.awt
        • javax.swing
      • Java 고급
        • 제네릭(Generic)
        • 열거형(Enum)
        • Annotation Type
          • Retention
          • Target
          • Nested Annotation
        • Java Reflection
          • Intro
          • Class
          • Field
          • Constructor
          • Method
          • Package
      • JDBC
        • 드라이버 로드
        • 연결 생성
          • JDBC Driver 유형
        • JdbcTemplate
      • Java 버전별 변경사항
        • Java 1.8
          • Lambda Expression
          • Stream API
          • java.time 패키지
        • Java 9
        • Java 12
          • switch~case
        • Java 13
          • Text Block
    • Arduino
      • 학습 준비
        • Reference
        • 아두이노 온라인 시뮬레이터
        • 전기의 이해
        • 그라운드(GND)의 이해
      • 개발 환경 구축
        • CH340 보드 설치
        • Editor 글꼴 설정
      • 아두이노 제어
        • 코드의 구성
        • 시리얼 출력
        • 디지털 출력
          • LED 출력
        • PWM 출력
        • 시리얼 입력
        • 디지털 입력
          • PIR 센서
        • 아날로그 입력
          • 온도 센서(LM35DZ)
          • 조도 센서
          • 가스 센서
        • 피에조 부저
        • 서보 모터 제어
          • 시리얼 서보 모터 제어
          • 스위치 서보 모터 제어
        • 온습도 센서(DHT-11)
        • LCD
      • 아두이노 통신
        • 블루투스(Bluetooth)
          • HC-06
            • 온도 센서 활용
          • HM-10
        • 와이파이(Wi-Fi)
          • ESP-01
            • WiFiEsp 라이브러리 추가
            • WiFiEsp 네트워크 스캔
        • 이더넷(Ethernet)
        • ArduinoJson 라이브리 사용
    • Regular Expression
  • Database
    • Oracle
      • 설치
        • SQL Plus
        • SQL Developer
        • DBeaver
        • Docker(Mac OS)
      • SQL
        • 관리자 명령
          • 사용자 관리
          • 권한 관리
          • Encoding 설정
          • 서비스 포트 설정
        • 사용자 명령
          • 테이블 관리
            • 테이블 항목 제약 조건
            • 외래키 제약조건
            • 데이터 유형
          • 시퀀스 관리
          • 데이터 관리
            • 데이터 추가
            • 데이터 조회
              • 오라클 내장 함수
              • 그룹 조회
              • Top N Query
            • 데이터 수정
            • 데이터 삭제
          • 뷰 관리
          • 인덱스 관리
          • 집합 연산
          • 테이블 조인
            • 등가 조인
            • 외부 조인
        • HR 계정
        • 기타 명령
          • 컬럼 간격 조정
      • 내보내기 및 불러오기
        • EXPDP, IMPDP
        • Docker로 실행중인 경우
      • 기타
        • 자동 세션 제거
        • Tablespace 관리
        • Unlock user
  • 면접대비
    • Q&A
      • Java
      • Database
      • Web
      • IT 일반상식
  • ETC
    • Eclipse IDE
      • 설치
      • 화면 설명
      • 환경 설정
      • 프로젝트 생성
      • 소스파일 작성 및 실행
    • Github
      • Github 계정 관리
      • Github 저장소 관리
        • Profile
        • Collaborators
        • Code
        • Issues
        • Pull requests
        • Action
          • Vue 3 Deploy Action
      • Personal Access Token
      • Git ignore 설정
        • Spring 개발용 샘플
      • Github Eclipse 연동
        • Branches
        • Project
        • Team project
          • Dynamic web project
          • Spring Boot Project
          • Branch 생성
          • Pull Request
          • Branch 보호
          • Branch 다시 생성
    • Figma
      • Team
      • Design
      • Component
    • 과정평가형
      • 실기 모의고사 1회
      • 실기 모의고사 2회
      • 실기 모의고사 3회
      • 실기 모의고사 4회
    • VScode
      • Live Server 실행 오류
      • Github 계정 변경
    • Naver ToastUI Editor
      • Editor 만들기
        • Editor options
          • File upload
      • Viewer 만들기
    • 문자 인코딩 방식
    • OBS
      • 녹화 잡음 제거 설정
    • Semantic Version
Powered by GitBook
On this page
  • state
  • state 선언
  • state 출력
  • state 변경
  • 단일 항목 변경
  • 객체 변경
  • 객체 일부 변경
  • 객체의 일부 변경 시 주의사항
  • 배열 변경
  • 배열 전체 교체
  • 예제 : 배열 섞기
  • 예제 : 목록 필터링
  • 배열 특정 인덱스 값 변경
  • 배열 데이터 추가
  • 배열 데이터 삭제
  1. Web
  2. Front-end
  3. JS
  4. ReactJS
  5. CDN(React18)
  6. Component
  7. 클래스 컴포넌트

state

컴포넌트에서 관리하는 데이터를 저장하는 state에 대해서 살펴본다.

Previous클래스 컴포넌트Nextprops

Last updated 2 years ago

state

state는 컴포넌트 내부에서 화면과 상호 작용하는 데이터를 저장하기 위한 도구이다. 화면에 해당하는 핵심 데이터들을 state로 저장하고 관리하여 변동 사항을 화면에 반영하도록 구현한다.

state 선언

클래스 컴포넌트에서 state는 다음과 같이 선언한다.

class MyComponent extends React.Component {
    state = {
        //key : value
    };
}

클래스 내부에 state라는 이름으로 객체를 선언하며, 다른 이름으로 생성할 경우 setState 함수 등 부가적으로 제공되는 기능을 사용할 수 없으므로 이름을 지켜야 한다.

state 출력

render 함수에서 state를 출력할 수 있다. 또한 클래스 내부의 모든 메소드에서 this.state 키워드로 state 항목에 접근할 수 있다.

class MyComponent extends React.Component {
    state = {
        text : "This is react component"
    };
    
    render(){
        return {
            <>
                <h1>{this.state.text}</h1>
            </>
        }
    }
}

글자 색상도 state로 설정할 수 있다.

class MainComponent extends React.Component {
    state = {
        text : "This is react component",
        color:"blue",
    };
    
    render(){
        return (
            <>
                <h1 style={{color:this.state.color}}>{this.state.text}</h1>
            </>
        );
    }
}

매번 this.state를 출력하는 것은 번거롭기 때문에 다음과 같이 ES6의 구조 분해 할당 구문으로 사용할 수 있다.

class MainComponent extends React.Component {
    state = {
        text : "This is react component",
        color:"blue",
    };
    
    render(){
        const {text, color} = this.state;
        return (
            <>
                <h1 style={{color:color}}>{text}</h1>
            </>
        );
    }
}

this.state에서 필요한 내용들을 구조 분해 할당하여 사용하면 코드가 비교적 간단해진다. 자세한 원리에 대해서는 다음 문서를 참고한다.

state 변경

state는 직접 변경을 금지한다.

state를 변경해야 하는 경우 setState 함수를 사용하여 변경한다. state를 직접 변경하면 render 함수가 호출되지 않아 화면이 데이터와 맞지 않게 되므로 state는 불변성(immutable)을 유지해야 한다.

단일 항목 변경

단일 항목의 경우 클래스 내부의 state에 다음과 같이 선언되어 있다.

state = {
    number : 10
}

위와 같이 선언된 state의 number를 20으로 변경하려면 다음과 같이 작성한다.

this.setState({number : 20});

객체 변경

state에 객체가 있을 경우는 다음 형태와 같다.

state = {
    monster : {
        no : 25,
        name : "피카츄",
        type : "전기"
    }
};

이 경우 객체 전체를 바꾸고 싶을 때는 다음과 같이 setState 함수를 호출한다.

this.setState({
    monster : {
        no : 1,
        name : "이상해씨",
        type : "풀"
    }
});

객체 일부 변경

객체에서 특정 항목만 변경하고 싶다면 this.setState에 객체가 아닌 함수를 넣어서 이전 상태 객체(prevState) 정보를 사용해야 한다.

this.setState(prev=>({ /* 변경할 내용 작성 */}));

위 코드에서 prev는 이전 상태 객체를 말한다. prev를 사용하여 몬스터의 번호만 바꾸면 다음과 같다.

this.setState(prev=>({
    monster : {
        ...prev.monster,
        no : 100
    }
}));

객체의 일부 변경 시 주의사항

prevState 대신 this.state를 사용하지 않아야 한다.

this.setState(()=>({
    ...this.state.monster,
    no : 100
}));

setState 함수는 비동기로 실행되며 연속 실행될 경우 마지막에 렌더링이 되기 때문에 this.state를 사용하여 setState를 연속 실행할 경우 마지막 결과로 덮어쓰기 되어 렌더링 될 수 있다. prevState를 사용하여 변경할 경우 직전 실행 결과에 대한 콜백 인수를 사용하기 때문에 setState 연속 실행 시 상태가 이어져 문제가 생기지 않는다. (하단 그림 참조)

배열 변경

배열의 경우 여러 가지 변경이 있을 수 있다.

  • 배열 전체 교체

  • 배열 특정 인덱스 값 변경

  • 배열 데이터 추가

  • 배열 데이터 삭제

배열 전체 교체

배열을 전체 교체하는 상황은 다음과 같을 수 있다.

  • 기존 배열의 위치를 랜덤으로 뒤섞는(shuffle) 경우

  • 기존 배열에서 검색(filter)하여 새로운 배열을 만드는 경우

단일 항목 변경과 동일하게 진행한다

const copyArr = [...this.state.arr];
//copyArr에 대한 처리 수행
this.setState({arr:copyArr});

배열을 복사하는 방법은 여러 가지가 있으며, 예제 코드에서는 전개 연산자(spread operator)를 사용하였다.

예제 : 배열 섞기

섞기 버튼을 누르면 기존에 저장된 5마리의 몬스터 이름의 위치가 무작위로 변경되는 예제이다.

class MainComponent extends React.Component {
    state = {
        monsters : ["피카츄", "라이츄", "파이리", "꼬부기", "버터플"]
    };

    shuffle = e=>{
        const monstersCopy = [...this.state.monsters];
        for(var i=0; i < monstersCopy.length; i++){
            const pos = Math.floor(Math.random() * monstersCopy.length);
            const temp = monstersCopy[pos];
            monstersCopy[pos] = monstersCopy[i];
            monstersCopy[i] = temp;
        }
        this.setState({monsters:monstersCopy});
    };
 
    render(){
        
        const {monsters} = this.state;

        const monsterList = monsters.map((monster, index) => {
            return (
                <li key={monster}>{monster}</li>
            );
        });

        return (
            <>
                <h1>포켓몬스터 목록</h1>
                <button onClick={this.shuffle}>섞기</button>
                <ul>{monsterList}</ul>
            </>
        );
    }
}

const app = ReactDOM.createRoot(document.querySelector("#app"));
app.render(
    //class 이름을 태그로 사용
    <MainComponent/>
);

예제 : 목록 필터링

class MainComponent extends React.Component {
    state = {
        monsters : ["피카츄", "라이츄", "파이리", "꼬부기", "버터플", "리자드", "리자몽", "어니부기", "거북왕", "야도란", "또가스", "뮤", "뮤츠"],
        results:[],
    };
    
    search = e=>{
        const keyword = e.target.value;
        if(!keyword) return;
    
        const newResult = this.state.monsters.filter(monster=>monster.indexOf(keyword) >= 0);
        this.setState({results:newResult});
    };
    
    render(){
        
        const {monsters, results} = this.state;
    
        const resultList = results.map((monster, index) => {
            return (
                <li key={monster}>{monster}</li>
            );
        });
    
        return (
            <>
                <h1>포켓몬스터 도감</h1>
                <input onInput={this.search} placeholder="이름 입력"/>
                <ul>{resultList}</ul>
            </>
        );
    }
    }
    
    const app = ReactDOM.createRoot(document.querySelector("#app"));
    app.render(
    //class 이름을 태그로 사용
    <MainComponent/>
);

배열 특정 인덱스 값 변경

(작성 예정)

배열 데이터 추가

state에 있는 배열에 데이터를 추가할 경우 다음과 같이 전개 연산자와 콜백 함수를 사용하여 작성한다. prev 사용 이유는 객체의 일부 변경 시 주의사항 참조.

this.setState(prev=>({
    arr : [...prev.arr , 신규값]
}));

배열 데이터 삭제

배열에서 데이터를 지우는 방법은 여러 가지가 있다.

  • 인덱스와 범위를 알 때 - splice(index, range)

  • 데이터를 알 때 - filter()

filter()의 경우 데이터를 지우는 명령이 아니라 원하는 데이터를 추려내는 명령이지만 깊은 복사(Deep copy)를 하므로 추려낸 뒤 state에 재 설정한다면 데이터를 삭제하는 것과 같은 효과가 발생한다.

splice()는 원본을 변경하므로 별도의 깊은 복사(Deep copy) 코드가 필요하다.

const deleteItem = 30;
this.setState(prev=>({
    arr : prev.arr.filter(value=>value !== deleteItem)
});

arr은 가상의 state 항목이며, deleteItem에는 다른 값이 들어가도 무방하다.

깊은 복사와 얕은 복사에 대한 차이 및 방법은 다음 문서를 참고한다.

구조 분해 할당
Deep Copy vs Shallow Copy
state는 화면 구성을 위한 값의 모음이다