공부일지

데이터 보관 본문

코딩/C#

데이터 보관

이하택 2023. 10. 24. 13:03

작성 목표

  • 데이터 구조와 자료형 개념의 구조화

  • 스킵
    1. 데이터의 종류

    • 데이터 형식 : 기본 데이터 형식 + 복합 데이터 형식(구조체, 클래스, 배열 등등)
      • 복합 데이터 형식 → 오디오, 이미지 등등 표현

    1. 변수 : 데이터를 담는 메모리 어딘가에 존재하는 일정 크기의 공간
    • 프로그래머는 컴파일러에게 변수를 선언한다.

    • 선언 동시 초기화

    • 여러 변수 한번에 선언 : 동일 데이터 타입일 시

    • 초기화(Initialization)
      • 최초의 데이터 할당.
      • 미입력 시 쓰레기 데이터 할당 → 소프트웨어가 예상치 못하게 동작.
      • 따라서 초기화하도록 C#이 칼들고 협박함.
        • 에러 메시지 + 실행 파일 미생성
        • 보통 0으로 초기화

    • 리터럴(Literal : ‘말 그대로, 문자 그대로’)
      • 고정값을 나타내는 표기법
      • int a = 100; (a : 변수, 100 : 리터럴)

값 형식과 참조 형식(Value Type & Reference Type)

C#의 메모리 영역 : 스택(값) + 힙(참조)

값 형식 : 변수가 값을 담는 데이터 형식

참조 형식 : 변수가 값이 있는 위치를 담는 데이터 형식

  • 스택과 값 형식
    • 데이터를 쌓아 올리는 구조의 메모리
    • 스택의 메모리 동작 방식
      • LIFO : Last In First Out : “먼저 넣은 놈이 나중에 나온다.“
      • 즉 블록을 위로 쌓아갈 때, 맨 위의 블록을 먼저 치워야 아래의 블록을 가져온다고 이해하자.
      • Stack에 대한 전격적인 분석 전까지 Push는 데이터 삽입, Pop은 데이터 반환으로 알고 있자.

      • 스택의 작동방식을 스크립트로 구현한 것. 나중에 분석해 보자.
        • Stack.cs
          public class MyStack
          {
          	private int[] arr;
          	private int index;
          	public int Size;
          
          	public MyStack(int size)
          	{
          		Size = size;
          		arr = new int[size];
          		index = -1;
          	}
          
          	//추가
          	public void Push(int data)
          	{
          		if(IsFull())
          		{
          			throw new Exception(“Stack is Full”);
          		}
          		arr[++index] = data;
          	}
          
          	//삭제 - 추출
          	public int Pop()
          	{
          		if(IsEmpty())
          		{
          			//강제로 오류라고 시스템에 알림
          			throw new Exception(“Stack is Empty”);
          		}
          		return arr[index--];
          	}
          
          	//체크
          	public int Peek()
          	{
          		if(IsEmpty())
          		{
          			//강제로 오류라고 시스템에 알림
          			throw new Exception(“Stack is Empty”);
          		}
          		return arr[index];
          	}
          
          	//비어있는지 체크
          	public bool IsEmpty()
          	{
          		return ( index == -1 );
          	}
          
          	//꽉 찼는지 체크
          	public bool IsFull()
          	{
          		return (index == Size);
          	}
          }
      • 스택의 사용 예시
        public class GameManager : MonoBehaviour
        {
        	void Start()
        	{
        		MyStack stack = new MyStack(5);
        		stack.Push(10);
        		stack.Push(20);
        		stack.Push(30);
        
        		stack.Pop();
        		stack.Pop();
        		stack.Pop();
        	}
        }

  • 스택의 메모리 제거 : 중괄호가 제거될 때 제거된다.
    • 어? Pop(메모리를 호출)하면 데이터가 Stack에서 제거되는 것 아닌가요?
    • 대략적으로 설명하자면 Stack은 최상단 인덱스(주소)를 가지고 있다가 Pop할 시 최상단 메모리를 한 칸 내리는 식으로 작동한다.
    • 따라서 메모리가 비워진다기 보다는 인덱스의 위치가 조정되어 사용하지 않게 되고, 나중에 해당 인덱스에 다른 값이 들어오면 변경되는 식으로 작동하는 것이다?
      • 실제로 이와 같이 동작하는가?
      • 아니면 작동방식을 구현하는데에 있어서, 배열을 사용하여 편의성을 위해 혹은 알고리즘 적 효율성을 위해 어쩔 수 없이 이용한 것인가?
    • 이후 중괄호가 끝나는 지점에서 Stack의 메모리는 완전히 비워지게 된다.

  • 궁금증 : int형은 stack에 쌓이는데 왜 선언 순서와 상관없이 값을 가져올 수 있는가?

Stack을 C#으로 - 특강 정리(작성중)
스택이란 ‘업보 스택 쌓는다.’ 라는 말로서 적어도 나에게는 친숙한 스택이라는 자료구조. 오늘은 이 친구를 알아보자. 스택, 영어로 Stack은 위와 같이 어떠한 것들이 무더기로 쌓여 있는 것을 의미한다. 자료구조에서도 이와 유사한 역할을 진행한다. 스택의 구조 Stack을 배열로 어떻게 만들까? 배열 안에 아무 데이터도 없으니 현재 index는 -1로 설정! 스크립트로 구현해보자 초기 MyStack.cspublic class MyStack { private int[] arr; private int index; public int Size; public MyStack(int size) { Size = size; arr = new int[size]; index = -1; } //추가 public void ..
https://lee-hataeg.tistory.com/16

  • 힙과 참조 형식
    • 자유롭게 데이터를 저장할 수 있는 메모리
    • 메모리 동작 방식
      • FIFO : First In First Out
      • (편의점 아르바이트를 해보신 분들에게 익숙할) 선입선출 : 먼저 들어온 메모리가 먼저 나간다는 의미이다.
      • Stack 영역에 데이터가 저장된 주소 저장, Heap 영역에 데이터의 값 저장.

  • 스택의 메모리 제거 : 스스로 지우지 못함.
    1. GC(가비지 컬렉터)가 주기적으로 확인.
    1. 프로그램 종료되어
    1. 메모리가 사용되지 않는다는 것을 확인했을 때 GC가 제거
    • 따라서 과도한 양의 Stack 사용은 GC에게 부담.

  • 사용 이유
    1. 메모리 영역의 한계
    1. 기본 데이터 타입 중 string을 예로 들 때, 컬렉션이 어쩌고 저쩌고~~

메모리 특강 내용 정리
Q. 데이터 10을 저장하고 싶을 때 데이터 10이 어디에 저장되느냐? 맨앞? 맨끝?정답은 Random이다. 이렇게 메모리의 주소를 지목하여 데이터를 대입하는 과정을 우리는 변수에 데이터를 대입하며 익혀왔다. int x = 10; int y = x; x = 20; Console.WriteLine(y); //result : 10 person yeom = new person("염예찬", 32); person chad = yeom; yeom.age = 33; Console.WriteLine(chad.age); //result : 33정수형 변수의 경우각 데이터에게 서로 상호 무관한 자기의 방이 있음. 복사가 진행될 때 해당 방에서 내용물을 복사 시켜줌.Call by Value 클래스의 경우정확한 설명은 아니나..
https://lee-hataeg.tistory.com/14


Nullable 형식

C# 컴파일러는 값 형식의 변수에 어떤 값이든 넣도록 강제하고,

넣어주지 않으면 실행 파일을 건내주지 않는다.

어떤 값도 가지지 않는 변수가 필요할 때 사용할 수 있는 것이 Nullable이다.

//자료형? 변수명 = null;

int? num = null;
float? sosu = null;

속성

  • HasValue : 값을 갖고 있는지 아닌지 여부
  • Value : 변수에 담겨진 값

HasValue가 false일때 값을 가져오려 하면 예외를 띄움.

따라서 Nullable 형식을 사용할 때는 변수가 비어있는지 사전검사가 필수이다.


Var형식

강력한 형식의 언어 : 프로그래머의 실수를 줄여줌. 단, 데이터에 적합한 자료형을 지정해야 함.

약한 형식의 언어 : 변수의 자료형을 골라서 쓰지 않아도, 일단 변수를 선언해서 데이터를 할당하면 컴파일러나 인터프리터가 자동으로 형식을 지정.

C#은 강력한 형식의 언어이지만 var키워드로 약한 형식 검사를 진행할 수 잇다.

단, var 키워드의 변수는 선언과 동시에 초기화를 해주어야 한다.

  • var키워드로 필드 선언 시 컴파일러가 어떤 형식인지 파악할 수 없기 때문
  • 따라서 var는 지역 변수로만 사용 가능

Obejct와 Var의 차이

  • Object : 힙에 메모리 올리고 변수에 힙의 주소를 넣어줌.
  • var : 컴파일 시점에 컴파일러가 적합한 데이터 형식을 판단해서 int, string 등으로 바꿔 컴파일


공용 형식 시스템

이러한 자료형들은 C#의 자체적인 자료형이 아닌 .Net 형식 체계 표준(공용 형식 시스템)을 준수하고 있는 것.

  • .NET 형식 언어들 끼리의 호환성을 위해


문자열 다루는 기능

  • 문자열에서 탐색
    메소드내용
    IndexOf()찾으려는 문자/문자열의 앞에서 제일 첫 번째 인덱스 반환
    LastIndexOf()찾으려는 문자/문자열의 뒤에서 제일 첫 번째 인덱스를 반환
    StartWith()해당 문자열로 시작하는지 여부
    EndsWith()해당 문장려로 끝나는지 여부
    Contains()해당 문자열을 포함하는지 여부
    Replace()해당 문자열을 특정 문자열로 모두 변경하여 반환
  • 문자열 변형
    메소드내용
    ToLower()모든 대문자를 소문자로 바꾼 문자열을 반환
    ToUpper()모든 소문자를 대문자로 바꾼 문자열을 반환
    Insert()특정 인덱스에 특정 문자열을 삽입한 문자열을 반환
    Remove()특정 인덱스 부터 특정 개수만큼 문자가 삭제된 문자열 반환
    Trim()현재 문자열의 앞 / 뒤 공백을 삭제한 문자열 반환
    TrimStart()현 문자열의 앞에 있는 공백을 삭제한 문자열 반환
    TrimEnd()현 문자열의 뒤에 있는 공백을 삭제한 문자열 반환
  • 문자열 분할
    메소드내용
    Split()
    SubString()

  • 문자열 서식 맞추기
    • Format() 메소드
    • 문자열 보간(Interpolation)

  • Format 메서드
    • 첨자 ex) Console.WriteLine(”전화번호 {0}”, “12345678910”);
    • 왼쪽 / 오른쪽 맞춤
      • string result = string.Format(”{0, -10}DEF”, “ABC”); //ABC DEF
        • DEF 앞에 문자 10개가 들어갈 공간을 만들고 왼쪽에서 부터 ABC를 채우는 것
    • 숫자 서식화
      • 패스
    • 날짜/ 시간 서식화

  • 문자열 보간
    • WriteLine($”{name}, {(age > 20 ? “성인” : “미성년자.”)}”);


Uploaded by N2T

'코딩 > C#' 카테고리의 다른 글

연산자  (0) 2023.10.25
제어문  (0) 2023.10.25
기본 자료형  (0) 2023.10.24
Stack을 C#으로 - 특강 정리(작성중)  (0) 2023.10.18
메모리 특강 내용 정리  (1) 2023.10.06