QnA
사용언어 (C#) |
사용툴 (VS) : |
운영체제 (OS) : |
namespace DisplayAddress
{
public class Student
{
protected string[] address; //address string형 배열 선언
protected string[] name; //name을 string형 배열 선언
}
public class GIStudent : Student //student로부터 상속받은 GIStudent 클래스 선언
{
public string[] email; //email 을 string 형 배열선언
private int[] result; //result을 string형 배열 선언
public int[] Data
{
set
{
result = value;
}
get
{
return result;
}
}
public void Display()
{
foreach (int a in result)
{
Console.WriteLine("{0}", email[a]);
}
foreach (int val in result)
{
Console.WriteLine("{0}", name[val]);
}
foreach (int val in result)
{
Console.WriteLine("{0}", address[val]);
}
}
public static void Main(string[] args)
{
GIStudent gi = new GIStudent(); //
//new 연산자를 이용하여 완전한 메모리를 생성하였고 클래스 이름과 같은 생성자를 선언하였음
FileStream fs = File.OpenRead(@"C:\Users\Robbins.HS\Desktop\C#\상속의 개념 및 객체 배열 이해\name.csv");
//File을 이용해서 파일 스트림 생성
//파일을 읽어오려면 FileStream의 객체를 생성해야한다. FileStream의 객체를 생성하는 방법은 여러가지가 존재
//하지만 OpenRead()함수를 이용해서 스트림을 개설하였다.(OpenRead()함수로 사용지 읽기용으로 파일을 연다.
//FileStream의 객체가 생성되었다는 것은 목표지점에 스트림이 개설되었다는 것을 의미한다.
StreamReader r = new StreamReader(fs, System.Text.Encoding.Default);
//문자스트림 변환
string strFileLine = string.Empty;
//strFileLine에 한줄을 가져와 읽을 공간을 비워둔다.?
string s = null; //string형 s는 =null값으로 지정
string[] email = new string[20]; //string형 email에 배열 선언과 메모리 할당을 동시에 초기화 하였다.??
string[] address = new string[20];//string형 address에 배열 선언과 메모리 할당을 동시에 초기화 한다.
string[] name = new string[20];
int i = 0; //int형 i = 0; 선언
int j = 0; //int형 j= 0; 선언
gi.Data = new int[s.Length];
while (r.Peek() != -1) //
{
s = r.ReadLine();//문자스트림으로 변환한 내용을 한줄을 읽어 s에 저장한다?
if (s.Length > 0) //s의 배열에 길이만큼 조건을실행 ?
{
j = 0;
foreach (string val in s.Split(','))//s의 한줄씩 읽어온 내용을 Split로 이용하여 ','로 구분하여 잘라 string형 val에 값을 넣은다.
{
if (j == 0) email[i] = val;//만약 구분한 값의 인덱스 번호가 0이라면 val값을 email 배열에 넣는다.
if (j == 1) address[i] = val; //만약 구분한 값의 인덱스 번호가 1이라면 val값을 address배열에 넣는다.
if (j == 2) name[i] = val; //만약 구분한 값의 인덱스 번호가 2이라면 val값을 name배열에 넣는다.
j += 1; //j=j+1 값이 증가
}
}
i += 1; //i=i+1 값이 증가
}
r.Close();
gi.Display();
Console.ReadKey();
}
}
}
------------------------------------------------------------------------------------------------------
.csv파일을 읽어서 배열에 넣은다음 gistudent클래스에서 display()함수이용하여 출력을 하려고하는데
프러퍼티로이용해서 값을 받아온거 같은데 지금 위에 빨간글씨에서 NullReferenceException이 처리가 되지 않았습니라도 오류가 뜨는데 이유를 잘모르겠습니다. 대체 어떤게 잘못 됬을까요 ?
첫댓글 프로퍼티랑 다 잘 만드셨네요. 상속은 왜 하셨는지 모르겠지만. 뭐 공부하신다고 생각하고.. 잘못 된 부분이 있습니다. 게을러서 제가 코딩을 써서 테스트는 안해봤지만서도.^^ 지금 gi.Data = new int[s.Length]; 할때 배열을 만들고 싶으신거 같은데요.. 배열이 Null 입니다. 왜냐.. GIStudent gi = new GIStudent(); 이때 저 클래스는 객체로 만들어 졌지만.. 저 클래스 안에 있는 변수인 배열들은 아직 객체로 생성 되지 않은 상태인데 객체를 생성할려고 하니 에러가 납니다.
즉 클래스는 객체상태지만 그 클래스 안에 있는 변수(배열)은 아직 Null 상태입니다.
아들 이름은 지어놨지만 마누라가 없어서 애를 못 낳는 뭐 그런 상태죠
.. 흠 위에 비유는 잊으시구요.. 그냥 조크 던져봤는데 안 던지느만 못하는군요. 위 상황은 2가지 해결 법이 있습니다. 찾으셨는지요..
힌트를 드리지요 만일 힌트로 안돼면 11시에 코딩하러 옵니다 ^^
1. 일단 클래스 생성하실때 생성자를 작성하셔서 배열을 new 로 객체화 해주시던지요
2. 또 한가지는 프로퍼티를 하나 더 작성하셔서 프로퍼티에 넣은 값으로 객체를 배열 크기를 지정하여 생성하시는 걸 하시던지
public int DataCreate {
set{
result = null;
result = new string[value];
}
get {
return result.Length;
}
저렇게 하시던지 방법은 뭐... 여러가지가 있을껍니다.. 아 코딩안해드릴려고 했는데.. 성공하시길..
아 코딩 성공했어요! 감사합니다
이분 결국 여기오셨구나 ^^
덕분에 c#공부에 많은 도움이 됬어요! 감사합니다!
저요???
아뇨 이분 클리앙에서 제가 소개해줬어요