<학습 내용>
- 상속
- 다형성
- 추상클래스
- 인터페이스
- 프로퍼티
- 컬렉션 API, 객체 컬렉션
- Winform
Out에 의한 참조
- ref와 유사하지만, 변수에 어떤값이 초기화 되어 있지 않아도 사용 가능(어차피 메서드 호출에 의해서 초기화 될 것으로 기대)
빈그릇을 받아서 채운다는 개념
* ref vs out
ref는 컵에 물을 채워서 바꿔줘라면 out은 빈컵을 내밀고 채워줘하는 것
확장 메서드
- 어떤 클래스에 대해서 추가적인 기능(메서드)를 삽입해 주는 특별한 형태의 static 메서드
확장메서드는 스테틱으로하기
this 쓰기
캡슐화
- 은행에서 금고가 있음 로또를 당첨받아 40억을 동네 금고에 들어가 다 넣음 은행 금고에 있는 돈은 다 내꺼지만 그걸 내가 은행 금고에 직접 들어가 돈을 꺼내오면 그것은 절도범임. 우린 은행원을 통해 간접적으로 접근하여 돈을 꺼내거나 넣어야 함
은행원의 역할 고객도 만나고 금고에도 들어갈 수 있는 것
java에서는 getter/setter 메서드 활용
C#에서는 속성(Property)를 활용함
1) 멤버변수는 private로
2) 퍼블릭 속성 만듬(get, set)
3) 생성자에서 .을 통하여 get, set 할 수 있음
간단히 속성(Property)만들기
- 맴버 변수 없이 바로 속성을 작성할 수 있음 (내부적으로 맴버변수 자동 생성)
- 검증을 위한 C# 코드를 추가할 수 없음
익명클래스
클래스가 없어도 즉시 만들어 사용 가능
접근한정자(Access Modifier)
- private
- public
- protected 자식클래스만
-
객체지향에서 4가지 중요 개념
- 추상화(클래스를 통해 필요한 비지니스로직만 뽑아내는것)
- 캡슐화(중요한 데이터를 감추고 간접적으로 접근하게 하는 것)
- 상속
- 다형성
상속(Inheritace)
- 어떤 클래스가 명시적으로 상속을 받지 않는 경우, 컴파일 시 최상위 super 클래스인 Object 클래스를 상속받게 됨
- C#에서 클래스는 기본적으로 아무것도 상속받지 않는 경우 Object를 상속받음
Base 클래스의 생성자
- Sub(자식) 클래스의 생성자에서 Base(부모) 클래스의 생성자를 호출할 수 있음
- 메서드Body가 시작하기 전, base 키워드를 사용해 부모클래스 생성자 호출
tip) 우리에게 100억의 금고가 있지만 엄마가 열쇠를 안물려줌. 부모클래스로부터 다 상속하는것은 아님 public, protected, private로 제한할 수 있음
tip) 자식개체를 생성할때는 무조건 부모 클래스의 기본 생성자를 호출한다.!
tip) 자바에서는 super라는 키워드로 자식에서 부모 생성자를 호출 할 수 있는데, c#에서는 base를 통해 호출가능하다!
상속은 기본 부모 클래스의 성질을 물려 받는것 뿐만 아니라 새로운 호칭을 가질수 있다!
자바 vs C# 다형성
tip) 자바는 다형성을 띌때 오버라이드 된 값을 출력하지만 씨샵은 오버라이드 안하고 부모속성을 출력함
C#은 virtual과 override로 해줘야 바뀜 자바랑 다른점!!!
다형성은 왜 필요할까?
다형성의 출발은 하나의 객체를 지속적으로 사용하고 싶을 때 두고 지정하고 사용하고 싶을 것이다. 문제는 그 객체를 지정하고 있는 참조 값을 어떻게 표현하는지가 중요함. 대학생(자식)->사람(부모) 이런 구조라면 사람을 통해 대학생을 참조하여 사용할 수 있게 만들편 편리할것!
식당을 예로 하자면 손님을 맡는다, 주문을 받는다, 음식을 한다 ....
식당에 오는 사람들은 남자, 여자, 잘생겼는지 못생겼는지 다양하게 나눌수 있는 손님들이 있다. 그러나 식당의 입장에서 그러한 것들은 중요치 않다. 식당에서 중요한 것은 주문, 제공, 계산 이런것들만 중요. 그러나 다양한 손님들은 존재, 이러한 경우 손님이란 타입을 정하지 않으면 하나하나 만들어야 할 것!
"부모의 타입으로 자식의 타입을 접근할 수 있는 것이 기본!! "
다형성을 통해 부모클래스를 통해 자식 클래스를 접근할 수 있고 속성 또한 변경할 수 있다. 손님으로써 접근하는것이 다형성의 기본!
ex)
스텐드가 있음, 시중에는 여러개의 전구가 있음. 여러개의 전구가 있으니 스텐드를 만드는 입장에서는 하나하나 따로 만들어야 되는 번거로움이 있었음. 이게 불편하기 때문에 전구를 통일시키는 규격을 만듬. 스텐드는 앞으로 그 규격에 맞는 스텐드를 만들면 되서 편하게 됨!
서로 다른 클래스가 서로를 알게 하기 위해서는 서로의 참조 값을 알아야 함
스텐드라는 전구를 꼳을 클래스
전구라는 부모 클래스
전구를 상속받은 형광등
전구를 상속받은 백열등
메인메서드에서 똑같은 타입으로 백열등과 형광등을 전구란 타입으로 스텐드에 연결시켜 스위치 On/Off한다
디자인패턴(Design Pattern)
객체지향 고수들이 많이 해보니 잘되는 패턴들이 있더라... (당구를 치다보면 어떤 방식이 잘 쳐지더라)
Strategy Pattern
: 공통된 호칭(부모)을 바라보게 하는 클래스를 만들어 설계하는 것. 그 나머지 클래스들이 똑같은 작동을 한다면!
자바에서는 JDBC에 Strategy Pattern사용한다!! 커맨드, 프리페어먼트, 커넥션 등... 오라클, mysql, mssql등 처음에 설치하는 방법만 다르고 연결하는것은 똑같음
추상클래스(abstract)
몸통부분은 만들 필요 없음 어차피 자식 클래스에서 다시 선언할것이기 때문에
이러한 경우 추상매소드로 만들면 됨
바로 이렇게!
이러한 경우 객체를 만들 수 없다(new로 생성 못함) 왜냐하면 몸통이 없으니까 만들 필요도 없고
abstract를 만드는 이유는 어차피 자식클래스에서 할거니까 재정의 하기 편하게 하려고
- 어떤 클래스의 메서드를 모든 Sub 클래스에서 overriding해 사용하는 경우, 이 메서드를 추상메서드를 만드는 것이 권장
- 하나라도 추상 메서드를 가지고 잇는 클래스는 추상 클래스가 되며 abstract 메서드를 명시해야 함
- 추상클래스는 new를 선언할 수 없고, 참조변수를 선언하는데 사용할 수 있음
- 완성된 메서드만 있더라도 abstract 메서드를 선언해도 됨
인터페이스 (Interface)
tip)
만약 100%로 abstract로 된 메서드라면 인터페이스 쓰자!!
- 추상메서드나 상수로만 구성되며, 직접 객체를 생서앟ㄹ 수 없지만 참조변수 선언이 가능함으로써
사람이라는 호칭을 사용하면 말하다() 밖에 못하고
인어라는 호칭을 사용하면 수중 호흡하다 밖에 못함
사람은 추상메서드로 사용하고, 물고기를 인터페이스로 사용한 이유는 사람은 아마 완성된 다른 메서드가 있을것이라 가정했기 때문
is 연산자
- 참조변수가 가르키는 객체의 type을 확인하고 싶을 때
- 참조변수가 가리키는 실체 객체가 is 뒤의 type과 일치하거나 하위 type이면, true, 그렇지 아니면 false
as 연산자
- 참조변수가 가리키는 객체의 type을 계층관계에 있는 다른 type으로 캐스팅 하고 싶을때
- 캐스팅을 시도하여 성공하면 캐스팅된 결과를 반환하고, 실패한 경우, null을 반환
배열
크기를 지정하면 수정할 수 없기 때문에 List, Dictionary 로 바꿈
C#의 배열은 객체이다
참조형 객체의 특징
산에서 보물을 찾음, 그래서 난 보물지도를 그림, 친구가 내 보물지도를 복사해서 가져감
내가 보물지도를 가지고 있으니 괜찮아 가 아니라 복사된 보물지도로도 보물을 찾아 갈 수 있음
Indexer란?
- 객체 내의 데이터를 참조변수의 배열형식으로 접근할 수 있도록 지원하는 문법
- 배열이라는 익숙하고 일관된 문법으로 객체의 데이터를 이용하도록 편의를 제공
Refactoring
- 기존의 코드의 수행 결과는 다르지 않지만 안에 로직이 바뀐것
WinForm
parial: 하나의 클래스의 경우 여러 클래스로 나눔
Idisposable 인터페이스
소멸자 대신 쓰기
'IT > C#' 카테고리의 다른 글
C# 004 (0) | 2017.03.23 |
---|---|
C# 003 (컬랙션, 싱글톤) (0) | 2017.03.22 |
사전 과제 C# (0) | 2017.03.15 |
[C#] Virtual(가상) vs Abstract(추상) vs Interface(인터페이스) (0) | 2017.03.08 |
001 C# 이란? (0) | 2017.02.16 |