기계어와 가까운 그 어셈블리어가 아니고 컴파일 결과물을 C#에서는 어셈블리라고 함.
=> NET 런타임 환경에서 실행할 수있는 코드 덩어리.
dll 또는 exe 으로 주로 두 가지 유형이 있다.
개인 어셈블리 :
한 응용 프로그램의 유일한 속성 인 dll 또는 exe . 일반적으로 응용 프로그램 루트 폴더에 저장된다.
공용 / 공유 어셈블리 :
한 번에 여러 응용 프로그램에서 사용할 수있는 dll. 공유 어셈블리는 GAC, 즉 Global Assembly Cache에 저된다.
출처 : https://learn.microsoft.com/ko-kr/dotnet/standard/assembly/
객체 내부에서만 접근 가능하게 한다. 또한 연관있는 변수와 메소드를 묶어준다.
=> 특정 메서드로만 접근 가능하게 만든다.
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
을 상속받고, SystemException
은 Exception
을 상속받는다.
즉, 상속 받을수록 더 구체적이고 추상화 단계가 높아짐
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());
}
}
MainVocal
과 MainDancer
이 Member
클래스의 기본속성과 메서드를 잘 물려받았다.
하나의 객체가 여러 타입을 가질 수 있음을 의미한다. 사실 이렇게말하면 이해가 잘 안된다.
=> 같은 동작을 여러 형태로 구현 할 수 있다라고 이해하면 된다.
위 예시에서 동일한 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!"
추상클래스를 이용하여 인터페이스보다 조금 더 세밀한 추상화를 이용했다.