클래스
이 세상에서 객체라고 할만한 모든 것이 갖고 있는 두가지 : 속성과 기능
C#의 객체 : 속성 -> 데이터, 기능 ->메소드
필드 : 클래스 안에 선언된 변수들
멤버: 필드와 메소드를 비롯하여 프로퍼티, 이벤트 등 클래스 내에 선언된 요소들
Cat kitty = new Cat();
Cat()은 생성자라고 하는 특별한 메소드. 클래스의 이름과 동일한 이름을 가지며 객체를 생성하는 역할
new 키워드는 생성자를 호출해서 객체를 생성하는 데 사용하는 연산자
생성자와 new키워드는 바늘과 실 같은 존재
kitty는 참조. kitty자체에 메모리가 할당되는 것이 아니고 생성자가 힙에 생성한 객체를 가리키는 주소다
모든 클래스는 복합 데이터 형식(기본데이터들이 모여서) 그리고 복합 데이터 형식은 참조형식이다.
즉 클래스는 참조형식
Cat kitty; 라고 만 쓰면?
여기서 kitty는 null을 가짐. kitty는 참조(주소)라고 했다. 가리킬 객체를 만들어주지 않았으니 null인 참조이다.
참고로
Cat객체를 주목
객체 외부에선 인스턴스를 만들고 kitty라는 주소로 Cat객체를 가리켜 사용하면 되지만
객체 내부에선 kitty이름을 알 수 가 없다. 내부에선 자기자신을 어떻게 부를까?
= this사용
new연산자와 생성자는 모든 데이터 형식에 사용 가능 int a= new int(); a = 3; string b = new string(new charp[]{'한', '글'}); -> 다른 데이터 형식에 new 사용한거 보면 헷갈리지 말고 이거 참고 |
예제
namespace thistiscsharp
{
class Cat
{
public string Name; //참고로 필드를 Public으로 하는것은 안된다. 필드는 99퍼가 private
public string Color;
public void Meow()
{
Console.WriteLine($"{Name} : 야옹");
}
}
class MainClass
{
public static void Main(string[] args)
{
Cat kitty = new Cat();
kitty.Color = "하얀색";
kitty.Name = "키티";
kitty.Meow();
Console.WriteLine($"name = {kitty.Name}, color = {kitty.Color}");
Cat nero = new Cat();
nero.Color = "검은색";
nero.Name = "네로";
nero.Meow();
Console.WriteLine($"name = {nero.Name}, color = {nero.Color}");
}
}
}
생성자와 종료자
객체가 생성될때는 생성자가 호출되고 소멸할 때는 종료자가 호출됩니다
생성자
- 원하는 값으로 초기화 하기 위해 사용
- 즉 매개변수를 입력받아 원하는 값으로 필드를 초기화할 수 있는 최적의 장소가 생성자(필드 초기화, 자원 초기화 등등)
- 접근한정자가 없고 클래스이름과 같으면 생성자이니 헷갈리지 말것
생성자의 명시적 구현 방법
class 클래스이름
{
한정자 클래스이름(매개변수_목록)
{
//
}
//필드
//메소드
}
이렇게 명시적으로 생성자를 구현하지 않아도 컴파일러에서 생성자를 만들어줌( 기본 생성자라고 하고 기본값으로 초기화해준다)
하지만 생성자의 명시적 구현은 객체의 필드를 원하는 값으로 초기화 가능
사용방법
class Cat
{
public Cat() //생성자!
{
Name = "";
Color = "";
}
...
}
class MainApp
{
..
..void Main(..)
{
Cat kitty = new Cat("네로", "하얀색");
아까는 Cat의 필드를 public으로 해주는 안좋은 예제를 했는데
생성자로 매개변수에 값을 넣어줘 초기화하는 식으로 사용가능
생서자는 오버로딩도 가능
using System;
using static System.Console;
namespace thistiscsharp
{
class Cat
{
public string Name;
public string Color;
public Cat()
{
Name = "";
Color = "";
}
public Cat(string _Name, string _Color) //생성자 오버로딩 위에 Cat이라는 같은이름의
{ //생성자가 있지만 생성자 오버로딩(매개변수 추가)
Name = _Name;
Color = _Color;
}
~Cat() //가비지 컬렉터의 종료시점(예측 불가) 에 따라종료자 할때마다 실행결과 //다를 수 있음
{
Console.WriteLine($"{Name} bye");
}
public void Meow()
{
WriteLine("Meeeow");
}
}
class MainClass
{
public static void Main(string[] args)
{
Cat kitty = new Cat();
kitty.Color = "yellow";
kitty.Name = "kitty";
kitty.Meow();
Console.WriteLine($"name= {kitty.Name}, color = {kitty.Color}");
Cat nero = new Cat("nero", "black");
nero.Meow();
Console.WriteLine($"name= {nero.Name}, color = {nero.Color}");
}
}
}