C# 프로퍼티(Property) 를 알아보자!

이번에 알아볼 것은 C#의 Properity입니다.

이것이 무엇인가 전혀 감이 안잡혔는데요.. 새로 추가가 된 기능이었군요;;  

public,private 같은 접근한정자의 한계점을 나름대로 보완한 C#만의 새로운 기능이라고 합니다.
은닉성과 편의성의 두마리 토끼를 잡았다는…

클래스를 만들고 메소드를 만들고.. 해당메소드안에 데이터에 접근하여 값을 가져오거나 값자체를 변경하거나.. 프로그래밍을 하면서 수십수백번도 더 있는 일입니다. 그렇게 하면서 원하는 데이터를 만들고 결과를 도출해 가는게 프로그래밍아니기겠습니까? 하지만.. 그동안 사용해왔었던 손에 익었던 델파이와 비교해보니 좀 햇갈리고 불편한 것 같습니다. 물론 델파이에도 public private이라는 개념이 있긴합니다만 워낙 그런거 잘 안따지고 개발을 하다보니  .. 그렇다는 이야기는 재사용을 잘 안하는 프로그램을 했다는 이야기겠죠 ㅜㅜ  그런 큰 불편함을 모르고 개발을 해 왔던 것 같습니다.

Properity라는것은 기존의 public과 private으로 선언하여 했던것의 번거로움을 덜어주는 기능이라고 말하고있습니다.

기존의 소스를 예를든다면..

이런 식으로해서.. 데이터를 집어넣고 집어넣은 데이터를 출력하였는데..  이것을 Properity를 이용해서 좀 더 간결하고 편리하게 할 수 있다는 것입니다.


c# property


선언을 하는 예를 보겠습니다.

Test라는 클래스를 선언 하였고..   메소드와 흡사합니다.



c# property2


형식은 아래와 같은데.. C#버전이 올라가면서 간결해졌습니다. 주석으로 처리했던것은 옛날에 가능했던 문법이고요.. 물론 사용가능합니다.


c# property3


단지.. 값을 넣고 불러오는 용도로만 사용한다면..  get;set;과같이 표현을 해도 무방하기때문에 간결해 진것 같습니다. 하지만 안에 내용을 좀 변경하거나 수정한다고 하면.. 좀 달라지겠죠?

책속의 예제를 한번 살펴본다면..


c# property4



Age라는 클래스에서 특이한점은.. get에 해당하는 프로퍼티만 있고 set에는 내용이 없습니다. 그렇다는 것은.. 
읽기만 가능한속성을 표현하고자 할때 유용하게 사용이 될 것같습니다.  또한 그냥 입력값을 받아오는거이 아니라 날짜의 형식을 변환해서 받아올때는 이런식으로 하면 된다라는걸 보여주는것 같군요..

그래서 해당하는 구문을 돌려서 확인을 하면.. 아래처럼 원하는 결과값이 잘 나오는것 같습니다.

무언가 한결 간결해진 느낌이 드네요..

C# Property_example


좀 더 간결하게 할 수 있습니다.

이 부분인데요…

           BirthdayInfo birth = new BirthdayInfo();
           birth.Name = "테스트";
           birth.Birthday = new DateTime(2012,11, 5);

이것을 바꿔본다면..

           BirthdayInfo birth = new BirthdayInfo()
           {
              Name = "테스트",
              Birthday = new DateTime(2012,11, 5)
           };

중괄호로 묶어서 객체명을 생략할 수 있습니다.   단 여기서 주의할점은..  세미콜론; → 콤마, 로 구분지어 야 한다는 것입니다. 이것만 주의한다면 좀 쉽게 코딩할 수 있겠습니다.

이상으로 C#의 Property에 대해 알아봤습니다. 감사합니다.








C#, 추상클래스(abstrace class)를 알아보자!


이번시간에 알아볼 것은 C#의 abstract class(추상클래스)입니다.


학창시절에 배웠었던 기억이 잠시 나는 것 같은데요..

책을 통해서 클래스 메소드 인터페이스 등등 C#의 많은 문법들을 배우고 있는 것 같습니다.

추상클래스라는것은..

인터페이스와 비슷한 것인데요   인터페이스가 클래스안에 외형적인 선언과같은 것을 소유했지만… 직접 인스턴스를 만들지 못해서   해당 인터페이스를 참조하는 클래스에 구현적인 기능을 넣었다면.. 이것도 비슷하게.. 해당하는 클래스에 직접 인스턴스(객체)를 생성하지 못하고.. 마찬가지로 클래스를 상속하는 파생클래스를 만들어서 구현하는게 동일합니다.

하지만 이것는 인터페이스와는 다르게.. 클래스안에 메소드나 필드를 만들 수 있습니다. 직접 인스턴스를 만들지 못하는 것은 동일하지만요…

정리하여 표로 나타내보면..



형식
공통점
다른점
인터페이스
직접 인스턴스를 갖지못한다.
*외형적인 형식만 갖을 수 있다(메소드,이벤트,인덱서,프로퍼티 만 존재)
추상클래스
*형식뿐만아니라 안에 내용도 갖을 수 있다 (구현)
*추상메소드를 가질 수 있다.(인터페이스와 같은 역할을 하는 장치-구현을 가지 못하지만.. 파생클래스에서 구현하도록 강제됨!)


어떻게 본다면.. 이것을 이용한다면.. 인터페이스의 기능들을 전부 다 가능하도록 할 수 있겠다는 생각이 듭니다. 하지만 아직 아는게 많지 않아서.. ㅜㅜ

문법은 이렇습니다.



C# abstrace class


클래스이름 앞에  abstract라는 한정자를 붙여서 이게 추상클래스다! 라고 알려주는것이지요..
이것으로 직접 객체를 생성할 수 없다고 하였으니.. 이것을 상속하는 클래스를 만들려면.. 그동안에 배웠던 상속하는 방법과 다르지 않습니다.

C# abstrace class2


별다를게 없는것 같습니다. 근데 클래스관련하여 너무 많은 기능들이 있다 보니 햇갈리기 시작합니다. 이미 예전부터 햇갈리기 시작했습니다 ㅜㅜ

예제를 한번 보겠습니다.


추상클래스 AbstractBase을 만들었고 메소드를 3개 갖고있네요.. 그중 마지막 메소드는..  추상메소드네요
public abstract void AbstractMethodA(); <--이거죠..  인터페이스처럼 상속받은 파생클래스에서 내용을 채워서 무언가 일을 시킬 수 있느거죠..


C# abstrace class3


Derived라는 클래스를 만들었으며 추상클래스를 상속하였고..
메인클래스/메소드에서..  이타입의 AbstractBase에.. 이것을 상속한 메소드타입의 객체를 생성하여 할당하였습니다. 그리고 생성된 객체를 통해서 메소드 2개에 접근하였는데요..

obj.AbstractMethodA(); ←  Derived 클래스에 추상메소드를 선언하여 처리하였네요..


C# abstrace class4


obj.PublicMethodA(); ← 추상클래스 AbstractBase의 메소드PublicMethodA()을 호출하라고 합니다.

       public void PublicMethodA()
       {
           Console.WriteLine("AbstractBase.PublicMethodA()");
       }

그럼 위 두개의 호출이 이루어지게되겠네요..

C# abstrace class Example


실행하게된다면.. 위에서 보이는것 처럼 3개의 결과가 찍히게됩니다.  과연 이렇게 이것을 사용하게되었을 때의 이득이 무엇일까요..? 사용시의 장점이 무엇이길래.. 다들 추상클래스~ 하는지.. 모르겠습니다.  

책의 설명에는..  반강제적인 조항을 만들 수 있기때문이라고 합니다.

이를테면 이런거죠.. 내가 A라는 클래스를 추상으로 만들고 또한 추상 메소드를 mb,mc를 만들었는데 사용하려면.. 파생클래스를 만들어야하며..    mb,mc를 오버라이딩해서 써야겠지만.. 이것을 일일이 설명할 필요가 없다는것입니다.  당연히 그렇게 쓰지 않으면 문법적으로 에러가 나서 컴파일이 안되겠죠..

흐음!! 과연 그런일이 얼마나 일어날지.. 아직은 잘 모르겠네요.. 프로젝트단위가 커진다면.. 모르겠네요^^

아무튼  C#에서의 abstrace class(추상클래스)에 대해 알아봤습니다. 감사합니다.











C#, 여러 인터페이스를 한꺼번에 상속하자!

이번시간에 알아볼 것은 인터페이스의 다중상속입니다.

클래스든.. 인터페이스든 객체지향프로그램에서는 상속이 가능하지만.. 큰 차이점이라면.. 클래스는 하나만 상속이 가능하지만 인터페이스는 여러개를 한꺼번에 상속받을 수 있습니다.

그 이유가 무엇이냐면.. 인터페이스는 외형적인 것 을 물려받기 때문에 문제가 없이 안심하고 사용할 수 있습니다.

아래와같은 인터페이스가 2개가 있는데  FlyingCr이라는 클래스에서  : Irun,Ifly 을 이용해서 2개를 상속받았습니다.




이것은 책에 나와있는 예제를 한번 실행해봤습니다

C#Interface 다중상속




이런표현이 가능하네요..  

그래서 결과적으로..

이렇게 FlyingCr클래스타입의 객체를 생성하여서
Run(), Fly() 메소드를 실행하는것이 가능합니다.   인터페이스2개를 상속하였죠..

또한.. 클래스의 상속에서 사용할 수 있는 연산자가 is와 as가 있었죠?  지난시간에 했었던것인데 기억이 나실련지 모르겠네요..

is의 경우 객체가 해당형식에 해당하는지 검사해서 결과값을  true,false로 반환하는것이고..
as의 경우 참조형식과 비슷하게 되지만.. false 일경우 객체참조를 null로 한다라는거였죠..


아무튼.. as연산자를 이용해서.. 인터페이스에 해당하는 형식이 있으면.. 아래 구분이 정상적으로 실행되겠죠..


아래는 책에 나와있는 예제를 한번 테스트해봤습니다.

메인 클래스에서 보시면.. "----" 을 기준으로 위와 아래에..
Run(),Fly()메소드를 실행하는것을 해봤는데 잘됩니다.

햇갈리고 복잡한데요.. 예제같은것을 많이 테스트해봐서 손에 익혀야 할 것 같습니다.

책으로 봐서는 잘 알겠는데 실제 작성해보라고하면.. 정말 손이 안떨어집니다.^^

이상으로 인터페이스의 다중상속에 대해서 알아봤습니다. 감사합니다.









C# Interface란 무엇인가?

C# Interface란 무엇인가?

어떤사람들은 객체지향 프로그래밍의 꽂은 인터페이스라고하고   중수에서 고수로 넘어가려면 이것을 잘 다뤄야 된다고 이야기를 한다죠.. 저는 뭐 아직 클래스가 뭔지도 제대로 파익이 안되어서 먼 미래의 이야기같네요 하지만 모르고 넘어갈 수는 없기 때문에  C#에서 말하는 인터페이스를 알아 보고자합니다

interface [이름]
{
    메소드..
    이벤트..
    인텍서..
    프로퍼티..
}

이렇게 나와있습니다.   또한 객체를 생성할 수 없다고 합니다;;  그럼 어디다 어떻게 쓰라는 건지..

이것은 인터 페이스를 참조하는 파생클래스를 만들어서 만들어진 클래스로부터 객체를 생성해서 사용은 가능합니다.  뭐.. 상속해서 사용해야하기때문에 이것안에 는 public 으로 선언해줘야 겠죠.. 이런것은 납득이 갑니다.

이거 사용 할려고 클래스를 만들어서 사용 해야 한다니 정말 번거롭네요.. 이게 대체 뭐라고..

interface { .. }     →  new 객체생성 (x)


intefrace Inf_nm {...}  →  class Cls_nm:  Inf_nm { … } →  Cls_nm inf = new Cls_nm( ...)    (O)


Inf_nm inf_nm = new Cls_nm() (O)    ← 지난 시간에 봤었던 것 같네요.. 기반클래스와 파생클래스의 관계처럼..  클래스가 인터 페이스로 상속을 받았으니  이런 식으로 형변환도 가능 하다라는…. 전 아직도 잘 모르겠네요 ㅠㅠ 객체 지향은 어렵습니다.


설명하기를 이것으.... 컴퓨터에 있는 usb 포트와 같다 라고 합니다.  약속이라고 합니다.

usb포트에 선풍기를 꽂으면 선풍기가 돌면서 바람이 나오고.. 메모리를 꽂으면 플래쉬메모리 저장장치로 사용할 수 있으며.. 스마트폰과 컴퓨터를 연결할 수 있고 충전도 할 수 있고..   이런 것들이 모두 가능한 이유는 usb라는 약속을 따랐기 때문인데요 이것을 인터 페이스와 같다고 설명하고 있습니다.

이것을 사용하려면.. 파생클래스를 선언해서 참조하는식으로 객체(인스턴스)를 만들어 사용한다고하는데  중간에 만들어지는 클래스에 각기 다른 기능의 메소드를 구현하여 마치 usb 포트처럼 다른 성격으로 사용할 수 있다고.. 이야기합니다. 그래도 그렇지 저는 잘 모르겠습니다. 과연 저렇게 하면..그게 편한 걸까요?
책에 나와있는 예제를 통해서 한번 이해를 해보도록 하겠습니다. 당체 무슨 이야기인지 햇갈리기만 하네요.
코딩하고 프로그램돌려보고 하니깐 조금.. 그것도 아주조금 의미는 살짝 와 닿는것 같지만 쉽지 않습니다.


C# Interface


위에 소스는 책에나와있는 예제코드를 약간 변형해서.. 퀴즈의 내용에 답하는 코드인데요.. 이번에도 역시 결과는 있지만 정답은 없습니다ㅜㅜ

가독성이 좀 떨어지는데 차근차근 알아가 봐야겠습니다. 제가 이해한내용이니 제가 틀릴수도있죠..

인터페이스라는 것을 선언 하는것은 이렇습니다.

ILoger라는 이름의 interface를 선언했습니다. 근데 안에 내용은 전혀 없네요
선언만 있을 뿐이지 안에 내용이 없는데 USB포트와 같다는 말이 실감이 나네요..  이것 안에 메소드를 어떤 클래스에 상속해서 어떤 형식으로 메소드의 내용을 채울지..? 그것에 따라 하는 역할이 바뀌는 것입니다.

   interface ILogger
   {
       void WriteLog(string message);
   }

그래서 이름도 이렇게 지은 것이 아닌가 하는 생각이 드네요..

Inteface 바로 아래와 아래 아래에 클래스를  만듬과 동시에 상속 받았네요
상속의 관계를 표현할때.. 기원클래스와 파생클래스의 개념처럼  

클래스이름 : 상속하는인터 페이스이름

이런 식의 문법으로 표현했습니다.

그러면서..  Interface 안에 구현해놓았던..  WriteLog(string message) 메소드를 선언하였네요..


C# interface2


ConsoleLogger클래스에는 현재시간과 입력받은 string 타입의 문자열을 콘솔창에찍어주는 일을하는것을 구현했습니다.

그리고 아래에 나와있는 FileLogger클래스는..  using System.IO; 을 해서..  StreamWriter형식을 이용하여 파일을 생성하는것을 구현한 것인데요.. 이건 나중에 배워야할 내용이긴 한데.. 아무튼 이 클래스에서는.. 파일을 생성하는것을 구현하고자 했습니다.

그런데 보시면..
오버로딩 되어있습니다. 클래스와 같은 이름으로해서 string type의 매개변수를 받는 것을 만들어 놨습니다.
지난시간에 배웠던 내용이죠.. 아무튼 정리를 하면서 책을 보니.. 더디긴 하지만 복습도 되고 좋네요

어떤 파일이름으로 저장을 할 것 인지를 구현하기 위해 추가한 것이죠
public FileLogger(string path)
       {
           writer = File.CreateText(path);
           writer.AutoFlush = true;
       }


바로 위에 나와있는 ConsoleLogger클래스에는 예제에는 나와있지는 않았지만.. 한번 똑같이 오버로딩을 구현해봤습니다. 흐린색으로 표시된 거 보이시죠?

책으로 독학으로 공부하려 다보니 물어볼 곳도 마땅치 않고.. 제가 궁금증을 스스로 해결해야 하는데 바로 이런 것들이죠..  실제 이것을 이용해서 접근하는 방법이 문제이긴 한데..  어떤식으로 접근 하는지를 확인도 할겸.. 테스트도하고 이런 것 이라고 생각해주세요..

소스가 꼬여있어서 복잡한데요..
저한테는 꼬부랑글씨 해석 하는 것 보다 좀 더 어렵네요 ㅜㅜ  처음이라 그렇겠죠? 생소해서..

그리고.. 아래는 인터페이스를 참조하지 않은 클래스를 만들었는데.. 여기도 오버로드가 되어있죠.. 이 타입의 매개변수를 받게 말이죠..

상속을 받지는 않았지만..  클래스내부에서 사용할 필드를 선언해서 사용해도 상관이 없나봅니다.

그리고 아래에는 온도를 콘솔창에서 입력받을 수 있는 기능을 하는 메소드를 하나 만들었습니다.

C# interface3



이렇게 구현을 하고  메인메소드에서..  바로위에 만들었었던 ClimateMonitor 타입의 객체에 인터 페이스를 상속받았던 ConsoleLogger(+매개변수) 타입의 객체를 전달해줬네요..

머리아픕니다 이게 무슨소린지;;;

ClimateMonitor클래스를 만들때 오버로딩하면서..인터페이스형태의 매개변수를 받을 수 있게 만들었잖아요?
그래서.. 문법적으로는  문제가 없어 보이는데..

   class MainApp
   {
       static void Main(string[] args)
       {
           ClimateMonitor monitor = new ClimateMonitor( new ConsoleLogger );
                          //new FileLogger("MyLog.txt"));
           monitor.strat();


       }
   }

ConsoleLogger와 FileLogger를 보니까 하나는 매개변수가없고 하나는 있습니다! 네.. 그렇죠.. 클래스생성시 오버로딩을 이용한거죠… 아무튼 이런식 으로 구현을 하였더니..
while문을 돌면서..  
logger.WriteLog("현재 온도: " + temperature);

logger.WriteLog로.. 받은 결과 값을..   ConsoleLogger로  monitor 생성자에게 값을 넘기면..

현재 시간과 입력한 값을 콘솔창에 뿌려주게 되고..

C# interface4

FileLogger("MyLog.txt") 로 값을 넘겨 주게 되면..
MyLog.txt 의 텍스트파일 안에 현재 시간과 입력한 값을 저장하게 됩니다.


C# interface5


정말 별 것 아닌 걸 이것을 이용하여 만들려고 보니 복잡합니다. 몇 번은 더 봐야겠습니다.

제 나름대로의 정리를 하여 내린 결론은  interface란 형식만 있고 결과가 파생 클래스에따라 달라진다! 입니다!   usb 포트가 정답이네요^^;

상황에 따라 다르겠지만.. 다른 케이스에서는 효율적일 수 도 있겠죠.. 지금은 객체 지향도 제대로 파악 못해서 나중에 실력이 늘면 다시 드려다 봐야겠습니다. ^^;  이상으로   C# Interface를 알아봤습니다.감사합니다.