
객체지향 프로그래밍(OOP)은 객체(Object)라는 단위로 프로그램을 설계하는 프로그래밍 패러다임입니다. 리액트(React)는 UI 라이브러리로, 객체지향 프로그래밍의 원칙들을 사용할 수 있지만, 리액트 자체는 객체지향을 전제로 한 라이브러리는 아닙니다. 리액트는 컴포넌트 기반 아키텍처를 사용하고, 함수형 프로그래밍(FP)의 개념을 더 많이 따르는 편입니다. 그럼에도 불구하고, 리액트에서 객체지향 프로그래밍의 일부 개념을 적용할 수 있습니다.
객체지향 프로그래밍은 주로 다음과 같은 네 가지 핵심 개념에 중점을 둡니다.
리액트는 컴포넌트 기반의 UI 라이브러리입니다. UI는 여러 개의 컴포넌트들로 구성되며, 각 컴포넌트는 독립적인 상태와 로직을 가질 수 있습니다. 이 점에서 리액트는 객체지향 프로그래밍의 캡슐화 개념과 유사한 부분이 있습니다. 리액트에서는 컴포넌트가 상태를 캡슐화하고, 그 상태를 바탕으로 UI를 렌더링합니다.
리액트에서 객체지향 개념을 활용할 수 있는 부분은 주로 클래스형 컴포넌트를 사용할 때입니다. 하지만 리액트는 최신에는 함수형 컴포넌트가 더 널리 사용됩니다.
리액트의 초기에는 클래스형 컴포넌트를 사용하여 UI를 구성했으며, 이때 객체지향 프로그래밍의 원칙을 다음과 같이 적용할 수 있었습니다:
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
increment() {
this.setState({ count: this.state.count + 1 });
}
render() {
return (
<div>
<p>{this.state.count}</p>
<button onClick={() => this.increment()}>Increment</button>
</div>
);
}
}
상속 (Inheritance): MyComponent는 React.Component를 상속받아 리액트의 기본적인 컴포넌트 기능을 갖습니다. 또한, 사용자 정의 클래스를 만들어 기능을 확장하거나 수정할 수 있습니다.
캡슐화 (Encapsulation): state와 setState는 클래스 내부에서 관리되며, 컴포넌트 외부에서 직접 접근할 수 없습니다. 외부에서는 render 메서드를 통해 UI만 갱신할 수 있습니다.
다형성 (Polymorphism): 컴포넌트는 상속을 통해 다른 동작을 구현할 수 있습니다. 예를 들어, 기본 컴포넌트를 상속하여 다른 방식으로 동작하는 컴포넌트를 만들 수 있습니다.
현재 리액트에서는 함수형 컴포넌트가 더 많이 사용되고 있으며, 함수형 컴포넌트는 객체지향 프로그래밍의 개념을 그대로 따르지는 않지만, 상태 관리와 로직 분리라는 측면에서 함수형 프로그래밍에 더 가까운 방식입니다. 함수형 컴포넌트에서는 Hooks를 사용하여 상태를 관리하고, 라이프사이클을 다루며, 더 직관적이고 간결한 코드 작성을 가능하게 합니다.
리액트에서 함수형 컴포넌트와 클래스형 컴포넌트의 가장 큰 차이는 this 사용 여부와 상태 관리 방식입니다.
1. 클래스형 컴포넌트:
2. 함수형 컴포넌트:
| 구분 | 클래스형 컴포넌트 | 함수형 컴포넌트 |
|---|---|---|
| 상태 관리 | this.state와 this.setState 사용 | useState 등 Hook을 통해 상태 관리 |
| 메서드 | 클래스 메서드로 정의하고 this로 접근 | 함수 내부의 함수로 정의 |
| 바인딩 문제 | this 바인딩 필요 (constructor에서) | 바인딩 문제 없음 |
| 코드 간결성 | 상대적으로 복잡함 | 더 간결하고 직관적 |
| 사이클 관리 | componentDidMount, componentDidUpdate 등 라이프사이클 메서드 사용 | useEffect 등 Hook으로 관리 |
리액트는 컴포넌트 기반 아키텍처를 사용하므로, 객체지향의 캡슐화와 함수형 프로그래밍의 선언적 UI를 혼합하여 사용합니다. 리액트의 설계 자체는 함수형 프로그래밍에 더 가까운 접근을 취하고 있지만, 클래스형 컴포넌트에서 객체지향 개념을 적용할 수 있습니다.
리액트는 객체지향 프로그래밍의 개념을 일부 차용하면서도 함수형 프로그래밍의 이점을 살려 UI를 선언적으로 구성하는 데 중점을 두고 있습니다.