시작은 0부터
C# 변수, 함수 본문
[ 변수 ]
값을 담을 수 있는 크기의 단위
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 은 참조 형식이지만, 값 형식처럼 동작한다.
'C# 학습일지' 카테고리의 다른 글
25. 콘솔RPG 100% - 생성자와 스태틱(Static) (0) | 2022.08.05 |
---|---|
24. 프로퍼티(Property), 파라미터(Parameter), 아규먼트(Argument) (0) | 2022.08.04 |
23. 구조체(Struct)와 클래스(Class) (0) | 2022.08.03 |
22. 달팽이형식 2차 도전 ( 코드 간편화 ) (0) | 2022.07.29 |
21. 레이싱게임 - 2차원 배열로 장애물 낙하 구현 (0) | 2022.07.28 |