본문 바로가기
🌐 유니티 (Unity)

Day 9 - C# 문법(클래스, 상속, 가상메서드 및 오버라이딩, 추상클래스)

by shin0707 2024. 4. 24.
728x90

  • 주제

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

 

728x90

loading