속성(프로그래밍)

Property (programming)

속성은 일부 객체 지향 프로그래밍 언어에서 필드(또는 데이터 멤버)와 메서드 사이의 기능에서 중간인 특별한 종류의 클래스 멤버입니다.속성을 읽고 쓰는 구문은 필드의 구문과 비슷하지만 속성 읽기 및 쓰기는 일반적으로 'getter' 및 'setter' 메서드 호출로 변환됩니다.필드와 같은 구문은 많은 메서드[citation needed] 호출보다 읽고 쓰기가 쉽지만 "후드 아래" 메서드 호출을 배치함으로써 데이터 검증, 활성 업데이트(예를 들어 GUI 요소의 업데이트), 또는 "읽기 전용 필드"라고 불리는 것을 구현할 수 있습니다.

C#언어에 대한 자세한 예는 다음과 같습니다.

언어 지원

속성을 지원하는 프로그래밍 언어로는 ActionScript 3, C#, D, Delphi/Free Pascal, eC, F#, Kotlin, JavaScript, Objective-C 2.0, Python, Scala, Swift, Lua, Visual Basic 등이 있습니다.

Java 및 C++와 같은 일부 객체 지향 언어는 속성을 지원하지 않으므로 프로그래머는 대신 [1][citation needed]접근자변환자 메서드의 쌍을 정의해야 합니다.

Oberon-2는 객체 가변 가시성 [citation needed]플래그를 사용하여 대체 메커니즘을 제공합니다.

GroovyJava Virtual Machine용으로 설계된 다른 언어는 기본적으로 속성을 지원합니다.

C++에는 퍼스트 클래스 속성이 없지만 연산자 오버로드[2]에뮬레이트할 수 있습니다.

또한 일부 C++ 컴파일러는 언어 [citation needed]확장자로 퍼스트 클래스 속성을 지원합니다.

많은 객체 지향 언어에서 속성은 접근자/변환자 메서드의 쌍으로 구현되지만 공용 필드에서와 동일한 구문을 사용하여 액세스됩니다.쌍에서 메서드를 생략하면 읽기 전용 또는 일반적이지 않은 쓰기 전용 속성이 생성됩니다.

속성에 대한 기본 지원이 없는 일부 언어에서는 호출 컨텍스트에 따라 기본 데이터를 반환하거나 변경하는 단일 메서드로 유사한 구성을 구현할 수 있습니다.이러한 기술은 [citation needed]Perl 등에서 사용됩니다.

일부 언어(루비, 스몰토크)는 통사당(통사당)을 제한적으로 사용하여 일반적인 방법을 사용하여 속성 같은 구문을 얻습니다.

구문 변형

일부 언어는 속성 및 메서드를 공식적으로 지정하고 사용하기 위해 잘 확립된 구문 규칙을 따릅니다.

다음 표기법 중 하나:

  • 도트 표기법
  • 괄호 표기법

도트 표기법

다음 예제에서는 JavaScript의 도트 표기법을 보여 줍니다.

문서.create Element(요소 생성)(프리); 

괄호 표기법

다음으로 JavaScript의 괄호 표기 예를 나타냅니다.

문서['createElement'](프리); 

구문 예시

C#

학급   {     사적인 인트 색.; // 개인 필드          // 공용 속성     일반의 인트 색.      {           얻다         {             돌아가다 이것..색.;         }         세트          {             한다면 (가치 > 0) {                 이것..색. = 가치;             }         }     } } 
// 액세스:   = 신규 (); 인트 color_tmp = 0; // ... .색. = 17; color_tmp = .색.; // ... .색. = ~.색.; // 비트 보완...  // 또 다른 어리석은 예: .색. += 1; // "펜"보다 훨씬 더 선명합니다.set_Color(pen.get_Color() + 1)! 

최신 C# 버전에서는 컴파일러가 컴파일 중에 속성의 backing 필드를 생성하는 "자동 구현 속성"도 사용할 수 있습니다.즉, 속성에는 setter가 있어야 합니다.단, 비공개일 수 있습니다.

학급 모양.  {          일반의 Int32 높이 { 얻다; 세트; }     일반의 Int32   { 얻다; 사적인 세트; }      } 

C++

C++에는 퍼스트 클래스 속성이 없지만 속성을 제한적으로 에뮬레이트할 수 있는 몇 가지 방법이 있습니다.그 중 두 가지는 다음과 같습니다.

표준 C++ 사용

#실패하다 <iostream>  템플릿 < >타이프네임 T> 학급 소유물 {         T 가치;     일반의:         T & 교환입니다. = (컨스턴트 T &i) {             돌아가다 가치 = i;         }         // 이 템플릿클래스 멤버 함수 템플릿은 다음과 같은 목적으로 사용됩니다.         // 입력이 더 엄격합니다.여기에 할당할 수 있는 것은 완전히 동일한 유형뿐입니다.         // 에러가 발생하는 이유는 참조 초기화 시 암묵적 유형 변환 중에 생성된 임시 변수입니다.         템플릿 < >타이프네임 T2> T2 & 교환입니다. = (컨스턴트 T2 &i) {             T2 &경비원 = 가치;             던지다 경비원; // 도달하지 못했습니다.         }          // 암묵적으로 T로 변환합니다.         교환입니다. T 컨스턴트 & () 컨스턴트 {             돌아가다 가치;         } };  구조 푸우 {     // 이름 없는 클래스를 사용하는 속성.     학급 {             인트 가치;         일반의:             인트 & 교환입니다. = (컨스턴트 인트 &i) { 돌아가다 가치 = i; }             교환입니다. 인트 () 컨스턴트 { 돌아가다 가치; }     } 알파;      학급 {             흘러가다 가치;         일반의:             흘러가다 & 교환입니다. = (컨스턴트 흘러가다 &f) { 돌아가다 가치 = f; }             교환입니다. 흘러가다 () 컨스턴트 { 돌아가다 가치; }     } 브라보!; };  구조 막대 {     // 속성 <>-템플릿 사용.     소유물 < >부울> 알파;     소유물 < >서명되어 있지 않다 인트> 브라보!; };  인트 주된 () {     푸우 후우;     후우.알파 = 5;     후우.브라보! = 5. 135f;      막대 막대기;     막대기.알파 = 진실의;     막대기.브라보! = 진실의; // 이 행은 컴파일 시간 오류를 발생시킵니다.                       // 가드 템플릿멤버 기능으로 인해.     ::표준::외치다 << > 후우.알파 << > ", "                 << > 후우.브라보! << > ", "                 << > 막대기.알파 << > ", "                 << > 막대기.브라보!                 << > ::표준::;     돌아가다 0; } 

상세한 예에 대해서는, 「스택 오버플로우」도 참조해 주세요.

C++, Microsoft, GCC, LLVM/Clang 및 C++빌더 고유

MSDN 문서 페이지에서 가져온 예.

// decspec_decl.cpp 구조 S {    인트 i;    무효 풋프롭(인트 j)    {        i = j;    }     인트 프롭을 가져오다()    {       돌아가다 i;    }     __declspec(소유물(얻다 = 프롭을 가져오다, 놓다 = 풋프롭)) 인트 프롭; };  인트 주된() {    S s;    s.프롭 = 5;    돌아가다 s.프롭; } 

D

학급  {     사적인 인트 m_color; // 개인 필드          // public get 속성     일반의 인트 색. () {         돌아가다 m_color;     }          // 공개 세트 속성     일반의 무효 색. (인트 가치) {          m_color = 가치;     } } 
자동  = 신규 ; .색. = ~.색.; // 비트 보완  // 일반 할당과 마찬가지로 식에서도 set 속성을 사용할 수 있습니다. 인트 컬러 = (.색. = 0xFF0000); 

D 버전 2에서는 각 속성 액세스자 또는 뮤테이터에 @property를 표시해야 합니다.

학급  {     사적인 인트 m_color; // 개인 필드          // public get 속성     @parames(@parames) 일반의 인트 색. () {         돌아가다 m_color;     }          // 공개 세트 속성     @parames(@parames) 일반의 무효 색. (인트 가치) {         m_color = 가치;     } } 

델파이/프리 파스칼

유형 TPen = 학급   사적인     FCollor: TCollor;     기능. GetColor(컬러): TCollor;     절차. 세트 컬러(컨스턴트 에바루: TCollor);   일반의     소유물 색.: 정수 읽어주세요 GetColor(컬러) 쓰다 세트 컬러; 끝.;  기능. TPen.GetColor(컬러): TCollor; 시작한다.   결과 := FCollor; 끝.;  절차. TPen.세트 컬러(컨스턴트 에바루: TCollor); 시작한다.   한다면 FCollor << 고객명 >>님 에바루    그리고나서 FCollor := 에바루; 끝.; 
// 액세스: 변화하다 : TPen; // ... .색. := 것은 아니다. .색.;  (* Dellphi는 '직접 필드' 구문도 지원합니다.  속성 색상: TColler 읽기 FCollor 쓰기 SetColor;  또는  속성 색상: TColler 읽기 GetColor 쓰기 FCollor;  여기서 컴파일러는 읽기 및 쓰기와 동일한 코드를 생성합니다. 들판이를 통해 필드의 효율과 자산의 안전성을 확보할 수 있습니다. (속성에 대한 포인터를 얻을 수 없으며 언제든지 멤버를 바꿀 수 있습니다. 액세스 할 수 있습니다). *) 

eC

학급   {    // 개인 데이터 멤버    색. 색.; 일반의:    // 공용 속성    소유물 색. 색.     {         얻다 { 돌아가다 색.; }       세트 { 색. = 가치; }    } }  블랙펜 { 색. = 블랙입니다. };  화이트펜 { 색. = 하얀색 };  펜3 { 색. = { 30, 80, 120 } };  펜4 { 색. = 컬러 HSV { 90, 20, 40 } }; 

F#

유형 () = 학급     허락하다 변이 가능한 _색. = 0      멤버 이것..색.         와 함께 얻다() = _색.         그리고. 세트 가치 = _색. <-> 가치 끝. 
허락하다  = 신규 () .색. <-> ~~~.색. 

자바스크립트

기능. () {     이것.._컬러 = 0; } // 속성을 펜 타입 자체에 추가합니다. // 인스턴스에서 개별적으로 설정 물건.define Properties(정의 속성)(.시제품, {     색.: {         얻다: 기능. () {             돌아가다 이것.._컬러;         },         세트: 기능. (가치) {             이것.._컬러 = 가치;         }     } }); 
변화하다  = 신규 (); .색. = ~.색.; // 비트 보완 .색. += 1; // 1개 추가 

액션 스크립트 3.0

패키지  {  일반의 학급  {   사적인 변화하다 _개요. = 0;      일반의 기능. 얻다 밝다 ():설치하다 {    돌아가다 _개요/;   }      일반의 기능. 세트 색.(가치:설치하다):무효 {    _컬러 = 가치;   }  } } 
변화하다 : = 신규 (); .색. = ~.색.; // 비트 보완 .색. += 1; // 1개 추가 

목표-C 2.0

@interface Pen : NSObject @property (복사) NSCollor *colour; // "copy" 속성을 사용하면 원본이 아닌 // 객체복사본이 유지됩니다.@end @implementation Pen @synthesize color; // 접근기 메서드를 합성하는 컴파일러 명령어. // Xcode 4.5 이후로는 남길있습니다.@end

위의 예는 다음과 같은 임의의 방법으로 사용할 수 있습니다.

 * = [[ 할당하다] 초기화]; .색채 = [NSCollor 블랙 컬러]; 흘러가다 빨간. = .색채.적색 컴포넌트; [.색채 drawSwatchInRect: NSMake 수정(0, 0, 100, 100)]; 

PHP

학급  {     사적인 인트 $color = 1;      기능. __설정($140, $value($value))     {         한다면 (property_module($ this, $140)) {              $ this->$140 = $value($value);         }     }      기능. __취득($140)     {         한다면 (property_module($ this, $140)) {             돌아가다 $ this->$140;         }         돌아가다 무효;     } } 
p달러 = 신규 (); p달러->색. = ~p달러->색.; // 비트 단위 보완 메아리치다 p달러->색.; 

파이썬

속성은 새 유형 클래스(클래스:objectPython 2.2 이상에서만 사용할 수 있습니다(Python 2.2에서 유형클래스 통합 튜토리얼관련 섹션 참조).Python 2.6은 속성을 정의하는 데코레이터를 포함하는 새로운 구문을 추가했습니다.

학급 :     방어하다 __init__(자신) -> 없음.:         자신._컬러 = 0  # "private" 변수      @parames(@parames)     방어하다 색.(자신):         돌아가다 자신._컬러      @color.세터     방어하다 색.(자신, 색.):         자신._컬러 = 색. 
 = () 액세스 수: .색. = ~.색.  # 비트 보완... 

루비

학급    방어하다 초기화하다     @color = 0   끝.        # @color 필드의 getter를 정의합니다.   방어하다 색.     @color   끝.    # @color 필드의 세터를 정의합니다.   방어하다 color=(가치)     @color = 가치   끝. 끝.   = .신규 .색. = ~.색.    # 비트 단위 보완 

Ruby는 또한 클래스의 인스턴스 메서드로 정의된 자동 getter/setter 신시사이저를 제공합니다.

학급    attr_filterface : 브랜드    # @brand의 getter를 생성합니다(읽기 전용).   attr_writer : 사이즈     # @size용 세터를 생성합니다(쓰기 전용).   attr_accessor : 컬러  # @color의 getter와 setter를 모두 생성합니다(읽기/쓰기).    방어하다 초기화하다     @color = 0          # 객체 내에서 인스턴스 변수에 직접 액세스할 수 있습니다.     @브랜드 = '펜브랜드     @size = 0.7         # 그러나 attr_accessor Class 인스턴스 메서드로 정의된 setter 메서드를 사용할 수도 있습니다.   끝. 끝.   = .신규 놓다 .브랜드.           # 생성된 getter를 통해 펜 브랜드에 액세스합니다. .크기 = 0.5           # 생성된 세터를 통해 펜 크기 필드를 업데이트합니다. .색. = ~.색. 

비주얼 베이직

비주얼 베이직(.NET 2003-2010)

일반의 학급        사적인 _컬러 ~하듯이 정수 개인 필드      일반의 소유물 색.() ~하듯이 정수 공유 재산         얻다             돌아가다 _컬러         끝. 얻다         세트(바이밸 가치 ~하듯이 정수)             _컬러 = 가치         끝. 세트     끝. 소유물  끝. 학급 
' 펜 클래스 인스턴스 만들기 어둡다  ~하듯이 신규 ()  ' 값 설정 .색. = 1  ' 가치의 취득하다 어둡다 색. ~하듯이 Int32 = .색. 

Visual Basic(만)NET 2010)

일반의 학급       일반의 소유물 색.() ~하듯이 정수 공유 재산  끝. 학급 
' 펜 클래스 인스턴스 만들기 어둡다  ~하듯이 신규 ()  ' 값 설정 .색. = 1  ' 가치의 취득하다 어둡다 색. ~하듯이 Int32 = .색. 

비주얼 베이직 6

clsPen이라는 반에 있습니다. 사적인 m_컬러 ~하듯이   일반의 소유물 얻다 색.() ~하듯이      색. = m_컬러 끝. 소유물  일반의 소유물 허락하다 색.(바이밸 오른쪽 ~하듯이 )     m_컬러 = 오른쪽 끝. 소유물 
' 액세스: 어둡다  ~하듯이 신규 cls펜 ' ... .색. = 것은 아니다. .색. 

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Accessors And Mutators In Java". C# Corner - Community of Software and Data Developers. Retrieved 5 January 2022.
  2. ^ "Portability of Native C++ properties". Stack Overflow. Stack Overflow. Retrieved 5 January 2022.
  3. ^ "property (C++)". Microsoft technical documentation. Microsoft. Retrieved 5 January 2022.
  4. ^ "clang::MSPropertyDecl Class Reference". Clang: a C language family frontend for LLVM. Retrieved 5 January 2022.
  5. ^ "__property Keyword Extension". Embarcadero/IDERA Documentation Wiki. Retrieved 5 January 2022.