1. 내장형 구조체
내장형 구조체란 무엇인가?
저번의 구조체에 이어서 내장형 구조체가 있다.
이것은 .NET Framework에 포함 되어 있으며 자주 사용되는 데이터 타입이다.
그중에서
DataTime : 특정 날짜와 시간을 나타낸다.
- 날짜와 시간을 조작하고 포맷 가능
TimeSpan : 시간의 간격이나 두 날짜 간의 차이를 표현하는 것을 나타낸다.
- 일, 시, 분, 초, 밀리초로 표현됨
//내장형 구조체
DateTime now = DateTime.Now; //현재 시간을 불러냄
Console.WriteLine($"Current Date and Time: {now}");
TimeSpan duration = new TimeSpan(1, 30, 0); //시간을 표시해주는 형태
Console.WriteLine($"Duration: {duration}"); //01:30:00
2. 클래스
데이터들을 모아서 함수를 묶는 느낌이다.
new 키워드로 할당한다.
구조체랑 비슷하긴 하다.
특정 class를 구현할 때 묶일 수 있는 것으로 묶어서 관리하는 용도로 쓰인다.
class Person
{
public string name;
public void ShowInfo()
{
Console.WriteLine($"이름: {name}, 나이: {Age}");
}
}
class Program
{
static void Main(string[] args)
{
//class Person
Person p1 = new Person(); //객체 생성 (instance)
p1.ShowInfo();
}
}
기본생성자
기본생성자란?
클래스가 객체로 생성될 때 자동으로 실행되는 특별한 메서드이다.
클래스와 같은 이름을 가지며, 반환형이 없다. (void 사용x)
class Person
{
public string name;
public int Age;
//기본생성자
//클래스가 객체로 생성될때 자동으로 실행되는 특별한 메서드
//클래스와 같은 이름을 가지며, 반환형이 없다 (void도 사용하지 않음)
//객체를 만들때 필요한 초기값을 설정할 때 사용 많이한다.
public Person()
{
//초기화 해준 값이 public string name, public int age에 들어감
name = "이름 없음";
Age = 0;
Console.WriteLine("기본 생성자가 실행됨");
}
public void ShowInfo()
{
Console.WriteLine($"이름: {name}, 나이: {Age}");
}
}
class Program
{
static void Main(string[] args)
{
//class Person
Person p1 = new Person(); //객체 생성 (instance)
p1.ShowInfo();
}
}
매개변수가 있는 생성자
생성자가 아예 없는 클래스의 경우 기본생성자를 자동으로 만들어준다.
하지만 매개변수를 받는 생성자만 코딩했을 경우 기본생성자를 생성 안 한다.
일반적인 경우에는 기본 생성자를 따로 만들어줘야 한다.
매개변수는 외부에서 입력 받아 넣어주고
기본 생성자안에서 초기화 해준 값이 매개변수 값에 들어간다.
class Person
{
public string Name;
public int Age;
//기본생성자
//클래스가 객체로 생성될때 자동으로 실행되는 특별한 메서드
//클래스와 같은 이름을 가지며, 반환형이 없다 (void도 사용하지 않음)
//객체를 만들때 필요한 초기값을 설정할 때 사용 많이한다.
public Person(string name, int age) //외부에서 입력 받아서 넣어주려고 함
{
//초기화 해준 값이 public string name, public int age에 들어감
Name = name;
Age = age;
Console.WriteLine("매개변수있는 생성자가 실행됨");
}
public void ShowInfo()
{
Console.WriteLine($"이름: {Name}, 나이: {Age}");
}
}
class Program
{
static void Main(string[] args)
{
//class Person
Person p1 = new Person("철수", 25); //객체 생성 (instance)
p1.ShowInfo();
Person p2 = new Person("영희", 30);
p2.ShowInfo();
}
}
실습
스타크래프트의 마린 클래스를 만들어보는 실습을 진행해보았다.
기본생성자와 인자 있는 생성자를 사용해서 진행하였다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace lionstudy33
{
//마린 클래스를 만드세요.
//이름, 미네랄
//기본생성자, 인자 있는 생성자
class Marin
{
public string Name;
public int mineral;
public Marin()
{
Name = "마린";
mineral = 50;
}
public Marin(string _name, int _ral)
{
Name = _name;
mineral = _ral;
}
public void ShowInfo()
{
Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
}
}
//배럭클래스를 만드세요 barracks (스타 이름임.,.)
//Barracks 150
class Barracks
{
public string Name;
public int mineral;
public Barracks()
{
Name = "배럭";
mineral = 150;
}
public Barracks(string name2, int ral2)
{
Name = name2;
mineral = ral2;
}
public void ShowInfo()
{
Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
}
}
class Scv
{
public string Name;
public int mineral;
public Scv()
{
Name = "마린";
mineral = 50;
Console.WriteLine("");
}
public Scv(string _name, int _ral)
{
Name = _name;
mineral = _ral;
}
public void ShowInfo()
{
Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
}
}
class Program
{
static void Main(string[] args)
{
Marin marin = new Marin("불꽃테란", 100);
Scv scv = new Scv("열받은 SCV", 70);
Barracks barracks = new Barracks();
marin.ShowInfo();
scv.ShowInfo();
barracks.ShowInfo();
}
}
}
3. this 키워드
this 키워드는 자기 자신을 가르킨다.
this를 사용하게 되면 해당 객체에 접근할 수 있다.
public Barracks(string Name, int mineral)
{
this.Name = Name; //헷갈리는 변수명 때문에 프로그램이 인식하기 힘들어 표시해놓는 느낌, 같은 이름을 쓰고 싶을때
this.mineral = mineral;
}
그렇게 this 키워드를 사용한 위의 마린 클래스 실습을 수정하였다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace lionstudy33
{
//마린 클래스를 만드세요.
//이름, 미네랄
//기본생성자, 인자 있는 생성자
class Marin
{
public string Name;
public int mineral;
public Marin()
{
Name = "마린";
mineral = 50;
}
public Marin(string _name, int _ral)
{
Name = _name;
mineral = _ral;
}
public void ShowInfo()
{
Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
}
}
//배럭클래스를 만드세요 barracks (스타 이름임.,.)
//Barracks 150
//this 키워드를 사용해보자!
//this란? 자기자신을 가르킨다.
class Barracks
{
public string Name;
public int mineral;
public Barracks()
{
Name = "배럭";
mineral = 150;
}
public Barracks(string Name, int mineral)
{
this.Name = Name; //헷갈리는 변수명 때문에 프로그램이 인식하기 힘들어 표시해놓는 느낌, 같은 이름을 쓰고 싶을때
this.mineral = mineral;
}
public void ShowInfo()
{
Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
}
}
class Scv
{
public string Name;
public int mineral;
public Scv()
{
Name = "마린";
mineral = 50;
Console.WriteLine("");
}
public Scv(string _name, int _ral)
{
Name = _name;
mineral = _ral;
}
public void ShowInfo()
{
Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
}
}
class Program
{
static void Main(string[] args)
{
Marin marin = new Marin("불꽃테란", 100);
Scv scv = new Scv("열받은 SCV", 70);
Barracks barracks = new Barracks();
marin.ShowInfo();
scv.ShowInfo();
barracks.ShowInfo();
}
}
}
그 외에도 생성자와 this 키워드를 사용한
미네랄 클래스를 실습하였다.
class Mineral
{
public int MineralCount;
public Mineral()
{
MineralCount = 1500;
}
public void ShowInfo()
{
Console.WriteLine($"현재 미네랄 갯수 : {MineralCount}");
}
}
//Game클래스를 만들어보자
class Game
{
public static int mineral;
public static int gas;
public static int charCount;
public static void ShowInfo()
{
Console.WriteLine($"미네랄 {mineral} 가스 {gas} 인구수 {charCount}");
}
}
class Program
{
static void Main(string[] args)
{
Game.mineral = 50;
Game.gas = 0;
Game.charCount = 4;
Game.ShowInfo();
//클래스의 배열 7개 생성
Mineral[] mineral = new Mineral[7];
//각 배열에 new 객체화
for (int i = 0; i < mineral.Length; i++)
{
mineral[i] = new Mineral();
mineral[i].ShowInfo();
}
}
}
4. get / set 함수 (Getter Setter)
보통 외부에서 제한하고 싶은 코드는 private 을 사용한다.
여기에서 문제점은
하지만 main 에서 접근을 할 수가 없다는 것이다.
그럴 때를 위해 get / set 함수를 사용하는 것이다!
이 함수를 적용해서 private 속성에 접근하는 것이다.
아래의 코드에서는
SetName
GetName
으로 접근하였다.
class person
{
private string name = "기본값"; //내부 변수
//값 설정하기 (setter) 함수가 필요.
//아래 같은 함수를 setter 함수라고 함.
public void SetName(string newName)
{
name = newName;
}
public string GetName()
{
return name;
}
}
class Person
{
private string name = "기본값"; //내부 변수
private string nam = "남";
}
static void Main(string[] args)
{
//private, public, protected
//C# get/set 방식의 함수와 프로퍼티 비교
//C# 에서는 객체의 값을 읽고 (get), 설정 (set)하는
//방식으로 함수 (get/set 메서드) 또는
//** 프로퍼티 **를 사용할 수 있다.
person p1 = new person();
Console.WriteLine(p1.GetName());
p1.SetName("할루");
Console.WriteLine(p1.GetName());
}
프로퍼티
그리고 Get Set 함수를 관리하기 쉽도록 프로퍼티 라는 것을 제공한다.
get {}
set {}
형식으로 작성하면 된다.
이렇게 하면 함수를 나누지 않고 바로 사용할 수 있어 가독성도 좋고 편리해진다.
class Person
{
private string name = "기본값"; //내부 변수
private string nam = "남";
public string Name //프로퍼티
{
get { return name; } //getter
set { name = value; } //setter
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
Console.WriteLine(p1.Name);
p1.Name = "가나다";
Console.WriteLine(p1.Name);
//위쪽 처럼 GetName함수 SetName함수 나누지않고 바로 사용할 수 있어 편하다.
자동구현 프로퍼티
여기에서 자동구현 프로퍼티 라는 것도 있다.
public (변수) (변수명) { get; set; }
이렇게 한 줄로 표기가 가능하다.
class marine
{
public string Name { get; } = "마린";
public int Mineral { get; set; } = 50;
}
class Program
{
static void Main(string[] args)
{
marine m = new marine();
Console.WriteLine("이름 : " + m.Name + ", 미네랄 : " + m.Mineral);
}
}
이렇게 오늘의 내용도 끝!
프로퍼티가 솔직히 날 정말 헷갈리게 했다..
근데 블로그를 쓰면서 다시 공부하니
이해가 어느정도 잘 되는 느낌이었다~
그리고 나름 블로그 쓰는 것도 재밌다! ^,^
😊
그럼 오늘도 고생했다~!