1. 인터페이스 (Interface) |
오늘날 우리가 많은곳에서 사용하는 usb 포트는 다방면으로 사용 가능한 장치입니다.
어뎁터를 통해 휴대폰을 충전한다 던지 컴퓨터 주변기기들(마우스, 키보드, 프린터, 선풍기...)을 usb 포트를 통해
전원을 공급한다던지 데이터 수신호를 보낸다던지 컴퓨터와 사용자간 연결 통로같은 역활들을 합니다.
이는 다양한 응용력, 확장능력을 가지고 있습니다.
앞서 말한 usb포트와 같은 역활을 하는것이 이번장에 공부할 인터페이스(Interface)입니다.
인터페이스는 클래스와 비슷해 보이지만 메서드, 이벤트, 프로퍼티, 인덱서 등만 가질수 있다는
차이가 있고 접근 한정자는 public으로만 선언 할수 있습니다. 또한 인스턴스를 만들 수없어 직접적인
사용은 불가능하지만 상속을 받는 클래스의 인스턴스를 생성하는 것은 가능합니다.
- 메서드, 이벤트, 프로퍼티, 인덱서 만을 가질수 있습니다.
- 자체적으로 인스턴스화 될수 없으며 상속을 통한 클래스의 인스턴스는 생성가능 합니다.
- 실체화 될수 없는 인터페이스는 추상적인 멤버를 가집니다.
- 접근 한정자는 public으로만 기본적으로 지정됩니다.
- 인스턴스는 참조자 형으로 사용할수 있습니다.
선언 형식
interface [인터페이스명] { [반환형식] [메서드명] ( [매개변수 목록] ); //... }
소스코드
using System; namespace ConsoleApp1 { //인터페이스 메서드의 원형으로만 이루어 집니다. //멤버 변수는 존재 할수 없습니다. interface ITest { //접근제한자 붙이지 않는다. void Function(); void Function2(); } interface ITest2 { void Function2(); } //인터페이스 다중상속 class TestClass : ITest, ITest2 { //상속받은 인터페이스의 모든 메서드를 구현하도록 강제 됩니다. public void Function() { Console.WriteLine("하하하하"); } public void Function2() { Console.WriteLine("호호호호"); } }; class Program { static void Main(string[] args) { TestClass tc = new TestClass(); tc.Function(); tc.Function2(); Console.WriteLine(); //인터페이스는 인스턴스화 될수 없지만 참조자 형으로 사용 가능 ITest interfaceA = tc; interfaceA.Function(); interfaceA.Function2(); Console.WriteLine(); ITest2 interfaceB = tc; interfaceB.Function2(); } } }
결과
하하하하 하하하하 호호호호 |
2. 형변환 ( is, as ) |
앞서 공부한 클래스에서도 사용할수 있는 키워드 입니다.
형식 비교와 형변환을 위해 사용할수 있는 키워드로 상속 클래스, 상속 인터페이스에서 안전성과 명확성이
필요로 할때 사용할수 있습니다.
is : 객체가 해당 형식인지 비교하여 그 결과를 bool 타입으로 반환 합니다.
as : 형변환 연산자가 변환에 실패할 경우 예외(오류)를 던지는 것에 비해 as는 객체 참조를 null로
만든다는 차이가 있습니다.
인터페이스가 인터페이스를 상속하고 이를 클래스로 상속받아 인스턴스를 구현
using System; namespace ConsoleApp1 { interface IGun { void Fire(); } interface IAutoGun : IGun { void Fire(int count); } interface ILaser { void shoot(); } class TestClass : IAutoGun, ILaser { public void Fire() { Console.WriteLine("IGun : 빵야!"); } public void Fire(int count) { for (int i = 0; i < count; i++) { Console.WriteLine("IAutoGun : 뚜루뚜루!"); } } public void shoot() { Console.WriteLine("ILaser : 찌이이잉~!"); } }; class Program { static void Main(string[] args) { TestClass tc = new TestClass(); tc.Fire(); tc.Fire(3); tc.shoot(); Console.WriteLine(); // is 같은 형식인지 비교 if(tc is IGun) { // as : 형변환을 이후 안전성 확인 IGun gun = tc as IGun; if (gun != null) gun.Fire(); } if(tc is ILaser) { ILaser lasergun = tc as ILaser; if (lasergun != null) lasergun.shoot(); } } } }
결과
IGun : 빵야! |
3. 추상 클래스 (abstract) |
추상 클래스는 인터페이스와 클래스중 많은 부분이 클래스에 더 가깝습니다.
메서드, 필드, 메서드 구현, 프로퍼티, 이벤트 등을 가질수 있고 인터페이스와 달리 직접 구현 또한
할수있습니다. 하지만 클래스와 달리 인스턴스는 만들수 없습니다.
이 추상 클래스에서 할수 있는것은 모두 클래스에서 가능한 기능들이지만 왜 굳이 추상 클래스를
사용할까요? 클래스에서 가능하지만 많은 부분을 다른 프로그래머에게 강제할수 없고 설명 또한
필요한 부분이 생길것 입니다. 하지만 추상 클래스는 클래스 자체 만으로 해당 추상 메소드를 강제
할수 있으며 구현되지 않은 부분들은 컴파일러가 알려줄수 있습니다.
- 인터페이스는 명시하지 않은 메서드는 모두 public이 되지만 추상 클래스는 private로 선언됩니다.
- 인터페이스와 달리 직접 구현이 가능하지만 클래스 처럼 인스턴스는 만들수 없습니다.
- 파생 클래스들은 모든 추상 메서드를 구현을 강제 할수 있습니다.
- 추상 클래스가 추상 클래스를 상속한 경우 자식 추상클래스는 부모 추상클래스의 추상 메서드를
구현하지 않아도 됩니다. (결국 인스턴스를 생성할 클래스에서 구현하기 때문)
소스코드
using System; namespace ConsoleApp1 { //추상클래스 ( 멤버 메서드중 추상 메서드가 하나라도 들어가 있으면 추상 클래스가 됩니다 ) abstract class Gun { public int number = 1; //발사에 대한 추상적 기능을 강제 할 추상 메서드 public abstract void Fire(); //인터페이스와 달리 직접 구현도 가능 합니다. public void Reload() { Console.WriteLine("척커덩!"); } } //추상클래스를 상속받은 클래스가 인스턴스화가 가능한 클래스가 되려면 //추상함수를 모두 재정의 해야 한다. class AutoGun : Gun { public override void Fire() { Console.WriteLine("빵야!"); } } class LaserGun : Gun { public override void Fire() { Console.WriteLine("지이잉~"); } } class Program { static void Main(string[] args) { Gun g = new AutoGun(); g.Fire(); g.Reload(); if (g is LaserGun) { LaserGun laser = g as LaserGun; if (laser != null) laser.Fire(); } else { Console.WriteLine("LaserGun 이 없습니다."); } } } }
결과
빵야! |
이상으로 인터페이스, 형변환, 추상 클래스의 강좌를 마치도록 하겠습니다.
수고하셨습니다.
'프로그래밍 > c# 기초' 카테고리의 다른 글
왕초보 입문용 프로그래밍 c# 기초 공부 강좌 13편 - 델리게이트(Delegate), 이벤트(Event) (0) | 2018.11.06 |
---|---|
왕초보 입문용 프로그래밍 c# 기초 공부 강좌 12편 - 예외 처리(try, catch, throw, finally) (1) | 2018.11.05 |
왕초보 입문용 프로그래밍 c# 기초 공부 강좌 10편 - 구조체(struct), 오퍼레이터(operator) (3) | 2018.11.03 |
왕초보 입문용 프로그래밍 c# 기초 공부 강좌 9편 - 클래스(Class) - 3 (0) | 2018.11.01 |
왕초보 입문용 프로그래밍 c# 기초 공부 강좌 8편 - 클래스(Class) - 2 (3) | 2018.11.01 |