C#의 모든 클래스의 최상위에 있는 클래스이다.
따라서 사용자 정의 클래스를 비롯한 모든 클래스는 Object를 상속받는다.
Object 클래스는 다음과 같은 4개의 public 메소드를 포함하고 있다.

1
2
3
4
5
6
7
public class object
{
    public virtual bool         Equals(object obj);
    public virtual int         GetHashCode();
    public Type                 GetType();
    public virtual string     ToString;
}
cs



1
2
3
4
5
6
7
8
9
10
11
namespace CSharp_Practice
{
    class Program
    {
        static void Main(string[] args)
        {
            Program program = new Program();
            Console.WriteLine(program.ToString());
        }
    }
}
cs

실행 결과 : CSharp_Practice.Program


ToString() 메소드는 기본적으로 해당 인스턴스가 속한 클래스의 전체 이름(FQDN)을 반환한다.

하지만 각 클래스에서 오버라이드 할 수 있기 때문에, 다르게 동작할 수도 있다.

값 타입들(short, int, ... )의 ToString()은 담고 있는 값을 반환한다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Parent
{
    public void foo()
    {
        System.Console.WriteLine("Foo!");
    }
}
 
Parent parent = new Parent();
Type type = parent.GetType();
 
Console.WriteLine(type.FullName);
Console.WriteLine(type.IsClass);
Console.WriteLine(type.IsArray);
cs


실행 결과 : 

Parent

True

False


GetType() 메소드는 인스턴스에서 타입을 알아낸다.


*클래스명에서 바로 타입을 얻어내고 싶을 때는 typeof 메소드를 이용한다.

ex) Type type = typeof(Parent);



Equalse(object) 메소드는 인자와 인스턴스가 같은지 비교해 bool형으로 반환한다.

value type에 대해서는 값으로 비교, ref type에 대해서는 같은 주소를 가리키고 있는지를 비교한다.



GetHashCode() 메소드는 특정 인스턴스를 고유하게 식별할 수 있는 4바이트 int값을 반환한다.

Equals()가 true를 반환할 경우 두 객체의 HashCode도 같아야 한다.

때문에 보통 Equals 메소드를 하위 클래스에서 재정의할 때 GetHashCode까지 재정의해야 한다.

당연히 value type의 경우 값이 같다면 HashCode또한 같다.

'C#' 카테고리의 다른 글

C# 추상 클래스  (0) 2016.06.08
C# 연산자 오버로딩  (0) 2016.06.08
C# 클래스 - 상속  (0) 2016.06.08
C# 클래스 - 형변환  (0) 2016.06.08
C# 클래스 - 프로퍼티(property)  (0) 2016.06.07
Posted by RPG만들기XP
,

C# 클래스 - 상속

C# 2016. 6. 8. 01:17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Parent
{
    int property;
    public virtual void foo()
    {
        System.Console.WriteLine("Foo!");
    }
}
 
public class Child : Parent
{
    public override void foo()
    {
        // 부모의 foo 호출
        base.foo();
 
        // 아래 두 줄은 같은 동작
        this.foo();
        foo();
    }
}


virtual 키워드를 붙이지 않은 메소드는 override 할 수 없다.


부모 함수를 찾고 싶으면 base 키워드를 이용한다.

(C++에서의 Parent::foo() 와 같다.)


1
2
3
4
5
6
7
8
9
public sealed class Leaf
{
 
 
public class ChildLeaf : Leaf // 컴파일 안됨
{
 
}
cs


sealed 키워드를 사용해서 상속을 막을 수 있다.





* C#에서는 다중상속을 지원하지 않는다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Parent()
{
    int number;
    public Parent(int number)
    {
        this.number = number;
    }
}
 
public class Child : Parent
{
    public Child() // 에러 발생
    {
    }
}
cs


C#에서 위와 같이 부모 클래스에는 없는 signature의 생성자가 있을 경우에, 아래와 같은 문법을 활용할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Parent()
{
    int number;
    public Parent(int number)
    {
        this.number = number;
    }
}
 
public class Child : Parent
{
    public Child() : base(0)
    {
    }
    
    public Child(int number) : base(number) // 이런 것도 된다.
    {
    }
}
cs


부모 자식간에만 되는 것은 아니다. 아래와 같이 활용 가능.

1
2
3
4
5
6
7
8
9
10
11
public class Parent()
{
    int number;
    public Parent(int number)
    {
        this.number = number;
    }
    public Parent() : this(0)
    {
    }
}
cs


아주 좋은 기능이다.

'C#' 카테고리의 다른 글

C# 연산자 오버로딩  (0) 2016.06.08
C# 클래스 - Object 클래스  (0) 2016.06.08
C# 클래스 - 형변환  (0) 2016.06.08
C# 클래스 - 프로퍼티(property)  (0) 2016.06.07
C# 클래스 - 생성자  (0) 2016.06.07
Posted by RPG만들기XP
,

C# 클래스 - 형변환

C# 2016. 6. 8. 00:48
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Parent
{
    public void foo()
    {
        System.Console.WriteLine("Foo!");
    }
}
public class Child : Parent
{
    public void foo2()
    {
        System.Console.WriteLine("Foo2!");
    }
}
 
Parent something = new Child();
something.foo();
//Child stupid = something; // 컴파일 에러
Child smart = something as Child; // 잘 됨
if (something is Child)
    System.Console.WriteLine("something is Child!");
if (smart is Parent)
    System.Console.WriteLine("smart is Parent!");
cs


실행 결과 - 

Foo!

something is Child!

smart is Parent!


자식 -> 부모로의 형변환은 암묵적으로 가능하다.

부모 -> 자식으로는 안된다.

16번 라인은 C#에서의 자식->부모로의 암묵적 형변환을 보여주고 있다.

18번 라인은 부모->자식으로의 암묵적 형변환을 시도하였으나, 컴파일이 되지 않는다.


as 키워드는 캐스팅이 가능할 경우 캐스팅하고, 실패했을 경우 null을 리턴한다.

is 키워드는 실제로 캐스팅을 하지는 않고, 캐스팅이 가능한지 여부를 검사하여 bool 형으로 반환한다.

'C#' 카테고리의 다른 글

C# 클래스 - Object 클래스  (0) 2016.06.08
C# 클래스 - 상속  (0) 2016.06.08
C# 클래스 - 프로퍼티(property)  (0) 2016.06.07
C# 클래스 - 생성자  (0) 2016.06.07
C# 배열  (0) 2016.06.07
Posted by RPG만들기XP
,