본문 바로가기
코스웨어/15년 스마트컨트롤러

20150603 - 23번 이량경 friend, 정적{this, static)/객체복사, this, 접근한정자, Base, 상속, ISAS,오버라이딩,메소드 숨기기, 중첩분할 클래스, 확장메소드, 구조체

by 알 수 없는 사용자 2015. 6. 4.
728x90
반응형
<시스템제어><C++>

1. 프렌드함수
- 은닉화를 깨는 함수
- 데이터은닉을 푸는 함수.(private을 풀어주는 함수)
- java에는 허용안함.

2. 프렌드 클레스
- 관계성있는 클레스라면 클래스 자체를 지정할수 있다. 
- 클래스 선언문 안에 friend class 로 지정하면 된다.

1) 프렌드 함수
- private ,pulic 영역 모두어떤 멤버 변수든지 읽고 쓸수 있고 모든 멤버 함수를 자유롭게 호출할수 있다.
- 함수가 한개 이상의 클레스의 멤버함수가 될수 없다. 
그래서 양쪽 클래스에서 프렌드로 지정하면 양쪽모두를 멤버함수처럼 사용할수 있다.
   
<FriendFunc>  



<관계성있는 클레스일경우 은닉된 멤버를 자유롭게 읽기위해서 통째 프렌드로 지정.>
- 클래스 선언문 내에 클래스명을 프랜드로 지정


<프랜드 멤버함수>
- 특정 클래스의 특정 맴버함수만 프랜드로 지정
- 많은 함수 중에 꼭 필요한 함수에 대해서만 숨겨진 멤버를 엑서스할 수 있도록 범위설정을 위함.

- 다른클래스에 속한 멤버함수다.
- 클래스 선언부에 friend키워드 함수원형 으로 사용

*객체지향에서는 사용을 필요할때만하자. 





2.정적멤버  
1) this


<static 키워드를 붙여 정적멤버임을 명시>
- 정적멤버 변수
- static을 쓰면 만들어지지는 않고 단지 존재한다.

static int y;           // 객체를 1000개 만들어도 1개다.
int smart ::y =1;    // 생성


<static>





<제어UI>

1. 객체복사하기.
1) Shallow Copy (얕은 복사)
- 바이너리복사 라고도 한다. 
- 힙에 있는 실제 객체가 아닌 스택에 있는 참조를 복사해서 받아  메모리 공유현상이 일어난다.
- 주소카피가 일어났기 때문에 값의 공유가 일어남. 


2) Deep Copy (깊은 복사) : 각각의 주소를 가진 복사가 목적.
- 명시적으로 필드를 복사해야한다.
- 힙에 보관된 내용을 별도의 힙 공간에 객체를 보관.

* 각 객체별로 깊은 복사가 필요한 메소드들은 깊은 복사 메소드가 내부적으로 구현되어있다고 볼수 있다.
- 배열

* 깊은 복사는 명시적 필드 복사가 필요하다.


3) ICloneable.Clone()메소드
- 클래스가 구현해야하는 클래스 목록
"깊은 복사"기능을 가질 클래스가 .NET 프레임워크의 다른 유틸리티 클래스나 다른 프로그래머가 작성한 코드와의 호환되도록 하고싶으면 ICloneable 을 상속하도록 하는 것이 좋다.


2. this(예약어)
- 객체가 스스로를 가리키는 키워드 : 자신의 필드나 메소드에 접근하는 키워드.

<변수명을 따로 가져와도됨.>
- 변수의 명명 규칙이 있듯. 유사한 역할이라면 같게 하는게 좋다.
- Employee의 필드 Name와 매개변수의 Name가 같은이유는 자신을 호출한다는 목적에 따라 같게 만들었다.
this.


2) this() 생성자
- 자기 자신의 생성자
this()생성자는 다른코드에서는 사용불가, 생성자에서만 사용가능.


3. 접근한정자 (공개 수준 결정)
1) 객체지향 프로그래밍 3대 특성
은닉성 : 최소한의 기능만 노출
- 다형성 (다중정의)
- 상속성

* 필드 메소드 모두 사용가능.
-------------------------------------------------------------------------------------------
(try - catch , throw)
예외처리 - 런타임에서 실행오류가 발생했능때 핸들링하기위한 방법

익셉션이 가장 큰 범위 
- 예상가능한 범위를 벗어나면 throw 일종의 브레이크인데 예외처리쪽에 던진다.
 익셉션 문구는 throw를 통해 변경하면 된다.

throw :조건문이 만족되면 현재수행문을 예외처리로 던져라.
-------------------------------------------------------------------------------------------


<C#에서 재공하는접근한정자>


a) public 다른클래스간의 다른어샘블리간 물리적으로 다를때..등등..

b) protect 부모자식간은 데이터(필드(를 열어주되 연관성이 없으면 접근 불가능.

c) private 선언하지 않을경우 C#은 기본적으로 private
-------------------------------------------------------------------------------------------
<멀티에 물리적으로 형성할 경우>
d) internal 물리적으로 동일한 파일일경우 public 접근 가능 /물리적으로 파일이 다르면 접근 불가

e) protected internal 물리적으로 동일한 파일일경우 protect로 접근 가능 /물리적으로 파일이 다르면 접근 불가
-------------------------------------------------------------------------------------------
실행단계에서 데이터를 가져올수 없습니다.등등.. 의 실행상의오류가 발생됨에도 불구하고 프로그램을 정상적으로 종료 처리한다.
유저의마지막 실행코드를 받아올수있도록 처리하는 것.
가베지 컬렉트가 정상처리할수 있게 하고, 익셉션이 정상적으로 예외처리를 받아올수 있도록하는것.
-------------------------------------------------------------------------------------------

4. Base
- 자식(파생된)
- 부모클래스를 가리키는 키워드 Base 
* 만약 부모클래스와 내용이 동일하다면 Base.클래스 를 통해부모클래스를 가리킴.


* this, base는 사용한다는 의미자체로 설명이 되므로 무수히 많은 코드일경우 this, base로 관계를 명확히 밝힐수 있다.

5. 상속 
- 베이스와 파생 / 기반에서 파생된 클래스
- 파생 클래스는  :(콜론)베이스 로 표시한다.

- 기반(부모)클래스가 가진 내용으로 필드 메소드 프로퍼티를 포함하여 필드 메소드 프로퍼티를추가로 정의할수 있다.
- 부모클래스 메소드 호출, 생성자 호출 : 부모클래스에서 사용되어진 필드값을 그대로 가져옴.
- 재정의일경우 base라는 키워드 사용 궂이 안만들어도됨.

- 부모클래서의 생성자를 호출하기위해서는 베이스키워드 사용(또다른메모리 할당을 받지 않기위함.)


6. IS 와 AS -_-많노..
자식클래스를 부모클래스로 형변환할 경우 상관없지만, 부모클래스를 자식클래스로 변환시킬경우는 명시해야함.

- is : 부모상속관계에 있는지 없는지 확인만한다.: 관계있다면 형변환을 한다.

- as : as라는 키워드를 사용하지만 사실 연산자다. 객체의 참조를 비워버린다.

<cat의 타입은 마멀>
마멀을 캣츠처럼 사용하겠다 하여 형변환.
as를 사용하게 마멀을 캣츠처럼 사용하겠다. 명시하여 형변환이 일어남.




7. 오버라이딩과 다형성
* 객체지향의 특징중 하나 다형성
- 부모자식간의 관계를 부모 필드 메소드를 가쟈와서 쓰겠다.
- 부모 클래스 (필드는 그대로 쓰겠다가 되겠지만) 메소드를 자식이 메소드를 재정의할수있다.를 오버라이딩이라고 한다.

* 부모가 허락(버추얼을 붙여 메소드 선언)을 해야 재정의가 가능하다. virtual 을 통해 가능하다.
- 추가하거나 재사용이 가능하다.


8. 메소드 숨기기
전체 클래스 설계할대부터 클래스의 허용성 상속성을 고려하여 설계해야한다.
클래스 라이브러리 만드는 사람입장에서는 : 동일한 이름으로 가져가야할 경우가 있다.
/이미 사용중인 부모클래스가 있을경우 버추얼이 선언되어있다면 오버라이드 시키면 되지만.../


9. 오버라이드 봉인 
- 상속관계에서 재정의
- virtual
- new

절대 건드리지마 이원형 그대로 써 하고 싶을때 쉴드(키워드)를 통해 봉인하면 된다.

10. 중첩 클래스
- 클래서 내에 클래스 선언.
클래스 = 틀
일종의 마스킹 : 클래스를 분리하기 위함.



11. 분할 클래스
Partial 키워드를 통해 나누어서 구현


12. 확장 메소드
- 기존 클래스의 메소드기능을 확장.
- 상속받아 만든 자식클래스에 필드나 메소드를 추가하는 상속과 다르다. 
- 확장 메소드를 이용하면 문자열 뒤집기나 int 형식에 제곱연산기능을 넣을수 있다

* 매개변수1 : 리턴할변수를 선언하고 1인자를 대입. 

* 매개변수2 :  매개변수 목록
-________-
_-------_
-______-
-_______________-
-____________-

인트타입의 객체(원형에 접근할 방법이 없어 -> 생성된 객체 a
10파워를 잡아낼수 있게 확장(파싱,할때 마스킹할수있게 하는것). 인트에 파워 메소드를 붙임,


13. 구조체
= 복사를 하게 되면 새로운 메모리 공간을 할당.
깊은 복사군집이면 struct로 만들어 진행.
구조체도 상속은 가능하지만 system.object형식상속이므로 궂이 구조체 상속을 사용할필요는 없다.


클래스(조각) 난것들을 엮을때,
상속관계의 잠재적 버그나 상위 클래스의 코드의 재사용성의 허락범위를 제어하기 위함.

내용이 부족해도 이해바랍니다..-_-;;




728x90