[공부] 261013 상속 (작성중)
오늘의 개념
- 생성자(Constructor):
new Player()에서 객체를 생성할 때 실행되는 특별한 메서드- 초기화(Initialization): 객체를 처음 사용할 수 있도록 초기 상태를 설정하는 것
- 객체 이니셜라이저(Object initializer): 객체 생성 직후 프로퍼티나 필드의 초기값을 설정하는 C# 문법
CH20_Q01
태그, 초기 본문, 새 본문, 덧붙일 메모를 한 줄씩 입력함. 태그는 비어 있지 않은 문자열이며 본문·메모는 공백·한글 완성형·영문자로 이루어지고 빈 문자열도 가능함.
TextRecord.Text는 처음 미정이며 setter는 앞뒤 공백을 제거한 길이가 1~12일 때만 저장함. 비공개 백킹 필드는 부모에만 둠.TaggedRecord는 TextRecord를 상속하고 자동 프로퍼티 Tag와 읽기 전용 Formatted를 추가함. Formatted는 태그를 대괄호에 넣고 공백 뒤에 본문을 붙여 반환함.객체 이니셜라이저로 태그·초기 본문을 설정한 뒤 표시함. 물려받은 Text에 새 본문을 대입하여 표시하고, 파생 클래스의
AppendNote(string note)로 현재 본문 뒤에 공백 하나와 메모를 덧붙인 뒤 표시함. 메모 추가도 부모의 Text 검증을 거치며 잘못된 최종 본문이면 이전 값을 유지함.
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 프로퍼티에 대입해 검증을 거친다.
}
}
//객체 이니셜라이저로 태그·초기 본문을 설정한 뒤 표시함. 어디에?
TaggedRecord rec = new TaggedRecord
{
//객체 이니셜라이저로 넣은값으로 초기화
Tag = tag,
Text = origin,
};
초기화 부분
객체 이니셜라이저로 넣은값으로 초기화
- 위에 대입한값을 프로퍼티에 전달함
Console.WriteLine(rec.Formatted); //메모 준비가 나옴
.
.
public string Formatted
{
get
{
return $"[{Tag}] {Text}"; //Text는 지금 수정된 값이잖아
//객체 이니셜라이저에서 초기화한대로 태그와 텍스트가 들어감
}
}
중요한 건
Text를 고정된 초기값으로 출력하는 게 아니라,get이 실행되는 시점의Text값을 읽는다는 것
- 이 코드를 실행하면
Formatted의get이 실행 Formatted자체에 문자열을 저장해 놓은 게 아니라, 호출할 때마다Tag와Text를 읽어서 문자열을 만들어 반환- 이니셜라이저로 처음 설정한 뒤 변경했다면 변경된 값을 읽는 것
새 본문 입력
rec.Text = neo;
Console.WriteLine(rec.Formatted); //추가 준비가 나옴
- Text 프로퍼티에 neo를 넣어줌
- Text는 get set 다 있어서 이렇게 넣어줘도 됨
- 본문이 바뀐상태로 Formatted 호출
메모추가
// 4. 메모 추가 후 출력
rec.AppendNote(extra);
Console.WriteLine(rec.Formatted);
.
.
.
public void AppendNote(string note)
{
Text = Text + " " + note;
// 현재 Text에 note를 덧붙인 문자열을 만든다.
// Text 프로퍼티에 대입해 검증을 거친다.
}
값을 바꾸는게 아닐 추가하는 특수 기능이라 추가 메서드를 만듬
TextRecord부분
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부분
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 프로퍼티에 대입해 검증을 거친다.
}



