- 주제
1. 클래스(필드, 프로퍼티, 메서드, 생성자, 소멸자)
2. 객체지향 프로그래밍(캡슐화, 상속, 다형성, 추상화, 객체)
3. 다형성(Virtual 가상메서드 및 오버라이딩, Abstract 추상클래스)
- 공부내용
1. 클래스
공통적으로 반복되는 코드(함수)들은 따로 분리하여 부모 클래스 생성
구성 요소: 필드, 메서드, 생성자, 소멸자
1) 필드: 변수
-private 접근 제한자 사용(클래스 내부만 접근 가능)
-필요한 경우에는 프로퍼티를 통해 간접적으로 접근 허용
class Player
{
// 필드 선언
private string name;
private int level;
}
- 프로퍼티 : private가 사용된 변수에 간접적으로 접근하여 값을 설정하거나 읽을 때 사용.
-get 접근자: 값을 반환
-set 접근자: 값을 설정
-프로퍼티에 접근 제한자 적용 가능
ex) private set { name = value; } //Person 클래스 밖에서 name 값 설정 불가능
-유효성 검사 가능
class Person
{
private string name;
private int age;
public string Name
{
get { return name; } //값(필드) 반환
set { name = value; } //값(필드) 설정
}
public int Age //유효성 검사(age가 0 이하이면 값 설정이 유효하지 않음)
{
get { return age; }
set
{
if (value >= 0)
age = value;
}
}
}
//호출
static void Main(string[] args)
{
Person person = new Person(); //Person 클래스의 인스턴스 생성
person.Name = "John"; // Name 프로퍼티에 값 설정
person.Age = 25; // Age 프로퍼티에 값 설정
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}
[출력]
Name: John, Age: 25
-자동 프로퍼티 설정(외부에서 자유롭게 값을 설정하고 읽기 가능)
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
2) 메서드: 함수
class Player
{
// 필드
private string name;
private int level;
// 메서드
public void Attack() //public 접근 제한자를 사용(외부에서 호출 가능)
{
// 공격 동작 구현
}
}
//메서드 호출
static void Main(string[] args)
{
Player player = new Player(); // Player 클래스의 인스턴스 생성
player.Attack(); // Attack 메서드 호출
}
3) 생성자
-클래스와 동일한 이름
-변수와 함수를 초기화하고, 데이터의 초기값을 설정
class Person
{
private string name;
private int age;
// 매개변수가 없는 디폴트 생성자
public Person()
{
name = "Unknown";
age = 0;
}
// 매개변수를 받는 생성자
public Person(string newName, int newAge)
{
name = newName;
age = newAge;
}
public void PrintInfo()
{
Console.WriteLine($"Name: {name}, Age: {age}");
}
}
//생성자 호출
static void Main(string[] args)
{
Person person1 = new Person(); // 디폴트 생성자 호출
Person person2 = new Person("John", 25); // 매개변수를 받는 생성자 호출
}
4) 소멸자
-클래스와 동일한 이름
-이름 앞에 ~ 기호를 붙여서 표현
-메모리나 리소스를 해제
-객체가 소멸되는 시점에 로깅 작업을 수행 또는 디버깅 정보를 기록
class Person
{
private string name;
public Person(string newName)
{
name = newName;
Console.WriteLine("Person 객체 생성");
}
~Person()
{
Console.WriteLine("Person 객체 소멸");
}
}
2. 객체지향 프로그래밍
(코드를 구현할 때 고려해야하는 5가지 특징)
2-1. 캡슐화: 클래스를 사용하여 외부에서 직접적인 접근을 제한(보안 강화)
2-2. 상속
: 기존의 클래스(부모)를 확장하여 새로운 클래스(자식)를 생성(중복 코드 줄이기)
-부모 클래스를 자식 클래스에 상속하면, 자식 클래스는 부모 함수와 본인 함수 둘 다 접근 가능.
다만, 부모 클래스에서 private로 생성된 데이터는 접근 불가능.
-양 쪽의 함수명이 동일한 경우, 상속한 클래스는 내부의 함수를 우선시 함.
// 부모 클래스
public class Animal
{
public string Name { get; set; } //자동 프로퍼티 사용
public int Age { get; set; }
public void Eat()
{
Console.WriteLine("Animal is eating.");
}
public void Sleep()
{
Console.WriteLine("Animal is sleeping.");
}
}
// 자식 클래스
public class Dog : Animal //Dog 클래스는 Eat, Sleep, Bark 사용 가능
{
public void Bark()
{
Console.WriteLine("Dog is bark.");
}
}
public class Cat : Animal //Cat 클래스는 Eat, Sleep, Meow 사용 가능
{
public void Sleep() //부모 클래스와 동일한 함수명 생성
{
Console.WriteLine("Cat is sleeping.");
}
public void Meow()
{
Console.WriteLine("Cat is meow.");
}
}
// 사용 예시
Dog dog = new Dog();
dog.Name = "Bobby";
dog.Age = 3;
dog.Eat(); // Animal is eating.
dog.Sleep(); // Animal is sleeping.
dog.Bark(); // Dog is barking
Cat cat = new Cat();
cat.Name = "KKami";
cat.Age = 10;
cat.Eat(); // Animal is eating.
cat.Sleep(); // Cat is sleeping. //부모 클래스 함수보다 Cat 클래스 함수 우선시
cat.Meow(); // Cat is meow.
2-3. 다형성: 기존의 클래스 내 함수가 자식 클래스에서 다르게 동작 가능(오버로딩, 오버라이딩)
2-4. 추상화: 기존의 클래스에 필수 부분만 구현, 자식 클래스에서 세부 구현(Abstract 추상 클래스)
2-5. 객체: 필드와 메서드
3. 다형성
3-1. Virtual 가상 메서드 및 오버라이딩(Overriding)
부모 클래스에서 virtual 키워드를 사용하여 함수를 선언하면,
자식 클래스에서 override 키워드를 사용하여 필요에 따라 변경 또는 확장 가능
public class Unit
{
public virtual void Move() //virtual를 사용하여 함수 선언
{
Console.WriteLine("두발로 걷기");
}
public void Attack()
{
Console.WriteLine("Unit 공격");
}
}
public class Marine : Unit
{
//필요에 따라 변경하지 않은 경우
}
public class Zergling : Unit
{
public override void Move() //override를 사용하여 함수 선언
{
Console.WriteLine("네발로 걷기"); //필요에 따라 변경한 경우
}
}
// 사용 예시
// #1 참조형태와 실형태가 같을때
Marine marine = new Marine();
marine.Move(); //두발로 걷기
marine.Attack(); //Unit 공격
Zergling zergling = new Zergling();
zergling.Move(); //네발로 걷기
zergling.Attack(); //Unit 공격
// #2 참조형태와 실형태가 다를때
List<Unit> list = new List<Unit>(); //실형태가 List일 때
list.Add(new Marine());
list.Add(new Zergling());
foreach (Unit unit in list)
{
unit.Move();
}
3-2. Abstract 추상 클래스와 추상 메서드
자식 클래스로의 상속을 전제로 생성되는 부모 클래스로 사용.
-구현 부분이 없는 추상 메서드로 구성(반드시 자식 클래스에 구현 부분이 추가 되어야 함)
-abstract 키워드를 사용하여 선언
abstract class Shape //추상클래스(부모)
{
public abstract void Draw(); //추상메서드
}
class Circle : Shape //자식
{
public override void Draw()
{
Console.WriteLine("Drawing a circle"); //구현부분
}
}
class Square : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a square");
}
}
class Triangle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a triangle");
}
}
//사용예시
List<Shape> list = new List<Shape>();
list.Add(new Circle());
list.Add(new Square());
list.Add(new Triangle());
foreach (Shape shape in list )
{
shape.Draw();
}
[출력]
Drawing a circle
Drawing a square
Drawing a triangle
'🌐 유니티 (Unity)' 카테고리의 다른 글
Day 11 - 텍스트 게임 만들기(오류 해결 과정2) (0) | 2024.04.26 |
---|---|
Day 10 - 텍스트 게임 만들기(오류 해결 과정) (2) | 2024.04.25 |
Day 8 - C# 문법(조건문, 반복문, 배열, 딕셔너리, 메서드, 오버로딩, 구조체) (0) | 2024.04.23 |
Day 7 - C# 문법(WriteLine, 이스케이프 시퀀스, 자료형, 변수, 연산자 등) (0) | 2024.04.22 |
Day 6 - 게임 이펙트 코드 수정(위치 이동) (0) | 2024.04.20 |