스토리지

[3.16] 배열 및 클래스 복습 2 본문

Unity/수업내용(C#)

[3.16] 배열 및 클래스 복습 2

ljw4104 2021. 3. 16. 10:54
using System;

namespace Study07
{
    public class App
    {
        public App()
        {
            //Fruits배열 선언
            Fruits[] fruits;
            //배열 인스턴스화
            fruits = new Fruits[3];
            //Fruits 객체 생성
            Fruits data1 = new Fruits(2500, "사과");
            Fruits data2 = new Fruits(3000, "복숭아");
            Fruits data3 = new Fruits(5000, "수박");

            //배열의 요소에 추가
            fruits[0] = data1;
            fruits[1] = data2;
            fruits[2] = data3;

            //배열 요소를 출력
            foreach (var i in fruits)
            {
                Console.WriteLine("이름 : {0}, 가격 : {1}", i.name, i.price);
            }
            Console.WriteLine();

            //배열 요소에서 이름이 "사과"인 Fruits객체를 검색
            Fruits apple = null;
            foreach (var i in fruits)
            {
                if (i.name.Equals("사과"))
                {
                    apple = i;
                    break;
                }
            }
            if (apple != null)
            {
                Console.WriteLine("사과는 배열안에 있습니다.");
            }
            else
            {
                Console.WriteLine("사과는 배열안에 없습니다.");
            }
            Console.WriteLine();

            //배열요소에서 이름이 "복숭아"인 Fruits객체를 삭제
            for (int i = 0; i < fruits.Length; i++)
            {
                if (fruits[i] != null && fruits[i].name == "복숭아")
                {
                    fruits[i] = null;
                    //삭제된 요소 뒤에 있는 값들을 앞으로 한칸씩 땡기기
                    for (int j = i; j < fruits.Length - 1; j++)
                    {
                        if (fruits[j + 1] != null)
                        {
                            fruits[j] = fruits[j + 1];
                            fruits[j + 1] = null;
                            break;
                        }
                    }
                }
            }

            foreach (var i in fruits)
            {
                if (i != null)
                {
                    Console.WriteLine("이름 : {0}, 가격 : {1}", i.name, i.price);
                }
            }
        }
    }
}
using System;

namespace Study07
{
    public class Fruits
    {
        public int price;
        public string name;
        public Fruits()
        {
            
        }

        public Fruits(int price, string name)
        {
            this.price = price;
            this.name = name;
        }
    }
}

1)생성자는 만약 객체 생성시 받아야 되는 값이 있으면, 인자 없는 생성자와 인자 있는 생성자 둘 다 만들어 주는게 편하다.

객체를 먼저 만들고 나중에 멤버변수값을 넣어야 하는 경우가 생길수도 있기때문이다.

 

2) 단순히 배열을 출력만 한다 => foreach

    배열 안에서 요소들의 값을 변경할 일이 있다 => for (foreach는 원래있던 값을 변경하거나 할당이 불가능하다)

 

또한 NullReferenceException (참조값이 가리키는 값이 없을 때 발생) 에러는 언제 어디서는 발생할 수 있기 때문에 무언가를 실행하기 전에 null인지 체크해줄 필요가 있다.

 

* NullReferenceException : 참조 데이터가 없을 때 발생한다. ArrayIndexOutOfBound 에러와 함께 가장 많이 발생한다.

  fruit = null;을 했는데 fruit.name을 출력할려고 하면 이미 null이기 때문에 NullReferenceException을 출력한다. 

  컴파일 타임에는 발견할 수 없기 때문에 런타임 시간에 디버깅을 통해 어떤 값이 Null인지 체크해야한다.

Comments