C#은 완전한 객체지향 프로그램(OOP)이다 i,e, 클래스 밖에서는 정의조차 안된다;;
객체지향 프로그램의 경우 수정능력의 용이성, 재사용성이 높아진다 (수행속도는 같음)
→ C,C++의 경우 완전객체지향은 아니라 객체없이 정의등이 가능하다
객체는 instance 라고도 부른다 ⇒ instance는 더 정확한 실체라고 생각하자
메소드는 사용자 정의 함수와 거의 비슷한 개념으로 보면 된다
만약, 클래스 내장 함수로 안 만들었다면 (절차지향적) 여러번 써야하는 문제有
속성은 변수를 통해, 기능은 매소드를 통해서 구현된다!
Note* C#에서는 int도 하나의 클래스이다. int a 는 int클래스의 a 객체라는 뜻

class Cat
{
public string Name; -> 멤버변수(C++), property(C#)이라고 부름
public string Color; -> 멤버변수(C++), property(C#)이라고 부름
public void Meow() -> 함수(C++), 메소드(C#)이라고 부름
{
Console.WriteLine("{0} : 야옹", Name);
}
}
Cat kitty = new Cat();
-> 여기서 kitty라는 얘는 stack에 참조변수로 정의됨
-> 그리고 new 라는 걸 하면 Heap에 Cat()이라는 클래스에 대한 메모리를 할당하기시작함.
-> Cat(틀) kitty(객체) 라고 구조화된다.
-> 이때 new 뒤의 Cat()은 함수고 이건 생성자이다!
(즉, 객체를 만들면 생성자가 10000000% 작동된다는 것을 알것이다)
(또한 생성자는 닥치고 클래스이름과 같아야만 한다! 관례적인게 아니라 꼮!!)

생성자의 경우에는 반환하는 함수가 아니므로 void Cat()이다. 그러나 무조건 생성자는 반환이 아니라 참조변수에 메모리 연결해주는 역할이므로 void조차 적지 않는다!
(이 그림에서는 Cat에 대한 생성자를 오버로딩 해놓았다)
(또한, 만일 생성자를 정의하지 않았다면 디폴트 생성자가 만들어지며 그냥 메모리만 잡는 역할)
→ 내가 생성자를 정의했다면 디폴트 생성자는 만들어지지 않는다.
But, 만일 내가 public Cat(string _Name, string _Color) 를 만들어 놓고 Cat() 이렇게 부르면 어떻게 될까? → 컴파일 에러가 난다 디폴트 생성자가 만들어지지 않기 때문에!!!!!!
소멸자는 메모리가 삭제될때 선언되는 메소드를 말한다. Cat c = new Cat(); 했을때 c라는 참조변수는 코드블록을 벗어날때 스택에 있던 c는 사라짐 .
그러나 new Cat()에 해당하는 애는 Heap에 있고 이를 가르키는 주소가 더 이상 없으므로 가비지컬렉터가 이를 제거하는 구조다.