
주접떨기
오늘 배운 것 키워드
- 상속성
- 은닉성
- 클래스의 형식 변환
- 다형성
- 문자열 둘러보기
1. 상속성
기사, 궁수, 법사 3가지 직업 클래스를 만드는데 똑같이 hp, attack 속성이 필요하다.
이를 각 직업 클래스에 다 쓰면 코드가 너무 길어지므로 hp, attack을 가진 Player라는 클래스를 만들고 각 직업에 상속 후 각자 필요한 기능을 더해준다.
사용법은 아래와 같다.
class Player //부모 클래스
{
//필드
static public int counter = 1;
public int id;
public int hp;
public int attack;
}
class Knight : Player //자식클래스
{
}
class Archer : Player
{
}
class Mage : Player
{
}
상속을 하기 위해서는 클래스 옆에 : (부모 클래스 명)을 달아주면 된다.
상속을 하면 부모의 필드(변수)와 메서드(기능)를 그대로 이어받아 사용할 수 있다.
메서드를 사용하는 경우는 아래와 같다.
class Player //부모 클래스
{
//필드
static public int counter = 1;
public int id;
public int hp;
public int attack;
public Player()
{
Console.WriteLine("Player 생성자 호출");
}
public Player(int hp)
{
this.hp = hp;
Console.WriteLine("Player hp 생성자 호출");
}
}
class Knight : Player //자식클래스
{
public Knight()
{
Console.WriteLine("Knight 생성자 호출");
}
}
결과는
Player 생성자 호출
Knight 생성자 호출
이라고 뜨지만
class Player //부모 클래스
{
//필드
static public int counter = 1;
public int id;
public int hp;
public int attack;
public Player()
{
Console.WriteLine("Player 생성자 호출");
}
public Player(int hp)
{
this.hp = hp;
Console.WriteLine("Player hp 생성자 호출");
}
}
class Knight : Player //자식클래스
{
public Knight() : base(100) //base = Player : 부모를 부르는 말
{
Console.WriteLine("Knight 생성자 호출");
}
}
다음과 같이 Knight()에 base(100)을 달아주면 다음과 같이 결과가 나온다.
Player hp 생성자 호출
Knight 생성자 호출
2. 은닉성
(학교에서 캡슐화로 배운 것!)
은닉을 해야 하는 이유?
: 클래스를 만들 때 모두 public. 즉 모두에게 공개해 누구든지 사용할 수 있게 한다면은 함부로 데이터가 변경되는 위험이 있기 때문에!
접근한정자의 종류
public | 외부에서 접근 가능 |
protected | 상속된 자식과 클래스 내부에서 접근가능 / 외부 접근 불가 |
private | 외부에서 접근 불가 |
3. 클래스의 형식 변환
클래스를 만들 때 매개변수만 다르고 기능은 같다면 오버로딩을 해서 만들면 된다.
하지만 매개 변수로 들어갈 변수의 수가 많아지면 같은 기능의 클래스를 오버로딩으로 많이 만들게 되어
비효율적으로 된다.
=> 공통적으로 상속받는 부모 클래스를 매개변수로 두면 자식들도 자연스레 다 받는다!!!
class Player
{
public int hp;
public int attack;
}
class Knight : Player
{
}
class Mage : Player
{
public int mp;
}
class Program
{
static void EnterGame(Knight knight)
{
}
static void EnterGame(Mage mage)
{
}
static void Main(string[] args)
{
Knight knight = new Knight();
Mage mage = new Mage();
EnterGame(knight);
EnterGame(mage);
}
}
EnterGame을 만들기 위해 매개변수에 각 직업을 넣어 2개를 만들어 주었다.
이를 더욱 간단하게 아래와 같이 나타낼 수 있다.
class Player
{
public int hp;
public int attack;
}
class Knight : Player
{
}
class Mage : Player
{
public int mp;
}
class Program
{
static void EnterGame(Player player)
{
}
static void Main(string[] args)
{
Knight knight = new Knight();
Mage mage = new Mage();
EnterGame(knight);
EnterGame(mage);
}
}
EnterGame에서 Player player를 매개변수로 받고 있고 player는 Player 클래스를 가진 변수이고 Knight와 Mage모두 Player를 상속받았으므로 위 코드와 같은 결과를 보여준다.
여기서 EnterGame(Player player)에서 Mage이 가지고 있는 mp 변수를 가져오고 싶은데
우리는 player를 매개변수로 받았으니 player에는 mp변수가 없으므로 값을 가져올 수 없다.
=> 형 변환 사용하기!
static void Main(string[] args)
{
Knight knight = new Knight();
Mage mage = new Mage();
//Mage 타입 -> Player 타입 O
//Player 타입 -> Mage타입 X
Player magePlayer = mage; //오류발생!
Mage mage2 = (mage)magePlayer;
EnterGame(knight);
EnterGame(mage);
}
Mage는 Player의 기능 + 본인의 기능이 있으니깐 가능하지만
Player는 자신의 기능 외의 기능을 Mage가 가지고 있을 수 있기 때문에 오류가 뜬다!
특정 메서드가 어떤 것을 매개변수로 받는지 알 수 있는 문법!
class Program
{
static void EnterGame(Player player)
{
bool isMage = (player is Mage); //is 문법 - player가 Mage이면
if(isMage)
{
Mage mage = (Mage)player;
mage.mp = 10;
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
Mage mage = new Mage();
EnterGame(knight);
EnterGame(mage);
}
}
is와 as 둘 다 사용하지만 보통은 as문법을 주로 사용한다.
class Program
{
static void EnterGame(Player player)
{
Mage mage = (player as Mage); //as 문법
if(mage != null)
{
mage.mp = 10;
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
Mage mage = new Mage();
EnterGame(knight);
EnterGame(mage);
}
}
4. 다형성
오버라이딩 (Overriding)
: 자식클래스에서 부모 클래스의 메서드를 재정의하여 사용하는 것.
즉, 부모 클래스의 메서드를 자식클래스에서 동일한 이름과 매개변수를 이용하여 기능만 다르게 만든 것을 말한다.
sealed : 봉인을 한
sealed이 적힌 것을 마지막으로 사용하고 그 외 오버라이딩은 없다!
5. 문자열 둘러보기
String name = "Harry Potter";
5.1. 찾기
bool found = name.Contains("Harry");
int index = name.IndexOf('z');
5.2. 변형
name = name + " Junior";
String lowerName = name.ToLower();
String upperName = name.ToUpper();
string newName = name.Replace('r', 'l');
5.3. 분할
string [] names = name.split(new char [] { ' ' });
string substringName = name.Substring(5);
오늘의 결과와 느낀 점
is와 as는 잘 안 썼던 문법이라 한 번 더 찾아볼 것!
'Unity > 강좌' 카테고리의 다른 글
2D 타일바니아 게임 만들기 (0) | 2024.09.06 |
---|---|
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문 - #4. 객체지향의 시작 (0) | 2024.07.31 |
2D 종스크롤 슈팅 게임 #09. 텍스트파일을 이용한 커스텀 배치 구현 (0) | 2024.07.30 |
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문 - #3. Text RPG (0) | 2024.07.29 |
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문 - #2. 코드의 흐름제어 (0) | 2024.07.29 |

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!