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를 알아봤습니다.감사합니다.







C#의 구조체(Structure) 를 알아보자


C#의 구조체를 알아보겠습니다.

이번에 알아보려고 하는것은  C#에서의 구조체입니다.  프로그래밍언어를 하면서 이것을 사용해 보셨을것 입니다. 저도 자주 사용은 하지 않지만.. 델파이에서 TreeView의 노드의 항목마다의 key값과 안 보이는 데이터들을 마땅히 담을 만한것이 없어서 한번 사용해보긴 했지만.. 잘 사용을 안 하는 것이다 보니.. 잘 안써지게되더라고요

C#에서도 당연히 Structure 라는 것이 있습니다.  클래스와 비슷하죠.. 사촌지간 즘될것입니다.    

비슷하다면… 클래스를 놔두고 이것을 사용해야 하는 이유가 있을까요? 분명.. 클래스와 다른 장점이 있기 때문에 이런 구문이 존재하겠죠..

일단 차이점을 알아보면.. 가장 큰 차이점은..    형식이 틀리다는 것입니다.   클래스는 참조 형식에 해당이 되겠고 이것은  값 형식에 해당이 됩니다.  [뇌자극]책의 초반에 읽었던 내용이 생각이 나는데요..     값 형식의경우 스택에 데이터를 보관하는 구조이며.. 구문이 끝나면 메모리에서 해제가 되기때문에 가비지컬렉터가 필요 없는 것이 특징이고..   참조 형식의 경우 힙영역에 데이터를 넣어 놓고.. 스택에 힙 영역의 번지를 가리키는 주소를 넣어 놓은 구조로.. 바로 메모리 해제가 되지 않는다고 하였거든요..

가장 큰 특징이라고 하겠네요..   한눈에 보기 편하도록 정리를 해 보겠습니다.



구조체(Structure)
클래스(class)
생성시 필요한 키워드
struct 이름 { … }
class 이름 { … }
형식
값 형식
참조형식
생성시필요한구문
선언으로 생성 가능..
new 연산자로 생성해야함
상속 여부
상속
System.Object 형식을상속하는 System.ValueType로 상속받음

이 정도로 정리가 됩니다.

구조체란? 클래스와 비슷한 구조로되어있어.. 안에 필드와 메소드가 존재하지만.... 값형식이어서 메모리관리가 효율적이며..성능이 제법좋다? 정도로 요약할 수 있겠습니다.

값 형식이다보니 메모리관리가 확실 하다보니.. 쓰임새가 있을 것 같죠..?  이것도 안에 필드와 메소드를 소유합니다 .

또한 = 연산자를 통해서 모든 필드를 그대로 복사할 수 있습니다.   클래스를  = 연산자를 이용해서 복사하면.. 참조형식이기 때문에 우리가 흔히 생각하는 복사가 아니어서 엉뚱한 결과를 얻게 되지만 구조체의 복사는 말 그대로 우리가 생각하는 그런 복사입니다.

복사가 되고 나서 값이 변경되면..  이전에 복사한 것에 영향을 안 준다는 것이죠..
또한 생성시에  선언만 한 상태로 생성해서 바로 사용할 수 있습니다. 마치 필드..(변수)를 생성해서 사용하는 것처럼요..


MyStructure a;   ← 이렇게 말이죠..

new연산자를 이용해서도 생성할 수 있습니다.
MyStructure a = new Mystructure();

이런 특징들이 있네요.. 제법 쓸모가 있을 것 같은데 예제를 한번 돌려서 감을 익혀야겠습니다.

C# Structure_Example


structure의 특징들을 한꺼번에 담기 위해서 만든 예제인 것 같은데요..  아직 C#을 잘 익히지 못해서..  모든 구조체가 System.Object형식을 상속하는 System.ValueType로 상속을 받는다고 하여..   위의 예제에는 ToString() 메소드에 오버라이딩을 하는 것을 보여줬는데요.. 잘 모르겠네요.. ㅜㅜ;;;

또한 = 연산자를 이용해서..  p3d3 = p3d2 로  복사를 하였고 복사 후  p3d2 .Z에 값을 변경하였는데   p3d3.Z에는 값의 변화가 없었네요..  하나하나 알아간다는 것은 좋은 일인데..

연습하고 테스트해보고 실제 적용해보지 않으면 금방 까먹어 버리니..ㅎㅎ 어서 책을 다 훑어보고 2~3 번정도 다시 정독해야 할 것 같네요.  그리고 바로 프로그래밍들어가야 겠습니다.








C#에서의 오버라이딩과 다형성 ( Overriding and polymorphism )




이번에 알아보려고 하는 것은 C#의 Overriding(오버라이딩)과 (polymorphism)다형성입니다.

학교 다닐때 배웠던 내용이 언 듯 기억이 나기도 하고 가물가물하네요..

오버로딩(Overloading)과 오버라이딩(Overriding)이 라는 말이 햇갈리네요..

정리하자면.. 오버로딩은 메소드에서 지난번에 포스팅했듯이.. 같은 이름으로 매개변수의 갯수나 타입 등으로 전혀 다른 마치 동명이인과 같은 일을 하는 것을 만들 수 있 다는 것이라고 했었죠…

Overriding은 클래스의 상속관계에서 사용하는 개념으로 전혀 다른 의미로 재정의 한다 라는 뜻입니다. 이번 시간에 알아보고자 하는 것이고요..

다형성이라는 개념과 같이 짝을 이루어서 다니죠..  다형성은.. 객체가 여러가지 형태를 가질 수 있다는 말입니다..  줄여서 표현한 것 같네요..

객체가 다형성을 갖기 위해서 오버라이딩을 이용 한다는 것인데요..  

객체는 재정의을 해서 다양한 형태를 갖을 수 있다… 라고 설명을 할 수 있겠습니다.

근데 말이 너무 어렵네요..;;

아래 표를 본다면.. MainBase라는 클래스가있는데 virtual이라는 약속된 문자를 사용하여  Overriding할 수 있게 하였습니다.

그리고  바로 아래에 보면.. Test1 : MainBase 이렇게 지정하여 해당클래스가 : [클론]뒤에 나오는 클래스를 상속한다고 지정하였으며..  해당클래스가 포함하는 메소드의 앞부분에

override 라는 키워드를 사용하여 오버라이딩한다는것을 표현했습니다.

C# Overriding



제가 이해한것을 한마디로 표현하자면 재정의와 다형성이라는 것은 기존의 클래스로부터 물려받은 자료에 내가 필요한 내용을 덧붙여 새로운 성격의  메소드를 만드는 것이라고 하겠습니다.


이것은... virtual로 상속받은 메소드를 덧붙여 내스타일로 메소드를 재정의 하는것이 죠..



추가되는 내용에 따라 성격이 달라질 수 있기 때문에 다형성이라는 말이 어울리겠네요..

아래는 overriding에 대한 예제입니다.

C# Overriding Example


MainBase클래스의 Mb01()이라는 메소드를 virtual키워드를 이용하여 재정의 할 수 있게 하였고 하단의 클래스들에 override라는 한정자를 지정하여 구현하여 봤습니다.


또한.. 이것을 봉인하고 싶다고 한다면..

sealed라는 한정자를 두면 됩니다.

class Base
{
    public virtual void Test()
    {
            ..
    }
}

class Sub : Base2
{
    public sealed void Test()
    {
      ...
    }
}


Base2를 재정의 하려고 하는 클래스가 있다면.. 에러를 뿌려주게 됩니다.

위의 소스까지는 상속이 되겠죠.. 아래에 Base2를 상속 하려고 하는 것이 안되는 것입니다.



아직 100%감이 안 잡혀서.. 좀 연구하고 테스트도 더 해 봐야겠습니다.

이상으로 C#에서의 오버라이딩과 다형성에 대해 알아봤습니다.









C#에서 클래스( Class ) 란 무엇인가?


안녕하세요 C# 프로그램의 클래스에 대해 알아보고자 합니다. 그동안에는 크게 어려운 내용이 없어서 그냥 술술 책을 넘겨왔었는데..

객체 지향프로그램 그것도   java나  C#같은 언어에서 클래스를 잘 이해하지 못한다면 프로그램을 아예 짤 수 없을 지경이 되는 것이죠..

저는 그동안에 델파이를 갖고 개발을 해왔었는데 델파이도 물론 객체 지향 언어는 맞습니다.

하지만 그런 특징적인 것들을 잘 모른 체 그동안 수년간 개발을 해 왔습니다.  ㅜㅜ 이번을 기회로 해서 정말 열심히 기초를 다지는 기회가 되었으면 좋겠습니다.

진행에 앞서.. 용어가 너무 햇 갈려서 정리를 해야 할 것 같습니다. 말을 하나로 통일을 하던가 해야지 햇갈리기만 하네요..ㅜㅜ 용어를 완벽하게 이해 못하고 진행하면.. 객체 지향 프로그램은 소귀에 경읽기 될 것 같습니다.

(혹시 라도 잘못된 것이 있다면 지적해주세요.. 뇌자극C#책을 기반으로 나름대로 정리하긴 했습니다만...)

C# 객체지향



학교다닐때 붕어빵과 붕어빵틀이라는 것을 비유를 해서 배웠던 기억이 나는데요.. 뇌자극 C# 5.0에서도 역시나 아니나 다를까 같은 표현을 쓰셨네요..

클래스 = 붕어빵틀
객체    = 붕어빵 (인스턴스)


형 틀을 이용해서 찍어 내는 것이죠.. 그래서 효율 적인 프로그래밍을 하는 것이 가능합니다.

그래서.. 클래스를 하나 생성해 놓고.. 이것을 해당하는 클래스 타입으로 선언해서 쓰시면 됩니다. 찍어서 쓰는 것이죠..(객체를 생성한다고 합니다...)

class Apple
{
  public string Color;
  public string Size;
}

......

App a1 = new Apple();        -->  a1 이라는 Apple 타입의 객체를 생성 하였습니다.
a1.Color = "red";
a1.Size   = "10";

ConsolWritLine("{0} , {1}", a1.Color , a1.Size );


위처럼 진행을 하면..

결과가 Red , 10 이라는 것이 찍히겠죠....

위와 같이 Apple이라는 클래스를 갖고 객체를 생성하려고 할 때..  new Apple() 이런식으로 코딩을 하였는데  Apple() 이런 표현이되는 것을 생성자라고 합니다. 특별한 메소드라고 하네요..    


C# Class Example1




위의 예제는 뇌자극C# 5.0에 나와있는 예제를 한번 코딩하여서 돌려봤습니다.

Cat이라는 클래스를 만들어놨는데..  new Cat() 을 이용하여.. 객체를 만들어서 값을 넣어봤거든요..
kitty와 nero라는 객체를 만들어서 값이 잘 찍히는 지 확인하는 예제입니다.

이것의 기본구조네요.. 여기 까지는 그럭저럭 잘 이해가 됩니다.

static(정적) 필드와 메소드에 대한 이야기가 나오네요..

static는 프로그램에서 정적이다 라고 표현을 하는데요..
C#에서는 그리고 Class안에 선언이된 정적 필드의 경우 접근하는 방법이 달라집니다. 말이좀 어려운 것 같습니다.

예를 들어..   아래처럼 class A 안에 public으로 선언이 된 필드 a1,a2가 있는데 이것에 접근하려면.. 객체를 생성해서 접근을 해야 하지만..

class A
{
  public int a1;
  public int a2;
}
class MainApp
{
       static void Main(string[] args)
       {
A sub = new A();
sub.a1 = 10;
sub.a2 = 20;
        }
     ........
}


아래 화면과 같이 static 이라는 것을 붙여 정적으로 한정 시켜 주면....  객체를 생성하지 않아도 해당 클래스의 필드(변수)에 접근이 가능 하다는 거죠..
아직은 초반이라 이런 것이 되는구나.. 정도만 알 것 같은 데요.. 전역 변수와 같이 써먹을 수 있을 것 같기도 하고요..

class A
{
  public static int a1;
  public static int a2;
}
class MainApp
{
       static void Main(string[] args)
       {
A.a1 = 10;
A.a2 = 20;
        }
     ........
}


정적 메소드역시 마찬가지 일 거라 생각이 듭니다.
그래서 객체를 생성하지 않아도 접근할 수 있는 메소드라고 생각이 드네요..

class A
{
   public static void A00()
   {
       // ....
   }
}

......

A.A00();    <--이런식으로   (인스턴스)를 만들지 않고 접근이 가능합니다.


아래는 정적 필드를 선언하여서 카운트가 어떻게 올라 가는지 확인하는 프로그램입니다.
Global이라는 Class안에..  static 으로 Count필드를 선언 하였고 초기화 하였는 데요..

static이기 때문에 객체를 생성하지 않고 바로 필드로 접근하는 식으로 이것안에 메소드를 만들었습니다.

그리고 main클래스 안에서 Count를 위해 new class() 이렇게 생성하며 접근 하였습니다.

결과적으로 4번 호출하였기 때문에 아래와 같이 4라는 count가 찍히게 되었네요..


C# Class Example static




일단 이정도로 정리하고 이어서 가야겠습니다. 아직도 class에 대한 내용이 많네요 감사합니다.