inflearn logo
강의

Course

Instructor

C# Programming: From Fundamentals to Practical Application

Inheritance (Access Modifier)

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

Resolved

115

Lucas

27 asked

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

감사합니다!!

C# .net

Answer 2

1

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

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

1

Lucas

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

0

communityai8509

안녕하세요, 인프런 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# 클래스의 필드 초기화 방법

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

UI있는 Designer 오류 발생 질문입니다.

0

70

2

CancelationTokenSource 질문이있습니다.

0

51

2

비동기 2강 UI가 없는 환경 질문입니다.

0

65

1

16_Collection 에서 Stack_ 후입선출에 질문입니다.

0

59

2

꼭 vs2022 로 다운받아야 하나요?

1

114

2

공부 문의드립니다,,

0

77

2

똑같이 따라서 ^1 했는데 에러가 떠요.

0

68

1

영상 구문 그대로 따라했는데 에러가 나요.

0

56

1

30강 듣고 질문이있습니다.

0

62

1

오늘 첫 강의를 들었습니다.

0

80

2

159번 강의 보는데 궁금한게 있습니다

0

62

3

asp.net blazor 강의는 현재 계획없으신가요

0

77

2

강의자료

1

171

2

메소드 호출이 되는이유?

0

76

1

~ 연산자 이해가 안되요

0

166

5

thread join 사용

0

176

4

블로그 글

0

107

2

Delegate 내용은 어디서 다루나요?

0

106

2

Xunit private 메서드 테스트

0

120

2

자원정리 개념

0

113

2

강의 영상 오류

0

88

1

this string text의 동작 과정이 궁금합니다.

0

128

2

type변환 as에서 string과 int, int? 차이 질문입니다.

0

196

2

상속 부분 강좌에서 upcasting을 하는 이유가 궁금합니다.

0

134

2