7장 수업내용

DEVELOP/C# 2006. 9. 19. 14:50

NameSpace

목적
클래스 구조체 인터페이스 열거형등을 기능별로 묶어 관리하기 위해서
쉽게 찾기 위해서
소유회사에 대한 정보를 표시하기 위하여

작성법
네임스페이스명 {.....}

작명법
첫문자는 대문자가 관례
설계회사의 URL의 역방향으로 지어주는게 관례
http://www.samsung.com
com.samsung
       TV
               TV1.CS
               TV2.CS

멤버
네임스페이스명
{
  .....
  [타입정의형]
  열거형
   클래스
   구조체
   인터페이스
   대리자
   네임스페이스
  ....
}

계층표시
com{  //네임스페이스명
  samsung{  //네임스페이스명
....
  }
}

//동일표현으로..

com.samsung{
....
}

**시험문제 주관식
접근 제한자(액세스 한정자/Access Modifier)
(public/*internal) class 클래스명
{
  (public/internal/*private/protected) void Main()
  {
  ......
  }
}
//public : 모든 설계도상에서 사용가능
//internal : 한정자의 역할, 같은 어셈블리(프로젝트) 내에서만 사용가능
//private : 한정자의 역할, 해당 타입내에서만 사용가능

다른 솔루션의 개체를 사용하기 위해서는 참조에서 해당 폴더 bin의 솔루션명.exe파일을 추가하면 사용할 수 있다..


필드/메소드
종류
인스턴스/정적

인스턴스(필드/메소드):반드시 개체를 만들어서 사용해야함
(개체별로 따로 갖고 있음)
ex. Car myCar = new Car();
     myCar.Sound();
정적(static)(필드/메소드): 클래스 이름으로 사용해야함
(데이터 영역에 한번 만들어짐)
ex. Console.WriteLine();
    클래스명.정적메소드



상수와 읽기 전용필드
공통점
값이 할당되면 변경할 수 없다.

차이점
초기값 할당위치가 다르다
상수는 값형 스트링만 가능
읽기전용필드는 값형 모든 참조형 가능
접근방식이 다르다
(상수:클래스명.상수명)
(읽필:참조변수.필드명)

상수의선언
클래스의 멤버/지역변수도 선언가능
[접근제한자] const [데이터형/값형,스트링] 상수명 = 값;


정적(필드/메소드)의 특징
static키워드가 붙는다.
클래스명으로 사용
공유의 의미가 있다.상수와 읽기 전용필드
공통점
값이 할당되면 변경할 수 없다.

차이점
초기값 할당위치가 다르다
상수는 값형 스트링만 가능
읽기전용필드는 값형 모든 참조형 가능
접근방식이 다르다
(상수:클래스명.상수명)
(읽필:참조변수.필드명)

상수의선언
클래스의 멤버/지역변수도 선언가능
[접근제한자] const [데이터형/값형,스트링] 상수명 = 값;

읽기전용필드
클래스의 멤버로만 쓰임
[접근제한자] readonly [데이터형/값형,참조형] 필드명(=값/생략가능);
생성자에서 초기화 될 수 있다.
  생성자(){필드명=값;}

코드영역데이터영역스택영역힙영역
기계어 명령정적데이터,Console.WriteLine지역변수(값형,참조형)Car개체 Sound()

오버라이딩
  상속일 경우에만 사용
  자식(파생) 클래스에서 부모(기본)클래스의 멤버를 재정의
  오버라이딩의 방법 2가지
    new 한정자 : 부모 클래스의 모든 멤버(상수/필드/속성/인덱서/메소드)를 재정의
    override 한정자 : 부모 클래스의 abstract, virtual 메소드만 재정의
  new 한정자
  부모에서는 그냥 선언 public void [Method] {....}
  자식에서 (new) public (new) void [Method] {....}

  부모 변수 = new 부모();
   변수.메소드();

  자식 변수 = new 자식();
  변수.메소드();

** 부모 변수 = new 자식();  //예외
  변수.메소드();

virtual한정자와 override한정자 
//virtual : 파생클래스가 재정의 하지 않을 경우, 기본클래스의 원래멤버가 호출되도록 함
//override : 한정자는 부모멤버가 virtual, override로 정의 된 경우 자식 멤버 정의시 사용
public virtual void [method] {....}

public override void [method] {....}


추상클래스

클래스의 종류(p116)

일반 클래스 : 상속, 개체생성, 실행(Main()이 있을경우)
추상 클래스 : 상속-파생클래스를 무조건 만들어서 사용

추상클래스는
구체적인 설계도가 아니라 파생 클래스가 가져야 될 멤버(필드/속성/인덱스/메소드)를 정의하는 클래스

추상클래스(개념적 부모)//실제내용이 없음

파생클래스(구체적인 자식)//실제내용이 있음

추상클래스 작성법
abstract class [클래스명] {....}
클래스명 변수 = new 생성();//이런식으로 생성할 수 없다.
//오로지 상속받아서만 사용

추상클래스의 멤버
  상수/필드/인덱서/속성
  생성자/소멸자
  연산자 오버로딩
  메소드
+ 추상메소드

추상 메소드(abstract method)
  정의만 있고 실행내용이 없는 메소드
  abstract 반환형 메소드명(매개변수 리스트); //{} <- 내용이 없다

추상메소드를 갖는 클래스는 추상클래스(abstract class ..)여야만 한다.



인터페이스(interface)
개념
나  -  리모콘  -  테레비
//리모콘을 통해서 테레비를 조정
//리모콘=사용설명서

//택배박스위의 송장

//개체의 사용방법을 설명한 것


개발자  -  설명서  -   컴파일된 클래스
             M1,M2       M1{.....},M2{....}
                         -> //구현

인터페이스의 필요성
다양한 개체를 통일된 방법으로 사용하고자 할 경우 인터페이스를 사용
ex. 통합리모콘으로 TV,audio,VTR조종

인터페이스의 작성법
namespace [네임스페이스명]
{
  (접근제한자) interface 설명서이름
  {
  속성/인덱서/메소드/이벤트
  }
}
메소드 정의
public (접근제한자 불가) [변환형] [메소드명](매개변수리스트);


구현 클래스 작성법
(접근제한자) class [클래스명] : (부모클래스 or (인터페이스1,인터페이스2...))
{.....}//인터페이스에서 선언한것은 꼭 구현해야함

구현 클래스 사용법

구현클래스 변수 = new 구현 클래스 생성자();
//변수.M1();,변수.M2();,변수.M3();,변수.M4();

인터페이스1 변수 = new 구현클래스 생성자();
//변수.M1();,변수.M2();

인터페이스2 변수 = new 구현클래스 생성자();
//변수.M3();,변수.M4();

인터페이스의 상속

interface [인터페이스명] : [기본 인터페이스명 1],[기본 인터페이스명 2]...//인터페이스만 다중상속 가능
{
  //M1,M2가 정의되어있으므로
  M3();
  M4();
}


구조체
설계도 클래스(참조형)  -  개체(힙)
         구조체(값형)  -  개체(스택)

구조체의 작성법
namespace [네임스페이스명]
{
  (접근지정자) struct [구조체명]
  {
  상수/필드..../메소드.../
  }
}
주의사항
기본생성자는 명시적으로 작성불가(컴파일러가 무조건 만들기 때문에..)
인스턴스 필드가 있을 경우 필드 선언시 초기화를 할 수 없다.
  private string name;
인스턴스 필드 개수만큼 매개변수를 갖는 생성자가 반드시 있다.
소멸자는 없다.
다른 구조체를 상속 못함(그러나 인터페이스는 구현 가능)
//다른 구조체 포함은 가능??

구조체를 써야하는 이유
없다. 다만 유리할 경우가 있을뿐이다.

메소드 내부에서 많은 객체를 생성하고 사용할 경우
이 객체를 구조체로 만들면 좋다.
-> 개체를 힙에 만들면 참조변수관리
-> 힙에 사용되지 않는 개체를 없애는 시간이 필요(쓰레기수집자)

하지 말아야할것
-> 구조체를 다른 변수에 할당하지마라
  구조체 S1 = new 구조체();
  구조체 S2 = S1; //Deep Copy가 이루어짐
  //이런경우는 클래스를 이용해서 참조하는것이 더 빠름

메소드의 매개변수값?? 사용하지 마라.
  구조체 S1 = new 구조체();
  M1(S1);//통째로 복사되므로 지양해야함

AND