변경 가능과 변경 불가능이란 무엇인가요?

책상 화면에 바이너리 코드가 표시된 노트북 컴퓨터

작성자

Gregg Lindemulder

Staff Writer

IBM Think

Annie Badman

Staff Writer

IBM Think

변경 가능과 변경 불가능이란 무엇인가요?

변경 가능과 변경 불가능은 시스템, 인프라 또는 데이터를 생성한 후 변경할 수 있는지 여부를 나타냅니다. 변경 가능한 리소스는 제자리에서 수정할 수 있습니다. 변경 불가능한 리소스는 변경할 수 없으며, 수정 시 새 인스턴스가 생성됩니다.

변경 가능 대 변경 불가능은 소프트웨어 개발과 인프라 관리 모두에 대한 최신 접근 방식을 주도하는 원칙입니다.

이러한 차이는 화이트보드에 텍스트를 쓰는 것과 비교할 수 있습니다. 단어를 추가하거나, 일부를 지우거나, 작성된 내용을 변경할 수 있다면 이는 변경 가능한 리소스와 같습니다. 하지만 작업을 완료하는 순간 화이트보드가 유리로 덮여 있고 다른 내용을 작성하기 위해 새 화이트보드를 사용해야 한다면 이는 변경 불가능한 리소스입니다.

이 개념은 컴퓨팅 전반에 걸쳐 광범위하게 적용되지만 프로그래밍에서 가장 일반적으로 접하게 됩니다. 프로그래밍에서 어떤 데이터 유형을 직접 수정할 수 있는지, 그리고 언제 새로운 복사본을 만들어야 하는지 이해하는 것은 일반적인 작업에 필수적입니다. 이러한 작업에는 알고리즘 작성, 애플리케이션 프로그래밍 인터페이스(애플리케이션 프로그래밍 인터페이스) 구축, 객체 지향 프로그래밍(OOP) 클래스 설계가 포함됩니다.

변경 가능 또는 변경할 수 없는 개체를 사용할지 선택하면 메모리에서 데이터를 관리하는 방법, 데이터를 안전하게 공유하거나 변경할 수 있는 방법 및 의도하지 않은 부작용이 발생할 수 있는지 여부에 영향을 줍니다. 이것이 바로 변경 가능과 변경 불가능이 초보자와 숙련된 프로그래머 모두에게 기본 개념인 이유입니다.

예를 들어 Python 프로그래밍 언어에서 목록과 사전은 변경 가능한 유형입니다. 해당 오브젝트 내에서 항목을 추가, 제거 또는 수정할 수 있습니다. 반면 부울(참 또는 거짓 값) 또는 튜플(1,2,3)과 같이 정렬된 컬렉션과 같은 객체는 변경할 수 없는 유형입니다. 완전히 새로운 개체를 만들지 않고는 내용을 변경하거나 변경할 수 없습니다.

전문가의 인사이트를 바탕으로 한 최신 기술 뉴스

Think 뉴스레터를 통해 AI, 자동화, 데이터 등 가장 중요하고 흥미로운 업계 동향에 대한 최신 소식을 받아보세요. IBM 개인정보 보호정책을 참조하세요.

감사합니다! 구독이 완료되었습니다.

구독한 뉴스레터는 영어로 제공됩니다. 모든 뉴스레터에는 구독 취소 링크가 있습니다. 여기에서 구독을 관리하거나 취소할 수 있습니다. 자세한 정보는 IBM 개인정보 보호정책을 참조하세요.

변경 가능한 유형과 변경 불가능한 유형 선택

변경 가능한 데이터와 변경할 수 없는 데이터 중에서 선택하는 것은 일반적으로 데이터에 자주 업데이트가 필요한지, 스레드 간에 공유되는지 또는 버전 기록이 필요한지 여부 등 세 가지 주요 요소에 따라 달라집니다. 

변경 가능한 유형: 용도 및 이점

변경 가능한 형식은 일반적으로 데이터를 자주 업데이트해야 하고 프로그램의 여러 부분이 동일한 개체를 수정할 때 가장 잘 작동합니다.

효율적인 업데이트

변경 가능한 개체는 데이터를 수정하여 새 개체를 만들 필요가 없으므로 메모리 사용량을 줄입니다. 가비지 수집(메모리를 확보하기 위해 사용하지 않는 데이터를 제거하는 프로세스)의 프로세서 사용량을 낮출 수 있으므로 더 적은 수의 임시 개체를 만들고 수집해야 할 수 있습니다.

예를 들어 앱의 장바구니는 변경 가능한 목록을 사용하여 각 변경 사항에 대해 새 개체를 만들지 않고 항목을 직접 추가하거나 제거합니다.

더 빠른 성능 

변경 가능한 형식은 새 개체를 만드는 대신 기존 개체를 업데이트하기 때문에 증가하는 목록이나 실시간 카운터와 같이 자주 변경되는 데이터에서 더 나은 성능을 발휘합니다. 이러한 효율성은 빠른 수정에 의존하는 데이터 구조의 작업 속도를 높입니다.

예를 들어 음악 앱의 재생 목록은 변경 가능한 목록을 사용하여 빠르게 업데이트할 수 있습니다. 각 변경에 대해 1,000곡의 재생 목록을 다시 만드는 것과 비교하여 노래가 추가되거나 삭제될 때 마이크로초 만에 이를 수행할 수 있습니다.

공유 상태 

변경 가능한 객체를 사용하면 프로그램의 여러 부분이 동일한 객체에 액세스하고 변경할 수 있습니다. 이 프로세스를 통해 여러 구성 요소가 작업을 조정하기 위해 읽고 쓰는 데이터인 공유 상태로 작업할 수 있습니다. 구성 요소가 공통 데이터를 통해 조정하거나 통신해야 할 때 유용합니다.

예를 들어 프로젝트 관리 앱은 변경 가능한 개체를 사용하여 작업 목록, 일정 및 알림을 공유하기 위해 사용합니다. 팀원 한 명이 작업을 업데이트하면 모든 팀원이 변경 사항을 즉시 확인할 수 있습니다.

불변 유형: 용도 및 이점

불변 형식은 일반적으로 데이터를 만든 후 변경되지 않아야 할 때 가장 잘 작동합니다. 특히 프로그램의 여러 부분이 동일한 데이터에 액세스하는 동시성이 있는 애플리케이션에서 중요합니다.

예측 가능성

변경할 수 없는 개체의 상태는 고정되어 있기 때문에 다른 코드에 의해 변경되지 않습니다. 이 기능은 예상치 못한 돌연변이와 관련된 버그를 제거하므로 프로그램을 보다 예측 가능하고 이해하기 쉽게 만듭니다.

예를 들어, 뱅킹 앱은 트랜잭션 레코드를 변경할 수 없는 개체로 저장하는 경우가 많으므로 나중에 노코드로 변경할 수 없습니다. 이는 규정 준수를 보장하고 거래가 변조되지 않았음을 증명하는 감사 추적을 유지하는 데 매우 중요합니다.

스레드 안전성

불변 객체는 생성 후 상태를 변경할 수 없기 때문에 일반적으로 스레드로부터 안전합니다. 여러 스레드가 충돌 없이 동시에 안전하게 읽을 수 있지만 개발자는 여전히 동시 시스템에서 참조를 신중하게 관리해야 합니다. 이는 여러 스레드가 충돌을 일으키지 않고 동일한 데이터에 액세스해야 하는 다중 스레드 프로그램에 이상적입니다.

예를 들어, 날씨 앱은 현재 상황, 예측 및 경보에 대해 동시 스레드를 실행할 수 있습니다. 날씨 데이터를 변경할 수 없는 개체로 저장한다는 것은 각 스레드가 예기치 않게 변경될 위험 없이 동일한 정보를 읽을 수 있음을 의미합니다.

손쉬운 디버깅

변경 불가능한 객체는 프로그램 실행 중에 값이 예기치 않게 변경되지 않기 때문에 디버깅을 단순화할 수 있습니다. 이 기능은 부작용으로 인한 버그를 줄이고 팀이 문제를 더 빨리 해결하는 데 도움이 될 수 있습니다.

예를 들어, 비디오 게임은 플레이어의 상황과 통계를 변경 불가능한 객체로 저장하는 경우가 많습니다. 이러한 값은 예기치 않게 변경될 수 없기 때문에 개발자는 관련 없는 코드가 통계를 변경하지 않는다는 사실을 알고 버그를 쉽게 추적할 수 있습니다.

Mixture of Experts | 12월 12일, 에피소드 85

AI 디코딩: 주간 뉴스 요약

세계적인 수준의 엔지니어, 연구원, 제품 리더 등으로 구성된 패널과 함께 불필요한 AI 잡음을 차단하고 실질적인 AI 최신 소식과 인사이트를 확인해 보세요.

변경 가능 vs 변경 불가능에 대한 프로그래밍 접근 방식

가장 널리 사용되는 두 가지 프로그래밍 스타일인 객체 지향 프로그래밍(OOP)과 함수형 프로그래밍은 가변성에 접근하는 방식이 다릅니다.

OOP는 종종 가변성을 수용하여 데이터와 동작을 모두 보유하는 개체를 중심으로 프로그램을 구축합니다. 이러한 객체는 속성의 값(예: 사람의 연령 또는 제품 가격 변경)을 업데이트할 수 있는 세터라는 특수 함수를 사용하여 시간이 지남에 따라 변경될 수 있습니다.

반면, 함수형 프로그래밍은 불변성에 중점을 둡니다. 변경이 필요할 때마다 새로운 값을 생성하고 반환하여 프로그램을 보다 예측 가능하고 테스트하기 쉽게 만듭니다.

프로그래밍 언어는 변경 가능한 유형과 변경할 수 없는 유형에 대한 접근 방식도 다양합니다.

Python

Python에서는 변경 가능한 유형과 변경 불가능한 유형이 모두 일반적입니다.

한 가지 예로 이름이나 문장과 같은 문자 시퀀스인 문자열을 들 수 있습니다. Python의 문자열은 변경할 수 없습니다. 새 텍스트를 추가하면 새 문자열 객체가 생성됩니다. 반면 목록은 변경 가능합니다. 이러한 정렬된 컬렉션은 반복 가능하며 목록 개체 내에서 항목을 추가, 제거 또는 수정할 수 있습니다.

실행 전에 코드를 검사하기 위해 컴파일러(코드를 실행 전에 기계어로 변환하는 프로그램)를 사용하는 대신, Python은 런타임에 유형을 검사합니다. 즉, 프로그램이 실행되는 동안에만 오류가 발견됩니다. 변경할 수 없는 문자열을 수정하려는 시도와 같이 변경 가능성과 관련된 실수는 TypeError를 트리거합니다.

오류가 처리되지 않으면 프로그램이 즉시 중지되어 더 이상 코드가 실행되지 않습니다. 이 절차를 사용하면 개발 속도가 빨라지지만 형식 처리에 세심한 주의가 필요합니다.

Python의 가변성을 이해하면 함수 간에 데이터를 공유하거나 공유 모듈 내에서 작업할 때 오류를 방지하는 데 도움이 됩니다. GitHub의 튜토리얼과 코드 예제는 Python의 기본 제공 유형 사용에 대한 모범 사례를 제공합니다.

Javascript

JavaScript는 변경 가능한 유형과 변경 불가능한 유형을 모두 사용합니다. Python과 마찬가지로 문자열도 변경할 수 없습니다. 그러나 Python과는 달리 모든 객체는 기본적으로 변경 가능합니다.

JavaScript의 유연한 구문은 객체 지향 스타일과 함수형 스타일을 모두 지원하므로 개발자는 필요에 따라 변경 가능성을 관리할 수 있습니다.

Java

Python과 마찬가지로 Java 문자열은 변경 불가능합니다. 일단 생성된 문자열의 값은 변경할 수 없습니다. 이 특성은 텍스트를 자주 작성하거나 수정하는 프로그램에서는 비효율적일 수 있습니다.

이 문제를 해결하기 위해 Java는 새 개체를 만들지 않고 텍스트를 직접 수정할 수 있는 변경 가능한 문자열 클래스인 StringBuilder를 제공합니다. 성능을 향상시키고 메모리 사용을 줄여 불변성의 안전성과 가변성의 성능 이점의 균형을 맞출 수 있습니다.

C++

C++는 const 키워드를 사용하여 변수, 함수 및 전체 개체를 읽기 전용으로 표시합니다. 개발자에게 변경 가능성에 대한 세밀한 제어를 제공하여 변경을 방지함으로써 변경 가능한 개체를 변경할 수 없는 개체로 효과적으로 전환할 수 있습니다.

Java와 마찬가지로 C++ 문자열은 구현에 따라 변경 가능하거나 변경할 수 없습니다.

C++는 객체 지향 및 함수형 프로그래밍 스타일을 모두 지원합니다. OOP 스타일에서 개발자는 시간이 지남에 따라 기존 개체를 수정하는 반면 함수형 프로그래밍은 기존 데이터를 변경하는 대신 새 값을 만듭니다. 

프로그래밍 이상의 변경 가능 vs 변경 불가능 

가변성과 불변성의 원칙은 프로그래밍을 넘어 인프라와 시스템까지 확장됩니다. 최신 소프트웨어 엔지니어는 클라우드 아키텍처 및 배포 파이프라인을 설계할 때 이와 동일한 개념을 적용합니다.

변경 가능한 인프라

변경 가능한 인프라는 배포 후 변경할 수 있는 서버 또는 기타 IT 리소스를 의미합니다. 예를 들어 서버에 로그인하여 소프트웨어를 수동으로 업데이트하거나 구성을 변경하거나 패치를 설치할 수 있습니다. 이 방식은 유연성을 제공하지만, 서버들이 각각 독특한 “스노플레이크”처럼 변하면서 구성 편차가 생기고, 변경 사항을 추적하거나 재현하기 어려워질 수 있습니다.

변경 불가능한 인프라

불변 인프라는 배포 후 서버 또는 IT 리소스를 변경할 수 없음을 의미합니다. 실행 중인 시스템을 업데이트하는 대신 팀은 변경 사항이 내장된 새 인스턴스를 배포한 다음 이전 인스턴스를 폐기합니다. 이 접근 방식은 구성 드리프트를 줄이고 롤백을 단순화하며 일관된 배포를 보장하는 데 도움이 됩니다.

기타 애플리케이션

가변성과 불변성의 원칙은 소프트웨어 및 시스템 설계의 다른 영역에도 적용될 수 있습니다.

데이터베이스

일부 데이터베이스는 추가 전용 로그를 사용하므로 각 변경 사항은 영구적으로 기록되며 변경할 수 없습니다. 다른 것들은 변경 가능하여 문서 편집과 같이 데이터를 직접 업데이트하거나 삭제할 수 있습니다.

클라우드 스토리지

특정 클라우드 스토리지 시스템은 이전 버전을 유지하고 변경되지 않도록 잠그기 위해 변경할 수 없는 스토리지로 구성할 수 있습니다. 이렇게 하면 데이터가 실수로 변경되거나 삭제되는 것을 방지하는 데 도움이 됩니다. 변경 가능한 스토리지를 사용하면 언제든지 파일을 편집하거나 교체할 수 있습니다.

버전 관리 시스템

Git과 같은 많은 버전 제어 툴은 각 커밋이 변경할 수 없는 별도의 스냅샷으로 저장되는 불변 모델을 따릅니다. 새로운 변경 사항이 추가되는 경우에도 신뢰할 수 있는 버전 기록을 보장하는 데 도움이 됩니다.