<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>youani_03</title>
        <link>https://velog.io/</link>
        <description>낭만주의</description>
        <lastBuildDate>Fri, 03 Jan 2025 23:11:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. youani_03. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/youani_03" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[C#/Unity] Property에 대해 알아보기]]></title>
            <link>https://velog.io/@youani_03/AboutProperty</link>
            <guid>https://velog.io/@youani_03/AboutProperty</guid>
            <pubDate>Fri, 03 Jan 2025 23:11:49 GMT</pubDate>
            <description><![CDATA[<h3 id="property란-무엇이고-왜-사용할까">Property란 무엇이고 왜 사용할까?</h3>
<p>클래스 내에는 여러 필드(멤버 변수)들이 존재한다.
외부에서 클래스에 접근할 때, <strong>이 필드에 직접 접근하여 읽기/쓰기를 하도록 하는 것은 좋지 않다.</strong>
이때, <strong>외부에서 필드에 간접 접근</strong>할 수 있도록 Property를 제공한다.</p>
<h3 id="property-기본-예제">Property 기본 예제</h3>
<pre><code class="language-cs">class Person
{
    private string _name;

    public string Name
    {
        get { return _name; }    //getter
        set { _name = value; }    //setter
    }
}

class Program
{
    static void Main()
    {
        Person person = new Person();
        person.Name = &quot;John&quot;;             // call setter
        Console.WriteLine(person.Name);    // call getter
    }
}</code></pre>
<p>앞서 말했던 표현을 빌려서 말해보면,
Person의 _name 필드에 외부에서 직접 접근하는 것은 좋지 않으므로,
외부에서 접근할 때에는 Name property를 통해 간접적으로 접근한다.</p>
<p>setter 내의 value는 setter를 호출할 때 전달되는 값을 나타낸다.
위 코드에서는 John이 value이다.</p>
<h3 id="property는--값을-검증하는데-사용할-수-있다">Property는  값을 검증하는데 사용할 수 있다.</h3>
<p>property를 잘 이용하면 외부에서 접근할 때 데이터 변경에 대해 제한을 추가할 수 있다.</p>
<pre><code class="language-cs">class Person
{
    public int _age;

    public int Age
    {
        get { return _age; }
        set
        {
            if (value &lt; 0)
                _age = 0;
            else
                _age = value;
        }
    }
}</code></pre>
<p>setter를 살짝 수정해서 age가 0 이하의 값이 되지 않도록 제한할 수 있다.</p>
<h3 id="자동-구현-property">자동 구현 property</h3>
<p>property를 명시적으로 정의하는 번거로움을 줄이기 위해 C#에서는 자동 구현 property를 제공한다.</p>
<pre><code class="language-cs">class Person
{
    public string Name {get; set;}
}</code></pre>
<p>위 코드를 사용하면 컴파일러는 내부적으로 밑의 코드로 처리한다.</p>
<pre><code class="language-cs">class Person
{
    private string _name;

    public string Name
    {
        get { return _name; }    //getter
        set { _name = value; }    //setter
    }
}</code></pre>
<h3 id="private-set-property">private set property</h3>
<p>set 대신 private set을 사용함으로써
외부에서 직접적으로 데이터를 변경하는 것을 막으면서도
class 내부에서는 값을 설정할 수 있도록 만들 수 있다.</p>
<pre><code class="language-cs">class Person
{
    public string Name {get; private set;}

    public Person(string name)
    {
        Name = name
    }

    public void changeName(string name)
       {
        Name = name
    }
}

class Program
{
    static void Main()
    {
        Person person = new Person(&quot;Alice&quot;);

        person.changeName(&quot;Abigail&quot;); // change name
           person.Name = &quot;Haley&quot;; // Error
    }
}</code></pre>
<p>위 코드의 경우 changeName method는 class 내부에 정의되어 changeName을 이용해 Name 필드를 변경할 수 있지만
외부에서 Name 필드에 대한 직접적인 접근은 오류를 일으킨다.</p>
<hr>
<p>저도 개발하면서 배우는 중이라 내용에 문제가 있을 수 있어요!
혹시라도 잘못된 내용이 있다면 말해주세요.
확인 후 고치도록 하겠습니다.
읽어주셔서 감사합니다.</p>
<h4 id="참고한-사이트">[참고한 사이트]</h4>
<p><a href="https://chatgpt.com/">ChatGPT</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C#/Unity] Enum에 대해 알아보기]]></title>
            <link>https://velog.io/@youani_03/AboutEnum</link>
            <guid>https://velog.io/@youani_03/AboutEnum</guid>
            <pubDate>Wed, 01 Jan 2025 18:36:05 GMT</pubDate>
            <description><![CDATA[<h3 id="enum을-왜-사용하는-걸까">Enum을 왜 사용하는 걸까?</h3>
<p>Enum은 <strong>상수를 의미있는 단어들로 표현</strong>할 수 있게 해준다.</p>
<pre><code class="language-cs">public enum Direction
{
    Up         // 0
    Down     // 1
    Left     // 2
    Right     // 3
}</code></pre>
<p>위는 enum이 존재하는 의미를 잘 알 수 있는 한 예시이다.
string / bool 타입 모두 Direction을 표현하기에는 애매하거나 비효율적이다.</p>
<p>int 타입으로 표현했을 때, (0, 1, 2, 3) 각각이 어떤 방향을 나타내는지 알기 힘들다.
따라서 의미 있는 단어들로 표현할 수 있게끔 enum을 이용한다.</p>
<h3 id="enum은-숫자형-타입과-호환-가능하다">Enum은 숫자형 타입과 호환 가능하다.</h3>
<p>앞서 말했던 것처럼 enum은 상수를 표현한 것이다. 따라서 enum 타입을 int 타입으로 casting 할 수 있다.</p>
<p>위의 예시처럼 따로 enum을 상수로 정의하지 않으면, 위(UP)를 0으로 정의하고, 아래로 1씩 증가하여 정의된다.</p>
<pre><code class="language-cs">public enum Direction
{
    Up = 2         // 2
    Down         // 3
    Left = 7     // 7
    Right         // 8
}</code></pre>
<p>위의 예시처럼 enum을 상수로 정의할 수도 있다.</p>
<h3 id="enum-비트-연산">Enum 비트 연산</h3>
<p>Enum은 정수형을 기반으로 작동하므로 AND / OR / XOR / NOT 등 비트 연산을 할 수 있다.</p>
<p>아래는 AND / OR 비트 연산의 예시이다.</p>
<pre><code class="language-cs">public enum Direction
{
    Up         // 0
    Down     // 1
    Left     // 2
    Right     // 3
}

Direction UpRight = Direction.Up | Direction.Right; // OR
Console.WriteLine(Upright); // Output: 3

if ((UpRight &amp; Direction.Up) == Direction.Up) // AND
{
    Console.WriteLine(&quot;Up&quot;);
}</code></pre>
<p>하지만, 위의 방식으로 비트 연산을 이용할 경우, Upright의 출력이 3이 된다. <strong>이는 비트 연산을 표현하기에 적합하지 않다.</strong>
따라서 아래의 Attribute를 이용한다.</p>
<h3 id="flag-enum">[Flag] Enum</h3>
<p>Flags 특성을 enum에 추가하면, 이를 <strong>비트 플래그로 사용</strong>할 수 있다.</p>
<pre><code class="language-cs">[Flags]
public enum Direction
{
    Up         // 0b00_0000
    Down     // 0b00_0001
    Left     // 0b00_0010
    Right     // 0b00_0011
}

Direction UpRight = Direction.Up | Direction.Right; // OR
Console.WriteLine(Upright); // Output: Up, Right</code></pre>
<p>이 경우 출력이 Up, Right로 비트 플래그의 의도를 잘 전달할 수 있다.</p>
<h3 id="enum-관련-method">Enum 관련 method</h3>
<h4 id="enumgetname">Enum.GetName</h4>
<p>GetName은 <strong>특정 enum 값에 대한 이름을 반환</strong>한다.</p>
<pre><code class="language-cs">[Flags]
public enum Direction
{
    Up         // 0b00_0000
    Down     // 0b00_0001
    Left     // 0b00_0010
    Right     // 0b00_0011
}

string name = Enum.GetName(typeof(Direction), 1);
Console.WriteLine(name); // Output: Down</code></pre>
<p>값에 대한 이름이 존재하지 않을 경우 null을 반환한다.</p>
<h4 id="enumgetvalues">Enum.GetValues</h4>
<p>GetValues는 <strong>enum에 정의된 모든 값을 배열 형태로 반환</strong>한다.</p>
<pre><code class="language-cs">[Flags]
public enum Direction
{
    Up         // 0b00_0000
    Down     // 0b00_0001
    Left     // 0b00_0010
    Right     // 0b00_0011
}

Array values = Enum.GetValues(typeof(Direction));
foreach (var value in values)
    Console.WriteLine($&quot;{value} = {(int)value}&quot;);</code></pre>
<p>cf) GetNames는 enum에 정의된 모든 이름을 문자열 배열(String[])으로 변환한다.</p>
<h4 id="enumhasflag">Enum.HasFlag</h4>
<p>HasFlag는 Enum에서 <strong>특정 값(플래그)이 설정되어 있는지를 확인</strong>하는 데 사용되는 method이다.</p>
<pre><code class="language-cs">[Flags]
public enum Direction
{
    Up         // 0b00_0000
    Down     // 0b00_0001
    Left     // 0b00_0010
    Right     // 0b00_0011
}

Direction UpRight = Direction.Up | Direction.Right;
Console.WriteLine(UpRight.HasFlag(Direction.Up); // Output: True
Console.WriteLine(UpRight.HasFlag(Direction.Down); // Output: False</code></pre>
<p>HasFlag는 내부적으로 비트 AND 연산을 이용하여 특정 플래그가 있는지를 확인한다.
내부적으로 boxing을 이용하기 때문에, 빈번하게 호출하면 성능에 영향을 미칠 수 있고, 이 경우 직접 AND 연산을 이용하는게 빠르다.
<br>
<br></p>
<hr>
<p>저도 개발하면서 배우는 중이라 내용에 문제가 있을 수 있어요!
혹시라도 잘못된 내용이 있다면 말해주세요.
확인 후 고치도록 하겠습니다.
읽어주셔서 감사합니다.</p>
<h4 id="참고한-사이트">[참고한 사이트]</h4>
<p><a href="https://chatgpt.com/">ChatGPT</a>
<a href="https://medium.com/@tlsdydwls123/c-%EB%94%B0%EB%9D%BC%ED%95%98%EA%B8%B0-7%EA%B0%95-enum-%EC%97%B4%EA%B1%B0%ED%98%95-d1e64e9e0ca7">C# 따라하기 7강 : enum(열거형)</a>
<a href="https://blog.naver.com/kojy2004/223440105021">[C#] Enum (열거형)</a></p>
]]></description>
        </item>
    </channel>
</rss>