객체 지향 문법
객체지향
현실 세계의 모든 것들을 '속성'과 '행위'로 정의한다.
클래스
기본 자료형 타입으로는 현실 세계의 모든 것들을 표현하기 힘들기 때문에, 개념이 비슷한 것들을 일반화하여 표현하기 위해 직접 타입을 정의한 것이다.
클래스로 정의된 타입은 모두 참조형으로 분류되므로 사용하려면 new 연산자로 메로리 할당을 해야한다.
필드
클래스의 속성을 의미한다. 또는 객체에 속한 변수이다. 멤버 변수라고도 한다.
메서드
클래스의 행위를 의미한다. 또는 객체에 속한 함수이다. 서브루틴, 프로시저라고도 한다. 메서드를 쓰는 이유는 다음과 같다.
- 중복 코드 제거 : 중복된 코드는 메서드로 묶어서 편하게 이용할 수 있다.
- 코드 추상화 : 메서드의 내부를 몰라도 입출력 인자의 용도만 안다면 사용 가능하다.
생성자
객체가 생성되는 시점에 자동으로 호촐되는 메서드. 반환타입을 명시하지 않는 점을 제외하면 일반 메서드를 정의하는 방법을 따른다.
소멸자
객체가 제거되는 시점에 자동으로 호출되는 메서드. C#은 C++와 달리 delete라는 예약어가 없고, GC가 호출돼야 소멸자가 호출된다. 그래서 정확히 언제 소멸자가 호출되는지 알 수 없다. 소멸자의 사용은 권장되지 않고, 주로 IDisposable을 구현하여 Dispose()를 사용하는 방법이 권장된다.
다음은 생성자와 소멸자의 예시이다.
class Book
{
public Book() //생성자
{
}
~Book() //소멸자
{
// 자원 해제
}
}
정적 멤버, 인스턴스 멤버
class Dog
{
static public int CountOfInstance; //Dog 클래스의 총 인스턴수 개수를 세기 위한 정적 필드
public string _name;
public Dog(string name)
{
CountOfInstance++; //객체가 생성될 때 CountOfInstance에 1씩 더해준다.
_name = name;
}
public static void PrintBark()
{
Console.WriteLine(CountOfInstance + " 마리 개가 짖습니다.");
//정적 메서드 또한 호출 시 Dog.PrintBark() 으로 호출한다. 정적 메서드 안에서는 인스턴스 멤버에 접근 불가
}
public static void Main()
{
Console.WriteLine(Dog.CountOfInstance);
Dog blackDog = new Dog("검둥개");
Dog whiteDog = new Dog("백구");
Console.WriteLine(Dog.CountOfInstance);
//CountOfInstance가 인스턴트 필드였다면 인스턴스 단위로 변수를 가지고 있기 때문에 총 인스턴스 개수를 셀 수 없다.
}
}
특정 클래스의 인스턴스를 의도적으로 단 한 개만 만들고 싶은 경우에는
class Dog
{
public static Dog KingDog = new Dog("왕개");
public string _name;
private Dog(string name) //생성자를 private으로 해놓으면 다른 곳에서 객체 생성 불가
{
_name = name;
}
public void Bark() //이 메소드를 쓰려면 Dog.KingDog.Bark() 이런식으로 호출 가능하다.
{
//멍멍
}
}
Main 메서드의 인자로 사용되는 string 배열 사용 예제
public void Bark() //이 메소드를 쓰려면 Dog.KingDog.Bark() 이런식으로 호출 가능하다.
{
Console.WriteLine("첫번째 인자로 멍멍이 입력되었습니다. 멍멍!");
}
public static void Main(string[] args)
{
if (args[0].Equals("멍멍"))
{
Dog.KingDog.Bark();
}
}