안녕하세요~! 문쑹입니다 :)
오늘은 복습을 하고 일지를 작성 해보겠습니다.
일반 생성자와 스태틱 생성자와 디폴트 생성자의 개념을 한 번더 짚어보고 가겠습니다.


스태틱 생성자는 메서드가 호출 될때 딱 한 번만 실행이 되고 사라지는 객체입니다. 코드를 살펴보면 시작1을 호출하고 Person person1으로 메서드를 생성합니다. 다음 시작2를 실행하고 person1을 new Person();으로 Person Class를 호출합니다. 그러면 제일 우선 순위인 스태틱 생성자를 호출한 후 디폴트 생성자를 호출 합니다. 다음 시작3을 호출한 후 메서드에 string객체를 호출하는 일반 생성자를 출력받은 후 마지막으로 시작4를 출력합니다.
캡슐화(Encapsulation)
관련성이 있는 데이터와 그 데이터를 다루는 메서드를 객체 안에 구현하는 것이 일반적이지만 객체의 밖에서 알아야 할 필요가 없는 내부 멤버를 숨기기도 하는데, 이를 캡슐화라고 한다.

위의 코드를 보면 객체가 없으니 그나마 파일로 구분해 줄 수가 있는데, 예를 들어 위의 모든 코드를 math.c라는 파일 안에 넣어 둘 수 있다. 파일로 구분한 것도 일종의 캡슐화라고 볼 수 있지만, 단점이 존재한다.
- 변수 pi를 파일 내의 모든 함수에서 접근할 수 있다. 다른 파일에서도 접근할 수 있게 돼 있다면 역시 모든 파일의 함수에서 읽고 쓰는 것이 가능하다.
- 다른 파일에서는 Print 함수만 쓰도록 강제할 수 없다. 실수로 GetAreaOfCircle 함수를 써도 막을 방법이 없다.
위의 코드를 C#에서의 캡슐화를 사용하여 바꿔보았다.

멤버 변수 pi와 멤버 메서드 GetArea에는 public 접근 제한자가 명시돼 있지 않으므로 외부에서 접근하려고 하면 컴파일 단계에서 오류가 발생한다.
정보은닉(information hiding)
클래스 입장에서 "정보"라고 불리는 것은 멤버 변수를 일컫는데, 외부에서 이 멤버 변수를 직접 접근할 수 없게 만드는 것이 바로 정보 은닉에 해당한다.
상속(inheritance)
동일한 클래스가 필요하면서 그 안에 추가적인 기능을 넣어서 활용을 하려는데 이 클래스를 이름만 다르게해서 만들어 버린다면 효율성이 많이 떨어집니다. 하지만 이것을 해결하기 위해서 만들어진 기능이 바로 상속입니다.



노트북, 데스크톱, 넷북이라는 타입을 정의했을때 공통적으로 부팅, 끄기, 리셋과 같은 행위와 전원이 들어와 있는지에 대한 상태값을 제공하는데, 이를 정리하면 모두 컴퓨터라는 특징에서 나온 것임을 알 수 있다. 하지만 상속을 이용하면 공통적인 특징을 정의하는 부모 클래스(parent class)를 두고 자식 클래스(child class)에서 부모의 기능을 물려받는 식으로 처리할 수 있다. 아래의 예시는 위의 예시에 상속을 받은 것이다.


* 부모 클래스는 다른 말로 기반(base) 클래스 또는 슈퍼(super) 클래스라고도 한다. 그리고 자식 클래스는 다른 말로 파생(derived) 클래스 또는 서브(sub) 클래스라고도 한다. 부모 또한 부모를 가질 수 있기 때문에 조상(ancestor) 클래스라는 표현이 있고 반대로 자손(descendant)클래스라는 표현도 있다.

TurnOff의 메서드를 사용하기 위하여 NoteBook타입인 device 객체를 받아서 Shutdown()을 사용하고싶었지만 나머지
aDesktop, aNetbook은 에러가 발생하였다. 그리하여 이것들의 부모 클래스인 Computer타입을 사용하였더니 에러가 사라졌다.

클래스 배열을 살펴보자
Computer(Notebook 객체, Desktop 객체, Netbook 객체) - 참조 배열 객체
machines - 배열 객체를 가르키는 참조변수

Computer타입 machines1의 배열을 만들었다. machines2는 machines1을 풀어 놓은 것이다. 대부분 1번을 선호하여 사용한다 2번의 경우 배열의 갯수 또는 다차원 배열이 된다면 효율성이 떨어지기 때문에 1번 방법을 사용하여 클래스 배열을 선언한다.

하지만 배열의 갯수가 여러개이면 반복문을 사용하는 것이 효율적이다. Computer 타입의 임시 변수 Temp를 만들어 machines의 배열 갯수만큼 반복하여 출력한다.
as, is 연산자
클래스의 형변환에서 빠질 수 없는 것이 바로 as연산자다. 오류를 발생시키지 않고도 형변환이 가능한지 확인할 수 있는 방법이 필요했고 이를 위해 as연산자가 추가되었다.
as 연산자는 형변환이 가능하면 지정된 타입의 인스턴스 값을 반환하고, 가능하지 않으면 null을 반환하기 때문에 null반환 여부를 통해 형변환이 성공했는지 판단할 수 있다. as 연산자는 참조형 변수에 대해서만 적용할 수 있고 참조형 타입으로의 체크만 가능하다.
is 연산자는 형변환의 가능성 여부를 불린형의 결괏값(true / false)으로 반환한다. as와 is 연산자를 언제 쓰느냐에 대한 기준은 명확하다. 형변환된 인스턴스가 필요하다면 as를 사용하고 필요없다면 is를 사용하면 된다.

is 연산자가 as 연산자와는 다른 또 하나의 특징은 대상이 참조 형식뿐 아니라 값 형식에도 사용할 수 있다. 그래서 위의 예제를 컴파일 했을 때 오류가 발생하지 않는다.
* is 연산자는 값 형식에 사용할 수 있지만 C# 컴파일러는 값 형식과 참조 형식을 구분할 수 있기 때문에 본문의 예제 코드처럼 int 타입과 string 타입의 변환 여부에 대해서는 컴파일 오류는 아니지만 경고는 발생 시킨다.
이상 포스팅을 마치겠습니다. 감사합니다 :)
Hasta Luego~!