어제에 이은 C# 공부중 예제들~ 추상메소드, 인터페이스, 보호클래스(상속불가), 모든 클래스들은 c#에 의해서 System.Object 를 상속, 프로퍼티(별칭 프로퍼티를 통해 데이터에 접근할 수 있도록 하는것 읽기/쓰기 제어), 인덱서(객체 자체에 [] 연산자를 지정해 해당 데이터에 접근할 수 있도록하는것. 대략 읽기만 가능?)



using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/*
 * 추상 메소드! 그리고 인터페이스.
 */
namespace test3
{
    // 추상메소드 : 파생되는 클레스에 특정 메소드를 만들도록 강요할 수 있음.
    abstract class Animal
    {
        abstract public void Walk();
    }

    class Person : Animal
    {
        public override void Walk()
        {
            System.Console.WriteLine("사람 걷다.");
        }
    }

    class Robot : Animal
    {
        override public void Walk() // override 키워드의 순서가 참 거슬렸었음. 이렇게도 되나?(된다)
        {
            System.Console.WriteLine("로봇 걷다.");
        }
    }

    // 인터페이스 : 클래스는 다중상속 불가. 인터페이스를 통해 1개이상 상속이 가능하다고 함.
    interface IAnimal
    {
        void Walk();
    }

    interface IUserSkill
    {
        void Dance();
    }

    class Person2 : IAnimal, IUserSkill // 1개 이상이라고 하는게 요런걸 말하는건가!?
    {
        public void Walk()
        {
            System.Console.WriteLine("사람2 걷다.");
        }

        public void Dance()
        {
            System.Console.WriteLine("사람2 춤춘다.");
        }
    }

    class Person3 : IAnimal
    {
        public void Walk()
        {
            System.Console.WriteLine("사람3 걷다.");
        }
    }

    // 보호클래스 : sealed 키워드가 적용되면 어떤 클래스도 SealAnimal 을 상송받을 수 없다고 하네요.
    sealed class SealAnimal
    {
        public string Name;
        public void Walk()
        {
            System.Console.WriteLine("보호된(?!) 동물 클래스 걷다.");
        }
    }

    // 모든 c# 의 클래스는 System.Object 클래스를 상속 받는다.
    // System.Object 의 주요 메소드.
    // > Equals() : 객체가 같은지 판단.
    // > GetHashCode() : 고유 해시 반환.
    // > GetType() : 타입 반환.
    // > ToString() : 객체 문자열 반환.
    // > Finalize() : 객체 소멸전에 작업할 코드 수행.
    // > MemberwiseClone() : 객체의 복사본을 만듬.

    // 프로퍼티 : 이를 통해서 클래스의 멤버변수에 대해서 읽기/쓰기 속성을 지정할 수 있다.
    // 멤버 변수가 private 로 선언되었을지라도..
    class Ayo
    {
        private int nData;
        private ArrayList aData = new ArrayList();

        public void push_back(int value)
        {
            aData.Add(value);
        }

        public int Data // 이게 프로퍼티라고 한다. 음... 뭔가 타이핑이 더 많아 진거 같기도 하고 생략된거 같기도 하다.
        {
            get { return nData; }
            set { nData = value; }
        }

        // 인덱서 aData[0] 이런식이 된다는것인듯! 좋아 보이긴 한다.
        public int this[int index]
        {
            get { return (int)aData[index]; }
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            // 추상메소드 테스트
            Person p = new Person();
            Robot r = new Robot();

            p.Walk();
            r.Walk();

            // 인터페이스 테스트
            Person2 p2 = new Person2();
            Person3 p3 = new Person3();
            p2.Walk();
            p3.Walk();
            p2.Dance();

            // 배열!
            Person3[] p3array = new Person3[2];
            p3array[0] = p3;
            p3array[1] = new Person3();

            for (int i = 0; i < 2; ++i)
            {
                p3array[i].Walk();
            }

            foreach (Person3 it in p3array) // 익숙해져 보자!~
            {
                it.Walk();
            }

            Ayo aa2 = new Ayo(); // 항상 생성해 줘야하는건 C/C++ 에 비해서 성가신거 같다. 아직까진...
            aa2.Data = 32;
            System.Console.WriteLine("nData 의 값은? " + aa2.Data);

            aa2.push_back(10);
            aa2.push_back(15);
            aa2.push_back(20);

            System.Console.WriteLine("0 = " + aa2[0]);
            System.Console.WriteLine("1 = " + aa2[1]);
            System.Console.WriteLine("2 = " + aa2[2]);
        }
    }
}
Posted by ngcbbs
,