C#을 배워보자 (5) - 객체지향

김영현·2024년 11월 21일
0

C#

목록 보기
5/5

assembly in c#

기계어와 가까운 그 어셈블리어가 아니고 컴파일 결과물을 C#에서는 어셈블리라고 함.
=> NET 런타임 환경에서 실행할 수있는 코드 덩어리.

dll 또는 exe 으로 주로 두 가지 유형이 있다.

개인 어셈블리 :
한 응용 프로그램의 유일한 속성 인 dll 또는 exe . 일반적으로 응용 프로그램 루트 폴더에 저장된다.
공용 / 공유 어셈블리 :
한 번에 여러 응용 프로그램에서 사용할 수있는 dll. 공유 어셈블리는 GAC, 즉 Global Assembly Cache에 저된다.

출처 : https://learn.microsoft.com/ko-kr/dotnet/standard/assembly/


접근제한자(Access Modifier)

  • public : 모든 어셈블리 코드가 액세스 가능.
  • private : 동일한 class, 파생된 struct에 선언된 코드만 액세스 가능.
  • protected : 동일한 class, 파생된 class의 코드만 액세스 가능
  • internal : 동일한 어셈블리 코드만 액세스 가능
  • file : 동일한 파일에 있는 코드만 형식,멤버 액세스 가능
  • protected internal : 동일 어셈블리 or 다른어셈블리의 파생클래스에 있는 코드만 액세스 가능
  • private protected : 동일 어셈블리 or 동일 클래스, 파생클래스에 있는 코드만 액세스 가능

정리


캡슐화

객체 내부에서만 접근 가능하게 한다. 또한 연관있는 변수와 메소드를 묶어준다.
=> 특정 메서드로만 접근 가능하게 만든다.

class Member
{
    private string name; // 이름은 private으로 숨김
    private int age;     // 나이도 private
    public string Position { get; private set; } // 포지션은 읽기만 가능

    public Member(string name, int age, string position)
    {
        this.name = name;
        this.age = age;
        Position = position;
    }

    public string GetInfo()
    {
        return $"Name: {name}, Age: {age}, Position: {Position}";
    }
}

Member winter = new Member("Winter", 23, "Main Vocal");
Console.WriteLine(winter.GetInfo()); // "Name: Winter, Age: 23, Position: Main Vocal"

접근 가능한 멤버는 정상적으로 출력된다.
클래스 내부에서 private멤버 역시 접근 가능하다.

외부에서 접근 불가능한 멤버에 접근시 다음과 같은 오류가 컴파일 시점에 발생한다.


상속

상속은 부모 클래스로부터 공통 변수와 함수, 인터페이스를 그대로 물려받는다.
이전시간에 배웠던 IndexOutOfRangeException클래스 같은 경우 SystemException을 상속받고, SystemExceptionException을 상속받는다.

즉, 상속 받을수록 더 구체적이고 추상화 단계가 높아짐

    class Member
    {
        public string Name { get; private set; }
        public int Age { get; private set; }

        public Member(string name, int age)
        {
            Name = name;
            Age = age;
        }

        public virtual string Perform()
        {
            return $"{Name} is performing!";
        }
    }

    class MainVocal : Member
    {
        public MainVocal(string name, int age) : base(name, age) { }

        public override string Perform()
        {
            return $"{Name} is singing a high note!";
        }
    }

    class MainDancer : Member
    {
        public MainDancer(string name, int age) : base(name, age) { }

        public override string Perform()
        {
            return $"{Name} is dancing powerfully!";
        }
    }
    
        class Program
    {
        public static void Main(string[] args)
        {
            MainVocal winter = new MainVocal("Winter", 23);
            MainDancer karina = new MainDancer("Karina", 24);
            Console.WriteLine(winter.Perform()); 
            Console.WriteLine(karina.Perform());
        }
    }

MainVocalMainDancerMember클래스의 기본속성과 메서드를 잘 물려받았다.


다형성

하나의 객체가 여러 타입을 가질 수 있음을 의미한다. 사실 이렇게말하면 이해가 잘 안된다.
=> 같은 동작을 여러 형태로 구현 할 수 있다라고 이해하면 된다.

위 예시에서 동일한 Perform메서드를 호출했지만, 서로 다른 결과를 낸다.
=> 메서드를 덮어씌워 각기 다른 형태로 동작을 구현함.


추상화

공통된 특징이나 행동을 정의해서 세부구현을 감춰 인터페이스만 제공한다. 이를통해 재사용 가능한 클래스를 만들어 열심히 굴려댈 수 있다.

abstract class Member
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Member(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public abstract string Perform(); // 추상 메서드
}

class MainVocal : Member
{
    public MainVocal(string name, int age) : base(name, age) { }

    public override string Perform()
    {
        return $"{Name} is singing a high note!";
    }
}

class MainDancer : Member
{
    public MainDancer(string name, int age) : base(name, age) { }

    public override string Perform()
    {
        return $"{Name} is dancing powerfully!";
    }
}

Member winter = new MainVocal("Winter", 23);
Member karina = new MainDancer("Karina", 24);
Console.WriteLine(winter.Perform()); // "Winter is singing a high note!"
Console.WriteLine(karina.Perform()); // "Karina is dancing powerfully!"

추상클래스를 이용하여 인터페이스보다 조금 더 세밀한 추상화를 이용했다.


profile
모르는 것을 모른다고 하기

0개의 댓글