'프로그래밍/C#'에 해당되는 글 12

  1. 2007.12.23 추상클래스
  2. 2007.12.09 오버라이드 & base
  3. 2007.11.26 열거형(enum)
  4. 2007.11.26 구조체
  5. 2007.11.26 this
  6. 2007.11.25 Using 구문
  7. 2007.11.25 내포 클래스(Nested Class)
  8. 2007.11.25 정적 변수 및 메서드(static)
  9. 2007.11.25 접근제한자
  10. 2007.11.21 C# 클래스~1

추상클래스

2007.12.23 14:26 | Posted by 로멘틱가이
추상클래스와 추상매서드

추상화
추상클래스와 추상매서드에 대해 알아보기 전에 우리는 추상화란 무엇인가에 대한
답을 생각해보아야한다.

추상의 단어 뜻은 네이버 사전에 다음과 같이 나와있다.

예를 들면, 인간의 얼굴만을 표상()으로서 분리하는 것은 대상과 동차원상()의 절단()이며 본래의 추상이라고는 할 수 없다. 빨간 넥타이로부터 ‘빨강’ 혹은 ‘형()’만을 추출()하는 것, 또 빨간 우체통, 잘 익은 토마토 등에서 공통적인 ‘빨강’을 골라내고, 적() ·청() ·황()으로부터 ‘색()’을 빼내는 것은 추상이다.

추상은 불필요한 계기를 버리는 사상()을 표리일체()로 동반한다. 추상에는 보편성 ·일반성의 정도가 있고, 고도()의 추상은 언어작용과 밀접히 관계하여 보통명사나 명제()의 형성, 유형화(), 이론구성의 전제()가 되어, 일상적() ·학문적 활동에 불가결한 작용이다.

왠지 더 어렵다...-.-
결국 추상이란 어떤 여러개의 객체로부터 공통된 것을 빼내는 작업이다.
단 우리가 생각하는 추상이란 이미지는 뭔가 자세하지 않은 모호한 것을 의미한다.

이런 의미로 볼때 C#에서의 추상화는 위의 내용을 담고 있다.
1) 공통된 것을 빼낸다.
2) 자세하지 않은 모호한 것을 의미한다.

이 두가지의 의미를 가진 것이 추상화다.
추상화는 C#에서 클래스와 메서드로 표현한다. 여기서 중요한 것은 클래스에 메서드가
한개 이상 포함하고 있다는 것이다.
즉 추상화 클래스에는 반드시 메서드가 한개가 존재해야한다는 점이다.
그리고 추상화는 모호한 것을 의미하므로 자체에서 메서드에 대한 정의가 이루어지면 안된다.
즉 선언부만 추상화 클래스에는 존재해야한다는 의미다.

다음 예시를 보자.
abstract class Computer
{
       public abstract void CPU();
}

class IBM : Computer
{
       public override void Engine()
       {
            -----실제 구현부가 위치하는 곳
       }
}

자바의 경우 추상화 클래스를 상속받는 곳에 해당 함수명만 쓰면 되지만
C#의 경우 오버라이드 되는 함수에 override라고 기술을 해주어야한다.

일반 클래스와 추상화 클래스를 구분짓는 키워드는 위에서 보듯이 abstract이며
이것은 추상화 클래스 내부의 모든 메서드에서 abstract 키워드가 사용되어져야 한다는 것을
의미한다.

오버라이드 & base

2007.12.09 15:49 | Posted by 로멘틱가이

오버라이드 & base

오버라이드란?
사전에서 오버라이드를 찾아보면 덮어쓰기!!
즉 기존 것의 데이터를 새로운 데이터로 덮어쓰는 개념입니다.

부모 클래스
      .
      .                상속관계
      .
자식 클래스

위와 같은 상속관계의 경우 부모클래스의 변수와 함수를
자식이 재정의 하여 사용할 수 있다.

이런 경우 자식클래스에서 부모클래스를 오버라이드 한다고 한다.
그러면 c#에서는 과연 오버라이드를 어떤 방식으로 할 것인가!

 변수 : public new int x = 0;
함수 : public new void TEST(int a)

이와 같이 new라는 키워드를 사용하면 기존 변수와 함수를 오버라이드 하게 된다.

ex)
class Base
{
     public int x = 10
     public void  SetData(int i)
     {
      }
 }

class Derived : Base
{
     public new int x = 100;
     public new void SetData(int i)
     {
     }
 }

여기서 중요한 점은 기존 것을 덮어쓰는 거기 때문에 함수의 경우
반환값과 매개변수의 수가 똑같아야 한다는 점이다.

base변수

그럼 여기서 우리는 하나의 의문을 접하게 된다.
만약 상속 받은 클래스에서 부모 클래스의 변수를 사용하고 싶을때는 어떻게 하는가!

여기서 사용하는 base 키워드이다.

위의 예시에서 Derived 클래스에서 x라는 변수를 사용하면 100을 출력한다.
하지만 base.x라는 변수를 사용하면 10을 출력한다.

즉 base를 사용하면 부모 클래스를 사용하게 되는 것이다.
여기서 base는 해당 클래스의 생성자를 수행하고 부모 클래스의 생성자를 수행하라는 의미이다.

class Derived : Base
{
     public Derived() : base()
     {
     }
}

위와같은 선언은 Base 클래스의 생성자를 수행한 후
Derived 클래스의 생성자를 사용하라는 의미이다.

자식 클래스 사용 시 부모 클래스의 생성자를 호출하고 싶은 경우
위와 같이 사용하면 된다.

열거형(enum)

2007.11.26 23:13 | Posted by 로멘틱가이

열거형

열거형을 알기 위해서는 상수의 개념에 대해 알아야한다.

우리는 학교를 다니면서 상수와 변수의 개념을 배웠다.
상수란 변하지 않는 수를 의미하며 변수는 값을 바꿀 수 있는 것을 의미한다.

여기서 열거형은 상수의 집합을 의미한다.

일반적으로 우리가 상수를 선언할때 상수 하나의 고유한 값을 의미할 경우도 있지만
어느 경우에는 상수 집합이 사용되기도 한다.

이럴때 우리는 열거형을 사용한다.

예를들어 우리가 색을 표현할때 3가지 색에 대해 값을 고정해둔다고 생각해보자.
Red = 1 Yellow = 2 Blue = 3

이럴 경우 우리는 열거형으로 색이라는 그룹에 위의 3값을 상수로 넣을수 있는 것이다.
열거형의 형식은 다음과 같다.
enum 열거형이름 {열거형 리스트};

그럼 위의 예를 열거형으로 표현해보자.
enum Color {Red = 1, Yellow = 2, Blue = 3};

위와같이 된다.

열거형은 우리가 상수를 그룹질때 사용한다고 생각할때 사용하면 된다.

구조체

2007.11.26 22:52 | Posted by 로멘틱가이

구조체(Struct)

구조체는 C나 자바에 나오는 구조체와 동일하다.
구조체를 사용하는 이유는 무엇일까?

나는 일종의 그룹핑이라고 생각한다.
우리는 일례로 클래스에대해 알아볼때 의미의 그룹핑으로 클래스를 나눈다는 것을 배웠다.

구조체는 클래스와 동일하다.
다만 복잡하게 사용되지 않는 변수들의 집합에 사용하는 것이 구조체 이다.

만일 몇가지의 변수만을 사용하는 경우 클래스를 사용하면
자원의 낭비라고 할 수 있다.

C#에서는 작은 데이터(몇가지의 변수)를 처리할 때 사용되어진다.

그럼 C#에서의 구조체 구문을 알아보자.
[public] struct [구조체명]
{
     생성자
     멤버변수
     멤버메소드
}

구문만을 살펴보면 클래스와 동일하다고 할 수 있다.
다만 위에 설명한대로 복잡한 로직이 아닌 몇가지의 간단한 로직을 빠르게 처리할 때
사용하면 된다.

클래스 vs 구조체
참조형식 vs 값형식
new 인스턴스 vs new를 사용하지 않고 인스턴스
힙 참조영역 vs 스택 값영역

생성자
디폴트 생성자를 명시적으로 선언하면 안된다.
다만 오버로딩은 가능하다.

this

2007.11.26 00:01 | Posted by 로멘틱가이
this

1.자신의 멤버
자신의 멤버 변수의 값을 설정할때 사용

예를 들어
public Data(int A, int B)
{
     this.A = A;
     this.B = B;
}

와 같이 사용하면 Data라는 멤버함수를 포함하는 클래스를 호출하여 사용할때
클래스 자체의 멤버 변수에 Data의 매개변수로 들어가있는 A, B 변수의 값이 저장되어 진다.

2. 클래스 반환
클래스 반환의 의미는 만일 어떤 함수의 반환값이 클래스인 경우 해당 클래스를 반환하는데
현재 선언된 객체를 반환할 수 있다.

예를 들어 DataClass라는 클래스를 반환하는 Data라는 함수를 예를 들자
public DataClass Data()
{
     return this;
}
이런 경우Data는 DataClass의 현재 객체를 반환하게 된다.

3. 생성자를 호출
public 생성자() : this(1)

과 같이 선언하는 의미는 무엇일까?
우리가 생성자를 선언할때 매개변수가 없는 생성자를 실행시키면
매개변수가 있는 오버로드된 생성자들이 자동으로 실행되기를 원한다고 해보자.
그럴 경우 위와 같이 생성하면
생성자는 매개변수가 없는 생성자 -> int형 생성자를 소환하게 된다.

이와같이 this는 클래스 자체를 의미한다.
여기서 조심할 것은 this가 선언된 클래스가 아니라 객체화된 클래스라는 점이다.
즉 메모리 할당이 되어진 객체를 의미하는 것이라는 것을 헷갈리지 말아야한다.

참고로 필자는 해당 내용이 헷갈려서.-.- 몇주를 헤맨 적이 있다..^^;;

Using 구문

2007.11.25 23:46 | Posted by 로멘틱가이
using 문
1. 지시자

네임스페이스 지정
즉, C의 include 자바의 import와 같은 개념이다.
물론 Visual basic에도 동일한 개념이 있다.

미리 어떤 구문을 선언하여 해당 구문을 반복 사용하지 않기 위함이다.
예를 들어 우리가 자주 쓰는 다음 문구를 보자.
Console.WriteLine 의 경우 원래는 System 밑의 Console이라는 클래스의 함수를 의미한다.

하지만 우리가 처음에 using System을 사용하여 앞으로 System을 기본으로 사용하겠다는 것을
정의하였기 때문에 생략한 것이다.

만일 using 을 사용하지 않으면 다음과 같이 될 것이다.
System.Console.WriteLine이 될 것이다.

2. 명령문
명령문은 다음과 같은 구조로 되어있다.
using(객체 선언)
{
}

명령문이라고 하지만 내가 이해하기로는
일종의 부분 객체선언 같다.

해당 using을 사용하는 구간에서만 해당 객체를 사용하겠다고 하는 의미와 동일하다고 생각한다.

예를들면 다음과 같다.
using(Data dd = new Data())
{
     dd.변수 = 1;
     dd.변수1 = 2;
}
위의 경우 dd(즉 Data라는 클래스)의 변수 와 변수1에 값을 넣게다는 의미가 되며
그것은 using의 구문이 끝나는 곳에서 객체의 메모리는 제거되어진다.

내포 클래스(Nested Class)

2007.11.25 03:26 | Posted by 로멘틱가이
내포 클래스(Nested Class)

class A
{
     class B
     {
          class C
          {
          }
     }
}

이런 경우 위의 것을 객체화 시키면
A a = new A();
A.B b = new A.B();
A.B.C c = new A.B.C();

이렇게 클래스 안의 클래스를 객체화 시킬 수 있다.

정적 변수 및 메서드(static)

2007.11.25 00:44 | Posted by 로멘틱가이

정적 변수 및 메서드(static)

정적이란 메모리 힙 영역에 데이터가 저장된다 라고 책에는 나와있다.

그렇다면 메모리 힙 영역은 무엇인가?
메모리 힙에 대해 알아보자.

프로그램을 사용할 수 있는 자유 메모리. 프로그램 실행 시에 함수로 보내는 데이터 등을 일시적으로 보관해 두는 소량의 메모리와 필요시 언제나 사용할 수 있는 대량의 메모리가 있다. 이때, 소량의 메모리를 ‘스택’이라 하고 대량의 메모리를 ‘힙’이라 한다. 이 ‘힙’이 없어지면 메모리 부족으로 ‘이상 종료’하게 된다.
[출처 : 네이버 백과사전]

위의 정의를 살펴보자.
스택 - 소량의 메모리
힙 - 대량의 메모리
라고 간단하게 설명되어 있다.

딴 글들을 읽어보고 이해한 내용은 다음과 같다.
즉 자동으로 할당해주는 변수의 경우(즉 컴파일러가 할당해주는 영역)
스택 메모리에 생성되고
c에서의 malloc과 같이 강제로 세팅해주는 영역은 heap메모리에 저장되어 진다고 쓰여있다.

C#에는 malloc과 포인터가 없기 때문에 static만이 유일한 heap메모리 저장공간인 셈이다.
heap에 저장된 내용은 전역변수와 같이 사용되어 진다.(프로그램에서 유일한 값)
즉 사용시 클래스명.변수, 클래스명.함수로 사용되어진다.

static의 경우 인스턴스 생성 없이 어디서건 사용가능함으로 객체 생성이 필요없다.

ps. heap은 메모리 아래서부터 stack은 위에서부터 쌓인다.


접근제한자

2007.11.25 00:19 | Posted by 로멘틱가이

접근제한자

public - 어디서나 사용이 가능함
private - private 를 포함한 클래스 내에서만 접근 가능
protected - 기본클래스와 파생 클래스에서만 접근가능
                 (즉 상속받은 클래스와 본인 클래스에서만 가능)
internal - 동일 어셈블리 내에서 접근 가능(즉 동일 프로그램 내에서만 사용가능)
protected internal - 동일 프로그램 내에서 혹은 파생 클래스에서 클래스 멤버 사용 가능

1번 프로그램
class class1
{
     public a;

     private b;

     protected c;

     internal d;
}

class class2 : class1
{

// 설정1
}

2번 프로그램
class class3
{
//설정2
}

위와 같은 경우
설정1에서는 a,c,d가 접근 가능하다.
private는 자기자신의 class에서만 가능하기 때문이다.

설정2에서는 a,c가 접근가능하다.
internal의 경우 같은 프로그램에서만 가능하기 때문이다.

접근제한자의 범위에 대해 잘알아두어야한다.

C# 클래스~1

2007.11.21 20:59 | Posted by 로멘틱가이
1. Class란 무엇인가~?

객체지향언어를 공부하면 많이 접하는 두개의 용어가 있다.
Class와 객체가 그것이다.
그럼 Class는 무엇인가?~ 그것에 대해 알아보자.

- Class : 책에는 객체의 개념을 담고 있는 최소 단위라고 나와있다.
             이 말이 무엇인가? 고민고민을 한 후 내가 내린 결론은 의미의 범위라고 결론지었다.
             의미의 범위란 단어는 무엇인가~ 즉 우리 일상생활의 의미를 가지는 단어들을 범위짓는다
             라는 것이다.
             예를 들어보자 우리가 사람이라는 클래스가 필요해서 만들수 있지만 어떤 프로그램에서는
             그것 보다 포괄적인 의미인 동물이라는 클래스가 필요할 수도 있다.
             즉 어떤 의미를 발견하고 그것에 대해 범위를 지어 단어를 추출하면 그것이 Class인
             것이다.
- 객체 : 객체는 간단한게 Class에 메모리를 할당한 것이다.
            즉 그림에 스케치를 한 것에 물감칠을 한것이라고 생각한다.
            클래스는 다음과 같이 객체 정보를 메모리에 할당한다.

            클래스명 변수:
            변수 = new 클래스명();
            or
            클래스명 변수 = new 클래스명();


            가독성 및 타자치기 귀차니즘으로 인해 밑에것을 애용한다.;

2. Class의 구성요소

- 메소드 : 일종의 실행부다. 글에서 보면 행동을 나타내는 동사의 역할을 한다.
- 변수 : 속성이다. 글에서 보면 이런 저런 속성을 의미한다.

일반적으로 메소드는 public으로 선언하며 변수는 private으로 선언한다.
왜냐! 보안적인 문제로 직접 변수를 수정할 수 없게하기 위해서다.
그래서 일반적인 자바와 같은 언어에서는 get set 함수가 존재한다.
즉 변수의 값을 수정하거나 가져오는데 public함수를 통해서만 접근할 수 있게 하는 것이다.
그런데 C#은 이걸 막노동이라 생각했는지 다음과 같은 기능이 추가되었다.

public [데이터타입] [속성이름]
{
            get
            {
                        return [값];
            }

            set
            {
                        data = [값];
            }
}


MS의 막노동을 줄여주는 방법 같지만....머 기존 방법과 그렇게 틀린점은 모르겠다..^^;

그럼 다음 장에서 Class의 구성요소에 대해 계속 알아보도록 하자.
이전 1 2 다음

티스토리 툴바