Reference : C# 입문부터 안드로이드, 윈도우 앱(UWP) 동시에 만들기 Xamarin Forms(자마린 폼즈) + Maui(마우이)

https://www.inflearn.com/course/lecture?courseSlug=c-sharp-%EC%9E%90%EB%A7%88%EB%A6%B0-%ED%8F%BC%EC%A6%88&unitId=84981&tab=curriculum 

 

학습 페이지

 

www.inflearn.com

 

< 클래스 생성자 오버로딩 >

클래스 생성자:

        클래스를 생성할때 호출되는 메소드로 클래스 이름과 같다.

        생성자는 다른 메소드 처럼 반환값을 가질 수가 없다.

오버로딩:

        함수의 이름은 같고 매개변수를 다르게 하여 개발하는 방식

public class Rectangle
{
    public int Width { get; set; }
    public int Height { get; set; }

    // Default constructor
    public Rectangle() 
    {
        Width = 0;
        Height = 0;
    }

    // Constructor overloading
    public Rectangle(int side) 
    {
        Width = Height = side;
    }

    public Rectangle(int width, int height)
    {
        Width = width;
        Height = height;
    }
}

이 것을 다른 .cs에 있다고 가정 했을 때,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{   

           class Program
        {
            static void Main()
            {
                Rectangle r1 = new Rectangle();
                Console.WriteLine($"Width: {r1.Width}, Height: {r1.Height}");

                Rectangle r2 = new Rectangle(5);
                Console.WriteLine($"Width: {r2.Width}, Height: {r2.Height}");

                Rectangle r3 = new Rectangle(4, 7);
                Console.WriteLine($"Width: {r3.Width}, Height: {r3.Height}");
            }
        }
    }

.Height,.Width로 가져올 수 있다.

< 상속과 Protected >

C#에서 상속을 사용하면 한 클래스가 다른 클래스의 속성과 메소드를 상속 받을 수 있다. protected 접근 한정자는 해당 클래스 및 상속받은 클래스에서만 접근이 가능하게 한다.

 

상속: 
       다른 클래스에 정의된 멤버를 불려 받을 수 있는 기능
        상속해주는 클래스  - 부모클래스
        상속 받는 클래스  - 자식클래스

public class Animal
{
    protected int legs = 4;  // protected 변수

    public void Eat()
    {
        Console.WriteLine("Eating...");
    }
}

public class Dog : Animal  // Animal 클래스를 상속 받음
{
    public void Bark()
    {
        Console.WriteLine($"Barking with {legs} legs...");  // protected 변수 사용
    }
}
class Program
{
    static void Main()
    {
        Dog dog = new Dog();
        dog.Eat();
        dog.Bark();
    }
}

< Sealed 클래스와 메소드 오버라이딩 >

C#에서 'sealed' 키워드는 클래스를 봉인하여 다른 클래스가 해당 클래스를 상속받는 것을 막는다.

즉, 클래스명 앞에 sealed를 붙이면 상속을 못 하고 인스턴스화를 해서만 사용할 수 있다.

오버라이딩 (Overriding) :
오버로딩과 비슷하지만 오버로딩은 클래스내에서 동일한 이름으로 매개변수를
           다르게 하는 방식이고 오버라이딩은 클래스의 상속관계에서 메소드를 재정의 하는 방법

sealed class SealedClass
{
    public int x;
    public int y;
}

class Program
{
    static void Main()
    {
        SealedClass sc = new SealedClass();
        sc.x = 10;
        sc.y = 20;
        Console.WriteLine($"x = {sc.x}, y = {sc.y}");
    }
}

메소드 오버라이딩

C#에서 메소드 오버라이딩은 상속받은 메소드를 자식 클래스에서 재정의하는 것을 의미한다. 이를 위해서는 기본 클래스의 메소드에 virtual 키워드를 사용하고, 파생 클래스에서는 override 키워드를 사용해야 한다.

public class Animal
{
    public virtual void sound()
    {
        Console.WriteLine("This is the sound of an animal");
    }
}

public class Dog : Animal
{
    public override void sound()
    {
        Console.WriteLine("This is the sound of a dog");
    }
}
class Program
{
    static void Main()
    {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();

        myAnimal.sound();
        myDog.sound();
    }
}

< Partial 클래스 >

파샬 partial class :
           두개 이상의 파일이 클래스를 나뉘어서 개밝하는 방식
           컴파일시 자동으로 결합이 되고, 코드가 길어질 경우 관리를 수월하게 할 수가 있고,
           하나의 클래스를 여러명에서 동시에 작성할 수 있다. 
partial class 클래스명
            {
                  //코드
            }

// File1.cs
public partial class PartialClass
{
    public void Method1()
    {
        Console.WriteLine("Method 1");
    }
}
// File2.cs
public partial class PartialClass
{
    public void Method2()
    {
        Console.WriteLine("Method 2");
    }
}
class Program
{
    static void Main()
    {
        PartialClass myClass = new PartialClass();
        myClass.Method1();
        myClass.Method2();
    }
}

< 추상 클래스 >

C#에서 추상 클래스(abstract class)는 인스턴스를 만들 수 없고, 하나 이상의 추상 메서드(정의되지 않은 메서드, 즉 프로토타입만 있는 메서드)를 가질 수 있는 클래스를 말한다. 이 클래스는 반드시 상속을 통해 사용되며, 상속받은 클래스에서 추상 메서드를 구현(override)해야 한다.

abstract 추상클래스:

       상속을 해주기 위한 클래스

abstract class 추상클래스

{

     abstract public void message();  //상속받은 클래스에서 기능 구현

}

class 자식클래스 : 추상클래스

{

     public override void message()

    {

  Console.WriteLine(“코드구현”);

    }

}

예를 들어서 동물소리를 추상메서드로 사용한다고 가정해보자.

public abstract class Animal
{
    public abstract void animalSound(); // 추상 메서드

    public void sleep() 
    {
        Console.WriteLine("Zzz");
    }
}

이젠 돼지가 Animal을 오버라이드하여 구현하면 된다.

public class Pig : Animal
{
    public override void animalSound() // 추상 메서드를 오버라이드하여 구현
    {
        Console.WriteLine("The pig says: wee wee");
    }
}
class Program
{
    static void Main()
    {
        Pig myPig = new Pig(); 
        myPig.animalSound();  
        myPig.sleep();  
    }
}

< 정적 Static 클래스 >

static 정적 클래스 : 
                       인스턴스를 만들어서 사용할 수 없다.
                       생성자를 포함할 수 없다.
                       어디서든 접근할 수 있다.

static class 클래스명
{
	static public string name;
}
   public static class MyMathClass
    {
        public static int Square(int num)
        {
            return num * num;
        }
    }
    static void Main()
        {
            int result = MyMathClass.Square(5); // 인스턴스 생성 없이 사용
            Console.WriteLine(result);
        }

< 인터페이스와 네임스페이스 >

interface 인터페이스:
    메소드 선언은 있지만, 기능을 구현하는 코드는 없다. 다중 상속을 위해 존재한다.

    public interface 인터페이스명
     {
void interfaceVoid();
     }
     public class 클래스명 : 인터페이스명
                            {
                                  public void interfaceVoid()
                                 {
   //코드
                                  } 
      }

네임스페이스 namespace : 
유효범위를 제공하는 선언,모든 식별자가 고유하도록 보장한다.

namespace ShapeNamespace
{
    public interface IShape
    {
        double GetArea();
    }

    public class Rectangle : IShape
    {
        public double Length { get; set; }
        public double Width { get; set; }

        public double GetArea()
        {
            return Length * Width;
        }
    }
}

파일을 별도로 분리하고 싶으면, Rectangle을 다른 파일에다가 옮겨도 똑같은 값이 나온다.

    class Program
    {
        static void Main()
        {
            Rectangle rectangle = new Rectangle();
            rectangle.Length = 5.0;
            rectangle.Width = 3.0;
            Console.WriteLine(rectangle.GetArea());
        }
    }

< 대리자와 익명 메소드 >


대리자 delegate:
매개변수와 반환형식을 갖는 메소드를 캡슐화 하며, 대리자는 참조하는 메소드의 메모리 주소를 가진다.
메소드를 보관하는 공간이고 필요할 때 이 공간을 가져와서 함수를 실행한다.

public delegate void MyDelegate(string msg);

class Program
{
    public static void Hello(string strMessage)
    {
        Console.WriteLine("Hello, " + strMessage);
    }

    public static void Goodbye(string strMessage)
    {
        Console.WriteLine("Goodbye, " + strMessage);
    }

    static void Main()
    {
        MyDelegate del = Hello;
        del("Alice");
        del = Goodbye;
        del("Bob");
    }
}

익명메소드: 
  별도의 메소드를 만들지 않고 불필요한 오버헤드를 줄일 수가 있다.
 재사용할 필요가 없을 경우 사용한다.

public delegate void MyDelegate(string msg);

class Program
{
    static void Main()
    {
        MyDelegate del = delegate(string name)
        {
            Console.WriteLine($"Hello, {name}");
        };
        
        del("Charlie");
    }
}

< 이벤트 핸들러 >

C#에서 이벤트는 특정한 일이 일어날 때마다 호출되는 방법을 제공한다. 이벤트는 대리자를 사용하여 정의된다.

public delegate string MyDel(string str);

class EventProgram
{
    event MyDel MyEvent;

    public EventProgram()
    {
        this.MyEvent += new MyDel(this.WelcomeUser);
    }

    public string WelcomeUser(string username)
    {
        return "Welcome " + username;
    }

    static void Main(string[] args)
    {
        EventProgram obj1 = new EventProgram();
        string result = obj1.MyEvent("Tutorials Point");
        Console.WriteLine(result);
    }
}

< 문자열 다루기 >

class Program
{
    static void Main()
    {
        string txt = "Hello World";
        Console.WriteLine("Length: " + txt.Length); // 문자열 길이 확인
        Console.WriteLine("Upper: " + txt.ToUpper()); // 대문자로 변환
        Console.WriteLine("Lower: " + txt.ToLower()); // 소문자로 변환
        Console.WriteLine("Contains: " + txt.Contains("World")); // 특정 문자열 포함 여부 확인
        Console.WriteLine("Index: " + txt.IndexOf("World")); // 특정 문자열의 위치 찾기
    }
}

'C#' 카테고리의 다른 글

C# 프로퍼티, 객체 초기화  (0) 2023.06.08
MS-SQL 및 SSMS 설치 방법  (0) 2023.06.04
C# 문법 정리  (0) 2023.06.03
C#으로 프로그램 만들기  (0) 2023.06.02
비주얼 스튜디오 설치 및 환경설정 (For Windows)  (0) 2023.06.02

+ Recent posts