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}");
}
}