-
[이도저도] c# 고수님 모십니다2020.11.11 PM 07:33
사실 고수라고 해봤자 초기에 나오는 내용이기는 한지라 아실 수 있는 분은 아실 겁니다
단순 사용법이 아니라 개념적으로 좀 이해하셔야 답변을 해주실 수 있긴한데
질문이 모냐하면
이게 사실 c++ 때부터 넘어오는건데
c++ 는 데이터의 은닉성을 위해서
변수는 private 에 set 과 get 을 써서 접근하잖아요
근데
c#에서는 프로퍼티를 써서 할 수 있는데
예를 들어
public int variable { get; set; }
이렇게 기본 프로퍼티 형태로 가버리면
데이터의 은닉성이 완전히 사라지게 되잖아요?
변수 자체를 그냥 다른 곳에서 읽고 쓸 수 있으니깐요
프로퍼티 기본 폼을 쓰는 이유를 간단하게 알 수 있을까요?
그러면 private 으로 선언하게 되면 get 과 set 을 만들어주거나
public int Variable {
get {
return variable;
}
set {
variable = value;
}
}
이렇게 다른 접근용 프로퍼티(?) 를 만들어주어야 하나요??
이런 형태임에도 불구하고 변수는 꼭 왜 public int variable { get; set; } 선언해서 써야하는지 다시 궁금 안해질 수가 없네요
댓글 : 15 개
- 잉그람
- 2020/11/11 PM 07:39
간단하게
public int value { get; private set; }
이렇게 사용하면, 클래스 외부에서 설정은 불가능 하고 값만 넘겨 주도록 할 수 있습니다.
또, 본문의 예시 코드 처럼 직접 set 구문을 구현하고 값을 실제 변수에 설정 전/후의 처리를 할 수 있고,
get 구문에서 값 리턴전에 값의 유효성 체크에 따라 예외를 던지거나 하는 처리가 가능 합니다.
public int value { get; private set; }
이렇게 사용하면, 클래스 외부에서 설정은 불가능 하고 값만 넘겨 주도록 할 수 있습니다.
또, 본문의 예시 코드 처럼 직접 set 구문을 구현하고 값을 실제 변수에 설정 전/후의 처리를 할 수 있고,
get 구문에서 값 리턴전에 값의 유효성 체크에 따라 예외를 던지거나 하는 처리가 가능 합니다.
- 잉그람
- 2020/11/11 PM 07:50
C++ 에서 클래스의 캡슐화를 위해서 getter setter 등의 함수를 제작하여 사용하였는데, 이것을 간략화한 문법이 프로퍼티라고 보시면 됩니다.
클래스를 캡슐화 하는 이유에 대해서는 캡슐화에 대한 문서를 검색해 보시면 될 듯 하고요.
결국 개발중에 디버깅을 편하게 하기위해 사용하던 코딩 방법이 발전하여 문법화 된 것 입니다.
라고 답변을 추가하고 보니, C++의 get/set에 대해서는 알고 계셨군요. ㅎㅎ
제 경우 프로퍼티를 사용하는 가장 큰 이유는 디버깅이 좀더 편하기 때문 입니다.
비주얼 스튜디오 기준으로 public 변수를 클래스 외부에서 바로 사용하는 경우 어디서 사용하는지 바로 검출이 안되는 듯 하더군요. 함수나 프로퍼티는 어디서 호출하고 참조하는 지 개수까지 바로 알려주니까요. 코드가 크고 복잡할 수록 작업이 편해 집니다.
클래스를 캡슐화 하는 이유에 대해서는 캡슐화에 대한 문서를 검색해 보시면 될 듯 하고요.
결국 개발중에 디버깅을 편하게 하기위해 사용하던 코딩 방법이 발전하여 문법화 된 것 입니다.
라고 답변을 추가하고 보니, C++의 get/set에 대해서는 알고 계셨군요. ㅎㅎ
제 경우 프로퍼티를 사용하는 가장 큰 이유는 디버깅이 좀더 편하기 때문 입니다.
비주얼 스튜디오 기준으로 public 변수를 클래스 외부에서 바로 사용하는 경우 어디서 사용하는지 바로 검출이 안되는 듯 하더군요. 함수나 프로퍼티는 어디서 호출하고 참조하는 지 개수까지 바로 알려주니까요. 코드가 크고 복잡할 수록 작업이 편해 집니다.
- 왜날뾁에올인
- 2020/11/11 PM 07:56
질문을 간단하게 줄이자면
public int variable 를 왜 public int variable { get; set; }
이렇게 선언해서 쓰는 것 일까요
말씀하신데로 private set 은 좀 기능을 추가된거긴 하지만 그대로 쓰면 같은 것을....
public int variable 를 왜 public int variable { get; set; }
이렇게 선언해서 쓰는 것 일까요
말씀하신데로 private set 은 좀 기능을 추가된거긴 하지만 그대로 쓰면 같은 것을....
- Lafiel
- 2020/11/11 PM 07:56
캡슐화 및 옵저버 역할도 수행할 수 있죠~ 익숙해지면 정말 편할겁니다.
- 당근천국
- 2020/11/11 PM 07:58
프로퍼티는 입출력을 통일시키는 기능을 합니다.
입출구를 하나로 통일해서 입출력의 일관성을 유지해주는거죠.
속성이라는거 자체가 결국 예전엔 함수로 구현했던걸 좀더 직관적으로 구현할수 있게 해둔겁니다.
프로퍼티가 없는 언어들은 여전히 함수로 get/set를 구현하여 사용합니다.
입출구를 하나로 통일해서 입출력의 일관성을 유지해주는거죠.
속성이라는거 자체가 결국 예전엔 함수로 구현했던걸 좀더 직관적으로 구현할수 있게 해둔겁니다.
프로퍼티가 없는 언어들은 여전히 함수로 get/set를 구현하여 사용합니다.
- 당근천국
- 2020/11/11 PM 08:03
결국 변수는 원시데이터, 프로퍼티는 가공된 정보라고 할 수 있습니다.
예를 들면 int a = 1;으로 선언했는데 이 변수는 1~100의 값만 가질수 있다고 설계되어 있다고 가정해봅시다.
외부에서 int이니까 "–2,147,483,648 ~ 2,147,483,647"값이 들어가 있으니 별도로 유효성 검사를 해야합니다.
프로퍼티로 구현되어 있다면 프로퍼티 내부에서 입력할때 1~100값만 허용할수 있죠.
설계가 잘된 프로젝트라면 프로퍼티를 통해 입출력 된 정보는 유효성이 확보되었다고 판단하고 작업하면된다는 겁니다.
예를 들면 int a = 1;으로 선언했는데 이 변수는 1~100의 값만 가질수 있다고 설계되어 있다고 가정해봅시다.
외부에서 int이니까 "–2,147,483,648 ~ 2,147,483,647"값이 들어가 있으니 별도로 유효성 검사를 해야합니다.
프로퍼티로 구현되어 있다면 프로퍼티 내부에서 입력할때 1~100값만 허용할수 있죠.
설계가 잘된 프로젝트라면 프로퍼티를 통해 입출력 된 정보는 유효성이 확보되었다고 판단하고 작업하면된다는 겁니다.
- 왜날뾁에올인
- 2020/11/11 PM 08:09
설명하신건 이해를 못하고 질문을 올린건 아닙니다
제가 올린 내용과 같은 내용인긴한데
https://www.w3schools.com/cs/cs_properties.asp
이걸 보시면 아시겠지만 자동 프로퍼티가 아닌 그냥 프로퍼티는 get set의 개념에서 비슷하게 쓰는걸 알겠는데
자동 프로퍼티는 왜 저 형태를 구지 쓰느냐는 겁니다
제가 올린 내용과 같은 내용인긴한데
https://www.w3schools.com/cs/cs_properties.asp
이걸 보시면 아시겠지만 자동 프로퍼티가 아닌 그냥 프로퍼티는 get set의 개념에서 비슷하게 쓰는걸 알겠는데
자동 프로퍼티는 왜 저 형태를 구지 쓰느냐는 겁니다
- 당근천국
- 2020/11/11 PM 08:25
위에서 설명했다싶이 "프로퍼티 == 유효성 있는 데이터"인데 ide에서 구분해서 보여주니 같은 역할을 하는 변수/속성이면 프로퍼티사용을 권장합니다.
그러니 외부에 노출되는 변수는 가능하면 프로퍼티로 선언하는게 좋습니다.
(별다른 기능이 없어도 말이죠.)
그러다보니 보통 클래스 내부에서만 사용하는 변수는 프로퍼티로 선언하지 않습니다.(이것도 설계철학에 따라 조건에 따라 내부변수도 프로퍼티로 사용하기도 합니다.)
어차피 비주얼 스튜디오에서는 자동완성에서 필드와 프로퍼티를 구분해서 보여줍니 다른곳에서 참조할때는 프로퍼티를 우선해는게 당연한거죠.
당연히 권장사항일뿐 예전방식으로 프로퍼티없이 구현해도 상관은 없습니다.
단지 그 클래스를 갔다쓸때 프로퍼티가 없으면 저같은 사람은 쓸때마다 유효성검사를 따로 하겠지만 말이죠 ㅎㅎㅎㅎ
그러니 외부에 노출되는 변수는 가능하면 프로퍼티로 선언하는게 좋습니다.
(별다른 기능이 없어도 말이죠.)
그러다보니 보통 클래스 내부에서만 사용하는 변수는 프로퍼티로 선언하지 않습니다.(이것도 설계철학에 따라 조건에 따라 내부변수도 프로퍼티로 사용하기도 합니다.)
어차피 비주얼 스튜디오에서는 자동완성에서 필드와 프로퍼티를 구분해서 보여줍니 다른곳에서 참조할때는 프로퍼티를 우선해는게 당연한거죠.
당연히 권장사항일뿐 예전방식으로 프로퍼티없이 구현해도 상관은 없습니다.
단지 그 클래스를 갔다쓸때 프로퍼티가 없으면 저같은 사람은 쓸때마다 유효성검사를 따로 하겠지만 말이죠 ㅎㅎㅎㅎ
- 왜날뾁에올인
- 2020/11/11 PM 08:40
많은 답변 달아주셔서 감사합니다
- arkrian
- 2020/11/11 PM 08:07
저같은 경우 게임제작시 주로 HP나 BP제한 줄떄 사용합니다.
private int _hp;
public int HP { get=>_hp ;
set{
_hp=value;
if(_hp<0)_hp=0;
}
}
HP-=5;
이런식으로 사용하고요...
이거 외에 C#데이타바인딩이나 c#8.0의 기본 Json Serializer를 사용해보면 왜 프로퍼티를 써야하는지 명확해집니다.
예) 원본데이타는 암호화 되서 변수 a에 저장되어 있는데, UI에 출력할때는 프로퍼티를 통하여 암호가 풀린 데이타를 출력한다거나...
private int _hp;
public int HP { get=>_hp ;
set{
_hp=value;
if(_hp<0)_hp=0;
}
}
HP-=5;
이런식으로 사용하고요...
이거 외에 C#데이타바인딩이나 c#8.0의 기본 Json Serializer를 사용해보면 왜 프로퍼티를 써야하는지 명확해집니다.
예) 원본데이타는 암호화 되서 변수 a에 저장되어 있는데, UI에 출력할때는 프로퍼티를 통하여 암호가 풀린 데이타를 출력한다거나...
- 왜날뾁에올인
- 2020/11/11 PM 08:11
ㅠㅠ set get 개념 모르는게 아닌데 get set 개념에 대한 답변을 많이 달아주시네요
get set 할때 추가 기능을 넣을 수 있는 것도 알고는 있고여
get set 할때 추가 기능을 넣을 수 있는 것도 알고는 있고여
- arkrian
- 2020/11/11 PM 08:13
c# 8.0에서 추가된 Json시리얼라이저나 텍스트시리얼라이저의 예를 들면 시리얼라이즈 대상이 프로퍼티만 해당됩니다. (지금은 달라졌을지 모르겠네요)
이 경우 위에 있는 자동프로퍼티 선언이 중요해지죠.
애당초 C#에서는 클래스외부에서 데이타 엑세스시 프로퍼티사용을 유도하고 있기도 합니다.
이 경우 위에 있는 자동프로퍼티 선언이 중요해지죠.
애당초 C#에서는 클래스외부에서 데이타 엑세스시 프로퍼티사용을 유도하고 있기도 합니다.
- 당근천국
- 2020/11/11 PM 08:26
이게 그럴수 밖에 없는게 프로퍼티 개념을 알고 있으면 왜 외부에 노출되는 데이터를 프로퍼티로 사용해야하는지는 자동으로 이해되는게 일반적입니다.
그래서 보통 "프로퍼티를 왜쓰나요?"라는 질문은 프로퍼티 자체를 재대로 이해하지 못하는 경우가 많거든요 ㅎㅎㅎㅎ
그래서 보통 "프로퍼티를 왜쓰나요?"라는 질문은 프로퍼티 자체를 재대로 이해하지 못하는 경우가 많거든요 ㅎㅎㅎㅎ
- philz
- 2020/11/11 PM 09:00
이걸 질문하신게 아닌가 싶은데요
public int variable { get; set; } 의 경우 variable를 public으로 아무데서나 접근하게해서 은닉성을 없앤게 아니고,
실제로는 아래의 코드를 자동으로 생성해 주는 거예요.
private int _variable;
public int variable
{
get { return _variable; }
set { _variable = value; }
}
타이핑을 줄여주는 거죠.
public int variable { get; set; } 의 경우 variable를 public으로 아무데서나 접근하게해서 은닉성을 없앤게 아니고,
실제로는 아래의 코드를 자동으로 생성해 주는 거예요.
private int _variable;
public int variable
{
get { return _variable; }
set { _variable = value; }
}
타이핑을 줄여주는 거죠.
- 타히키
- 2020/11/11 PM 09:35
이 글을 한 번 읽어보시면 어때요?
https://stackoverflow.com/questions/2283026/difference-between-member-variable-and-member-property
https://stackoverflow.com/questions/2283026/difference-between-member-variable-and-member-property
user error : Error. B.