[공부] 261013 상속 (작성중)

강현구
∙∙조회 9

 


오늘의 개념

  • 생성자(Constructor): new Player()에서 객체를 생성할 때 실행되는 특별한 메서드
  • 초기화(Initialization): 객체를 처음 사용할 수 있도록 초기 상태를 설정하는 것
  • 객체 이니셜라이저(Object initializer): 객체 생성 직후 프로퍼티나 필드의 초기값을 설정하는 C# 문법

CH20_Q01

태그, 초기 본문, 새 본문, 덧붙일 메모를 한 줄씩 입력함. 태그는 비어 있지 않은 문자열이며 본문·메모는 공백·한글 완성형·영문자로 이루어지고 빈 문자열도 가능함.

TextRecord.Text는 처음 미정이며 setter는 앞뒤 공백을 제거한 길이가 1~12일 때만 저장함. 비공개 백킹 필드는 부모에만 둠. TaggedRecord는 TextRecord를 상속하고 자동 프로퍼티 Tag와 읽기 전용 Formatted를 추가함. Formatted는 태그를 대괄호에 넣고 공백 뒤에 본문을 붙여 반환함.

객체 이니셜라이저로 태그·초기 본문을 설정한 뒤 표시함. 물려받은 Text에 새 본문을 대입하여 표시하고, 파생 클래스의 AppendNote(string note)로 현재 본문 뒤에 공백 하나와 메모를 덧붙인 뒤 표시함. 메모 추가도 부모의 Text 검증을 거치며 잘못된 최종 본문이면 이전 값을 유지함.

csharp
using System;

Console.Write("태그: ");
string tag = Console.ReadLine();

Console.Write("초기 본문: ");
string origin = Console.ReadLine();

Console.Write("새 본문: ");
string neo = Console.ReadLine();

Console.Write("덧붙일 메모: ");
string extra = Console.ReadLine();

//--------------------------------

//1 record를 만든다.
TaggedRecord rec = new TaggedRecord
{
    Tag = tag,
    Text = origin,

};

//get은 값을 돌려주는 기능이야. 화면에 출력하는 기능이 아님
//문제의 표시함 은 화면에 출력하라는 뜻
//Console.WriteLine(tag); //태그도
//2 record.Formatted를 출력
Console.WriteLine(rec.Formatted); //메모 준비가 나옴

//3 record.Text에 neo를 대입한다.

rec.Text = neo;
Console.WriteLine(rec.Formatted); //추가 준비가 나옴

//분명 바로 위에 record가 떡하니 있는데 왜 못알아봄??

// 4. 메모 추가 후 출력
rec.AppendNote(extra);
Console.WriteLine(rec.Formatted);

class TextRecord
{
    //TextRecord.Text는 처음 미정
    //비공개 백킹 필드는 부모에만 둠. 
    private string text;

    public string Text
    {
        get
        {
            //저장된 값 반환
            return text; //뭐 안하면 자동으로 null
        }

        set
        {
            // 앞뒤 공백 제거
            string trimmed = value.Trim();

            // 길이가 1~12일 때만 저장
            if (trimmed.Length <= 12 && 1<= trimmed.Length)
            {
                text = trimmed;
            }
            
            
        }
    }
}

//TaggedRecord는 TextRecord를 상속
class TaggedRecord : TextRecord
{
    //자동 프로퍼티 Tag
    public string Tag { get; set; } = "";

    //읽기 전용 Formatted
    //Formatted는 태그를 대괄호에 넣고 공백 뒤에 본문을 붙여 반환함.
    //public string Formatted { get; }
    public string Formatted
    { 
        get
        {
            return $"[{Tag}] {Text}"; //Text는 지금 수정된 값이잖아
        }
    }

    //AppendNote(string note)로 현재 본문 뒤에 공백 하나와 메모를 덧붙인 뒤 표시함
    //여기부터 그럼
    public void AppendNote(string note)
    {
        Text = Text + " " + note;
        // 현재 Text에 note를 덧붙인 문자열을 만든다.
        // Text 프로퍼티에 대입해 검증을 거친다.
    }

}
//객체 이니셜라이저로 태그·초기 본문을 설정한 뒤 표시함. 어디에?

ini
TaggedRecord rec = new TaggedRecord
{
    //객체 이니셜라이저로 넣은값으로 초기화
    Tag = tag,
    Text = origin,

};

초기화 부분

객체 이니셜라이저로 넣은값으로 초기화

  • 위에 대입한값을 프로퍼티에 전달함

csharp
Console.WriteLine(rec.Formatted); //메모 준비가 나옴

.
.
    public string Formatted
    { 
        get
        {
            return $"[{Tag}] {Text}"; //Text는 지금 수정된 값이잖아
            //객체 이니셜라이저에서 초기화한대로 태그와 텍스트가 들어감
        }
    }

중요한 건 Text를 고정된 초기값으로 출력하는 게 아니라, get이 실행되는 시점의 Text 값을 읽는다는 것

  • 이 코드를 실행하면 Formatted의 get이 실행
  • Formatted 자체에 문자열을 저장해 놓은 게 아니라, 호출할 때마다 Tag와 Text를 읽어서 문자열을 만들어 반환
  • 이니셜라이저로 처음 설정한 뒤 변경했다면 변경된 값을 읽는 것

새 본문 입력

ini
rec.Text = neo;
Console.WriteLine(rec.Formatted); //추가 준비가 나옴
  • Text 프로퍼티에 neo를 넣어줌
  • Text는 get set 다 있어서 이렇게 넣어줘도 됨
  • 본문이 바뀐상태로 Formatted 호출

메모추가

arduino
// 4. 메모 추가 후 출력
rec.AppendNote(extra);
Console.WriteLine(rec.Formatted);

.
.
.

    public void AppendNote(string note)
    {
        Text = Text + " " + note;
        // 현재 Text에 note를 덧붙인 문자열을 만든다.
        // Text 프로퍼티에 대입해 검증을 거친다.
    }

값을 바꾸는게 아닐 추가하는 특수 기능이라 추가 메서드를 만듬


TextRecord부분

arduino
class TextRecord
{
    //TextRecord.Text는 처음 미정
    //비공개 백킹 필드는 부모에만 둠. 
    private string text;

    public string Text
    {
        get
        {
            //저장된 값 반환
            return text; //뭐 안하면 자동으로 null
        }

        set
        {
            // 앞뒤 공백 제거
            string trimmed = value.Trim();

            // 길이가 1~12일 때만 저장
            if (trimmed.Length <= 12 && 1<= trimmed.Length)
            {
                text = trimmed;
            }
            
            
        }
    }
}
  • 공백을 제거하고 길이 탐색 후 text 백킹필드에 넣음
  • 중요한건 기존값이 아닌 입력값이 조건에 맞는것인지 검사하는거라 value를 비교한다음 trimmed에 넣고
    그걸 text에 넣어 반환

TaggedRecord부분

csharp
class TaggedRecord : TextRecord
{
    //자동 프로퍼티 Tag
    public string Tag { get; set; } = "";

    //읽기 전용 Formatted
    //Formatted는 태그를 대괄호에 넣고 공백 뒤에 본문을 붙여 반환함.
    //public string Formatted { get; }
    public string Formatted
    { 
        get
        {
            return $"[{Tag}] {Text}"; //Text는 지금 수정된 값이잖아
            //객체 이니셜라이저에서 초기화한대로 태그와 텍스트가 들어감
        }
    }

    //AppendNote(string note)로 현재 본문 뒤에 공백 하나와 메모를 덧붙인 뒤 표시함
    //여기부터 그럼
    public void AppendNote(string note)
    {
        Text = Text + " " + note;
        // 현재 Text에 note를 덧붙인 문자열을 만든다.
        // Text 프로퍼티에 대입해 검증을 거친다.
    }