JSX vs 순수 자바스크립트 함수
1. JSX(JavaScript XML) 방식
function App() {
return (
<div className="App">
<h1>Hello, 리액트!!</h1>
</div>
);
}
- 개발자가 화면 구조를 한눈에 파악하기 매우 쉽습니다.
- 브라우저는 원래 이 코드를 이해하지 못합니다. 그래서 실행 직전에 바벨(Babel) 같은 도구가 아래의 코드로 번역해 줍니다.
2. React.createElement 방식
function App() {
return React.createElement("div", null, "Hello, 리액트!!", React.createElement("p", null));
}
- 순수 자바스크립트 함수 호출 형태입니다.
- 가상 DOM 객체를 만드는 실제 모습입니다.
📝 JSX 핵심 문법 정리
1. 반드시 부모 요소로 감싸기
JSX는 반드시 하나의 부모 태그로 감싸져야 합니다. 리액트의 가상 DOM이 컴포넌트 변화를 효율적으로 감지하기 위해 하나의 트리 구조를 가져야 하기 때문입니다.
- <div></div>, Fragment(<> </>)를 사용할 수 있습니다.
2. 자바스크립트 표현식은 중괄호 { } 안에!
HTML 태그 사이에서 자바스크립트 변수나 로직을 쓰고 싶을 땐 { }를 사용합니다.
- 삼항 연산자: 조건에 따라 다른 UI를 보여줄 때 유용합니다.
{ name === "리액트" ? <h1>YES</h1> : null } - 논리 연산자 (AND, OR): 조건이 맞을 때만 보여주거나(&&), 값이 없을 때 기본값을 보여줄 때(||) 사용합니다.
{ port || '포트를 설정하지 않았습니다.' }
function App() {
const port = undefined;
return (
<div>
{
port || '포트를 설정하지 않았습니다.'
}
</div>
)
}
3. 인라인 스타일링은 '객체'로
리액트에서 style 속성을 직접 줄 때는 문자열이 아닌 객체(Object) 형식을 사용합니다.
- CamelCase 사용: background-color 대신 backgroundColor처럼 대문자로 이어 씁니다.
- 중괄호 두 번: style={{ color: 'red' }}에서 바깥쪽 {}는 JS 사용을 위한 것, 안쪽 {}는 객체를 의미합니다.
- 미리 변수로 선언해서 <h1 style={style}> 처럼 넣는 게 코드가 훨씬 깔끔합니다.
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
let name = "변수 사용법";
const style = {
backgroundColor : 'black',
color: 'white',
fontSize: '48px',
fontWeight : 'bold',
padding : '20px'
}
return (
<div style = {
{
backgroundColor : 'black',
color: 'white',
fontSize: '48px',
fontWeight : 'bold',
padding : '20px'
}
}>
<h1 style = {style}>Hello,
{
name === "리액트" ? (<h1>YES</h1>) : null
}
!!</h1>
</div>
);
}
export default App;
4. 태그는 무조건 닫아야 함 (Self-Closing)
HTML에서는 <img>나 <input>을 닫지 않기도 하지만, 리액트에서는 에러가 납니다.
- 내용이 없는 태그라면 <input /> 처럼 반드시 닫아주어야 합니다.
5. 주석 (Comments)
JSX 안에서의 주석은 일반적인 JS 주석과 모양이 조금 다릅니다.
- {/* 주석 내용 */}
클래스 컴포넌트 vs 함수형 컴포넌트
| 구분 | 클래스형 컴포넌트 (Class) | 함수형 컴포넌트 (Functional) |
| 선언 방식 | class 키워드 사용, React.Component 상속 | function 또는 화살표 함수(const) 사용 |
| 상태 관리 | this.state와 this.setState() 사용 | Hooks (useState) 사용 |
| 라이프사이클 | componentDidMount 등 메서드 활용 | Hooks (useEffect) 사용 |
| 메모리/성능 | 비교적 메모리 소모가 큼 | 메모리 소모가 적고 선언이 간결함 |
| 사용 빈도 | 과거 프로젝트 유지보수 시 사용 | 현재 리액트의 표준 (강력 권장) |
클래스 컴포넌트
[ClassCom.tsx]
import { Component } from "react";
class ClassCom extends Component{
render(){
return(
<div>
클래스형 컴포넌트
</div>
)
}
}
export default ClassCom
- 리액트에세 클래스를 사용하고 싶다면, 리액트가 제공하는 Component라는 클래스의 기능을 그대로 상속받아 사용하여야합니다.
- render() 메소드는 클래스형 컴포넌트에서 화면에 무엇을 그릴지 결정하는 함수입니다.
- 함수형 컴포넌트는 함수 자체가 내용을 반환(return)하지만, 클래스형은 반드시 이 render() 함수 안에서 return을 해줘야 합니다. 리액트는 이 render 함수가 뱉어내는 JSX를 보고 화면을 그립니다.
함수형 컴포넌트
[FuncCom.tsx]
import React from 'react';
function FuncCom()
{
return (
<div>
함수형 컴포넌트
</div>
)
}
export default FuncCom;
[App.tsx]
import React from 'react';
import logo from './logo.svg';
import './App.css';
import ClassCom from './ClassCom';
import FuncCom from './FuncCom';
function App() {
let name = "변수 사용법";
return (
<div>
<ClassCom></ClassCom>
<FuncCom></FuncCom>
</div>
);
}
export default App;
'FE > TypeScript' 카테고리의 다른 글
| [React] 리액트란 무엇인가? (0) | 2026.03.31 |
|---|---|
| [TypeScript] 타입스크립트의 객체지향언어 - 클래스와 객체, 접근지정자, getter와 setter (0) | 2026.03.31 |
| [Typescript] 배열과 튜플, 그리고 스프레드 연산자에 대해 알아보자. (0) | 2026.03.29 |
| [TypeScript] 유니온 타입 / 타입별칭 / 타입가드 (0) | 2026.03.29 |
| [TypeScript] 타입스크립트의 열거형 (enum) / 리터럴 타입에 대해 알아보자. (0) | 2026.03.18 |