C# 클래스 static & this

728x90
  • this 키워드

- 객체 자신을 참조하는 키워드

- 사용처

  1) 함수의 파라미터 이름과 멤버 변수 이름이 동일

  2) 클래스 내부에서 멤버변수를 접근

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _079_this
{
    class AA
    {
        int a; //this가 가리키는 객체, private 속성
        public AA(int a)
        {
            this.a = a;
        }
        public void Print()
        {
            int a = 100;
            this.a = 1000;

            Console.WriteLine("a : {0}", a);
            Console.WriteLine("this.a : {0}", this.a);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AA aa = new AA(10);
            aa.Print();  //100, 1000
        }
    }
}

 

  • static 키워드

 - 클래스의 멤버(필드, 메소드)를 객체 생성 없이 사용 가능(new 없이)

 - 클래스 static 필드(변수)

 - 클래스 static 메소드(함수)

 - static 메소드 내부에 사용하는 변수는 반드시 static

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _080_static
{
    class AA
    {
        public static int a;
        public static int b;
        public static readonly int c = 200;  //읽기 전용, 상수화

        public int num;

        public static void Print()
        {
            Console.WriteLine("a: {0}", a);
            Console.WriteLine("b: {0}", b);

            //num = 100;  //오류
        }
    }
    class BB
    {
        public int a;
        public int b;

        public void Print()
        {
            Console.WriteLine("a: {0}", a);
            Console.WriteLine("b: {0}", b);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AA.a = 10; //객체 생성 없이 바로 접근
            AA.b = 100; //객체 생성 없이 바로 접근
            //AA.c = 200; //오류 : readonly이므로 변경 불가

            AA.Print();  //객체 생성 없이 바로 접근

            //BB.a //오류
            //BB.b //오류
            //BB.Print(); //오류

            BB bb = new BB();
            bb.a = 100;
            bb.b = 200;

            bb.Print();

            Console.ReadKey();
        }
    }
}

  • 클래스의 메소드 활용

- 클래스가 메소드의 파라미터

- 클래스가 메소드의 리턴형

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _081_class_parameter
{
    class AA
    {
        public int a;
        public int b;

        public AA()
        {
            a = 0;
            b = 0;
        }
        public void Print()
        {
            Console.WriteLine();
            Console.WriteLine("a : {0}", a);
            Console.WriteLine("b : {0}", b);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AA aa = new AA();
            aa.Print();

            CopyRefClass(aa);
            aa.Print();

            AA aaa = CopyDeepClass(aa);
            aaa.Print();

            aa.Print();
        }
        static void CopyRefClass(AA aa)
        {
            AA refAA = aa;
            refAA.a = 100;
            refAA.b = 10000;
        }
        static AA CopyDeepClass(AA aa)
        {
            AA tempAA = new AA();

            tempAA.a = aa.a;
            tempAA.b = aa.b;
            tempAA.a = 0;

            return tempAA;
        }
    }
}

 

728x90