맨위로가기

모듈성 (프로그래밍)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

모듈성(프로그래밍)은 컴퓨터 프로그램을 독립적인 모듈로 구성하여 프로그램의 유지 보수성, 재사용성 및 가독성을 향상시키는 프로그래밍 원칙이다. 모듈 프로그래밍은 코드 재사용을 위해 초기 소프트웨어 시스템에서 시작되었으며, 1960년대 후반과 1970년대에 구조적 프로그래밍의 연장선으로 발전했다. 모듈은 ALGOL 68, Modula, Mesa, 파스칼, C++, Java, Python 등 다양한 프로그래밍 언어에서 지원되며, 모듈 간의 잘 정의된 인터페이스를 통해 각 모듈이 독립적인 기능을 수행하고 상호 작용하도록 설계된다. 모듈식 시스템은 컴파일러를 통해 별도로 컴파일되고 링커에 의해 연결되며, 이를 통해 코드의 재사용성과 팀 협업 효율성을 높일 수 있다.

더 읽어볼만한 페이지

  • 프로그래밍 패러다임 - 지식 표현
    지식 표현은 컴퓨터가 인간의 지식을 이해하고 활용하도록 정보를 구조화하는 기술이며, 표현력과 추론 효율성의 균형, 불확실성 처리 등을 핵심 과제로 다양한 기법과 의미 웹 기술을 활용한다.
  • 프로그래밍 패러다임 - 의도적 프로그래밍
    의도적 프로그래밍은 프로그래머의 의도를 명확히 포착하고 활용하여 소프트웨어 개발 생산성을 향상시키기 위한 프로그래밍 패러다임으로, 트리 기반 저장소를 사용해 코드 의미 구조를 보존하고, WYSIWYG 환경에서 도메인 전문가와 협업하며, 코드 상세 수준 조절 및 자동 문서화를 통해 가독성과 유지보수성을 높이는 데 중점을 둔다.
모듈성 (프로그래밍)
모듈러 프로그래밍
유형프로그래밍 패러다임
고려 사항모듈성, 캡슐화, 정보 은닉, 응집도, 결합도, 관심사 분리
모듈성
목표코드 재사용성, 유지보수성 향상
장점코드 가독성 및 재사용성 향상
대규모 코드베이스 관리 용이
병렬 개발 가능
변경사항 격리
일반적인 방법라이브러리
클래스
패키지
서브루틴
기타 고려 사항모듈 간 인터페이스 설계
모듈 간 의존성 관리
모듈 테스트
관련 개념
관련 개념추상화
캡슐화
정보 은닉
관심사 분리
같이 보기
같이 보기결합도
응집도
동시성
함수형 프로그래밍
라이브러리
매크로
모듈
플러그인
소스 코드
참고 문헌
참고 문헌David Parnas (1972). "On the criteria to be used in decomposing systems into modules". 《Communications of the ACM》 15 (12): 1053–1058.

2. 역사

모듈 프로그래밍은 코드 재사용을 위해 서브 시스템(특히 I/O용)과 소프트웨어 라이브러리 형태로 초기 소프트웨어 시스템에서부터 사용되었다. 모듈 프로그래밍 자체는 1960년대 후반과 1970년대에 구조적 프로그래밍 (1960년대) 개념의 확장으로 개발되었다. "모듈 프로그래밍"이라는 용어는 최소 1968년 7월 래리 콘스탄틴이 조직한 모듈 프로그래밍에 관한 전국 심포지엄에서 유래되었으며, 정보 은닉 (1972)과 관심사 분리 (SoC, 1974)가 핵심 개념이다.[1]

1980년대와 1990년대에는 객체 지향 프로그래밍에 가려져 종종 혼동되었는데, 특히 C++와 Java의 인기가 높았기 때문이다. C 계열 언어는 C++ (원래 C with Classes, 1980)와 Objective-C (1983)에서 객체와 클래스를 지원했지만, 30년 이상 후에야 모듈을 지원했다. Java (1995)는 패키지 형태로 모듈을 지원하지만, 코드 구성의 주요 단위는 클래스이다. Python (1991)은 처음부터 모듈과 객체를 모두 사용했으며, 모듈을 코드 구성의 주요 단위로, "패키지"를 더 큰 규모의 단위로 사용했다. Perl 5 (1994)는 모듈과 객체를 모두 지원하며, CPAN (1993)에서 다양한 모듈을 사용할 수 있다. OCaml (1996)은 ML을 따라 모듈과 펑터를 지원했다.

모듈 프로그래밍은 현재 널리 사용되고 있으며, 1990년대 이후 개발된 거의 모든 주요 언어에서 발견된다. 모듈의 상대적 중요성은 언어에 따라 다르며, 클래스 기반 객체 지향 언어에서는 조직 및 캡슐화 단위로서 클래스와 중복 및 혼동이 여전히 있지만, 이 두 가지는 모두 별개의 개념으로 잘 확립되어 있다.

2. 1. 초기 모듈 프로그래밍 언어

ALGOL 68 (1968)의 원래 명세에는 모듈이 포함되지 않았지만, 초기 구현인 ALGOL 68-R (1970)과 ALGOL 68C (1970)에 확장 기능으로 포함되었고, 나중에 정식화되었다.[1] 처음부터 모듈 프로그래밍을 위해 설계된 최초의 언어 중 하나는 니클라우스 비르트가 만든 단명했던 Modula (1975)였다. 또 다른 초기 모듈 언어는 제록스 PARC의 Mesa (1970년대)였으며, 비르트는 후속작인 Modula-2 (1978)에서 Mesa와 원래 Modula를 모두 참고했다. 이는 특히 후속작인 Modula-3 (1980년대)를 통해 후기 언어에 영향을 미쳤다. 모듈의 M.a와 같이 모듈 M에서 객체 a를 참조하기 위해 점으로 정규화된 이름을 사용하는 Modula의 방식은 레코드 필드에 접근하는 표기법(객체의 속성 또는 메서드에 대해서도 유사함)과 일치하며, 현재 널리 사용되고 있다. C++, C#, Dart, Go, Java, OCaml, Python 등에서 이러한 방식을 볼 수 있다.

모듈 프로그래밍은 1980년대부터 널리 퍼졌다. 원래 파스칼 (1970)에는 모듈이 포함되지 않았지만, 이후 버전, 특히 UCSD 파스칼 (1978)과 터보 파스칼 (1983)에는 "유닛" 형태로 모듈이 포함되었으며, 파스칼의 영향을 받은 Ada (1980)도 마찬가지였다. Extended Pascal ISO 10206:1990 표준은 모듈 지원에서 Modula-2에 더 가깝게 유지되었다. Standard ML (1984)[2]에는 모듈 간 매핑을 위한 펑터 (매개변수화된 모듈)를 포함하여 가장 완벽한 모듈 시스템 중 하나가 있다.

2. 2. 모듈 프로그래밍의 확산

모듈 프로그래밍은 1960년대 후반과 1970년대에 구조적 프로그래밍의 개념을 확장하여 개발되었다. "모듈 프로그래밍"이라는 용어는 1968년 7월 래리 콘스탄틴이 조직한 모듈 프로그래밍에 관한 전국 심포지엄에서 유래되었다.[1] 이와 관련된 핵심 개념으로는 정보 은닉 (1972)과 관심사 분리 (SoC, 1974)가 있다.

ALGOL 68 (1968)의 원래 명세에는 모듈이 포함되지 않았지만, 초기 구현인 ALGOL 68-R (1970)과 ALGOL 68C (1970)에 확장 기능으로 포함되었고, 나중에 정식화되었다.[1] 모듈 프로그래밍을 위해 처음부터 설계된 최초의 언어 중 하나는 니클라우스 비르트가 만든 Modula (1975)였다. 또 다른 초기 모듈 언어는 제록스 PARC의 Mesa (1970년대)였으며, 비르트는 Modula-2 (1978)에서 Mesa와 Modula를 참고했다. Modula-2는 Modula-3 (1980년대)를 통해 후기 언어에 영향을 미쳤다. 모듈의 M.a와 같이 모듈 M에서 객체 a를 참조하기 위해 점으로 정규화된 이름을 사용하는 방식은 C++, C#, Dart, Go, Java, OCaml, Python 등에서 널리 사용되고 있다.

1980년대부터 모듈 프로그래밍이 널리 퍼졌다. 원래 파스칼 (1970)에는 모듈이 없었지만, UCSD 파스칼 (1978)과 터보 파스칼 (1983)에는 "유닛" 형태로 포함되었고, Ada (1980)도 마찬가지였다. Extended Pascal ISO 10206:1990 표준은 모듈 지원에서 Modula-2에 더 가깝게 유지되었다. Standard ML (1984)[2]에는 모듈 간 매핑을 위한 펑터 (매개변수화된 모듈)를 포함하여 가장 완벽한 모듈 시스템 중 하나가 있다.

1980년대와 1990년대에는 모듈 프로그래밍이 객체 지향 프로그래밍에 가려져 혼동되기도 했다. C 계열 언어는 C++ (원래 C with Classes, 1980)와 Objective-C (1983)에서 객체와 클래스를 지원했지만, 30년 이상 후에야 모듈을 지원했다. Java (1995)는 패키지 형태로 모듈을 지원하지만, 코드 구성의 주요 단위는 클래스이다. Python (1991)은 처음부터 모듈과 객체를 모두 사용했으며, 모듈을 코드 구성의 주요 단위로, "패키지"를 더 큰 규모의 단위로 사용했다. Perl 5 (1994)는 모듈과 객체를 모두 지원하며, CPAN (1993)에서 다양한 모듈을 사용할 수 있다. OCaml (1996)은 ML을 따라 모듈과 펑터를 지원했다.

모듈 프로그래밍은 현재 널리 사용되며, 1990년대 이후 개발된 거의 모든 주요 언어에서 발견된다.

2. 3. 객체 지향 프로그래밍과의 관계

클래스와 라이브러리를 통해 잘 정의된 인터페이스모듈이라는, 본체와 독립된 하위 객체라는 관계를 따르며, 이는 모듈성을 향상시키는 방법이다. 1980년대와 1990년대에는 모듈 프로그래밍이 객체 지향 프로그래밍에 가려져 혼동되기도 했다. C++, Java와 같은 인기있는 언어들은 객체와 클래스를 지원했지만, 모듈 지원은 훨씬 뒤늦게 이루어졌다. Java는 패키지 형태로 모듈을 지원하지만, 코드 구성의 주요 단위는 클래스이다. 반면 Python은 처음부터 모듈과 객체를 모두 중요하게 사용했다.

2. 4. 현대적 발전

모듈성은 컴퓨터 프로그램모듈이라고 부르는 분리된 부분으로 작성될 때 나타나는 특성이다.

프로그램에서 임의의 두 부분이 직접적인 상호관계가 많아지면, 주로 모듈 간의 관계에 잘 정의된 인터페이스가 나타나는 프로그램에 비하여 모듈성이 떨어진다.

'''모듈화 프로그래밍''' 기법은 모듈성을 높이는 것이다.

따라서 클래스에 의해서 그리고 라이브러리에 의해 잘 정의된 인터페이스모듈이라는 기본적으로 본체에 대한 독립된 하위 객체라는 필연적인 관계의 큰 틀을 따르는 본체와 모듈간에 가지고 있는 문제들을 해결해 나가는 과정을 보여준다.

3. 용어

.NET 언어에서 사용되는 어셈블리(예: C#, F#, Visual Basic .NET)나 Dart, Go, Java에서 사용되는 패키지와 같은 용어가 '''모듈''' 대신 사용되기도 한다. 그러나 다른 구현에서는 이러한 개념이 서로 다를 수 있다. 예를 들어 파이썬에서 패키지는 모듈의 모음이며, Java 9에서는 새로운 모듈 개념(향상된 접근 제어가 있는 패키지 모음)이 도입되었다.[1]

"패키지"라는 용어는 소프트웨어에서 다른 용도로도 사용될 수 있다(예: .NET NuGet 패키지). 컴포넌트는 비슷한 개념이지만, 일반적으로 더 높은 수준을 의미한다. 컴포넌트는 전체 시스템의 일부인 반면, 모듈은 개별 프로그램의 일부이다. "모듈"이라는 용어의 규모는 언어마다 크게 다르다. 파이썬에서는 매우 작은 규모로 각 파일이 모듈인 반면, Java 9에서는 모듈이 패키지의 모음이고, 패키지는 다시 파일의 모음인 대규모로 계획되어 있다.[1]

모듈에 대한 다른 용어로는 파스칼 방언에서 사용되는 '''유닛'''이 있다.[1]

4. 언어 지원

에이다, ALGOL, BlitzMax, C++, C#, Clojure, COBOL, Common Lisp, D, Dart, eC, Erlang, Elixir, Elm, F, F#, 포트란, Go, Haskell, IBM/360 어셈블러, 제어 언어 (CL), IBM RPG, 자바, 줄리아, MATLAB, ML, Modula, Modula-2, Modula-3, Morpho, NEWP, Oberon, Oberon-2, Objective-C, OCaml, 여러 파스칼 파생 언어 (Component Pascal, Object Pascal, Turbo Pascal, UCSD Pascal), Perl, PHP, PL/I, PureBasic, 파이썬, R, 루비,[4] 러스트, 자바스크립트,[5] Visual Basic (.NET) 및 WebDNA는 모듈 개념을 공식적으로 지원한다.

C, 원래 형태의 C++, 파스칼은 모듈을 지원하지 않았지만, CC++에서는 헤더 파일을 사용하여 별도 컴파일과 선언적 인터페이스 지정을 허용한다. 모듈은 iOS 7 (2013)에서 Objective-C에, C++20에서 C++에 추가되었으며,[6] 파스칼은 처음부터 모듈을 포함한 Modula와 Oberon 및 다양한 파생 언어로 대체되었다. 자바스크립트는 ECMAScript 2015부터 네이티브 모듈을 가지고 있다.

IBM i는 통합 언어 환경 (ILE)에서 프로그래밍할 때 모듈을 사용하며, C와 같이 프로그래밍 언어에 명명된 모듈을 지원하는 명시적인 구문 기능이 없는 경우에도 기존의 언어 기능, 코딩 규칙, 프로그래밍 관용구, 물리적 코드 구조를 사용하여 모듈식 프로그래밍을 수행할 수 있다.

5. 핵심 측면

'''모듈성'''은 컴퓨터 프로그램모듈이라고 부르는 분리된 부분으로 작성될 때 나타나는 특성이다. 프로그램에서 임의의 두 부분이 직접적인 상호관계가 많아지면, 주로 모듈 간의 관계에 잘 정의된 인터페이스가 나타나는 프로그램에 비하여 모듈성이 떨어진다.

클래스와 라이브러리에 의해 잘 정의된 인터페이스모듈이라는, 기본적으로 본체에 대한 독립된 하위 객체라는 필연적인 관계의 큰 틀을 따르는 본체와 모듈 간에 가지고 있는 문제들을 해결해 나가는 과정을 보여준다.

종종 모듈은 방향 비순환 그래프 (DAG)를 형성한다. 이 경우 모듈 간의 순환 종속성은 이를 단일 모듈로 간주해야 함을 나타낸다. 모듈이 DAG를 형성하는 경우 계층 구조로 배열할 수 있으며, 최하위 모듈은 독립적이며 다른 모듈에 의존하지 않고, 상위 모듈은 하위 모듈에 의존한다. 특정 프로그램 또는 라이브러리는 자체 계층 구조의 최상위 모듈이지만, 상위 수준 프로그램, 라이브러리 또는 시스템의 하위 수준 모듈로 간주될 수 있다.

5. 1. 모듈화의 이점

모듈화 프로그래밍 기법은 모듈성을 높이는 것이다. 모듈 프로그래밍을 사용하면 관심사를 분리하여 모듈이 논리적으로 개별적인 기능을 수행하고 잘 정의된 인터페이스를 통해 상호 작용한다.

모듈식 시스템을 만들 때는 모놀리식 응용 프로그램(가장 작은 구성 요소가 전체인 경우)을 만드는 대신, 여러 개의 작은 모듈을 별도로 작성하여 함께 구성하면 실행 가능한 응용 프로그램이 구성된다. 일반적으로 컴파일러를 통해 별도 컴파일 방식으로 별도로 컴파일된 다음, 링커에 의해 연결된다. JIT 컴파일러는 런타임에 이 구성을 "on-the-fly"로 수행할 수 있다.

모듈식으로 설계된 시스템은 올바르게 구축된 경우, 기존의 모놀리식 설계보다 훨씬 더 재사용이 가능하다. 이러한 모든 (또는 많은) 모듈이 다른 프로젝트에서 (변경 없이) 재사용될 수 있기 때문이다. 또한 프로젝트를 여러 개의 작은 프로젝트로 "분해"하는 것을 용이하게 한다. 이론적으로, 모듈화된 소프트웨어 프로젝트는 대규모 팀에서 더 쉽게 조립할 수 있는데, 이는 팀 구성원이 전체 시스템을 만들거나 시스템 전체에 대해 알 필요가 없이 할당된 작은 작업에만 집중할 수 있기 때문이다.

5. 2. 모듈 구성

모듈은 컴파일러를 통해 별도 컴파일 방식으로 별도로 컴파일된 다음, 링커에 의해 연결된다. JIT 컴파일러는 런타임에 이 구성을 "on-the-fly"로 수행할 수 있다.

이렇게 독립적인 기능은 일반적으로 프로그램 제어 기능 또는 특정 작업 기능으로 분류된다. 프로그램 제어 기능은 하나의 프로그램에 맞게 설계되었고, 특정 작업 기능은 다양한 프로그램에 적용할 수 있도록 면밀히 준비되었다.

모듈식으로 설계된 시스템은 올바르게 구축된 경우, 기존의 모놀리식 설계보다 훨씬 더 재사용이 가능하다. 이러한 모든 (또는 많은) 모듈이 다른 프로젝트에서 변경 없이 재사용될 수 있기 때문이다. 또한 프로젝트를 여러 개의 작은 프로젝트로 "분해"하는 것을 용이하게 한다. 이론적으로, 모듈화된 소프트웨어 프로젝트는 대규모 팀에서 더 쉽게 조립할 수 있는데, 팀 구성원이 전체 시스템을 만들거나 시스템 전체에 대해 알 필요가 없이 할당된 작은 작업에만 집중할 수 있기 때문이다.[1]

5. 3. 컴파일 및 링크

모듈식 시스템을 만들 때는 모놀리식 응용 프로그램(가장 작은 구성 요소가 전체인 경우)을 만드는 대신, 여러 개의 작은 모듈을 별도로 작성하여 함께 구성하면 실행 가능한 응용 프로그램이 구성된다. 일반적으로 컴파일러를 통해 별도 컴파일 방식으로 별도로 컴파일된 다음, 링커에 의해 연결된다. JIT 컴파일러는 런타임에 이 구성을 "on-the-fly"로 수행할 수 있다.

이러한 독립적인 기능은 일반적으로 프로그램 제어 기능 또는 특정 작업 기능으로 분류된다. 프로그램 제어 기능은 하나의 프로그램에 맞게 설계되었고, 특정 작업 기능은 다양한 프로그램에 적용할 수 있도록 면밀히 준비되었다.

참조

[1] 간행물 Proposal for a Modules Facility in ALGOL 68 http://archive.compu[...] 1976-02
[2] conference Modules for Standard ML https://dl.acm.org/d[...] 1984-08
[3] 서적 The Java Language Specification, Third Edition 2005
[4] 웹사이트 Class: Module (Ruby 2.0.0) http://ruby-doc.org/[...]
[5] 문서 ECMAScript® 2015 Language Specification, 15.2 Modules http://www.ecma-inte[...]
[6] 웹사이트 N4720: Working Draft, Extensions to C++ for Modules https://isocpp.org/f[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com