7.1 객체 지향 프로그래밍과 클래스
객체가 가지고 있는 두 가지, 속성과 기능.
속성 = 데이터(변수), 기능 = 메소드
클래스 = 객체를 만들기 위한 장치
7.2 클래스의 선언과 객체의 생성
class 클래스이름
{
//데이터와 메소드
}
예제)
class Cat
{
//데이터(필드)
public string Name;
public string Color;
//메소드
public void Meow()
{
Console.WriteLine("{0} : 야옹", Name);
}
}
객체 생성법
Cat kitty = new Cat();
kitty.Color = "하얀색";
kitty.Name = "키티";
kitty.Meow();
Console.WriteLine("{0} : {1}", kitty.Name, kitty.Color);
Cat nero = new Cat();
nero.Color = "검은색";
nero.Name = "네로";
nero.Meow();
Console.WriteLine("{0} : {1}", nero.Name, nero.Color);
7.3 객체의 삶과 죽음에 대하여 : 생성자와 소멸자
-생성자-
생성자의 역할 = 객체를 생성하는 것.
class 클래스이름
{
한정자 클래스이름( 매개변수 목록 )
{
//
}
//필드
//메소드
}
생성자를 구현해야 하는 이유
= 객체를 생성하는 시점에 객체의 상태를 원하는 값으로 초기화 하고 싶을 때
예제)
class Cat
{
public Cat()
{
Name = "";
Color = "";
}
public Cat( string _Name, string _Color )
{
Name = _Name;
Color = _Color;
}
}
-소멸자-
객체를 소멸할 때 쓰는 소멸자
가비지 컬렉터가 객체가 소멸되는 시점을 판단하여 소멸자를 호출
class 클래스이름
{
~클래스이름()
{
//
}
//필드
//메소드
}
7.4 정적 필드와 메소드
static = 메소드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정
예 - 인스턴스에 소속된 필드의 경우)
class MyClass
{
public int a;
public int b;
}
//
public static void Main()
{
MyClass obj1 = new MyClass();
obj1.a = 1;
obj1.b = 2;
}
예 - 클래스에 소속된 필드의 경우(static))
class MyClass
{
public static int a;
public static int b;
}
//
public static void Main()
{
MyClass.a = 1;
MyClass.b = 2;
}
정적 필드와 메소드를 사용하면 객체를 만들 필요 없이 바로 사용가능하다.
프로그램 전체에 걸쳐 공유해야하는 변수가 있다면 정적 필드를 이용하면 된다.
7.5 객체 복사하기 : 얕은 복사와 깊은 복사
얕은 복사 : 객체를 복사할 때 참조만 복사하는 것(같은 곳을 참조한다)
깊은 복사 : 객체를 복사할 때 참조와 값까지 복사하는 것 (서로 각자 다른 곳을 참조한다)
7.6 this 키워드
객체 외부에서는 객체의 필드나 메소드에 접근할 때 객체의 이름을 사용한다면,
객체 내부에서는 자신의 필드나 메소드에 접근할 때 this 키워드를 사용한다.
예)
class Employee
{
private string Name;
public void SetName( string _Name )
{
this.Name = _Name;
}
}
7.7 접근 한정자로 공개 수준 결정하기
클래스에 선언되어 있는 필드와 메소드 중에
어떤 것들을 공개하고 비공해 할 것인지 결정하는 한정자
public : 클래스의 내부/외부 모든 곳에서 접근할 수 있다.
protected : 클래스의 외부에서는 접근할 수 없지만, 파생 클래스에서는 접근 가능
private : 클래스의 내부에서만 접근할 수 있다.(기본 한정자)
internal : 같은 어셈블리에 있는 코드에 대해서만 public로 접근 가능. 다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가짐
protected internal : 같은 어셈블리에 있는 코드에 대해서만 protected로 접근할 수 있다.
다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가진다.
7.8 상속으로 코드 재활용하기
class 기반 클래스
{
//멤버선언
}
class 파생 클래스 : 기반 클래스
{
//아무 멤버를 선언하지 않아도 기반 클래스의 모든 것을 물려 받아 갖게 된다.
//단, private로 선언된 멤버는 제외
}
파생 클래스의 인스턴스를 생성할 때
호출되는 기반 클래스의 생성자에게 매개변수를 전달하려면 base 키워드를 사용한다
this는 자기 자신을 가리킨다면 base는 기반 클래스를 가르킨다.
예제)
class Base
{
public void BaseMethod();
}
class Derived:Base
{
public void DerivedMethod()
{
base.BaseMethod();
}
}
7.9 기반 클래스와 파생 클래스 사이의 형식 변환, 그리고 is 와 as
기반 클래스와 파생 클래스 사이에서는 족보를 오르내리는 형식 변환이 가능하며,
파생 클래스의 인스턴스는 기반 클래스의 인스턴스로도 사용할 수 있다.
예제)
Mammal mammal = new Mammal();
mammal.Nurse();
mammal = new Dog();
mammal.Nurse();
Dog dog = (Dog)mammal;
dog.Nurse();
dog.Bark();
mammal = new Cat();
mammal.Nurse();
Cat cat = (cat)mammal;
cat.Nurse();
cat.Meow();
형변환을 위한 연산자 is, as
is : 객체가 해당 형식에 해당하는지 검사하여 그 결과를 bool 값으로 변환
as : 형식 변환 연산자와 같은 역할을 한다. 다만, 형변환 연산자가 변환에 실패하는 경우 예외를 던지는 반면, as 연산자는 객체 참조를 null로 만든다.
댓글 없음:
댓글 쓰기