λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ–₯️/C#

[이것이 C#이닀] Chapter07: μ—°μŠ΅λ¬Έμ œ

by HanaV 2023. 8. 17.
728x90

1. ν΄λž˜μŠ€μ™€ 객체, μΈμŠ€ν„΄μŠ€λŠ” μ„œλ‘œ μ–΄λ–€ 점이 λ‹€λ₯Έκ°€μš”?

ν΄λž˜μŠ€λŠ” 객체λ₯Ό λ§Œλ“€κΈ° μœ„ν•œ 섀계도, κ°μ²΄λŠ” 클래슀λ₯Ό μ‹€μ²΄ν™”ν•œ κ²ƒμœΌλ‘œ μΈμŠ€ν„΄μŠ€μ˜ ν•œ μ’…λ₯˜μ΄λ‹€.
예) "μžλ™μ°¨"λΌλŠ” ν΄λž˜μŠ€κ°€ 있고, 이 ν΄λž˜μŠ€λŠ” μžλ™μ°¨μ˜ 속성(색상, λΈŒλžœλ“œ λ“±)κ³Ό λ™μž‘(가속, μ œλ™ λ“±)을 μ •μ˜ν•œλ‹€. 이 클래슀λ₯Ό 기반으둜 "블루 ν† μš”νƒ€ μžλ™μ°¨"와 "λ ˆλ“œ ν˜„λŒ€ μžλ™μ°¨"와 같은 객체λ₯Ό 생성할 수 μžˆλ‹€. μ΄λ ‡κ²Œ μƒμ„±λœ 객체듀은 클래슀의 μΈμŠ€ν„΄μŠ€μ΄λ©°, ν΄λž˜μŠ€μ— μ •μ˜λœ 속성과 λ™μž‘μ„ κ°€μ§€κ²Œ λœλ‹€.

 

2. λ‹€μŒ μ½”λ“œμ—μ„œ 였λ₯˜λ₯Ό μ°Ύκ³ , 였λ₯˜μ˜ 원인을 μ„€λͺ…ν•˜μ„Έμš”.

class A
{
}

class B: A
{
}

class C
{
    public static void Main()
    {
        A a = new A();
        B b = new B();
        A c = new B();
        B d = new A();
    }
}
  • BλŠ” Aλ₯Ό 상속받고 μžˆλŠ” ν΄λž˜μŠ€μ΄λ‹€. 즉, Aκ°€ λΆ€λͺ¨ 클래슀, Bκ°€ μžμ‹ ν΄λž˜μŠ€μ΄λ‹€.
  • A a = new A(); : A 클래슀의 객체 aλ₯Ό 생성
  • B b = new B(); : B 클래슀의 객체 bλ₯Ό 생성.
  • A c = new B(); : B 클래슀의 객체λ₯Ό A νƒ€μž… λ³€μˆ˜μ— 할당함. => λ‹€ν˜•μ„±μ„ λ³΄μ—¬μ€Œ. c λ³€μˆ˜λŠ” B 클래슀의 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ, λ³€μˆ˜ νƒ€μž…μ€ A이닀.
  • B d = new A(); : A 클래슀의 객체λ₯Ό B νƒ€μž… λ³€μˆ˜μ— ν• λ‹Ήν•˜λ €κ³  ν•˜λ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€. μ™œλƒν•˜λ©΄ AλŠ” B의 λΆ€λͺ¨ν΄λž˜μŠ€μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.(더 μƒμœ„μž„)

 

3. this ν‚€μ›Œλ“œμ™€ base ν‚€μ›Œλ“œμ— λŒ€ν•΄ μ„€λͺ…ν•˜μ„Έμš”.

this ν‚€μ›Œλ“œ: 자기 μžμ‹ μ„ κ°€λ¦¬ν‚€λŠ” 것
base ν‚€μ›Œλ“œ: λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ‚˜ 멀버에 μ ‘κ·Όν•  λ•Œ λΆ€λͺ¨ 클래슀λ₯Ό κ°€λ¦¬ν‚€λŠ” 것

 

4. ꡬ쑰체에 λŒ€ν•œ λ‹€μŒ μ„€λͺ… 쀑 ν‹€λ¦° 것을 λͺ¨λ‘ μ°ΎμœΌμ„Έμš”.
β‘  struct ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ μ„ μ–Έν•œλ‹€.
β‘‘ 볡사할 λ•Œ 얕은 볡사가 이루어진닀.
β‘’ μ°Έμ‘° ν˜•μ‹μ΄λ‹€.
β‘£ λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ μˆ˜ μžˆλ‹€.

  • 2번: structλŠ” κΉŠμ€ 볡사가 이루어진닀.
  • 3번: structλŠ” κ°’ ν˜•μ‹, classλŠ” μ°Έμ‘° ν˜•μ‹

 

5. λ‹€μŒ μ½”λ“œλ₯Ό 컴파일 및 싀행이 κ°€λŠ₯ν•˜λ„λ‘ μˆ˜μ •ν•˜μ„Έμš”.

using System;

namespace ReadonlyMethod
{
    struct ACSetting
    {
        public double currentInCelsius;
        public double target;

        public readonly double GetFahrenheit()
        {
            target = currentInCelsius * 1.8 + 32;
            return target;
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            ACSetting acs;
            acs.currentInCelsius = 25;
            acs.target = 25;

            Console.WriteLine($"{acs.GetFahrenheit()}");
            Console.WriteLine($"{acs.target}");
        }
    }
}

μœ„ μ½”λ“œλŠ” μ½κΈ°μ „μš©μΈ targetμ—λŠ” ν• λ‹Ήν•  수 μ—†λ‹€λŠ” μ—λŸ¬κ°€ λ‚œλ‹€. target을 κ±΄λ“œλ¦¬μ§€ μ•Šκ³  λ°”λ‘œ Fahrenheit둜 λ³€ν™˜ν•œ 것을 λ¦¬ν„΄ν•˜λ©΄ λœλ‹€.

μˆ˜μ •λœ μ½”λ“œ

using System;

namespace ReadonlyMethod
{
    struct ACSetting
    {
        public double currentInCelsius;
        public double target;

        public readonly double GetFahrenheit()
        {
            return currentInCelsius * 1.8 + 32;
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            ACSetting acs;
            acs.currentInCelsius = 25;
            acs.target = 25;

            Console.WriteLine($"{acs.GetFahrenheit()}");
            Console.WriteLine($"{acs.target}");
        }
    }
}

 

6. λ‹€ν˜•μ„±μ€ λ¬΄μ—‡μ΄λ©°, μ˜€λ²„라이딩과 λ¬΄μŠ¨ κ΄€κ³„κ°€ μžˆλŠ”지 μ„€λͺ…ν•˜μ„Έμš”.

λ‹€ν˜•μ„±μ€ ν•˜λ‚˜μ˜ κΈ°λŠ₯을 λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것을 λ§ν•œλ‹€. μ˜€λ²„λΌμ΄λ”©μ€ λ‹€ν˜•μ„±μ˜ ν•œ ν˜•νƒœλ‘œ, ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μƒμœ„ 클래슀의 λ©”μ„œλ“œλ₯Ό 이름과 λ§€κ°œλ³€μˆ˜ νƒ€μž…κ³Ό κ°œμˆ˜λŠ” κ°™μ§€λ§Œ λ‹€λ₯Έ λ™μž‘μ„ ν•˜λ„λ‘ ν•˜λŠ” 것이닀.

 

7. λ‹€μŒ μ½”λ“œμ—μ„œ switch 식을 μ œκ±°ν•˜κ³  switch 문으둜 λ™μΌν•œ κΈ°λŠ₯을 μž‘μ„±ν•˜μ„Έμš”.

private static double GetDiscountRate(object client)
{
    return client switch
    {
        ("학생", int n) when n < 18 => 0.2, //학생 & 18μ„Έ 미만
        ("학생", _) => 0.1, //학생 & 18μ„Έ 이상
        ("일반", int n) when n < 18 => 0.1, //일반 & 18μ„Έ 미만
        ("일반", _) => 0.05, //일반 & 18μ„Έ 이상
        _ => 0,
    };
}

μˆ˜μ •λœ μ½”λ“œ

private static double GetDiscountRate(object client)
{
    switch (client)
    {
        case ("학생", int n) when n < 18:
            return 0.2; // 학생 & 18μ„Έ 미만
        case ("학생", _):
            return 0.1; // 학생 & 18μ„Έ 이상
        case ("일반", int n) when n < 18:
            return 0.1; // 일반 & 18μ„Έ 미만
        case ("일반", _):
            return 0.05; // 일반 & 18μ„Έ 이상
        default:
            return 0;
    }
}
728x90

"); wcs_do();