WPF Q&A

WPF 에서는 Class Type 이 Reference Type 이 아닌가요? 어렵게설명하면안됨 평점: 없음 조회: 322
질문 먼져 보시고 아래의 코드를 보시는게 나을듯 합니다.


public class c
{
  public string c_property;

  public c()
  {     
            c_property = "ㅇㅋ";
  }
}


public class b
{
  public c b_property;

  public b()
  {
    b_property = new c();
  }
}


public class a
{
  public b a_property;
  public List<c> list;

  public a()
  {
    a_property = new b();
    list = new List<c>();

    list.Add(a_property.b_property);
  }

  public void methodB()
  {
    foreach (var item in list)
    {
      MessageBox.Show(item.c_property);
    }


    MessageBox.Show(a_property.b_property.c_property);
  }
}


public class d
{
  public b d_property;

  public d(b p_b_property)
  {
    d_property = p_b_property;
  }

  public void methodA()
  {
    d_property.b_property = null;
  }
}


아..;;; 변수명을 거지같이 지엇나봅니다;;; 상당히 복잡한느킴이네요;;


질문 시작하겠습니다.


WPF 가 아닌 Windows Forms 에서는 이미 경험한 적이 있습니다.
Class Type 같은 레퍼런스 타입은 string Type 같은 값 타입하고는 달리

메서드에 ref 키워드를 쓰지 않고 전달해도 전달받은 해당 메서드에서 내용을 수정하면
해당 메서드 밖에서도 그 수정된 내용이 반영되는데...

WPF는 그렇지가 않은가요?

위 코드에서 MethodA() 를 호출하고 MethodB() 를 호출하면 Null 값 참조 Exception 이 발생해야 하는데 "ㅇㅋ" 메제지가 정상적으로 띄워 집니다...
뭐가 문제인가요? Visual Studio 는 2015 를 쓰고있습니다.


태그 : 레퍼런스 키워드 타입 ref Reference Type
작성자 정보
어렵게설명하면안됨
Level 6
 [EXP.4/14]

메일:  비공개
글등록 +12 36 덧글등록 +3 24
자기소개
개인정보가 필요한 이유는? 12345678 이사이트 가입에 있어서 문제가 많네요.....
글 공유하기 |
  tweet facebook
2016-11-06 오후 11:29:24
나도한마디
사용자
족구            [2016-11-07]
Level 15
 [EXP.0/40]
메인 함수를 잘 못 작성하신게 아닌지..

WPF나 Winform의 문제가 아닌듯한데요..
사용자
족구            [2016-11-07]
Level 15
 [EXP.0/40]
public static void Main()
{
a a = new a();

d d = new d(a.a_property);
d.methodA();

a.methodB();
}

위와 같이 작성했을 때 널 레퍼런스 익셉션이 발생하는데요..
사용자
어렵게설명하면안됨            [2016-11-07]
Level 6
 [EXP.4/14]
아.. 그렇네요... 실제 문제되는 부분이 빠졌었긴했지만... 검토하신부분에서도 익셉션이 발생하지 않을줄 알았는데 발생하는것을 확인했습니다.

그러면 수정된 위 코드(빨간색 foreach 문)에서는 왜 에러가 발생하지 않는건가요? 발생해야 정상 아닌가요? Reference Type 인데 ㅠㅠ...
사용자
족구            [2016-11-08]
Level 15
 [EXP.0/40]
List에 들어있는 값은 메모리의 주소값입니다.
b_property의 값도 메모리의 주소값입니다.

methodA를 통해 b_property의 주소값은 null 이 되었고,
List에 들어있는 주소값은 변하지 않았습니다.

그러므로 List의 아이템을 통해 c_property의 접근이 가능합니다.
사용자
어렵게설명하면안됨            [2016-11-08]
Level 6
 [EXP.4/14]
위 코드에서 c_property 빼고는 전부 Class Type 입니다. 설마.. 아닌가요?
c_property 빼고 모구 Class Type 이라면 c_property 외에는 모두
Reference Type 인거 아닌가요?

Reference Type은 Visual Studio 2010 버전에서, Class Type 이 아닌 Value Type 에 썼을때 의미가 있었던 ref 키워드를, Reference Type에 명시해도/명시안해도 ref 키워드 자체가 의미가 없었습니다. 아닌가요? 그러니까 2015 버전이 아닌 Visual Studio 에서 이러한... 경험을 해보신 적이 있으시..겠죠 당연히!!

그러면.. Visual Studio 2015 에서는 어떠셨..는지..요?
만약 Visual Studio 2015 에서는 그 이전버전에서 ref 키워드가 Reference Type에 의미가 없었으니 이러한 문제를 제거하기위해 ref 키워드를 명시하도록
변경되었다고 해도... 효과가 없네요...

List 에 Add() 메서드로 들어간 Data가 Reference Type 이 맞다면
들어가있는 Data 를 List 개체를 통하지 않고 건드릴 수 있다는 것인데
족구님께서는 List 를 통해서 수정되지 않았다고 말씀하시는것 같은데 맞나요?

말씀하신 메모리 주소 값이라는것은 Value Type 이 아닌 Reference Type이기
때문에 해당 메모리 주소값에 접근해서 개체를 건드리는 식 이므로 Value Type
과는 달리, 같은 Reference Type 의 다른 변수들로부터 아래코드와 같이

a.a_property = d.d_property;

처럼 대입을 하면, 가장 마지막에 대입된 Reference Type 의 메모리 주소값을
대입받은 해당 변수로 접근하게 되는 것 아닌가요? 이것이 Refernce Type 과
Value Type 의 다른점 아니였나요?

정확하진 않지만 이것이, 그동안 배웠던 것과는 달라서 문제가 있어 보여서
간단하게 Windows Forms, WPF 에서 둘다 테스트를 해보았습니다.

글로 설명하겠습니다.

1. A, B, C 클래스가 있습니다
2. A 클래스에 C 클래스로 만든 전역필드가 있습니다.(아직 Data가 없는상태)
3. B 클래스에 ref 키워드로 C 클래스의 매개변수를 받는 메서드가 있습니다.
4. A 클래스의 C 클래스로 만든 전역필드를 B 클래스의 3번 메서드에 ref 키워드로 전달합니다.
5-1. 4번에서 ref 키워드로 전달받은 C 클래스 Type 매개변수의 Data 를 수정합니다.(Data 가 없었으니 Data 를 넣습니다.)
5-2. 5-1번 후 바로 Null 을 넣습니다.
6. A클래스의 메서드에서 Data 를 확인합니다.
7. 5-2번에서 넣은 Null 이 확인됩니다.

이게 맞는 거겠죠? 그런데 Data가 뜨네요?
이제.... Reference Type 이란것은 존재하지 않는다는 건가요?
아니면... 존재하지만 특별한 방법이 필요한가요?
아니면 제가 잘못 알고있는건가요....? ㅠㅠ
사용자
L.건            [2016-11-08]
Level 5
 [EXP.10/16]
근데 string도object에 파생받은 reference 타입아닌가요.
사용자
족구            [2016-11-08]
Level 15
 [EXP.0/40]
string type은 함수의 매개변수로 쓰일 때는 레퍼런스 타입이 아니라고 알고있습니다.

뭔가 기본타입과 혼용되어서 사용? 되는 것 같더군요..
태그로 엮인글
[C#.NET Q&A] c# 에서의 레퍼런스 개념을 잘모르겠습니다[2]  엿장수
[WPF Q&A] [RE] 컨트롤 캐스팅 문제.. 파일첨부 이재웅
[C#.NET Q&A] 이용정지된 사용자의 글입니다.[9]+15  이용정지
[C#.NET Q&A] 이용정지된 사용자의 글입니다.[8]+17  이용정지
[ASP.NET Q&A] 안녕하십니까? 질문있어요~[1] 파일첨부 최고CEO
[C#.NET Q&A] ref 사용 방법에 대해..[5]+1  아리가도요
[실버라이트 Q&A] WCF Ria Service + Stored Procedure 사용시 Result가 Multiple Table일때[1]+1  광개토대제
[윈도우8 & WP 정보뉴스] Windows 8 앱 개발 관련 레퍼런스 정리해 보았습니다.[3]  xenon
[ASP.NET Q&A] 왜 예약 키워드가 안나오는 걸까요?[1]  좋은날
[ASP.NET Q&A] input type="text" 관련 질문.[2]  불타는장농
글리스트
트리뷰 아이템의 맨앞에 화살표(?) 제거할수 있나요??[2]+2  대봉대봉
WPF textbox 특정 문자만 입력가능하게 만들기[1]+1  아힝헝홍
RadioButton 의 Content 의 문자열에 따라 다른 Control의 Visibility 를 변경 하려 ...[1]  비가와요
3D Tools 사용해보신분 계십니까?[1]+3  훈스훈스훈스
WPF의 윈XP 지원여부[2]  모리군
이미지 점점 커지게 하기[1]  나무늘보
WPF 는 Windows Forms 와는 달리 Try 를 꼭.....[3]+3  어렵게설명하면안됨
WPF Snapping Window 에 대해서 질문드리겠습니다  대봉대봉
MainWindow 비 정상 종료 시  Help
WPF 야구공 구현하는 방법[1]  나무늘보
 ★현재글->   WPF 에서는 Class Type 이 Reference Type 이 아닌가요?[3]+4  어렵게설명하면안됨
[RE] WPF 에서는 Class Type 이 Reference Type 이 아닌가요?[1]  족구
GeometryModel3D 객체 많은 량 사용시 버벅임[3]+1  훈스훈스훈스
WPF 디자인 관련 문의드립니다.  Help
UI스레드 시간을 나누는 방법이 있나요??[1]  능능능
WPF로 개발하고있는데 편집이 안됩니다  lsc999
3d 클래스 질문드립니다.  훈스훈스훈스
WPF 프로그램 개발 관련 질문드립니다.[1]+2  JW
GeometryModel3D클래스 질문드립니다.  훈스훈스훈스
ListView 에 동적인 작업을 하던 중...[2]+1 파일첨부 어렵게설명하면안됨
tabitem에서 click이벤트 질문입니다[2]+2  아힝헝홍