Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Archives
Today
Total
관리 메뉴

시작은 0부터

C# 변수, 함수 본문

C# 학습일지

C# 변수, 함수

0base 2022. 10. 11. 12:46

 

[ 변수 ]

 

값을 담을 수 있는 크기의 단위

 int < long < decimal < biginteger(스트링으로 데이터를 담은 상태에서 숫자로 전환해서 값을 환산)

 

정수 리터럴

10진수 : 접두사가 없음

16진수 : 0x 또는 0X 접두사 사용

 

float : 1234.01f

double : 1234D 또는 1234.1 (소수점이 있으면 자동으로  double로 인식) 

decimal : 1234M

 

var 는 값을 입력과 동시에 데이터형이 지정된다. ( var a  = 1f : a는 float으로 변환. )

- 컴파일러가 데이터 형식을 판단하도록 하는 키워드.

- 클래스 내부에서 멤버변수로 사용할 수 없다.

 

object 는 참조. 데이터형이 지정되지 않음. 

 

[ 함수(메소드) ]

 

void 형식의 함수안에서 계산 결과값을 가져오는 방법

void getRandomNumber(out(또는 ref) int ranNum)

{

int randomNum = Random.Range(1, 100);

ranNum = randomNum;

}

//--------------------------------------------------------------------------

int randomNumber = 1;

getRandomNumber(out(또는 ref) randomNumber);

 

ref : 값이 초기화가 되어있어야 한다.(값이 지정되어있어야 함. 참조할 값이 없으면 쓸 수 없음.)

ref 키워드를 사요하면 바로 

out : 값이 초기화되어있지 않더라도 사용할 수 있음.

 

 

[ 값 형식 vs 참조 형식 ]

 

기본데이터 형식

- 숫자 형식 (값 형식)

- 논리 형식 (값 형식)

- 문자열 형식 (참조 형식)

- 오브젝트 형식 (참조 형식)

 

복합데이터 형식

- 구조체 (값 형식)

- 배열 (참조 형식)

- 클래스 (참조 형식)

 

값 형식과 스택 메모리

코드 블록이 시작하고(" { ") 변수가 선언되면 값 형식의 데이터는 스택 메모리에 순서대로 생성됨.

코드 블록이 종료되어 (" } ")를 만나면 선언된 순서와 반대로 스택에서 해제된다.

생성 순서 : 1 > 2 > 3 이면

삭제 순서 : 3 > 2 > 1

 

참조 형식과 힙 메모리

힙은 저장된 데티러르 스스로 삭제하는 메커니즘은 갖고 있지 않다.

CLR 의 GC가 동작하면서 더 이상 사용되지 않는 객체가 있으면 해당 객체를 쓰레기로 간주하고 수거한다.

스택과 달리 힙은 생성된 데이터의 위치(코드블록)와는 무관하게 필요하다면 언제까지든 유지할 수 있다.

참조 형식의 변수

힙과 스택을 함께 사용한다.

힙 : 데이터를 저장

스택 : 데이터가 저장된 힙 메모리 주소

 

Built-In Types ( 내장된 데이터 형식들 ) : int, long, float, double, bool, char, string 등등..

object 는 class(참조 형식 : reference type)

string 은 class (참조 형식 : reference type이며 값형식처럼 동작한다.

 

class Point
{
	public float x;
    public float y;
    public Point(float x, float y)
    {
    	this.x = x;
        this.y = y;
    }
}

void SomMethod()
{
	Point a = new Point(10, 5);
    Point b = a
    b.x = 10;
    b = new Point(10, 5);
    
    bool pointAreTheSame = a.Equals(b);
}

참조 형식의 변수에서는 값이 중요하지 않다. 두 참조 형식 a 와 b 를 비교할 때, 같은 지 여부를 bool 값으로 반환하면 false가 나온다. 값이 같더라도 서로 다른 주소를 참조하기 때문이다.

 

* String은  char의 배열이기 때문에 참조 형식이지만, String 끼리 비교할 때는 값을 비교한다.

 

Nullable 형식

bool ? a = null; // 값 형식의 데이터를 참조 형식으로 쓸 수 있게 하는 것.

 

 Struct (값 형식)

new 로 생성되는 것은 모두 참조 형식이다. (단, Struct는 new 로 생성되도 값 형식)

 

String 이 불변 (Immutable)인 이유?

String(문자열)은 변경할 수 없는 타입

String strA = "이것은 문자열"

String 변수 strA 는 스택에 생성되고, Heap 주소를 참조한다. Heap 주소에는 String 내용이 생성되어있다.

 

이미 할당되어 있는 strA 변수에 다른 값으로 할당하면

strA = "다른 문자열";

즉, 기존의 값을 바꾸는 식이 아니라 새로운 주소를 할당.

요약

클래스는 참조형식이므로, 여러 변수가 동일한 개체를 참조하고 영향을 미칠 수있다.

구조체는 값 형식이므로, 각 변수가 자신의 데이터 복사본을 가지고 있다. 

ref, out 키워드를 사용하여 메소드 내부의 변수를 강제로 수정하고 메소드 외부의 원래 변수에도 영향을 줄 수 있다. 참조형식 값형식 모두 영향을 줄 수 있다.

ref 키워드는 변수가 메소드에 넘겨지기 전에 쵝화되어 있어야 한다. 반면에 out  키워드는 초기화되지 않아도 된다. 

string 은 참조 형식이지만, 값 형식처럼 동작한다.