본문 바로가기

:SERVER/C#(C Sharp)

스택,힙 메모리, 클래스

반응형
using System;

namespace CSharp {
    // 객체 지향 OOP; Object Oriented Programming
    // 속성, 기능

    // 참조(ref)를 이용한다.
    class Knight {
        public int hp;
        public int attack;

        public Knight Clone() {
            Knight knight = new Knight();
            knight.hp = this.hp;
            knight.attack = this.attack;
            return knight;
        }

        public void Move() {
            System.Console.WriteLine("Knight Move");
        }
        public void Attack() {
            System.Console.WriteLine("Knight Attack");
        }
    }

    // 복사를 이용.
    struct Mage {
        public int hp;
        public int attack;
    }

   
    class Program{
        static void KillMage(Mage mage) {
            mage.hp = 0;
        }

        static void KillKnight(Knight knight) {
            knight.hp = 0;
        }

        // Main 함수
        static void Main(string[] args) {
            Mage mage;
            mage.hp = 50;
            mage.attack = 30;
            KillMage(mage);

            Mage mage2 = mage;
            mage2.hp = 0;

            Knight knight = new Knight(); 
            knight.hp = 100;
            knight.attack = 10;
            knight.Move();
            knight.Attack();
            KillKnight(knight);

            Knight knight2 = knight;
            knight.hp=5; // knight2가 기존 knight 인스턴스를 바라봄

            Knight knight3 = new Knight();
            knight3.hp = knight.hp;
            knight3.attack = knight.attack; // 값만 같은 다른 객체를 생성

            // Deep Copy
            Knight knight4 = knight.Clone();
            knight4.hp = 4;

            // Stack 스택 메모리: 불안정하고 임시적으로 사용하는 메모리. ex) 함수 연산을 계산하는 메모장
                // 함수가 시작되는 부분부터 끝나는 부분까지 어느정도 사용하는지 추적함. 알아서 동적으로 잘 관리됨.
                // 복사되는 것 :  값(int,string..)이 들어감. [struct]. Stack 영역
                // 참조되는 것 : 실세 본체가 들어있는 메모리의 주소가 들어감. [object]. Heap 영역에 본체가 할당됨.
            // Heap 힙 메모리: 동적으로 할당되는 것
                // 메모리 할당을 했을 때, 메모리에 계속 남아 있는 상태. c++은 프로그래머가 할당 후 해제를 해야함. delete
                // c#은 언어 차원에서 관리해줌. 본체를 가르키는 부분이 없으면 알아서 해제함
                // ref 타입을 사용하면 주소를 사용하는 건 똑같음. stuct를 ref로 넘기면 stack 영역에 본체가 할당되어있을 수도 있다.
            
        }
    }
}
반응형

':SERVER > C#(C Sharp)' 카테고리의 다른 글

클래스 특성 - 상속성/은닉성/다형성  (0) 2022.09.16
클래스, 생성자, static  (0) 2022.09.16
함수, ref, out  (0) 2022.09.15
반복문  (0) 2022.09.14
분기문(if문, switch문, 삼항연산자)  (0) 2022.09.14