객체지향이란
OOP(Object Oriented Programming)으로 불리며 모든 것을 객체로 표현하는 프로그래밍이다. 그러면 객체란 무엇일까? 객체는 세상에 존재하는 모든 것, 예를 들어 사람, 자동차, 컴퓨터, 책 이런 모든 것을 객체로 표현할 수 있다. 예시로 든 사람은 사람의 속성(키, 몸무게, 나이 등 데이터), 사람의 기능(걷기, 밥먹기, 잠자기 등 행위)으로 나눌 수 있다. 이런 식으로 객체를 속성과 기능으로 구분하고 코드로 표현하는 것을 객체 지향이라고 한다.
클래스
객체를 만들기 위한 청사진(설계도)이다. 객체가 어떤 속성을 가지고 있으며 어떤 기능을 하는지 설명해준다. 예시로 자동차 설계도를 본다면 자동차가 어떤 속성과 기능을 가져야 하는지 결정한다. 속성으로는 색상, 사이즈 등이 있고, 기능으로는 주행, 정지 등이 있다. 자동차 설계도 = 클래스, 자동차 = 객체
클래스는 추상화, 캡슐화, 다형성, 상속이라는 4가지 특징을 지니고 있다.
추상화
추상화란 사물이나 개념이 가진 속성과 행위를 추출한다. 즉 모델링한다. C#에서는 클래스를 정의한다라고 표현한다. 추상화를 사용하는 이유는 뭘까? 가장 큰 이유는 반복을 피하기 위해서이다. 그럼 기본적인 구조에 대해 알아보자.
그렇다면 위 내용을 바탕으로 간단하게 몬스터를 제작해보자
클래스에서는 속성을 필드, 행위(기능)를 메서드러 부르며, 이를 통틀어서 멤버라고 칭한다. 몬스터 클래스는 몬스터의 데미지(damage)와 체력(int hp)의 필드(속성)을 가지고 있고, 소리치는 메소드(기능)을 가지고 있다. 위 코드는 말 그대로 몬스터 객체를 만드는 설계도이다. 그러면 설계도를 통해서 객체를 생성해 보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BasicGrammar : MonoBehaviour
{
public class Monster
{
public string name;
public int damage;
public int hp;
public void MonsterInfo()
{
Debug.Log($"{name}의 공격력 : {damage}, 체력 : {hp}");
}
}
void Start()
{
Monster goblin; // goblin이라는 객체 생성 (빈 껍데기)
goblin = new Monster(); // 인스턴스(Instance) 생성 -> new Monster()를 통해 실질적인 goblin 인스턴스 생성
goblin.name = "Goblin";
goblin.damage = 15;
goblin.hp = 100;
goblin.MonsterInfo();
Monster troll;
troll = new Monster();
troll.name = "Troll";
troll.damage = 10;
troll.hp = 200;
troll.MonsterInfo();
}
}
위 코드는 Monster 클래스(설계도)를 통해 goblin과 troll이라는 객체를 생성했다.
단계적으로 코드를 살펴본다면,
goblin이라는 변수 생성 데이터가 없는 빈 껍데기이다. (null 상태)
new 키워드를 통해 heap 메모리에 인스턴스를 생성, goblin 변수 heap 메모리 인스턴스를 가르키는 메모리 주소가 저장되고, goblin 변수를 통해 heap 메모리 인스턴스에 접근할 수 있다. 사실 실체는 인스턴스라고 할 수 있다.
troll도 마찬가지로 생성하게 된다면 밑에 그림과 같은 형태가 된다.
이렇게 클래스와 new 키워드를 통해 객체를 만들고 인스턴스를 생성해서 간단하게 goblin과 troll을 제작해 보았다.
생성자
생성자는 new키워드로 인스턴스를 생성할 때 자동으로 호출되는 메소드이다. 생성자는 클래스명과 동일하고 반환 타입이 없다. 기본 생성자는 따로 만들지 않아도 기본으로 가지고 있다. 말로는 뭔가 어려운 느낌이다. 코드를 예시로 들어보자.
public class Monster
{
public string name;
public int damage;
public int hp;
public Monster()
{
}
public void MonsterInfo()
{
Debug.Log($"{name}의 공격력 : {damage}, 체력 : {hp}");
}
}
사실 Monster 클래스를 명시적으로 표현한다면 public Monster()라는 기본 생성자가 있다. 모든 클래스는 위 코드처럼 클래스명과 동일한 기본 생성자를 가지고 있다. 하지만 기본 생성자는 따로 명시를 하지 않아도 기본으로 갖고 있기 때문에 new키워드로 생성자 호출이 가능하다.
그렇다면 매개변수를 가지고 있는 생성자를 살펴보자
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BasicGrammar : MonoBehaviour
{
public class Monster
{
public string name;
public int damage;
public int hp;
public Monster(string monsterName, int monsterDamage, int monsterHp)
{
name = monsterName;
damage = monsterDamage;
hp = monsterHp;
}
public void MonsterInfo()
{
Debug.Log($"{name}의 공격력 : {damage}, 체력 : {hp}");
}
}
void Start()
{
Monster goblin = new Monster("Goblin", 15, 100);
goblin.MonsterInfo();
}
}
매개변수가 있는 생성자는 인스턴스의 필드를 원하는 값으로 초기화 한다. goblin 변수로 선언하면서 new 키워드로 매개변수 생성자에 인자를 넣어 호출하면서 값을 초기화 할 수 있다. 보통 선언과 초기화를 같이 한다.
생성자가 있다면 소멸자도 있어야 한다. 소멸자는 해당 객체의 인스턴스가 제거 될 때 실행된다. 하지만 C#에서는 소멸자를 사용하지 않는다.
그 이유는 C/C++과 다르게 메모리 해제를 직접 하지않고 가비지 컬렉터가 알아서 해주는데 이 가비지 컬렉터 작동 시간을 예측할 수 없다.(쓰레기가 일정 양이 되어야 작동) 명시적으로 소멸자가 구현되어 있으면 가비지 컬렉터가 object로 부터 상속 받은 Finalize()메소드를 클래스의 족보를 타고 올라가며 호출(성능저하) 가비지 컬렉터가 프로그래머보다 똑똑하게 객체 소멸을 처리해서 굳이 사용하지 않는다라고 한다.
클래스와 생성자에 대한 공식 문서 : https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/types/classes
C# 형식 시스템의 클래스입니다. - C#
클래스 형식, 클래스를 사용하는 방법 및 앱에 대한 새 클래스 형식 선언을 만드는 방법에 대해 알아보세요.
learn.microsoft.com
유니티 C#은 스크립트를 생성할 때 자동으로 MonoBehaviour를 상속받는 클래스가 생성된다. 이는 클래스 자체가 인스턴스라고 생각하면 된다.
예를 들어 아래 코드로 Monster1, 2, 3에 스크립트를 할당하게 되면 모두 같은 스크립트를 가지고 있지만 Monster1, 2, 3의 hp를 다르게 설정할 수 있다. 이는 클래스가 인스턴스의 역할을 하기 때문에 동일한 스크립트를 가지고 있어도 각자의 다른 값을 가질 수 있다. 이 부분은 헷갈리지만 게임을 만들어보면서 이해해 봐야겠다.
public class UnityEx : MonoBehaviour
{
public int hp;
void Start()
{
}
}
간단하게 객체 지향에 대해서 알아봤다. 추후 공부하다가 추가될 내용이나 틀린 내용이 있다면 수정해야겠다.
'Unity C# > 개념 및 문법 정리' 카테고리의 다른 글
[Unity C#] 객체 지향 _ 다형성 (0) | 2025.01.16 |
---|---|
[Unity C#] 객체 지향 _ 캡슐화(접근 제한자, 프로퍼티) (1) | 2025.01.16 |
[Unity C#] C# 2.0 제네릭(Generic) 기초 (0) | 2025.01.11 |
[Unity C#] C# 1.0 컬렉션 (1) | 2025.01.10 |
[Unity C#] 형변환 (Type Casting) (0) | 2025.01.10 |