인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Lucas님의 프로필 이미지

작성한 질문수

C# 프로그래밍 기초부터 실전 활용까지

상속(접근 제어자)

접근 제어자로 필드를 만들어 파생 클래스에서 사용할 때 질문입니다.

해결된 질문

작성

·

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 함수를 사용하면 "피카 피카~~!"가 잘 출력되는 것을 확인했습니다.

 

제가 궁금한건

  1. Pikachu 파생 클래스에서 sound 변수를 Sound() 함수 안이 아니라 밖에서 값을 초기화 할 때 왜 에러가 뜨는지 궁금합니다.

  2. 그리고 이렇게 함수가 아닌 밖에서 초기화해서 사용할 수 있는 방법은 무엇이 있는지 궁금합니다.

class Pikachu : Pokemon
{
    sound = "피카 피카~~!";
    public Pikachu() : base
    {}
    protected void Sound()
    {
        Console.WriteLine($"{sound}"); 
    }
}

감사합니다!!

답변 2

1

Kaburi님의 프로필 이미지
Kaburi
지식공유자

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();
  }
}

더 궁금한 사항이 있으시다면 언제든지 질문주세요. 감사합니다. ^^

Lucas님의 프로필 이미지
Lucas
질문자

아하 어떤 말씀이신지 이해했습니다! 감사합니다!

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. Lucas님.

질문해주신 내용과 관련된 접근 제어자 및 클래스 상속에 대한 몇 가지 중요한 사항들을 함께 이해해보겠습니다.

  1. Pikachu 클래스에서 sound 변수를 함수 밖에서 초기화할 때 발생하는 에러:

    • C#에서는 클래스의 멤버 변수를 초기화할 때, 클래스 본체 내부에서 별도의 초기화 코드(생성자)를 사용하거나, 필드 선언 시점에 초기화하는 방식이 가능합니다. 클래스 본체(body)에서는 멤버 변수 선언 후에 바로 값을 할당할 수 없으므로, 에러가 발생합니다.
    • sound = "피카 피카~~!";와 같이 생성자나 초기화 블록 안이 아닌 클래스 본체 바로 아래에서 값을 할당하면 이는 올바른 문법이 아니며, 해당 부분은 다른 방법으로 처리해야 합니다.
  2. 함수 밖에서 초기화하는 방법:

    • 필드를 선언하면서 초기화하거나, 생성자에서 초기화할 수 있습니다.

    • 예시:

      class Pikachu : Pokemon
      {
       // 필드 선언과 동시에 초기화
       protected string sound = "피카 피카~~!";
      
      
       public Pikachu() : base()
       {
           // 또는 생성자 내부에서 초기화 가능
           // sound = "피카 피카~~!";
       }
      
      
       protected void Sound()
       {
           Console.WriteLine($"{sound}");
       }
      }
      

관련 내용을 보다 자세히 알고 싶으시다면 아래 링크를 참고하시면 도움이 될 것입니다:
- C# 클래스의 필드 초기화 방법

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Lucas님의 프로필 이미지

작성한 질문수

질문하기