참조 , 값 본문

[PL]/C# & WPF

참조 , 값

객과 함께. 2011. 6. 8. 19:06

Type  - ⅰ.value Type  - 내장형 : 정수형
                                               실수형 
                                              논리형
                                              문자형
 
                                    열거형 : 시스템이 미리 정해 놓은 범위 값만정의  
                                    구조체 : 변수들의 집합


           ⅱ.reference Type - 배열   : 동일한 변수들의 하나의 이름으로 묶어 놓은것.
                                       문자열 : 동일 타입의 값들이 모여서 구성도는것.

                                       클래스 : 메서드 묶음.이며 기본적이 라이브러이다.

 

■ 문자열

- 동일 타입의 값들이 여러개 모여서 구성되어진 것을 문자열 이라 한다.

- 별도의 타입을 제공하지 않으며 문자 배열을 대신 사용한다.

- 프레임 웍 차원에서 System.String 이라는 별도의 타입을 제공한다.

 

■ 클래스

-

        ex1) using System;
            
          class CSTest
          {
         static void Main()     
         {
          Time Now();   //메모리에 Time이라는 타입으로 Now()메서드 영역을 선언 하였고
          Now = new Time();   // 힙이라는 역역에 할 당 되기 때문에  new 라는 연사자를 사용 해서 Now알이아스 시켰다. 
          Now.Hour = 12;      // Class Time() 클래스 내부에서 메인 값에 접근을 하기 위해서 힙영역의 Now가 스택 영역에
          Now.min = 30;       // hour = 12 에 접근을 하게 된다.
          Now.sec = 45;
          }
          }

          class Time()
          {
         public int hour , min , sec;
         public void OutTime()    //메서드와 같은 이름을 가지고 있으면 Time생성자 메서드이다.
         {
          Console.WriteLine("현재 시간은 {0}시 {1}분 {2}초이다", hour , min , sec); //hour , min , sec 는 인스턴스 변수로
                                                                                   // 선언되어 있으며 같은 클래스 안에
                             // 선언되어 있기 때문에 형제(?)와 같아서
                             // 바로 변수명을 사용 하였다.  
         }
          }


       ex2) using System;
         class CSTest
         {
         static void Main()
         {
          Time Now = new Time(12, 30, 45);  //캡슐화(보안성 강화)
          Now.OutTime();                    // 클래스는 힙 영역에 할당 이 되므로 직접 접근이 안된다.
                                            // 그래서 new 사용 하여 선언을 하고 값을 넘겨줄 준비를 한다.
         }
         }

         class Time
         {
         int hour , min , sec;      //프로그램이 시작이 되면서 부터 인스턴스 영역의 변수들을 선언을 하고
                                                     // 메모리에 예약을 한다.
         
         Time (int ahour , int amin , int asec)      //Time 타입의 메서드는 int형으로 3개의 값을 넘겨받는 생성자 메서드이며
         {                                                // 생성자 메서드 내에서 넘겨 받은 값을 저장 하기 위해 변수를 같은 이름의
          hour = ahour;                           // 변수를 사용 할수 있으나 참조 곳의 값이 애매모호 하기 때문에 a라는 문자를
          min = amin;                             // 첨가 시켜준 것이다.
          sec = asec;
         }

         public void OutTime()      //이곳의 변수들은 Time클래스 안에 들어있는 형제 메소드 이기 때문에
         {                                   // 생성자의 변수를 그대로 사용 하였다.                                        
          Consoel.WriteLine("현재 시간은 {0}시{1}분{2}초 이다.",hour , min , sec);
         }
         }

★ 값과 참조
  - 값(value Type), 참조(Reference Type)타입의 차이점은 데이터가 저장 되는 메모리상의 위치이다. 값타입은 크기가 작고 고정 적이기 때문에 스택 에 생성이 되며 , 참조타입은 크고 가변적이기 때문에 동적으로 관리 되는 힙에 생성이 된다.


  ex1).   using System;
    
    class CSTest
    {
     static void Main()
     {
      int value = 3 , vcopy ;     //스택에 선언과 동시에 할당 이 된다.  , vcopy는 스택 영역에 예약만 되어있는상태이다.
      vcopy = value;
      vcopy = 4;
      Console.WriteLine("value = {0} , vcopy={1}", value , vcopy);

      int[] ar , arcopy;      //배열이므로 힙영역에 할당이 되어진다. 힙 영역은 직접 접근이 어렵기 때문에 스택 영역에
                                                               // ar , 이라는 네임을 자진 접근자를 생성한다.
      ar = new int[] {1,2,3,4,5};
      arcopy = ar;
      arcopy[1] =1234;
      Console.WriteLine("value = {0} , vcopy={1}", value , vcopy);
     }
    }
     
    ※ arcopy 요소 값을 변경하면 동일한 대상을 ㅅ가리키는 ar도 변경된다.
  
  
  ex2).   using Systeml;

    class CSTest
    {
     int value = 3 , vcopy = 3;
     Console.WriteLine(값타입의 경우: " + (value == vcopy ? "같다" : "다르다");
     // 값을 평가 하므로  같다

     int[] ar = {1,2,3,4,5};
     int[] arcopy = {1,2,3,4,5};
     Console.WriteLine(값타입의 경우: " + (ar == arcopy ? "같다" : "다르다");
    }

                //배열은 차원과 배열요소의  값이 완전히 같더라도 힙의 다른 위치를 가리키기 때문에 다르다고 평가한 것이다.

■ 지역 변수 - 메서드가 호출도리 때마다 ㅅ로 생성된다.

■ 인스턴스 변수  - 객체가 생성 될때  같이 생성되고 객체가 파괴될때까지 존재한다.

■ 정적변수 -

■ 배열 요소 - 배열의 한 요소로 생성된다. 배열이  생성될때 같이 생성되며 배열이 해제될 때 파괴된다.

■ 값인수  - 메서드의 인수로 선언되며 메서드가 호출될때 생성된다.
■ 참조 인수 - 값인수와 같되 앞에 ref라는 키워드를 붙인다.
■ 출력용 인수 - 참조 인수로 전달되는 실인수는 반드시 초기화 되어야 하지만 출력용 인수는 초기화 되지 않아도 상관없다.   

★캐스트(cast) - 변환 하려는 타입에 묶어서 ㄷ입 하면 되0는데 자격 요건을 꼭 따져 봐야 한다.

 

■ 타입변환
 암시적 변환 - 사용자가 요구 하지 않아도 컴파일러가 적당한 타입으로 바꿔주는 것이다. 
                  -  변수 값을 대입 할 때나  변수끼리 대입 할때는 좌우변의 타입이 일치해야 한다.
                 -  크기가 같아도 부호 여부에 따라표현 가능한 번위가 ㅏㄷㄹ라 안전하지 못하며 따라서 컴파일러는 암시적

                     변환을 허용하지 않는다.

 

  명시적 변환  - 프로그래머가 어떤 타입을 어떻게 ㅂ꾸라고 컴파이러에게 분명히 지시하는 것.
                    - 캐스트 연사자를 사용한다.
                    - 큰 타입을 작은 타입에 대입하거나 정수형 변수에 실수를 대입하면 값으리 손실이나 정확도의 희생이 따른다.