'닷넷 프로그램'에 해당되는 글 4건

  1. 2013.10.16 chapter 7
  2. 2013.10.11 chapter 6
  3. 2013.09.30 chapter 5
  4. 2013.09.30 1~4 chapter
posted by 준치 2013. 10. 16. 09:43

 

1 상속

1.1 상속

상속의 기본적인 이점은 기반클래스의 코드 재사용

객체 지향의 주용 특성 하나인 상속(Inheritance) 이미 만들어진 클래스의 멤버들을 물려받아

새로운 클래스를 정의하는 기법이다.

 

기존에 존재하는 클래스(Base Class) , 상속에 의해 새로 만들어진 클래스를 파생 클래스(Derived Class)

슈퍼 클래스 , 서브 클래스 라고도 하고 부모 클래스 , 자식 클래스 라고도 한다.

 

형식

지정자 class 이름 :  기반클래스 , 인터페이스

{

// 멤버 목록

}

 

:base 기반클래스를 의미한다.

:base에서 인수에 맞는 생성자를 호출하지만 없을 경우에는 기본 생성자를 호출하는데

기본 생성자가 없을 경우에는 에러 발생한다.

 

1.2 포함

상속이 코드를 재사용하는 유일한 방법은 아니며 포함 관계라는 것도 있다.

 

상속은 is a 관계 , 포함은 has a 관계를 표현

 

가장 차이점은 다형성의 발휘 여부이다.

상속은 클래스의 계층을 형성함으로써 다형성의 이점이 있지만

포함은 코드를 재사용하는 정도의 기능밖에 없다.

 

1.3 상속의 원칙

 

모든 클래스는 반드시 하나의 기반 클래스를 가질 있다.

 

Class Human : object { … }

 

기본적으로 object 상속받는다.

 

인라인화

 

1.4 안전한 변환

 

암시적,명시적 변환 관계가 상속 계층의 클래스끼리도 허용된다.

자식 타입의 객체는 별다른 지정이 없더라도 부모 타입으로 암시적 변환된다.

 

부모 타입의 변수는 자식 객체를 가리킬 있다!

 

최상위 부모 타입을 자식들을 대표하는 대포타입 이라고 한다.

 

is  연산자 타입을 점검

as 연산자 타입을 점검한 후에 변환까지 수행 - 결과가 null 인지 점검

typeof 연산자 변수의 타입을 표현하는 Type 또는 파생 객체를 리턴

 

실행 중에 타입에 대한 상세한 정보를 조사하는 기능을 리플렉션 이라 하는데 이런 기능이 있기 때문에

is , as , typeof 같은 연산자를 있는 것이다.

 

d = i as double 에러 발생 - as 좌변 객체가  우변 타입으로 바뀔 없을 null 리턴, 타입은 null 라는 것이

적용되지 않는다. 그래서 as 연산자는 반드시 참조형 이어야 한다. d = (double)i; 식으로 캐스트

 

2 재정의

2.1 멤버 숨기기

 

부모 클래스에서 사용된 메소드,프로퍼티,인덱서,연사자 동일한 명으로도 사용 있다.

하지만 경고가 뜬다. 진짜 그게 맞냐고?! 제대로 사용하려면 new 사용해서 쓴다.

 

public new void method(){ ….. }

 

2.2 메서드 재정의

재정의 대상은 메서드, 프로퍼티, 인덱스 같은 함수형 멤버들 모두 포함

 

Virtual - 부모 클래스의 함수 앞에 붙이며 자식 클래스에 의해 재정의될 있다는 뜻이다.

가상 함수라고도 불렀기 때문에 virtual 키워드 사용

재정의 가능한(override)이라고 이해하는 것이 직관적이다.

 

Override - 자식 클래스의 함수 앞에 붙이며 부모로부터 상속받은 함수와는 다르게 구현한다는

재정의되는 함수는 부모의 함수와 이름은 물론이고 시그니처도 일치해야 한다.

Base 키워드로 부모의 원래 함수를 호출 있다.

 

Virtual 선언 함수에서만 override 사용한다.

 

어떤 메서드를 호출할 것인가가 컴파일 결정되는 것이 아니라 실행 중에 결정된다.

가상 메서드 호출을 동적 결합이라고 한다.

 

2.3 다형성

클래스 타입의 변수는 정확하게 일치하는 객체뿐만 아니라 파생 클래스 타입의 객체까지도 가리킬 있다.

그리고 가상 메서드는 호출 객체의 실제 타입에 따라 선택되며 파생 클래스는 기반 클래스와는 다르게

메서드를 재정의 있다.

 

3 추상 클래스

3.1 추상 클래스

 

구현 코드를 가지지 않는 메서드도 있는데 이런 메서드를 추상 메서드 라고 한다.

 

public abstract int MoMo(int a, double b);

 

상위 클래스에서 파생 클래스를 위해 메서드 시그니처만 정의해 놓고자 추상 메서드가 사용된다.

파생 클래스에서 재정의해야만 호출 가능한 메서드가 된다.

파생 클래스에서 반드시 재정의해야 하므로 virtual 붙이지 않아도 자동으로 가상이다.

인스턴스를 생성할 없는 클래스이다.

클래스 선언문에 abstract 지정자를 붙이면 클래스는 추상 클래스가 된다.

 

내가 느낀 !

추상 클래스에 추상 메서드를 생성하면 파생클래스에서는 추상 메서드를 모조건 사용 - 추상멤버 사용 오류

추상 클래스에서 파생 클래스도 추상 클래스일 경우에는 추상 메서드를 사용 해도

 

*재정의 강제성*

 

3.2 봉인 클래스

지정자 sealed 메서드 앞에 붙이면 메서드는 봉인되며 이상 재정의할 없다.

최상위 부모 클래스에서는 키워드를 사용할 없다.

 

3.3 정적 클래스

생성자는 사용자에 의해서 호출되는 것이 아니라 컴파일러에 의해 자동으로 호출되므로 액세스 지정자는

통상 public이다.

특수한 경우에는 private , protected 수도 있다.

 

정적 클래스는 static 붙여서 클래스를 만든다.

생성자를 만들 없다.

정적 클래스는 멤버도 정적으로 생성해야 한다.

 

대표적인 클래스는 Convert 클래스다.

posted by 준치 2013. 10. 11. 16:36

함수형 멤버 

1.1 메서드 정의

함수는 클래스에 소속

전역 함수는 존재할수 없으며 모든 함수는 클래스의 멤버로만 존재

 

형식

지정자 리턴타입 이름(인수 목록){

//본체

}

 

함수의 이름은 통상 구체적인 동작을 상징하는 짧은 동사와 목적어의 조합

ref , out 키워드로 참조나 출력용 인수로 전달할 수동 있다.

리턴 타입은 실행을 마치고 호출 원으로 결과를 보고할 넘기는 값의 타입

 

C언어 - 함수 , 파스칼 - 프로시저 , 베이직 - 서브루틴

 

1.2 메서드 오버로딩

메서드는 이름으로 구분되는데 이름이 같더라도 인수목록이 다르면 여러 개의 메서드를 정의 있다.

기능을 오버로딩(overloading) 이라 한다.

 

인수의 개수나 타입에 대한 정보를 시그니처(Signature) 한다.

 

2.1 프로퍼티

클래스의 이런 기능을 정보 은폐라고 하며 과거부터 많이 사용해왔던 방법

필드 하나당 개의 메서드를 일일이 만든다는 것은 비효율적 이다.

그래서 get/set 사용 한다.

 

형식

지정자 타입 이름

{

Get{ return ;}

Set{ 변경;}

}

 

{}안에 get,set 접근자(accessor) 블록을 추가로 가진다는 점이 다르다.

Value 라는 이름의 암시적 인수로 set 접근자에게 전달

Static 붙여 모든 객체가 공유하는 정적 프로퍼티로 선언 가능

 

2.2 프로퍼티의 장점

속도 , 코드 줄임

 

2.3 인덱서

객체를 마치 배열인 것처럼 사용할 있도록 하는 특별한 메서드

 

형식

지정자 타입 this[인수]

{

Get{ return ;}

Set{ 변경;}

}

 

이름이 this 고정되어있다.

 

3.1 연산자 오버로딩

3.2 연산자 오버로딩의

설명이 애매 하므로 소스

 

TimePlus A = new TimePlus(1, 1, 1);

TimePlus B = new TimePlus(2, 2, 2);

TimePlus C;

C = A + B;

C.OutTime();

 

public static TimePlus operator +(TimePlus A, TimePlus B)

{

//루틴

}

 

객체와 객체를 + 하는 연산이 일어났는데 이때 오버로딩 되어

public static TimePlus operator +(TimePlus A, TimePlus B) 실행된다.

+ - ++ 모두 구현 가능하며 인수를 다르게 하여 오버로딩 있다.

 

3.3 캐스트 연산자

연산자 오버로딩이란 사용자가 정의한 클래스의 연산 방법을 사용자가 직접 지정함으로써 객체를

대상으로 연산 있는 기능.

 

형식

public static implicit(explicit) operator 변환대상(인수)

 

단항 연산자 이므로 인수도 반드시 하나여야 한다.

변환 방식을 지정하는 키워드가 오는데 implicit(암시적) , explicit(명시적) 하나 선택

암시적 변환 - 캐스팅을 하지 않더라도 컴파일러가 알아서 변환하는 것을 허가하는 연산

                 - 변환에 의한 손실이 전혀 없을 사용

명시적 변환 - 손실이 발생할 수도 있으므로 캐스팅에 의해서만 변환

                 - 컴파일러가 임의로 변환을 하지 못하는 변환

 

posted by 준치 2013. 9. 30. 18:13

 

1.1 클래스 선언

객체 지향 프로그래밍(OOP) 환경에서 가장 핵심

C#에서는 클래스에 속한 변수를 필드(field) , 함수(Method) 한다.

Field method 표현하는 과장을 추상화 한다.

추상화된 결과를 클래스에 포함시키고 변경해서는 되는 것을 적당히 숨겨 스스로 방어하는 것을 캡슐화 한다.

 

형식

지정자 class 이름 : 기반클래스

{

// 멤버 목록

}

 

1.2 분할 선언

분할 선언은 클래스 , 구조체 , 인터페이스 같이 덩치가 타입을 여러 개의 소스 파일에 나누어서 선언하는 방식 이다.

partial 이라는 지정자를 붙여 선언하면 같은 이름을 가지는 클래스 조각들이 나중에 컴파일러에 의해 하나로 합쳐진다.

 

규칙이 있는데 동일한 namespace 포함되어야 하며 컴파일러가 합치는 이라서 순서는 장담 없다.

 

1.3 지정자

클래스 멤버 앞에는 액세스 가능성 , 변경 가능성 , 상속 가능성 , 재정의 가능성 여부 등의 성질을 결정하는

여러 가지 지정자(Modifier)들을 붙일 있다.

 

액세스 지정자

Private , protected , public , internal , protected internal

객체 지향의 이런 특정(지정자를 통해 중요한 멤버를 안전하게  숨김) 정보 은폐(Information Hiding)라고 한다.

 

이외 지정자

static , readonly , const , virtual , override , new , abstract , sealed , volatile , extern

 

1.4 생성자

객체 생성시에 자동으로 호출되는 Method(메소드) 이며 객체를 초기화하는 역할을 한다.

형식

지정자 클래스 (인자 ){

}

 

1.5 파괴자

가비지 컬렉터가 해제 없는 관리 자원을 해제 사용한다.

화면 해상도 , 사운드 카드 , 볼륨 ,네트워크 연결 같은 메모리와 직접적으로 상관없는 환경

형식

~클래스 ~Human_Finalize()

 

2.1 정적 멤버

클래스와 객체는 다르다. 클래스는 객체를 만들기 위한 형틀에 불과하며 객체는 클래스가 메모리에 구현되어

생성된 실체이다. 실체를 인스턴스 라고 한다.

 

static 사용하여 정적 생성자를 이용하지 않고 정적필드의 초기값을 지정 있다.

정적필드 개별 객체에 소속되지 않으며 클래스에 직접 소속

객체가 아무리 많이 생성되어도 정적 필드는 하나만 생성

메모리에 한번만 생성

모든 객체 공유

 

쓰는 이유?! 클래스에 속한 모든 객체들이 공유해야 하는 전역적인 설정 정보나 읽기만 하는 참고 정보들이 정적 필드로 선언

한다.

 

2.2 상수 멤버

초기화되면 변경 없는 멤버

리터럴(Literal) 이라고 부르기도 한다.

const 형식

class Data{

public const int DAY = 24;

}

 

2.3 내부 타입

클래스가 클래스를 포함하는 중첩도 가능

클래스 안에 포함된 클래스를 내부 타입(Nested Type) 이라고 한다.

반대 개념은 외부 타입(Non Nested Type) 이며 namespace 소스 파일 바깥에 선언된

posted by 준치 2013. 9. 30. 18:12

 

IL - Intermediate Language

CLR - Common Language Runtime

CLR(Common Language Runtime)은 MS에서 제시한 .Net Framework의 일부로 가상 장차(Virtual Machine) JAVA JIT와 유사합니다. 여러 언어에서 작성된 (C++ 이나 C#, VB) 프로그램들이 컴파일된 바이너리 코드를 시스템이 이해할수 있는 NATIVE CODE로 번역해 전달하는 역할을 합니다. 

따라서 프로그래머는 사용될 시스템을 고려하지 않아도 되고(XP, 2000, WINDOW7) 그밖에도 메모리 관리나 형 변환 , 예외처리 등 디버깅 서비스도 제공합니다만 단점으로는 아무래도 중간과정을 거치기 때문에 성능에서 손해를 감수해야 하며 리팩토링이 쉽기 때문에 보안이 취약하기도 합니다.

CLR은 마이크로소프트가 Common Language Infrastructure (CLI) 표준을 토대로 구현한 것이며 .NET Framework에 있는 가상 머신 컴포넌트이다. .NET 환경에서 컴파일은 CLR 컴파일을 의미한다.

CLS - 닷넷은 언어들이 지켜야하는 최소한의 사양을 정의하는데 이를 CLS라고 한다.

BCL - MS 미리 작성하여 제공하는 정리된 클래스들의 거대한 집합이다.

 

Namespace(네임스페이스) - 명칭들을 저장하는 장소인데 명칭들이 저장되는 범위를 격리시키는 역할을 한다

기본사용법

Namespace A{

Class MyClass{ ... }

}

중복사용 가능

Namespace A{

Namespace B{

Class MyClass{ … }

}

}

Namespace A.B{

Class MyClass { … }

}

 

Using - 참조문을 짧게 있다. Using 다음에 참조할 namespace 명을 적으면 컴파일러가 선언된 namespace 항상 참조한다.

Using 별명 = namespace 형식으로 작성 있다.

 

출력 - Console.WriteLine("정수는 {0}이고 실수는 {1}이다.", i , d); {0} i출력 , {1} d출력

{인텍스 , : 형식}