본문 바로가기
코스웨어/16년 스마트컨트롤러

2016-05-22_조재찬_스터디일지-C# 클래스 복습

by 알 수 없는 사용자 2016. 5. 22.
728x90
반응형

try~catch 문


try 블록과 각각 다른 예외의 처리기를 지정하는 하나 이상의 catch 절로 구성



아래의 소스는 실행시 에러와 함께 종료된다.


using System;

 

namespace TryCatchText

{

    class Program

    {

        static void Main(string[] args)

        {

            int a, b, c;

            a = 10;

            b = 0;

            c = a / b;

            Console.WriteLine(c);

        }

    }

}


실행시 에러가 뜨면서 프로그램 종료 



try~catch문을 통해 예외문구를 출력하게하고 비정상 종료를 막을 수 있다.

using System;
 
namespace TryCatchText
{
    class Program
    {
        static void Main(string[] args)
        {
            int a, b, c;
            a = 10;
            b = 0;
            try
            {
                c = a / b;
                Console.WriteLine(c);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}



Output : 


0으로 나누려 했습니다.

계속하려면 아무 키나 누르십시오 . . .




c#에서의 접근 한정자

 public

 클래스의 내부/외부 모든 곳에서 접근 가능



 protected

 클래스의 외부에서는 접근할수 없지만, 파생 클래스에서는 접근 가능.

 private

 클래스의 내부에서만 접근가능.(파생클래스도 접근불가)



멤버에 접근 한정자가 명시되어 있지 않으면 암시적으로 private으로 지정된다.

아래는 protected접근자에 대한 예제이다.
using System;

namespace AccessModifier
{
    class WaterHeater
    {
        int a;
        protected int temperature;

        public void SetTemperature(int temperature)
        // 변수가 protected이므로 public메소드로 접근. 
        
        {
            if (temperature < -5 || temperature > 42) // -5~42사이의 값을 받음
            {
                throw new Exception("Out of temperature range");
                // 값이 범위를 벗어나면 위의 Exception문구를 출력
            }

            this.temperature = temperature; // public 메소드로 protect에 접근한다.

        }

        internal void TurnOnWater()
        {
            Console.WriteLine("Turn on water : {0}", temperature);
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            try
            {
                WaterHeater heater = new WaterHeater();
                heater.SetTemperature(20);
                heater.TurnOnWater();

                heater.SetTemperature(-2);
                heater.TurnOnWater();

                heater.SetTemperature(50);
                // catch 블록으로 이동. try~catch문을 쓰지않으면 실행시 처리되지않은 예외가 뜸
                heater.TurnOnWater();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}
Turn on water : 20
Turn on water : -2
Out of temperature range

실행결과 : http://ideone.com/CgGv4G



c#에서의 상속


상속(Inheritance)은 부모(기반) 클래스의 멤버를 자식(파생) 클래스가 물려받는것이다.


기반클래스 -> 파생클래스 또는 슈퍼클래스 -> 서브클래스

라고도 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base //기반 클래스
{
    //멤버 선언
 
    public void BaseMethod(){};
 }
 
class Derived : Base //기반 클래스 : 파생 클래스
{
    //기반 클래스의 모든 것을 상속 받음.
    //단, private으로 선언된 것 제외.
 
    public void DerivedMethod()
    {
        base.BaseMethod(); //base키워드를 통해 기반 클래스에 접근 가능.(this키워드는 자기 자신)
    }
}

this키워드가 자기 자신을 가리키는 반면, base 키워드는 기반 클래스를 가리킨다.


base키워드를 이용해 파생클래의 생성자에서 기반클래스의 생성자의 매개변수를 넘겨줄 수 있다.


public Derived (string Name) : base(Name) { }


상속시 멤버의 접근 지정자는 아래와 같다. 

 - 기반클래스의 public 멤버는 파생클래스에서도 public

 - 기반클래스의 protected 멤버는 파생클래스에서도 protected

 - 기반클래스의 private은 상속 불가


아래는 상속을 활용한 예제이다. 

실제적으로는 파생클라스가 기반클래스의 개념들을 물려받아 더 넓은 개념을 가지게 된다.


(참고 예제 : http://rintiantta.blog.me/40113370865)


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

namespace food
{
    class Food
    {
        public void Maked()
        {
            Console.WriteLine("(만들어짐)");
        }
        public void Selled()
        {
            Console.WriteLine("(팔림)");
        }
        public void Eatted()
        {
            Console.WriteLine("(먹힘)");
        }
    }

    class Pizza : Food
    {
        public string TypeOfPizza;
    }
    class Chiecken : Food
    {
        public string TypeOfChicken;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Pizza pizza = new Pizza();
            Chiecken chinnim = new Chiecken();
            
            pizza.TypeOfPizza = "포테이토 피자";
            Console.WriteLine("{0}", pizza.TypeOfPizza);
            pizza.Maked();
            pizza.Selled();
            pizza.Eatted();

            chinnim.TypeOfChicken = "갈릭 치킨";
            Console.WriteLine("{0}", chinnim.TypeOfChicken);
            chinnim.Maked();
            chinnim.Selled();
            chinnim.Eatted();
        }
    }
}


Output : (http://ideone.com/fDrY8D)


포테이토 피자
(만들어짐)
(팔림)
(먹힘)
갈릭 치킨
(만들어짐)
(팔림)
(먹힘)


음식은 만들어지고 팔리고 먹힌다는 공통속성을 가지고 있다. 

위와같이 "상속"을 통해 기반 클래스의 코드를 재사용하거나, 자식 클래스에서 기반클래스를 바탕으로 클래스를 확장할 수 있다.



728x90