C#.

이것이 C#이다 7장) 클래스와 객체, 인스턴스의 차이

Muru 2023. 8. 23. 23:07

7장 연습문제

클래스와 객체, 인스턴스는 서로 어떤 차이가 있나요?

Class

객체 (Object)를 만들기 위해 조재하는 Struct 오 Method의 구성단위를 Class라한다.

따라서 Class는 설계도라고 생각하는게 편하다.

객체를 만들기 위해서는 해당 객체가 어떤 속성과 기능을 가지고 있는지 정의 해줘야 하는데, 이 역할을 담당하고 있는것이

Class이다. 요약하자면 객체 생성을 위한 하나의 설계도 라 생각하면 된다.

 

Object

Class(설계도)에 따라 생성된 실체화 된 것으로 메모리에 할당 된다.

 

 

Instance

Object class (객체 클래스)의 Instace라 불린다. 설계도(class)에 짜여진 그대로 객체(object)를 생성 하는것. 이것을 '인스턴스화'라 표현한다고 한다. 이렇게 생성 된 것을 Instance라 표 현한다.,

 

 


this 키워드와 base 키워드

 

this 키워드 

this 클래스의 현재 객체를 가르키는 키워드이다. 클래스의 멤버 변수에 접근하기 위해 사용한다.

 

base 키워드

파생 클래스 && 자식클래스에서 기본 클래스 &&부모 클래스의 생성자, 필드, 메서드에 접근해야하는 경우 base키워드를 사용한다.

오로지 메서드, 프로퍼티, 생성자 내에서만 사용할 수있고, static으로 선언된 정적 메서드는 사용할 수없다.

주로 동일한 이름의 필드가 존재할경우 유용히 사용한다.

 

 

정의 된 클래스 내의 맴버를 가르킬때 사용한다. 보통 앞에 "_" 또는 "m"을 붙여서 객체 이름을 정하기도한다.

 

다음 예제...

    namespace ConsoleApp10
{
    class Example
    {
        private int data = 10;
        public virtual int GetData()
        {
            return this.data;
        }
    }

    class SubExample : Example
    {
        private int data = 20;
        public override int GetData()
        {
            return this.data;
        }

        public void Print()
        {
            Console.WriteLine("data - : " + this.GetData());
        }

    }
    internal class Program
    {
        static void Main(string[] args)
        {
            SubExample ex = new SubExample();
            ex.Print();
            Console.WriteLine("Press any key...");
            Console.ReadLine();
        }
    }
}

/결과 : 20

return this.data; 대신 return base.data를 사용했다면 값이 20이 아니라 10으로 나왔을것이다.


구조체(Struct)

 

구조체는 값 형식의 데이터 구조를 나타내는 사용자 정의 데이터 형식이다.

값 형식 : 구조체는 값 형식이므로 변수에 직접 데이터가 저장된다. 이에 반해 클래스는 참조 형식이고, 변수에는 데이터에 대한 참조가 저장된다.

상속 불가능 : 구조체는 다른 클래스나 구조체를 상속할 수 없다. 하지만 인터페이스 구현은 가능하다!

기본 생성자 : 구조체는 생성자를 정의할 수 있지만 ,기본 생성자를 반드시 제공해야하며, 모든 필드는 생성자 내에서 초기화 되어야한다.

복사와 할당 : 구조체 변수 간의 할당시, 값이 복사된다. 클래스 참조 복사와는 다르다.

 

구조체는 주로 스택에 할당되며 작은 데이터 구조나 간단한 값을 담는 객체에 유용하다. 그렇기에 자주 생성되고 소멸되는 작은 객체에 적합하다. 역으로 복사에 의해 데이터가 복제되기 때문에 큰 데이터나 자주 변경되는 데이터에 사용하기에는 좋지 않다.

    namespace ConsoleApp10
{
    struct Person
    {
        public string FirstName;
        public string LastName;
        public int Age;

        public Person(string firstName, string lastName, int age)
        {
            FirstName = firstName;
            LastName = lastName;
            Age = age;
        }

        public void DisplayInfo()
        {
            Console.WriteLine($"Name : {FirstName} {LastName} / Age : {Age}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
           Person person1 = new Person("Macus", "Rashford", 25);
           Person person2 = new Person("Bruno", "Fernandes", 29);

           person1.DisplayInfo();
           person2.DisplayInfo();

        }
    }
}

위의 예제에서 'Person'구조체는 3개의 필드와 생성자, 그리고 메서드를 갖고있다.

구조체 : FirstName, LastName, Age

생성자 : public Person(string firstName, string lastName, int age)

메서드 : DisplayInfo()


다형성과 오버라이드

 

C#에서 다형성은 객체 지향 프로그래밍의 중요한 개념 중 하나로, 동일한 메서드나 인터페이스를 사용하며 서로 다른 타입의 객체를 다루는 능력을 의미합니다. 이는 코드의 재사용성과유연성을 증가시키는데 도움이 되죠. 다형성은 클래스 상속과 인터페이스 구현을 통해 구현됩니다.

 

오버라이딩은 다형성의 핵심적 부분으로, 다형성을 실현하는데 사용된다. 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의 하며, 부모 클래스와 자식 클래스 간의 계층 구조에서 동일한 메서드 시그니처를 가진 메서드가 서로 다르게 작동할수있도록한다.

 

예제 코드

using System.Drawing;
using System.Linq.Expressions;
using System.Net.Http.Headers;
using System.Reflection.PortableExecutable;
using System.Threading.Tasks.Dataflow;
using System.Xml.Linq;

    namespace ConsoleApp10
{
    class Shape
    {
        public virtual void Draw()
        {
            Console.WriteLine("Drawing a shape");
        }
    }

    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 Program
    {
        static void Main(string[] args)
        {
            Shape shape1 = new Circle();
            Shape shape2 = new Square();

            shape1.Draw(); // "Drawing a circle"
            shape2.Draw(); // "Drawing a square"
        }
    }
}