구조체 형식?

사용자 정의 형식

 

데이터와 관련 기능을 캡슐화할 수 있는 값 형식

 

동작을 거의 제공하지 않거나 작은 데이터 중심 형식을 설계하는데 사용 권장

 

struct 키워드를 사용하여 정의

 

https://www.youtube.com/watch?v=zL5rb-Q5WzE&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=41

 

 

 

 

인스턴스는 new 키워드사용

모든 구조체 형식은 하나 이상의 생성자를 갖는다.

 

 

 

※클래스와 다른점

1. 값형식

2. 상속 불가능

 

매개변수 없는 생성자를 포함 불가

 

맴버 메서드에 virtual, protected 사용 불가

 

유형의 인스턴스가 작고 일반적으로 수명이 짧거나 다른 개체에 포함되는 경우

클래스 대신 구조체를 사용하는 것을 고려

 

다른 모든 경우는 클래스를 사용하자

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Stet39
{
 
    internal class Program
    {
        static void Main(string[] args)
        {
            //Position pos = new Position(1,1);
            //Position pos = new Position();
            //Position pos;
            //pos.x = 1;
            //pos.y = 1;
            //Console.WriteLine(pos);
            //Position pos = new Position(1,1);
            //pos.SetOrigin();
            //Console.WriteLine("{0}, {1}", pos.x, pos.y);

            Marine marine = new Marine(new Position(1,1));
            Console.WriteLine("마린의 현재 위치 : {0}, {1}", marine.position.x, marine.position.y); ;

            marine.Move(new Position(2, 3));
            Position pos = marine.GetPostion();
            Console.WriteLine("마린의 현재 위치 : {0}, {1}", pos.x, pos.y);

        }
    }
}

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Stet39
{
    struct Position
    {
        public int x;
        public int y;

        public Position(int x, int y)//매개 변수 없는 생성자 사용불가
        {
            this.x = x;
            this.y = y;
        }

        public void SetOrigin()
        {
            this.x = 0;
            this.y = 0;
        }
    }
}

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Stet39
{
    internal class Marine
    {
        public Position position;
        public Marine(Position position)
        {
            this.position = position;
        }
        public void Move(Position targetPosition)
        {
            Console.WriteLine("{0}, {1}로 이동합니다", targetPosition.x, targetPosition.y);
            this.position = targetPosition;
        }

        public Position GetPostion()
        {
            return this.position;
        }
    }
}

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

[C#] 업캐스팅, 다운캐스팅  (0) 2024.06.13
[C#] 생성자 연결  (0) 2024.06.12
[C#] virtual, override  (0) 2024.06.12
[C#] 상속  (1) 2024.06.03
[C#] static 한정자  (0) 2024.06.02

변수란?

값이 저장된 메모리 주소

 

 

프로그램이 실행되면 크게 2개의 메모리 영역을 사용

 

 

첫 번째 메모리 영역의 이름 : 스택 메모리

 

스택은 가장 나중에 넣은 데이터를 먼저 꺼내는(Last-In-First-Out) 선형적 구조

 

 

두번째는 메모리 영역의 이름 : 힙 메모리

 

힙은 계층적 구조이고, 임의의 순서대로 저장됨

 

변수가 선언되면 스택 메모리에 공간이 할당됨

 

변수에 값을 할당한다 == 메모리에 값을 저장한다

 

 

 

 

스택에 값이 직접 저장되는 형식 값형식

 

값 형식

int, float, char, bool, enum

스택에 값이 직접 저장된다

 

 

 

힙에 값이 저장되는 형식을 참조형식

참조형식은 스택과 힙 메모리 모두 사용

 

참조 형식

string, object, array, 메서드

 

힙에는 값을 스택에는 값의 주소 저장

값을 참조한다해서 참조 형식이라 부른다

 

값은 힙메모리에, 값의 주소는 스택에 저장됨

https://www.youtube.com/watch?v=ywLrndaAPq4&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=15

 

null 키워드는 개체를 참조하지 않는 null 참조를 나타내는 리터럴이다

 

즉, null은 아무것도참조하지 않는 값

 

null은 참조 형식 변수의 기본값이다

 

값은 변수에 할당 가능

 

string 은 참조 형식

그러므로 string 변수에 null 값 할당 가능

 

string name = null;

 

https://www.youtube.com/watch?v=ywLrndaAPq4&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=15

 

값 형식은 스택에 참조 형식은 힙에 값이 저장된다.

 

리터럴이란?

 

소스 코드의 고정된 값

https://learn.microsoft.com/ko-kr/dotnet/api/system.text.ascii?view=net-8.0

 

Ascii 클래스 (System.Text)

System.Text 네임스페이스의 System.Text.Ascii에 대해 자세히 알아보세요.

learn.microsoft.com

 

 

 

그렇다면 int a = null; 은 안되고
string b = null; 이 되는 이유는??


참조 형식의 변수는 해당 객체가 아니라 객체의 주소를 저장한다.

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

[C#] 입력 받기  (0) 2024.05.25
[C#] 박싱과 언박싱  (0) 2024.05.25
[C#] 문자열 보간  (0) 2024.05.25
[C#] 형식 변환  (0) 2024.05.25
[C#] 열거형식  (0) 2024.05.25

데이터 형식(Data Types):

데이터의 '유형'과 '크기'를 지정

 

1. 기본 데이터 형식 (값 형식)

- 정수형식 (int,byte ..etc)

- 부동 소수형식 (float, double, demical)

2. 복합 데이터 형식

- 클래스

- 구조체(값 형식)

- 인터페이스

스택(Stack):

데이터를 쌓아 올리는 구조의 메모리

쌓인 순서의 역순으로 필요 없는 데이터를 자동으로 제거(자동메모리) => LIFO(Last In First Out)

 

힙(Heap):

자유롭게 데이터를 저장할 수 있는 메모리

별명 : 자유 저장소


 

값 형식(Value Type):

메모리에 값을 담는 형식

스택에 할당

기본 데이터 형식과 구조체가 여기에 해당됨

 

참조형식(Reference Type):

메모리에 다른 변수의 "주소를 담는" 데이터 형식

힙에 할당

 

기본 데이터 형식(Primitive Types)

수 형식(정수 형식, 부동 소수점 형식)

논리 형식

문자열 형식

object 형식

 

복합데이터 형식 : 기본 데이터 형식을 바탕으로 만들어짐

 

박싱 : 값 형식을 object형식에 담아 힙에 올리기
언박싱 : 힙에 올라가 있는 데이터를 object에서 꺼내 값 형식으로 옮기기

 

변수 : 변경이 가능한 수
상수 : 항상 최초의 상태를 유지하는 수 -> 변경하려는 시도시 컴파일 에러

 

열거형식 : 하나의 이름 아래 묶인 상수들의 집합

=>  enum키워드 사용
상수 선언시 ex) enum dia{yes} -> dia.yes;


var키워드 - 컴파일러가 자동으로 형식을 추론
ex) var a = 3; // a는 int 형식
주의 : "지역변수 안"에서만 사용가능(메소드 안에서만 ) + 클래스, 구조체 사용불가

 

using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20240222
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //변수(Variables)에 대한 예제 문제:
            //1-1. 특정 프로그램에서 사용자의 이름을 입력받아 변수에 저장하고, 그 이름을 환영하는 메시지를 출력하는 프로그램을 작성하세요.
            //string a = "예준";
            //Console.WriteLine($"어서오세요 {a}");
            //Console.WriteLine("어서오세요 {0}", a);

            //2-2. 특정 도시의 현재 온도를 나타내는 변수를 만들고, 이 변수의 값을 5도 증가시킨 후 새로운 온도를 출력하는 프로그램을 작성하세요.
            //int temp = 24;
            //int now = temp + 5;
            //Console.WriteLine($"현재 온도는 {now}도 입니다");

            //3-3. 사용자로부터 두 개의 숫자를 입력받아 변수에 저장하고, 이 두 숫자를 더한 결과를 출력하는 프로그램을 작성하세요.
            //int a = 10;
            //int b = 20;
            //Console.WriteLine(a + b);

            //상수(Constants)에 대한 예제 문제:
            //2-1. 원주율을 상수로 선언하여 반지름이 5인 원의 넓이를 계산하여 출력하는 프로그램을 작성하세요.
            //float pi = 3.14f;
            //int r = 5;  // => float 과 int 의 곱이 된다.
            //float size = pi * pi * r;
            //Console.WriteLine(size);

            //2-2. 세금 비율을 0.1로 상수로 선언하고, 사용자로부터 어떤 상품의 가격을 입력받아 세금을 계산하여 총 가격을 출력하는 프로그램을 작성하세요.
            //float rate = 0.1f;
            //float price = 50.6f;
            //float total = rate * price;
            //Console.WriteLine(total); //=> 5.06

            //2-3. 1년에는 몇 개의 달이 있는지를 상수로 선언하고, 이 값을 사용하여 1년이 몇 개의 주가 있는지를 출력하는 프로그램을 작성하세요.
            //int CountOfMonth = 12;
            //int day = 365;
            //float CountOfWeek = day / CountOfMonth;
            //Console.WriteLine(CountOfWeek);
            // => 인트형끼리 나누면 소수점 자리가 Truncate을 하지 않아도 된다.


            //float CountOfMonth = 12f;
            //float day = 365f;
            ////float CountOfWeek = Math.Truncate(day / CountOfMonth); ==> 오류
            //float CountOfWeek = day / CountOfMonth;
            //Console.WriteLine(Math.Truncate(CountOfWeek)); // 30


        }
    }
}

'낙서장 > C#' 카테고리의 다른 글

[C#] 메서드 오버로딩  (0) 2024.06.02
virtual ,override, base  (2) 2024.03.08
상속과 다형성  (1) 2024.03.08
흐름 제어  (1) 2024.02.26
데이터를 가공하는 연산자  (0) 2024.02.25

+ Recent posts