C언어는 컴퓨터와 친한 언어로 운영체제, 임베디드 시스템 개발에 주로 사용되고 C#은 객체 지향의 특성과 동적인 웹사이트와 데스크톱 애플리케이션 개발에 주로 사용됩니다.
<객체 지향>(Object Oriented Programming)(OOP)
객체 지향은 명령형 프로그래밍으로 프로그램을 수많은 객체(Object)라는 기본 단위로 나누고 이들의 상호작용을 서술하는 방식입니다. 객체란 메소드, 변수를 가지고 특정 역할을 수행하도록 인간이 정의한, 추상적인 개념입니다. C#언어는 객체 지향으로 class, public 같은 용어를 다루게됩니다.
class Program
{
static void Main()
{
Console.WriteLine("Hello, World!"); //C언어 printf("Hello, World!")
}
}
프로그래밍의 시작인 "Hello, World!" 출력문입니다. class와 static문을 다루는 첫 문장입니다. 이제 예시 코드입니다.
class Program
{
static void Test()
{
Character mob = new Character();
}
static void Main()
{
// 객체(Object)
// 인스턴스화(Instance, Instantiate)
Character player = new Character();
player.hp = 100;
player.Damage(10);
Console.WriteLine(
"Player.hp: " + player.GetHP());
player.MP = 10;
Character npc = null;
Test();
GC.Collect();
Console.ReadLine();
}
}
class Character
{
// 정보 + 기능
// Member Variables(멤버변수)
// Fields
// 멤버 접근 지정자
// Access Specifiers
// Access Modifiers
// 정보은닉(Information Hiding)
// 캡슐화(Encapsulation)
// Member Initialization
// Field Initialization
public int hp = 10;
private int mp = 0;
protected int exp;
internal int lv;
// Properties
public int MP
{
set
{
mp = value;
if (mp > 99) mp = 99;
}
get { return mp; }
}
// 생성자(Constructor)
public Character()
{
Console.WriteLine("Character Constructor Call!");
hp = 100;
mp = 20;
exp = 0;
lv = 1;
}
// 소멸자(Destructor)
~Character()
{
Console.WriteLine("Character Destructor Call!");
}
// Member Functions(멤버함수)
// Methods
public void Damage(int _dmg)
{
if (_dmg > 100) return;
hp -= _dmg;
if (hp < 0) hp = 0;
}
// Getter / Setter
public void SetHP(int _hp)
{
hp = _hp;
}
public int GetHP()
{
return hp;
}
}
<객체>(Object)
class Character
{
// 정보 + 기능
// Member Variables(멤버변수)
// Fields
// 멤버 접근 지정자
// Access Specifiers
// Access Modifiers
// 정보은닉(Information Hiding)
// 캡슐화(Encapsulation)
// Member Initialization
// Field Initialization
public int hp = 10;
private int mp = 0;
protected int exp;
internal int lv;
}
위의 코드에서 객체와 관련된 코드들을 따로 뽑았습니다. 주석에서 다루는 C# 용어에 대해 알아보겠습니다.
- 멤버 변수(Member Variable): class, 구조체의 속성을 저장하는 변수, 필드와 같은 의미로 사용
- 필드(Field): class, 구조체 내에서 선언된 변수, 멤버 변수와 같은 의미로 사용
- class Character { int hp, mp, exp, lv }
- 접근 지정자(Access Specifiers): 클래스, 메서드, 필드 등의 접근 범위를 설정하는 키워드
- 접근 제한자(Access Modifiers): 접근 지정자와 같은 의미로 클래스 멤버의 접근 수준을 제어
- hp, mp, exp, lv 맨 앞에 붙는 public, private, protected, internal 등
- public: 모든 클래스에서 접근 가능.
- private: 같은 클래스 내에서만 접근 가능
- protected: 같은 클래스와 파생 클래스에서만 접근 가능
- internal: 같은 어셈블리 내에서만 접근 가능
- 정보 은닉(Information Hiding): 객체 내부를 외부에서 접근 못하도록하여 사용자가 객체를 수정못하도록 방지
- 캡슐화(Encapsulation): 객체의 데이터와 메서드를 하나의 단위로 묶어 보호하는 개념, 접근 지정자로 범위 제어
// Properties
public int MP
{
set
{
mp = value;
if (mp > 99) mp = 99;
}
get { return mp; }
}
// 생성자(Constructor)
public Character()
{
Console.WriteLine("Character Constructor Call!");
hp = 100;
mp = 20;
exp = 0;
lv = 1;
}
// 소멸자(Destructor)
~Character()
{
Console.WriteLine("Character Destructor Call!");
}
- Property: 속성으로 필드 mp 값을 제어합니다. set과 get 접근자를 다룹니다.
- get접근자: 값을 반환하는 메서드 // set접근자: 값을 설정하는 메서드 mp가 99보다 크면 99로 설정한다는 뜻
- 생성자(Constructor): 객체가 생성될 때 호출되어 초기화 작업을 수행
- 소멸자(Destructor): 객체가 소멸될 때 호출되어 정리 작업을 수행, 클래스 이름 앞에 ~ 기호를 붙이고 매개변수 X
- Character Constructor Call! 출력하고 hp, mp, exp, lv을 선언한 값으로 초기화
- Character 객체가 소멸될 때 호출되어 Character Destructor Call!을 출력
<메서드>(Methods)
// Member Functions(멤버함수)
// Methods
public void Damage(int _dmg)
{
if (_dmg > 100) return;
hp -= _dmg;
if (hp < 0) hp = 0;
}
// Getter / Setter
public void SetHP(int _hp)
{
hp = _hp;
}
public int GetHP()
{
return hp;
}
- 멤버함수(Member Function)와 메서드(Method): 클래스 내에 정의된 함수로 객체의 동작을 정의. C언어에서 함수와 같은 역할 수행. Damage, SetHP, GetHP 모두 이에 속함
- 구성요소: 접근 지정자 public 반환타입 void 메서드 이름 Damage 매개변수 int _dmg 메서드 본문 { .... }
- Damage: _dmg가 100 초과값이면 예외 처리, hp를 감소시키는 메서드, hp가 0미만이면 0으로 설정
- SetHP: hp를 _hp로 초기화
- GetHP: hp값 반환
<객체 인스턴스화> (Object, Instance, Instantiate)
class Program
{
static void Test()
{
Character mob = new Character();
}
static void Main()
{
// 객체(Object)
// 인스턴스화(Instance, Instantiate)
Character player = new Character();
player.hp = 100;
player.Damage(10);
Console.WriteLine(
"Player.hp: " + player.GetHP());
player.MP = 10;
Character npc = null;
Test();
GC.Collect();
Console.ReadLine();
}
}
- 객체(Object): 클래스의 인스턴스로 클래스는 객체를 생성하기 위한 청사진(설계도) 역할
- 인스턴스화(Instance, Instantiate): 클래스로부터 객체를 생성하는 과정을 의미
- Character player = new Character(); // player: Character class 내의 객체 // new Character(): player객체의 인스턴스화
- GC.Collect(): 가비지 컬렉터(Garbage Collector)를 강제로 실행하여 사용하지 않는 객체를 메모리 해제하는 용도, C#은 가비지 컬렉션을 자동 관리되지만, 특정 상황에서 메모리 해제를 강제하고 싶을 때 사용
- Console.ReadLine(): 콘솔에서 사용자가 입력한 한 줄의 문자열을 읽습니다. C언어에서 scanf와 같은 역할
'프로그래밍 C#언어' 카테고리의 다른 글
상속 (Inheritance) (0) | 2024.08.30 |
---|---|
String (문자열) (0) | 2024.08.30 |
구조체 (Structure) (1) | 2024.08.29 |
배열 (Array) (0) | 2024.08.29 |
DataType(데이터 타입) (3) | 2024.08.28 |