View
노트북, 데스크탑, 휴대폰에는 전원 켜기, 전원 종료, 리셋 등의 같은 역할을 하는 같은 기능이 공유되고 있다. 이는 모두 '컴퓨터'에서 파생되어 나온 기기이기 때문이다.
새로운 전자기기를 만드는 작업을 한다고 가정해보면, 개발자들은 컴퓨터에서 사용되어지던 기능들에 대한 정보를 그대로 가져오면서 거기에 덧붙여 기능을 확장시키는 작업을 한다. 여기서 컴퓨터의 기능을 새로운 전자기기로 가져오는 작업이 상속에 해당된다.
상속
...
}
상속을 받더라도 부모 클래스의 private 제한자가 붙은 필드나 메서드는 이용할 수 없다. 단, protected 제한자를 쓸 경우 상속받은 자식 클래스에서도 사용 가능하다.
클래스의 선언을 다음과 같이 하면 더 이상 상속을 해줄 수 없는 클래스로 만들 수 있다. ( 불임? )
sealed class A
{
...
}
형변환
부모 클래스는 일반적인 개념 ( coffee ) 이고, 자식 클래스는 특수한 개념 ( americano ) 이므로, 자식 -> 부모의 형변환은 가능하지만 부모 -> 자식의 형변환은 불가능하다.
( 자식이 가지는 메모리 크기 > 부모가 가지는 메모리 크기 -> 자식의 정보를 부모가 담기에는 메모리가 부족하여 정보 손실이 일어난다.)
as 연산자 & is 연산자
Name is Type
as 연산자의 경우, 형변환이 가능하면 형변환이 진행된 결과값을 반환하고 형변환이 불가능 한 경우 NULL을 반환한다.
참조형 변수 (클래스, 배열, 문자열 ) 에만 적용이 가능하며, 형변환에 대한 체크만 가능하다.
is 연산자의 경우, 형변환이 가능하면 True를 반환하고 현변환이 불가능 한 경우 False를 반환한다.
as 연산자와 마찬가지로, 참조형변수에만 적용이 가능하다.
형 변환을 통한 값이 필요할 때는 as 연산자를, Boolean 값이 필요할 때는 is 연산자를 이용하면 된다.
System.Object
{
...
}
class A : Object
{
...
}
이렇게 되면, 참조형 ( 문자열, 배열, 클래스 ) 과 값형 ( int, char, ... ) 이 같은 부모 클래스인 Object에게서 상속받게 되는데, 둘은 작동 방식이 매우 다르기에, 값 형식 변수는 System.ValueType에 한번 더 상속시켜 문제를 해결해주었다.
( System.ValueType 에서 Object 메서드를 재정의하여 작동 방식을 바꿔주었다고 보면 된다 )
모든 클래스는 Object Class를 상속받았기에, Object 클래스에 속한 메서드를 이용할 수 있다.
ToString
Console.WriteLine(americano.pub_value.ToString()); 기본타입(int)에 ToString을 이용
CsharpStudy.Americano
2
GetType
Type type = latte.GetType(); 해당 인스턴스를 가져와 Type형 변수 type에 저장
Console.WriteLine(type.FullName); type의 FQDN을 출력
Console.WriteLine(type.IsClass); type 이 class 이므로 true 를 출력
Console.WriteLine(type.IsArray); type 이 array가 아니므로 false 를 출력
CsharpStudy.Latte
True
False
ToString에서 기본타입의 FQDN을 가져오는 일이 불가능했지만, GetType 메서드를 이용하면 타입의 이름을 반환하는 작업을 수행할 수 있다.
int numb = 5;
Type intType = numb.GetType();
Console.WriteLine(intType.FullName);
System.Int32
typeof 예약어를 이용한다면, 인스턴스에서 가져오지 않고 곧바로 클래스의 이름에서 Type을 구하는 방법도 사용할 수 있다.
공부하면서 작성한 예제
using System;
namespace CsharpStudy
{
class MainClass
{
static void Main(string[] args)
{
Coffee coffee = new Coffee();
coffee.Offer(); 부모 클래스가 가진 메서드
coffee.Printpub();
coffee.Printpri();
coffee.Printpro();
Americano americano = new Americano();
americano.Offer(); 부모 클래스를 상속받은 자식 클래스도 부모의 메서드를 사용할 수 있다.
americano.Printpub_();
// americano.Printpri_(); 오류발생 부모 클래스의 private 는 이용할 수 없다.
americano.Printpro_(); 부모 클래스의 protected 는 자식 클래스도 이용할 수 있다.
}
}
public class Coffee
{
public int size;
public bool shot;
public bool milk;
public bool syrup;
public void Offer() { }
public void Clean() { }
public int pub_value = 2;
private int pri_value = 3;
protected int pro_value = 4;
public void Printpub() { Console.WriteLine(pub_value); }
public void Printpri() { Console.WriteLine(pri_value); }
public void Printpro() { Console.WriteLine(pro_value); }
}
public class Americano : Coffee
{
int numbofshot = 3;
public int Hasshot() { return numbofshot; }
public void Printpub_() { Console.WriteLine(pub_value); }
// public void Printpri_() { Console.WriteLine(pri_value); } 오류발생
public void Printpro_() { Console.WriteLine(pro_value); }
}
public class Latte : Coffee
{
int numbofshot;
public int Hasshot() { return numbofshot; }
int sizeofmilk;
public int Hasmilk() { return sizeofmilk; }
}
}