
다음 중 오류가 발생하는 코드를 모두 고르시오.
public class Parent
{
private int privateValue;
protected int protectedValue;
public int publicValue;
void ParentFunction()
{
privateValue = 0; // (a)
protectedValue = 0; // (b)
publicValue = 0; // (c)
}
}
public class Child : Parent
{
void ChildFunction()
{
privateValue = 0; // (d)
protectedValue = 0; // (e)
publicValue = 0; // (f)
}
}
static void Main()
{
Parent parent;
Child child;
parent.privateValue = 0; // (g)
parent.protectedValue = 0; // (h)
parent.publicValue = 0; // (i)
child.privateValue = 0; // (j)
child.protectedValue = 0; // (k)
child.publicValue = 0; // (l)
}
d, g, h, j, k -> d
- Main 함수에서 Parent/Child 모두 생성자를 통한 인스턴스를 생성하지 않았으므로 g,h,j,k 도 오류다.
아래 코드를 보고 이어지는 문제의 답을 적으시오.
public class Player
{
public void Attack(Monster monster) { monster.TakeHit(); }
}
public class Monster
{
public string name;
public Monster() { name = "몬스터"; }
public virtual void TakeHit() { Console.WriteLine($"{name}이 데미지를 받았습니다.")}
}
public class Slime : Monster
{
public Slime() { name = "슬라임"; }
public void TakeHit() { Console.WriteLine($"{name}이 분열합니다.") }
}
public class Dragon : Monster
{
public Dragon() { name = "드래곤"; }
public override void TakeHit() { Console.WriteLine($"{name}이 분노합니다.") }
}
static void Main(string[] args)
{
Player player = new Player();
Slime slime = new Slime();
Dragon dragon = new Dragon();
// 문제 코드
slime.TakeHit();
}
슬라임이 데미지를 받았습니다 -> 슬라임이 분열합니다.
- Slime class 에 대한 인스턴스화 였기 때문에 Slime 내 멤버 함수를 호출하게 된다.
- 참고로, Monster 로 Upcasting 되면 Monster 에서 정의한 TakeHit 이 적용되게 된다.
다음 중 이벤트에 대한 설명으로 옳지 않은 것을 고르시오.
a. 이벤트는 일련의 사건이 발생했다는 사실을 다른 객체에게 전달하는 용도로 사용한다.
b. 이벤트는 델리게이트의 일종이며 델리게이트의 일부 기능을 제한하여 이벤트로 사용한다.
c. 이벤트는 호출 순서를 보장해주지는 않으며, 사건 발생에 반응하는데 목적이 있다.
d. 이벤트는 += 과 -= 을 통한 추가 할당과 할당 제거만이 가능하며 = 대입연산자는 제한되어 있다.
e. 이벤트는 클래스 외부에서 발생이 가능하다.
c -> e
Invoke함수는 클래스 내에서만 발생한다. 외부에서는 구독만 가능하다.- 이벤트는 "호출 순서"를 보장하지는 않는다.