ETC/C#

객체 지향 / 클래스 / 정적 필드

빡구동동 2021. 1. 20. 22:55

객체 지향 / 클래스 / 정적 필드


객체 지향 프로그래밍

int a = 30;
int b = 40;

int : 클래스 

a,b : 객체(인스턴스, instance) - int의 인스턴스

 

Cat kitty = new Cat();

Cat() : 생성자(Constructor) - 클래스의 이름과 같다

new : 연산자 - 생성자를 호출해서 객체를 생성하는데 사용


"모든 클래스는 복합 데이터 형식이다"

복합 데이터 형식은 참조 형식이다.

Cat kitty;

여기서 kitty는 null을 가진다. 

kitty 자체에 메모리가 할당되는 것이 아니라 kitty는 참조로써 객체가 있는 곳을 가르킬 뿐 

 

그래서 new 연산자와 생성자가 필요하다.

new 연산자와 생성자를 이용해서 힙에 객체를 생성하고, kitty는 생성자가 힙에 생성한 객체를 가리킨다.

 

    class Cat   
    {
        public string Name;     // 필드
        public string Color;
        
        public void Meow()	// 메소드
        {
            Console.WriteLine($"{Name} : 야옹 ");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // kitty 객체(instance, 인스턴스) 생성
            Cat kitty = new Cat();// Cat() : 생성자
            kitty.Name = "키티";
            kitty.Color = "하얀색";
            kitty.Meow();
            Console.WriteLine($"{kitty.Name} : {kitty.Color}");
        }
    }

정적 필드와 메소드

static은 메소드나 필드가 클래스의 인스턴스(객체)가 아닌 클래스 자체에 소속되도록 지정하는 한정자

 

한 프로그램 안에서 인스턴스는 여러 개가 존재할 수 있으나 클래스는 단 하나만 존재

똑같은 클래스가 두 개 이상 존재할 수 없음

만약 어떤 필드가 클래스에 소속된다는 것은 곧 그 필드가 프로그램 전체에 유일하게 존재한다는 것

 

인스턴스에 소속된 필드

    class Program
    {
        class Aclass
        {
            public int a;
            public int b;
        }

        static void Main(string[] args)
        {
            Aclass obj1 = new Aclass();
            obj1.a = 1;
            obj1.b = 2;
            Aclass obj2 = new Aclass();
            obj2.a = 1;
            obj2.b = 2;
        }
    }

클래스에 소속된 필드(static)

 	class Global
        {
            public static int Count = 0;        //static : 공유 변수
        }
        class ClassA
        {
            public int cnt = 0;
            public ClassA()
            {
                Global.Count++;
                this.cnt++;
            }
        }
        class ClassB
        {
            
            public ClassB()
            {
                Global.Count++;
            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine($"Global.Count : {Global.Count}");
            ClassA a1 = new ClassA();
            ClassA a2 = new ClassA();
            ClassB b1 = new ClassB();
            ClassB b2 = new ClassB();
            Console.WriteLine($"Global.Count : {Global.Count} {a1.cnt} {a2.cnt}");
        }
    }