캡슐화 (컴퓨터 프로그래밍)
Encapsulation (computer programming)소프트웨어 시스템에서 캡슐화(encapsulation)는 데이터에 대해 작동하는 메커니즘 또는 방법으로 데이터를 번들링하는 것을 말합니다.또한 개체의 구성 요소와 같은 일부 데이터에 대한 직접 액세스의 제한을 가리킬 수도 있습니다.[1]캡슐화를 통해 개발자는 시스템 내부 구현 방식에 관계없이 일관되고 사용 가능한 인터페이스를 제공할 수 있습니다.예를 들어, 캡슐화는 클래스 내에서 구조화된 데이터 객체의 값 또는 상태를 숨기는데 사용될 수 있으며, 숨겨진 구현 세부 정보를 노출하거나 메소드에 의해 유지되는 상태 불변성을 위반할 수 있는 방식으로 클라이언트에 의한 직접 액세스를 방지합니다.
모든 OOP(object-oriented programming) 시스템은 캡슐화를[citation needed] 지원하지만 캡슐화는 OOP에만 있는 것은 아닙니다.추상적인 데이터 타입, 모듈, 라이브러리 등의 구현은 캡슐화(encapsulation)도 제공합니다.유사성은 프로그래밍 언어 이론가들에 의해 실존적 유형의 관점에서 설명되었습니다.[2]
의미.
객체 지향 프로그래밍 언어 및 기타 관련 분야에서 캡슐화는 서로 관련이 있지만 서로 다른 두 개념 중 하나를 가리키며 때로는 이들의 조합을 가리킵니다.[3][4]
- 개체의 일부 구성 요소에 대한 직접 액세스를 제한하는 언어 메커니즘입니다.[5][6]
- 해당 데이터에 대해 작동하는 방법(또는 다른 함수)을 사용하여 데이터를 번들링할 수 있도록 지원하는 언어 구성입니다.[1][7]
어떤 프로그래밍 언어 연구자와 학자들은 첫 번째 의미를 단독으로 또는 두 번째 의미와 결합하여 객체 지향 프로그래밍의 구별되는 특징으로 사용하는 반면, 어휘 폐쇄를 제공하는 일부 프로그래밍 언어는 캡슐화를 객체 지향에 직교하는 언어의 특징으로 봅니다.
두 번째 정의는 객체 지향 언어 및 기타 관련 분야에서 구성 요소를 자동으로 숨기지 않고 무시할 수 있기 때문에 두 번째 정의를 선호하는 사람들은 정보 숨기기를 별도의 개념으로 정의합니다.
캡슐화 기능은 다른 대안도 있지만 대부분의 객체 지향 언어에서 클래스를 사용하여 지원됩니다.
캡슐화 및 상속
디자인 패턴의 저자들은 상속과 캡슐화 사이의 긴장 관계에 대해 자세히 논의하고 있으며, 그들의 경험에서 디자이너들이 상속을 과도하게 사용한다고 말합니다.이들은 상속이 하위 클래스를 부모 구현의 세부 정보에 노출시키기 때문에 종종 상속이 캡슐화를 중단한다고 주장합니다.[8]yo-yo 문제에 의해 설명된 바와 같이, 상속의 과도한 사용과 따라서 캡슐화는 너무 복잡하고 디버깅하기 어려워질 수 있습니다.
정보숨김
캡슐화는 "데이터 멤버 및 멤버 기능을 숨기기 위해 사용될 수 있다"는 정의 아래에서 객체의 내부 표현은 일반적으로 객체의 정의 밖에서 보이지 않게 숨겨져 있습니다.일반적으로 객체 고유의 방법만이 객체 필드를 직접 검사하거나 조작할 수 있습니다.개체의 내부를 숨기면 사용자가 구성 요소의 내부 데이터를 잘못되거나 일관되지 않은 상태로 설정할 수 없게 되어 개체의 무결성을 보호합니다.캡슐화의 장점으로는 개발자가 소프트웨어 구성 요소 간의 상호 의존성을 제한할 수 있게 함으로써 시스템의 복잡성을 줄일 수 있고 따라서 견고성을 높일 수 있다는 것입니다.[citation needed]
Smalltalk나 Ruby와 같은 몇몇 언어들은 객체 메소드를 통해서만 접근을 허용하지만, 대부분의 다른 언어들(예: C++, C#, 델파이, 자바[9])은 프로그래머에게 숨겨진 것에 대한 어느 정도의 통제력을 제공합니다. 일반적으로 다음과 같은 키워드를 통해서 말이죠.public
그리고.private
.[6]ISO[6] C++ 표준은 다음을 나타냅니다.protected
,private
그리고.public
"액세스 지정자"로서 "어떤 정보도 숨기지 않는다"는 것입니다.정보 숨기기는 헤더 파일을 통해 인터페이스되는 소스 코드의 컴파일된 버전을 제공함으로써 수행됩니다.
거의 항상 리플렉션 API(Ruby, Java, C# 등), 때로는 이름 망글링(Python)과 같은 메커니즘 또는 특수 키워드 사용을 통해 이러한 보호를 무시하는 방법이 있습니다.friend
C++로객체 수준의 능력 기반 보안(객체 능력 모델 적용)을 제공하는 시스템은 예외이며 강력한 캡슐화를 보장합니다.
예
데이터 필드 제한
C++, C#, 자바,[9] PHP, 스위프트, 델파이 등의 언어는 데이터 필드에 대한 접근을 제한하는 방법을 제공합니다.
아래는 데이터 필드에 대한 접근이 a의 사용을 통해 제한될 수 있는 방법을 보여주는 C#의 예입니다.private
키워드:
학급 프로그램. { 일반의 학급 계좌 { 사적인 십진의 _계정잔액 = 500.00m; 일반의 십진의 잔액조회() { 돌아가다 _계정잔액; } } 정적인 공허한 주된() { 계좌 내 계정 = 신규 계좌(); 십진의 마이밸런스 = 내 계정.잔액조회(); /* 이 주요 방법은 대중을 통해 잔액을 확인할 수 있습니다. * 계정 클래스에서 제공하는 "CheckBalance" 메서드 * 그러나 "accountBalance" 값을 조작할 수 없습니다 */ } }
다음은 Java의 예입니다.
일반의 학급 직원 { 사적인 빅 데시말 급여 = 신규 빅 데시말(50000.00); 일반의 빅 데시말 봉급을 받다() { 돌아가다 이것..급여; } 일반의 정적인 공허한 주된() { 직원 e = 신규 직원(); 빅 데시말 살의 = e.봉급을 받다(); } }
객체 지향 언어가 아닌 언어에서도 캡슐화가 가능합니다.예를 들어, C에서, API의 클라이언트들이 접근할 수 없는 데이터 멤버들을 포함하는 데이터의 항목에 대해 동작하는 기능들의 집합에 대해 헤더 파일을 통해 공개 API에서 구조가 선언될 수 있습니다.extern
키워드.[10][11]
// 헤더 파일 "api.h" 짜임새 있는 독립체; // 멤버가 숨겨진 불투명 구조 // 'Entity' 객체에서 동작하는 API 기능 외전의 짜임새 있는 독립체 * 열린_(인트 이드); 외전의 인트 프로세스_(짜임새 있는 독립체 *정보); 외전의 공허한 밀접_(짜임새 있는 독립체 *정보); // 여기서 외부 키워드는 중복되지만 다치지는 마세요. // extern은 현재 파일 외부에서 호출할 수 있는 함수를 정의합니다. 키워드가 없어도 기본 동작입니다.
클라이언트는 불투명한 데이터 유형의 개체를 할당, 연산 및 할당 해제하기 위해 API 함수를 호출합니다.이 유형의 내용은 API 기능 구현에만 알 수 있고 액세스할 수 있으며, 클라이언트는 해당 내용에 직접 액세스할 수 없습니다.이러한 기능의 소스 코드는 구조의 실제 내용을 정의합니다.
// 구현 파일 "api.c" # # "api.h." 짜임새 있는 독립체 { 인트 ent_id; // 증명번호 차를 ent_name[20]; // 이름 ... 그리고. 다른. 회원들 ... }; // API 기능 구현 짜임새 있는 독립체 * 열린_(인트 이드) { ... } 인트 프로세스_(짜임새 있는 독립체 *정보) { ... } 공허한 밀접_(짜임새 있는 독립체 *정보) { ... }
이름 맹글링
아래는 가변 접근 제한을 지원하지 않는 파이썬의 예입니다.그러나 이름 앞에 밑줄이 붙어 있는 변수는 비공개로 간주해야 합니다.[12]
학급 차: 데프 __init__(자신) -> 없음.: 자신._최고속도 = 200 데프 운전해.(자신) -> 없음.: 활자로 찍어내다(f"최고 속도는"{자신._최고속도}.") 빨간 차 = 차() 빨간 차.운전해.() # 그러면 '최대 속도는 200입니다'라고 출력됩니다. 빨간 차._최고속도 = 10 빨간 차.운전해.() # 그러면 '최대 속도는 10'이라고 출력됩니다.
참고 항목
인용문
- ^ a b Rogers, Wm. Paul (18 May 2001). "Encapsulation is not information hiding". JavaWorld. Retrieved 2020-07-20.
- ^ Pierce 2002, § 24.2 존재하는 데이터 추상화
- ^ Scott, Michael Lee (2006). Programming language pragmatics (2 ed.). Morgan Kaufmann. p. 481. ISBN 978-0-12-633951-2.
Encapsulation mechanisms enable the programmer to group data and the subroutines that operate on them together in one place, and to hide irrelevant details from the users of an abstraction
- ^ Dale, Nell B.; Weems, Chip (2007). Programming and problem solving with Java (2nd ed.). Jones & Bartlett. p. 396. ISBN 978-0-7637-3402-2.
- ^ Mitchell, John C. (2003). Concepts in programming languages. Cambridge University Press. p. 522. ISBN 978-0-521-78098-8.
- ^ a b Pierce, Benjamin (2002). Types and Programming Languages. MIT Press. p. 266. ISBN 978-0-262-16209-8.
- ^ Connolly, Thomas M.; Begg, Carolyn E. (2005). "Ch. 25: Introduction to Object DMBS § Object-oriented concepts". Database systems: a practical approach to design, implementation, and management (4th ed.). Pearson Education. p. 814. ISBN 978-0-321-21025-8.
- ^ Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Design Patterns. Addison-Wesley. ISBN 978-0-201-63361-0.
- ^ a b Bloch 2018, pp. 73–77, Chapter §4 Item 15 수업 및 구성원의 접근성 최소화
- ^ King, K. N. (2008). C Programming: A Modern Approach (PDF) (2nd ed.). W. W. Norton & Company. p. 464. ISBN 978-0393979503. Retrieved 1 November 2019.
- ^ King, Kim N.C programming: 현대적 접근법WW Norton & Company, 2008.18장, 페이지 464, ISBN 0393979504
- ^ Bader, Dan. "The Meaning of Underscores in Python". Improve Your Python Skills. Retrieved 1 November 2019.
참고문헌
- Bloch, Joshua (2018). "Effective Java: Programming Language Guide" (third ed.). Addison-Wesley. ISBN 978-0134685991.