bbqmsg 님의 블로그
[C#] C#공부 하면서 기록할만한 것들 본문
new 키워드
출처: https://bakcoding.github.io/csharp/csharp-008-array/
new 키워드를 쓰거나 참조 형식으로 선언하면은 스택에 힙 메모리 주소를 찍고 힙에다가 저장한ㄷr.
단락 계산
if((3 % 2) == 1 || (3 - 1) == 2)
예를 들어 이런식이 있다면 앞에서 (3 % 2) == 1의 표현식이 참이기 때문에 뒤의 결괏값에 상관없이 전체 평가식이 참이 된다.
이런 이유로 프로그램의 실행 과정에서 뒤의 조건은 아예 실행조차 되지 않는 것을 두고 단락 계산 또는 단축 평가(short-circuit evaluation)됐다고 한다.
|| 연산과 마찬가지로 단락 계산은 && 논리곱 연산에서도 발생한다.
정적필드
class Person
{
static public int CountOfInstance;
public string _name;
public Person(string name)
{
CountOfInstance++;
_name = name;
}
}
인스턴스 필드는 new로 할당받은 객체마다 고유하게 메모리를 확보하기 때문에 클래스 전역적으로 값이 유지되지 않는다. 이 같은 요구사항을 만족하려면 클래스 단위의 필드를 정의해야 하고, 그것이 바로 정적 필드(static field)가 된다.
사용 범위 | 인스펙터 창에서 확인 유무 | |
public | 모든 클래스 | o (HideInInspector를 이용하면 인스펙터 창에서 보이지 않게 숨기기 가능) |
protected | 해당 클래스와 그 클래스를 상속받는 클래스 | x (SerializeField를 이용하면 인스펙터 창에 보이게 가능) |
private | only 해당 클래스 |
정보 은닉의 원칙
- 특별한 이유를 제외하고는 필드를 절대 public으로 선언하지 않는다.
- 접근이 필요할 때는 접근자/설정자 메서드를 만들어 외부에서 접근하는 경로를 클래스 개발자의 관리하에 둔다.
참조에 의한 호출(CBR: call by reference)
ref 예약어를 이용해서 Swap을 해주는 함수를 구현했다.
using System.Drawing;
using System.Formats.Tar;
using System.Net.Sockets;
using System.Runtime.Intrinsics.X86;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
int value1 = 5;
int value2 = 10;
SwapValue(ref value1, ref value2);
Console.WriteLine("value1 == " + value1 + ", value2 == " + value2);
}
private static void SwapValue(ref int value1, ref int value2)
{
int temp = value1;
value1 = value2;
value2 = temp;
}
}
out예약어를 이용해서 Divide를 해주는 함수를 구현했다.
using System.Drawing;
using System.Formats.Tar;
using System.Net.Sockets;
using System.Runtime.Intrinsics.X86;
using System.Text.RegularExpressions;
class Program
{
bool Divide(int n1, int n2, out int result)
{
if (n2 == 0)
{
result = 0;
return false;
}
result = n1 / n2;
return true;
}
static void Main(string[] args)
{
int quotient;
if(Divide2.Divide(15, 3, out quotient))
{
Console.WriteLine("15 / 3 = {0}", quotient);
}
}
}
ref는 메서드를 호출하는 측에서 변수의 값을 초기화함으로써 메서드 측에 의미 있는 값을 전달한다. 반면 out은 메서드 측에서 반드시 값으 할당해서 반환함으로써 메서드를 호출한 측에 의미 있는 값을 반환한다. 하지만 ref도 out처럼 참조에 의한 전달이기 때문에 메서드 측에서 의미 있는 값을 호출하는 측에 전달할 수 있다.