해결된 질문
작성
·
69
0
class Pokemon
{
protected string sound = "크아아왕";
protected void Sound()
{ Console.WriteLine($"{sound}"); }
}
class Pikachu : Pokemon
{
public Pikachu() : base
{}
protected void Sound()
{
sound = "피카 피카~~!";
Console.WriteLine($"{sound}");
}
}
이렇게 해서 Pikachu의 인스턴스를 만들어 Sound 함수를 사용하면 "피카 피카~~!"
가 잘 출력되는 것을 확인했습니다.
제가 궁금한건
Pikachu 파생 클래스에서 sound 변수를 Sound() 함수 안이 아니라 밖에서 값을 초기화 할 때 왜 에러가 뜨는지 궁금합니다.
그리고 이렇게 함수가 아닌 밖에서 초기화해서 사용할 수 있는 방법은 무엇이 있는지 궁금합니다.
class Pikachu : Pokemon
{
sound = "피카 피카~~!";
public Pikachu() : base
{}
protected void Sound()
{
Console.WriteLine($"{sound}");
}
}
감사합니다!!
답변 2
1
c# 에서는 필드의 값을 변경하고자 할 때 초기화 문이 아닌 이상 메서드 본문에서 할당이 가능합니다.
따라서 말씀해주신 문법 자체가 잘못된 것이며
만약 포켓몬 클래스를 상속받는 모든 클래스가 Sound를 구현해야 한다면
상속 클래스의 abstract property를 만들어보시는 건 어떨까요?
var pika = new Pikachu();
pika.MakePikaSound();
Console.ReadKey();
abstract class Poketmon
{
public abstract string Sound { get; }
protected void MakeSound()
{
Console.WriteLine($"{Sound}");
}
}
class Pikachu : Poketmon
{
public Pikachu() : base() { }
public override string Sound => "피카 피카~~!";
public void MakePikaSound()
{
MakeSound();
}
}
더 궁금한 사항이 있으시다면 언제든지 질문주세요. 감사합니다. ^^
0
안녕하세요, 인프런 AI 인턴입니다. Lucas님.
질문해주신 내용과 관련된 접근 제어자 및 클래스 상속에 대한 몇 가지 중요한 사항들을 함께 이해해보겠습니다.
Pikachu 클래스에서 sound 변수를 함수 밖에서 초기화할 때 발생하는 에러:
sound = "피카 피카~~!";
와 같이 생성자나 초기화 블록 안이 아닌 클래스 본체 바로 아래에서 값을 할당하면 이는 올바른 문법이 아니며, 해당 부분은 다른 방법으로 처리해야 합니다.함수 밖에서 초기화하는 방법:
필드를 선언하면서 초기화하거나, 생성자에서 초기화할 수 있습니다.
예시:
class Pikachu : Pokemon
{
// 필드 선언과 동시에 초기화
protected string sound = "피카 피카~~!";
public Pikachu() : base()
{
// 또는 생성자 내부에서 초기화 가능
// sound = "피카 피카~~!";
}
protected void Sound()
{
Console.WriteLine($"{sound}");
}
}
관련 내용을 보다 자세히 알고 싶으시다면 아래 링크를 참고하시면 도움이 될 것입니다:
- C# 클래스의 필드 초기화 방법
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아하 어떤 말씀이신지 이해했습니다! 감사합니다!