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);//통째로 복사되므로 지양해야함