Yang.공부방

Stack 과 Heap

C#/과제2019. 3. 25. 03:40

Stack

: 프로그램 실행 시 필요한 메모리 공간으로 메소드가 호출되는데 필요한 메모리(지역변수, 매개변수, 리턴 값)가 스택에 저장됨 

: 제네릭이 아닌 간단한 LIFO(후입선출) 방식의 개체 컬렉션

상속 : Object -> Stack


  • Stack Frame(스택프레임)

: 메소드 호출 전 반드시 호출에 필요한 메모리를 스택에 확보해야 하는데 이때 하나의 메소드에 필요한 메모리를 통합한 용어

하나의 메소드 : 하나의 스택프레임



Heap

: 스택의 반대되는 개념의 메모리

: new를이용하여 생성한 메모리가 저장됨 

: 데이터 값을 저장시키는데 stack이 데이터를 저장한 heap의 주소를 갖도록 한다.

사용자가 직접관리 해야만 하는 메모리 영역





(메소드 내에서 선언된 변수는 스택에 저장, new를 이용해 생성한 메모리는 힙에 저장)

Stack 참조 : https://docs.microsoft.com/ko-kr/dotnet/api/system.collections.stack?view=netframework-4.7.2

Stack과 Heap의 비교 참조 : https://guslabview.tistory.com/186

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

Boxing 및 Unboxing  (0) 2019.03.29
(3.25) 몬스터 공격하기 ver.수정  (0) 2019.03.26
몬스터 처치하기  (0) 2019.03.25
(3.22)값 형식  (0) 2019.03.25
(3.22과제)for문 문제내고 읽고 쓰기  (0) 2019.03.25

몬스터 처치하기

C#/과제2019. 3. 25. 03:18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
string Monster_Name = "오우거";
            int Monster_Hp = 123;
            int Monster_MaxHp = 123;
 
            string Hero_Name = "홍길동";
            int Hero_Hp = 80;
            int H_Attack = 4;
 
 
            Console.WriteLine("몬스터의 이름 : " + Monster_Name + "입니다");
            Console.WriteLine("몬스터의 체력은 : " + Monster_Hp + "/" + Monster_MaxHp + "입니다");
            Console.WriteLine("몬스터는 사납고 무섭습니다." + "\n");
 
            Console.WriteLine("용사의 이름 : " + Hero_Name + "입니다");
            Console.WriteLine("용사의 체력 : " + Hero_Hp + "입니다");
            Console.WriteLine("용사의 공격력 : " + H_Attack + "입니다" + "\n");
 
            Console.WriteLine("용사가 몬스터를 공격했습니다.");
            Console.WriteLine("몬스터는 " + H_Attack + "피해를 받았습니다.");
            Console.WriteLine("몬스터의 체력은 " + (Monster_Hp - H_Attack) + "/" + Monster_MaxHp + "입니다" + "\n");
 
 
            Console.WriteLine("공격을 더 하시겠습니까? ( Y / N )" + "\n");
 
 
            while (true)
            {
                ConsoleKeyInfo YorN = Console.ReadKey();
                if (YorN.Key == ConsoleKey.Y)
                {
                    Thread.Sleep(1000);
 
                    Console.BackgroundColor = ConsoleColor.DarkRed;
                    Console.WriteLine("\n 몬스터는 {0}의 피해를 받았습니다.", H_Attack);
                    Console.ResetColor();
                    Monster_Hp = Monster_Hp - H_Attack;
                    Console.WriteLine("몬스터의 체력은 " + Monster_Hp);
                    if (Monster_Hp <= 0)
                    {
                       
                        Console.WriteLine("\n 몬스터를 처치하였습니다.");
                        break;
                    }
                }
                else if (YorN.Key == ConsoleKey.N)
                {
                    Console.WriteLine("\n 용사가 도망쳤습니다.");
                    break;
                }
                else if (YorN.Key != ConsoleKey.Y && YorN.Key != ConsoleKey.N)
                        { Console.WriteLine("\n 잘못 누르셨습니다."); }
 
 
            }
 
cs


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

Boxing 및 Unboxing  (0) 2019.03.29
(3.25) 몬스터 공격하기 ver.수정  (0) 2019.03.26
Stack 과 Heap  (0) 2019.03.25
(3.22)값 형식  (0) 2019.03.25
(3.22과제)for문 문제내고 읽고 쓰기  (0) 2019.03.25

(3.22)값 형식

C#/과제2019. 3. 25. 02:42

데이터 타입 값, 참조 형식

 

[형식이란?]
프로그램 내에 표현할 데이터 종류에 대한 약속 ( 변수선언, 개체 생성을 통해 구체화 -> 구체화 된 데이터에 접근하기 위해 변수 사용.)


[값 , 참조 차이]

값 형식 : 값형식 변수에는 해당 데이터가 직접 포함됨  (int, float, double, long, char... 등이 있다.)
(각 변수에는 데이터 자체 사본이 들어있으며 다른 변수의 작업의 영향을 미칠 수 없다)

참조형식 : 참조형식 변수에는 데이터(개체)에 대한 참조가 저장됨 (class, delegate, string, object ... 등이 있다.)

(두가지 변수가 같은 개체를 참조할수 있으므로 다른 변수의 작업의 영향을 미칠수 있다)



[값 형식의 주요기능]

모든 값 형식은 System.ValueType에서 암시적으로 파생됩니다. 

값 형식 변수는 기본적으로 NULL 일수 없다. 그러나 해당 nullable형식의 변수는 NULL 일수 있다.

각 값 형식에는 해당 형식의 기본 값을 초기화 하는 암시적 기본 생성자가 있다.


값 형식 참조 : https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/value-types

참조형식 참조 : https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/reference-types

nullable형식 참조 : https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/nullable-types/

nullable형식 참조2 : http://www.csharpstudy.com/csharp/CSharp-nullable.aspx



암시적 변환 , 명시적 변환

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
            int a = 123;
            float b = a; //암시적 변환
 
            
            Console.WriteLine(a); // 123출력
            Console.WriteLine(b); // 123출력
 
 
            double c = 125.156;
            int d = (int)c; //명시적 변환(값을 잃는다)
            Console.WriteLine("c의 값 : " + c); // 125.156 출력
            Console.WriteLine("d의 값 : " + d); // 125 출력
 
cs

암시적 변환 : 파생클래스 -> 기본클래스 (int16 -> int32)등 변환 할 때 안정성과 손실에 대한 리스크없이 데이터 형 변환되는 것

: 동일 데이터형의 작은 타입-> 동일 데이터형의 큰 타입으로 암시적 변환 수행

명시적 변환(캐스트) : Object -> 특정클래스로 갈 때 (int 32 -> int16) 변환 시 값의 손실이 발생할 수 있거나 변환이 실패할 수 있는 경우 사용

: 큰 데이터형 -> 작은 데이터형으로 변환하는 과정이기 때문에 값을 잃을 수 있다.


암시적, 명시적 변환 참조 : https://guslabview.tistory.com/68

참조2 : https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/types/casting-and-type-conversions#implicit-conversions

암시적 숫자 변환 표 참조 : https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/implicit-numeric-conversions-table














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

Boxing 및 Unboxing  (0) 2019.03.29
(3.25) 몬스터 공격하기 ver.수정  (0) 2019.03.26
Stack 과 Heap  (0) 2019.03.25
몬스터 처치하기  (0) 2019.03.25
(3.22과제)for문 문제내고 읽고 쓰기  (0) 2019.03.25


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
for (int i=3; i<=5;i++)
            {
                Console.Write(i + 5 );
            };
            /*
             * i의 값은 3이다 
             * i의 값은 3이다
             * 3은 5보다 작거나 같다
             * 비교연산값은 ture다
             * ture이므로 본문을 실행한다
             * i의값은 3이다 
             * 산술연산을 통해 값은 8이다
             * 8을 출력한다
             * 반복(iterator)로 가서 i의 값은 3이다
             * 증가연산자를 만나 증가연산값은 4다
             * 
             * i의 값은 4다 
             * i의 값은 4다
             * 4는 5보다작거나 같다
             * 비교연산값은 true다
             * ture이므로 본문을 실행한다
             * i의 값은 4다
             * 산술연산을 통해 값은 9다
             * 9를 출력한다
             * 반복(iterator)로 가서 i의 값은 4다
             * 증가연산자를 만나 증가연산값은 5다
             * 
             * i의 값은 5다
             * i의 값은 5다
             * 5는 5보다 작거나 같다
             * 비교연산값은 ture다
             * ture이므로 본문을 실행한다
             * i의 값은 5다
             * 산술연산을 통해 값은 10이다
             * 10을 출력한다
             * 반복(iterator)로 가서 i의 값은 5다
             * 증가연산자를 만나 증가연산값은 6이다
             * 
             * i의 값은 6이다
             * i의 값은 6이다
             * 6은 5보다 작거나 같다
             * 비교연산값은 false다
             * false이므로 for문을 종료한다.
             * 
             * 출력되는 값은 8910 이다
            */
 
 
cs
for문의 구조 : initializer(초기화), condition(조건), iterator(반복) 로 구성되어있다 조건이 ture일 시 반복을 하는 반복문이다. 반복 중 원하는 지점에서 멈추고 싶을 시에는 break문을 사용하여 루프를 중단할 수 있다. (goto,return,throw문으로 루프를 종료할 수도있다.) for문 참조 :https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/for


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

Boxing 및 Unboxing  (0) 2019.03.29
(3.25) 몬스터 공격하기 ver.수정  (0) 2019.03.26
Stack 과 Heap  (0) 2019.03.25
몬스터 처치하기  (0) 2019.03.25
(3.22)값 형식  (0) 2019.03.25