발표회가 끝나고나서 구조체에 대한 이야기가 잠깐 나왔습니다.
이에 구조체에 대해선 정확하게 이해를 하고 있지 않아서 그대로 튜터님께 QNA를 드리고 정보를 얻었습니다.
public class Player
{
public int hp;
public string name;
}
public struct Enemy
{
public int hp;
public string name;
}
저는 클래스와 구조체는 보기엔 유사한 형태를 띄고 있어 비슷한 기능을 하는 것으로 생각하였었습니다.
하지만 이번에 얻은 정보로 느낀 점은 보기에만 비슷하고 전혀 다른 역할을 하고 있던 것 같습니다.
public class War
{
Player player = new Player();
Enemy enemy = new Enemy();
}
새로 객체를 만들 때도 둘은 아주 유사한 형태입니다.
player.name = "주인공";
player.hp = 100;
enemy.name = "적";
enemy.hp = 100;
이제 두 객체의 데이터에 값을 넣어줍니다.
Player player2 = player;
//player2.name == "주인공"
//player2.hp == 100
Enemy enemy2 = enemy;
//enemy2.name =="적"
//enemy2.hp == 100
Player 와 Enemy 모두 새로 객체를 생성하여 주고 기존의 객체를 대입시켜주면 대입시킨 객체와 원래 객체의 값은 동일합니다.
player2.name = "나 주인공 안할래";
player2.hp = "10";
enemy2.name = "나도 적 안할래";
enemy2.hp = "10";
여기서 enemy2의 값을 변경해주면 어떻게 될까요
player.name == "나 주인공 안할래"
player.hp == 10
player2.name == "나 주인공 안할래"
player2.hp == 10
enemy.name == "적"
enemy.hp == 100
enemy2.name =="나도 적 안할래"
enemy2.hp == 10
객체 player의 데이터는 player2와 같아지게 되었습니다.
하지만 enemy의 데이터는 enemy2 데이터와 다른 값을 가지고 있습니다.
여기서 보았을 때 player 와 playe2 는 완전히 같은 객체이고 enemy 와 enemy2 는 다른 객체인 것을 확인이 가능하였습니다.
왜 이런 상황이 발생하나..
일단 먼저 이론적인 부분부터 알아보자면
먼저 클래스는 참조 형식입니다. heap 메모리에 할당되기 때문에 실시간으로 제어하여 삭제가 불가능하며 가비지 컬렉터가 언젠가 삭제를 합니다.
구조체는 값 형식입니다. stack 메모리에 할당되며 스택({})이 끝났을 때 삭제됩니다.
Class == call by ref (참조형식) heap 메모리 저장
Struct == call by value (값형식) stack 메모리 저장
{
.... 구조체
}
구조체 삭제
둘의 차이를 그림으로 표현하면
클래스를 new class하여 생성할 경우 사용자가 실시간 삭제가 불가능하기 때문에 그만큼 성능 저하가 일어날 수 있고
그렇다고 여러군데에서 참조되는 경우에 new struct 를 많이 생성한다면 하나의 주소를 두는 class 에 비해 성능이 떨어지기에 적절한 경우에 사용하여야 한다고 합니다.
아직은 그 적절한 경우를 잘은 모르겠지만 이러한 특성을 기억하고 있다 사용할 수 있다면 좋을 것 같습니다.
발표회 때 받은 피드백과 정보 :
충돌처리를 하는 것은 stay로 처리하는 것보단 enter와 exit를 적절하게 사용하는 것이 낫다.
또한 코드를 깃에 저장하는 것, 코드를 합치는 것은 미뤄서는 안되는 작업이며
변경점이 있다면 무조건 하루가 가기전에 합치는 작업을 진행하는 것이 좋다.
'TIL' 카테고리의 다른 글
2024 11 11 TIL (2) | 2024.11.11 |
---|---|
2024 11 08 TIL (0) | 2024.11.08 |
2024 11 06 TIL (1) | 2024.11.06 |
2024 11 05 TIL (1) | 2024.11.05 |
2024 11 04 TIL (0) | 2024.11.04 |