C# 02 - hwi4033/SBS-GameAcademy GitHub Wiki

μ—°μ‚°μž

μ‚°μˆ  μ—°μ‚°μž

기본적인 사칙연산과 λ‚˜λ¨Έμ§€ μ—°μ‚°(%)이 μžˆλ‹€.
μš°μ„ μˆœμœ„λŠ” 사칙연산과 λ™μΌν•˜κ²Œ κ³±ν•˜κΈ°, λ‚˜λˆ„κΈ°, λ‚˜λ¨Έμ§€ 연산이 먼저이며 λ‹€μŒμœΌλ‘œ λ”ν•˜κΈ°, λΉΌκΈ° 연산이 이루어진닀.

μ—°μ‚°μž ν‘œκΈ° 예제 (a = 5, b = 2)
λ”ν•˜κΈ° + c = a + b, c = 7
λΉΌκΈ° - c = a - b, c = 3
κ³±ν•˜κΈ° * c = a * b, c = 10
λ‚˜λˆ„κΈ° / c = a / b, c = 2
λ‚˜λ¨Έμ§€ % c = a * b, c = 1

λŒ€μž… μ—°μ‚°μž

μˆ˜ν•™μ—μ„œμ˜ '='λŠ” κ°™λ‹€λ₯Ό μ˜λ―Έν•˜μ§€λ§Œ Cμ–Έμ–΄μ—μ„œμ˜ '='λŠ” λŒ€μž…μ„ μ˜λ―Έν•œλ‹€.

λŒ€μž… μ—°μ‚°μž μ„€λͺ… 예제
= μš°ν•­μ˜ 값을 μ’Œν•­μ— λŒ€μž… a = b
+= μ’Œν•­κ³Ό μš°ν•­μ˜ 값을 λ”ν•œ ν›„ μ’Œν•­μ— λŒ€μž… a += b ( a = a + b )
-= μ’Œν•­κ³Ό μš°ν•­μ˜ 값을 λΊ€ ν›„ μ’Œν•­μ— λŒ€μž… a -= b ( a = a - b )
*= μ’Œν•­κ³Ό μš°ν•­μ˜ 값을 κ³±ν•œ ν›„ μ’Œν•­μ— λŒ€μž… a *= b ( a = a * b )
/= μ’Œν•­κ³Ό μš°ν•­μ˜ 값을 λ‚˜λˆˆ ν›„ μ’Œν•­μ— λŒ€μž… a /= b ( a = a / b )
%= μ’Œν•­κ³Ό μš°ν•­μ˜ 값을 λ‚˜λ¨Έμ§€ μ—°μ‚° ν›„ μ’Œν•­μ— λŒ€μž… a %= b ( a = a % b )

증감 μ—°μ‚°μž

값을 1μ”© 증가 λ˜λŠ” κ°μ†Œμ‹œν‚€λŠ” μ—°μ‚°μžμ΄λ‹€.

증감 μ—°μ‚°μž μ„€λͺ…
++a (μ „μœ„ 증가) a의 값을 1 μ¦κ°€μ‹œν‚¨ ν›„ 연산을 μˆ˜ν–‰
a++ (ν›„μœ„ 증가) 연산을 μˆ˜ν–‰ν•œ ν›„ a의 값을 1 μ¦κ°€μ‹œν‚΄
--a (μ „μœ„ κ°μ†Œ) a의 값을 1 κ°μ†Œμ‹œν‚¨ ν›„ 연산을 μˆ˜ν–‰
a-- (ν›„μœ„ κ°μ†Œ) 연산을 μˆ˜ν–‰ν•œ ν›„ a의 값을 1 κ°μ†Œμ‹œν‚΄

비ꡐ μ—°μ‚°μž

두 κ°’μ˜ 크기λ₯Ό λΉ„κ΅ν•˜λŠ” μ—°μ‚°μžμ΄λ‹€. κ²°κ³ΌλŠ” μ°Έ(true) λ˜λŠ” 거짓(false)을 λ°˜ν™˜ν•œλ‹€.

비ꡐ μ—°μ‚°μž μ„€λͺ…
== μ’Œν•­κ³Ό μš°ν•­μ΄ κ°™μœΌλ©΄ μ°Έ, 틀리면 거짓을 λ°˜ν™˜
!= μ’Œν•­κ³Ό μš°ν•­μ΄ λ‹€λ₯΄λ©΄ μ°Έ, κ°™μœΌλ©΄ 거짓을 λ°˜ν™˜
> μ’Œν•­μ΄ μš°ν•­λ³΄λ‹€ 크면 μ°Έ, μž‘μœΌλ©΄ 거짓을 λ°˜ν™˜
>= μ’Œν•­μ΄ μš°ν•­λ³΄λ‹€ ν¬κ±°λ‚˜ κ°™μœΌλ©΄ μ°Έ, μž‘μœΌλ©΄ 거짓을 λ°˜ν™˜
< μ’Œν•­μ΄ μš°ν•­λ³΄λ‹€ μž‘μœΌλ©΄ μ°Έ, 크면 거짓을 λ°˜ν™˜
<= μ’Œν•­μ΄ μš°ν•­λ³΄λ‹€ μž‘κ±°λ‚˜ κ°™μœΌλ©΄ μ°Έ, 크면 거짓을 λ°˜ν™˜

논리 μ—°μ‚°μž

논리식을 νŒλ‹¨ν•˜μ—¬, μ°Έ(true)κ³Ό 거짓(false)을 λ°˜ν™˜ν•˜λŠ” μ—°μ‚°μžμ΄λ‹€.
&&와 || μ—°μ‚°μžλŠ” 이항 μ—°μ‚°μžμ΄λ©°, μ—°μ‚° μš°μ„ μˆœμœ„λŠ” μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μ΄λ‹€.
! μ—°μ‚°μžλŠ” 단항 μ—°μ‚°μžμ΄λ©°, μ—°μ‚° μš°μ„ μˆœμœ„λŠ” 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μ΄λ‹€.

논리 μ—°μ‚°μž μ„€λͺ…
&& (AND) μ’Œν•­μ΄ 참이고 μš°ν•­λ„ 참이면 μ°Έ
(OR) μ’Œν•­ λ˜λŠ” μš°ν•­μ΄ 참이라면 μ°Έ
! (NOT) 논리 값에 λ°˜λŒ€λ˜λŠ” 값을 λ°˜ν™˜

단락 평가

두 개 μ΄μƒμ˜ 논리 연산을 μˆ˜ν–‰ν•  λ•Œ 첫 번째 κ°’λ§ŒμœΌλ‘œ κ²°κ³Όκ°€ ν™•μ‹€ν•˜λ©΄ 두 번째 값은 ν™•μΈν•˜μ§€ μ•ŠλŠ”λ‹€.

int z = 0;

if (10 != 10 && ++z == z)
{
    Console.Write("Short-Circuit");
}

Console.Write("z : " + z);

// μ‹€ν–‰ κ²°κ³Ό
0

if문의 μ’Œν•­ 논리식이 κ±°μ§“μ΄λ―€λ‘œ AND 연산을 μˆ˜ν–‰ν•  ν•„μš”μ—†μ΄ if문을 λΉ μ Έλ‚˜μ˜¨λ‹€.
κ·ΈλŸ¬λ―€λ‘œ if문의 μš°ν•­ λ…Όλ¦¬μ‹μ˜ μ „μœ„μ¦κ°€μ—°μ‚°μžκ°€ μˆ˜ν–‰λ˜μ§€ μ•Šμ•„ z의 κ°’ = 0이 좜λ ₯λœλ‹€.

μ—°μ‚°μž μ˜€λ²„λ‘œλ”©

ν•΄λ‹Ή μ–Έμ–΄ μžμ²΄μ—μ„œ μ œκ³΅ν•˜κ³  μžˆλŠ” μ—°μ‚°μžμ— λŒ€ν•˜μ—¬ κ·Έ 의미λ₯Ό λ‹€μ‹œ λΆ€μ—¬ν•˜λŠ” 것을 λœ»ν•œλ‹€.
(https://learn.microsoft.com/ko-kr/previous-versions/8edha89s(v=vs.120)?redirectedfrom=MSDN)

public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
    public int Z { get; set; }
    public Point(int x, int y, int z)
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }
    public static Point operator +(Point p1, Point p2)
    {
        return new Point(p1.X + p2.X, p1.Y + p2.Y, p1.Z + p2.Z);
    }
    public static Point operator -(Point p1, Point p2)
    {
        return new Point(p1.X - p2.X, p1.Y - p2.Y, p1.Z - p2.Z);
    }
    public String toString()
    {
        return "x: " + X + ", y: " + Y + ", z: " + Z;
    }
}

static void Main(string[] args)
{
    Point p1 = new Point(5, 4, 11);
    Point p2 = new Point(1, 3, 3);
    Point addPoint = p1 + p2;
    Point subPoint = p1 - p2;

    Console.WriteLine(addPoint.toString());
    Console.WriteLine(subPoint.toString());
}

// μ‹€ν–‰ κ²°κ³Ό
x: 6, y: 7, z: 14
x: 4, y: 1, z: 8

λΉ„νŠΈ

데이터λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ΅œμ†Œ λ‹¨μœ„μ΄λ‹€.
λ©”λͺ¨λ¦¬λŠ” λΉ„νŠΈ λ‹¨μœ„λ‘œ 데이터λ₯Ό μ €μž₯ν•  수 있으며, 1개의 λΉ„νŠΈμ—λŠ” 0 λ˜λŠ” 1의 κ°’λ§Œ μ €μž₯ν•  수 μžˆλ‹€.
첫 번째 λΉ„νŠΈλŠ” λΆ€ν˜Έλ₯Ό λ‚˜νƒ€λ‚΄λ©° 첫 번째 λΉ„νŠΈμ— 1이 μžˆλ‹€λ©΄ 값은 음수, 0이 μžˆλ‹€λ©΄ μ–‘μˆ˜μ΄λ‹€.
0 λ˜λŠ” 1의 μ‘°ν•©μœΌλ‘œ 논리 계산을 μˆ˜ν–‰ν•œλ‹€.

10μ§„μˆ˜λ₯Ό 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” 방법

10μ§„μˆ˜μ˜ 값을 1 λ˜λŠ” 0이 될 λ•ŒκΉŒμ§€ 계속 2둜 λ‚˜λˆ„μ–΄ μ€€ λ‹€μŒ λ‚˜λˆˆ μœ„μΉ˜μ˜ λ‚˜λ¨Έμ§€ 값을 μ•„λž˜μ—μ„œ μœ„λ‘œ μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•œλ‹€.
ex) 23 -> 0001 0111

2μ§„μˆ˜λ₯Ό 10μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” κ³Όμ •

1 byte에 2μ§„μˆ˜λ‘œ μ €μž₯된 값을 2의 제곱으둜 λ‚˜νƒ€λ‚΄λ©°, 각각의 λΉ„νŠΈμ— 1이 μžˆλ‹€λ©΄ 1κ³Ό 2의 제곱의 μœ„μΉ˜λ₯Ό κ³„μ‚°ν•œ λ‹€μŒ 각각의 λΉ„νŠΈλ₯Ό λͺ¨λ‘ λ”ν•˜μ—¬ 10μ§„μˆ˜λ‘œ λ‚˜νƒ€λ‚Έλ‹€.

λΉ„νŠΈ μ—°μ‚°μž

λΉ„νŠΈ λ‹¨μœ„λ‘œ 논리 연산을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ—°μ‚°μžμ΄λ‹€.

λΉ„νŠΈ μ—°μ‚°μž μ„€λͺ… 예제 ( a = 15 (0000 1111), b = 10 (0000 1010) )
& (AND) 두 개의 ν”Όμ—°μ‚°μžκ°€ λͺ¨λ‘ 1이면 1을 λ°˜ν™˜ (a & b) -> 0000 1010
(OR) 두 개의 ν”Όμ—°μ‚°μž 쀑에 ν•˜λ‚˜λΌλ„ 1이라면 1을 λ°˜ν™˜ (a OR b) -> 0000 1111
^ (XOR) 두 개의 ν”Όμ—°μ‚°μžκ°€ μ„œλ‘œ κ°™μœΌλ©΄ 0을 λ°˜ν™˜, μ„œλ‘œ λ‹€λ₯΄λ©΄ 1을 λ°˜ν™˜ (a ^ b) -> 0000 0101
~ (NOT) ν”Όμ—°μ‚°μžμ˜ 값을 λ°˜μ „μ‹œν‚΄ (~a) -> 1111 0000

λΉ„νŠΈ μ—°μ‚°μž

μ‹œν”„νŠΈ μ—°μ‚°μž

0κ³Ό 1둜 이루어진 2μ§„μˆ˜λ₯Ό μ™Όμͺ½ λ˜λŠ” 였λ₯Έμͺ½μœΌλ‘œ μ›ν•˜λŠ” 자리 수만큼 μ΄λ™ν•˜λŠ” μ—°μ‚°μžμ΄λ‹€.

int data = 10;     // 0000 1010  
(data << 2)        // 0010 1000
(data >> 2)        // 0000 0010

μ‹œν”„νŠΈ μ—°μ‚°μž

μ‹€μˆ˜ ν˜•νƒœμ˜ 10μ§„μˆ˜λ₯Ό 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” 방법

10μ§„μˆ˜ μ‹€μˆ˜ 뢀뢄을 1.0이 될 λ•ŒκΉŒμ§€ 계속 2둜 κ³±ν•œ λ‹€μŒ 결과의 μ •μˆ˜ 뢀뢄을 μœ„μ—μ„œ μ•„λž˜λ‘œ μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•œλ‹€.

4 byte 크기의 μ‹€μˆ˜ν˜• μžλ£Œν˜•(float)은 μ†Œμˆ˜μ  μ΄ν•˜ 6μžλ¦¬κΉŒμ§€λ§Œ ν‘œκΈ°ν•˜λ©°,
8 byte 크기의 μ‹€μˆ˜ν˜• μžλ£Œν˜•(double)은 μ†Œμˆ˜μ  μ΄ν•˜ 155μžλ¦¬κΉŒμ§€λ§Œ 정확도λ₯Ό ν‘œκΈ°ν•œλ‹€.


λ©”λͺ¨λ¦¬ ꡬ쑰

ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κ²Œ 되면 λ©”λͺ¨λ¦¬μ— 각각의 데이터듀이 μ €μž₯되며
ν•„μš”μ— 따라 μ“°κ³  μ§€μš°κΈ°λ₯Ό λ°˜λ³΅ν•˜λ©° ν”„λ‘œκ·Έλž¨μ΄ λ™μž‘ν•œλ‹€.
그리고 κ·Έ ν•„μš”μ— 따라 각 λ°μ΄ν„°μ˜ μ €μž₯ 곡간이 κ΅¬λΆ„λ˜μ–΄ μ €μž₯λœλ‹€.

CODE μ˜μ—­

μ‹€ν–‰ν•  ν”„λ‘œκ·Έλž¨μ˜ μ½”λ“œκ°€ μ €μž₯λ˜λŠ” μ˜μ—­μ΄λ©°,
CPUλŠ” μ½”λ“œ μ˜μ—­μ—μ„œ μ €μž₯된 λͺ…령을 ν•˜λ‚˜μ”© 가져와 μ²˜λ¦¬ν•˜κ²Œ λœλ‹€. ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘λ˜κ³  μ’…λ£Œλ  λ•ŒκΉŒμ§€ λ©”λͺ¨λ¦¬μ— λ‚¨μ•„μžˆλŠ” νŠΉμ§•μ„ 가지고 μžˆλ‹€.

DATA μ˜μ—­

μ „μ—­ λ³€μˆ˜μ™€ 정적 λ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” μ˜μ—­μ΄λ‹€.
ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘λ  λ•Œ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜λ©°, ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ λ©”λͺ¨λ¦¬μ— λ‚¨μ•„μžˆλŠ” νŠΉμ§•μ„ 가지고 μžˆλ‹€.

HEAP μ˜μ—­

μ‚¬μš©μžκ°€ 직접 λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήν•˜κ³  ν•΄μ œν•˜λŠ” μ˜μ—­μœΌλ‘œ λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” 데이터와 객체듀을 μ €μž₯ν•œλ‹€.
μ½”λ“œ 블둝( {} )κ³Ό 상관없이 데이터가 사라지지 μ•ŠμœΌλ©°, μ €μž₯된 데이터와 객체듀은 가비지 μ»¬λ ‰μ…˜μ— μ˜ν•΄ κ΄€λ¦¬λœλ‹€.

STACK μ˜μ—­

ν•¨μˆ˜ 호좜 및 지역 λ³€μˆ˜μ™€ 맀개 λ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” μ˜μ—­μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ΄ μžλ™μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μž„μ‹œ λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ‹€.
μŠ€νƒ μ˜μ—­μ— μ €μž₯λ˜λŠ” ν•¨μˆ˜μ˜ 호좜 정보λ₯Ό μŠ€νƒ ν”„λ ˆμž„(Stack Frame)이라고 ν•œλ‹€.
ν•¨μˆ˜ 호좜이 λλ‚˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜μ™€ κ΄€λ ¨λœ 데이터가 μ‚¬λΌμ§€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.