일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- HTML
- 정성하
- 자바
- FFI
- c언어
- 스타크래프트2
- 마영전
- 안드로이드
- Qt 소켓프로그래밍
- 엑티브엑스
- 고속도로
- Qt OpenGL
- Qt4
- vuejs
- 알람프로그램
- 바이크
- 재귀함수
- 스타2
- android SAF
- 윈도우7
- 잡담
- 이륜차
- 양평역
- Java
- QT
- qt 설치
- 자료구조
- 디자이어HD
- 오토바이
- QTcpServer
- Today
- Total
프로그래밍과 잡담
[JAVA,C++] 인터페이스.. 본문
인터페이스란 어탭터라고 생각하면 된다.
110 볼트는 [| |]이런 모양으로 되어 있지만 220 볼트는 [o o] 이런 모양이다.
전파상에 가면 어댑터 달라하면
이런거 본 적 있을 것이다.
프로그래밍에서 인터페이스도 마찮가지다..
인터페이스는 그냥 저런 구멍을 제공할 뿐 외부 클래스에서는 내부 구현을 어떻게 하는지에 대해서 알 필요가 없다.
자바는 그냥 interface라는 이름이 아예 있고
c++ 같은 경우는 애초에 인터페이스라는게 없다. 왜냐하면 다중상속이 가능한 언어이기 때문에 인터페이스같은게 필요 없다.
그냥 일반적인 상속하는 것처럼 만들면 된다. 물론 자바 인터페이스처럼 함수들은 다 순수가상함수로 만들어야겠지만..
뭐 난 자바가 편하니까 자바형식으로 하겠다..
예를 들어서 압축을 해제하는 라이브러리가 있는데
그 라이브러리는 OutputStream을 사용한다.
OutputStream을 통해서 압축을 해제한다.
뭐 FileOutputStream을 통해서 파일 형태로 내볼 수 도 있지만..
byte[] 형태로 뽑고 싶을 때는 내가 직접 구현을 해야한다.
사실 OutputStream은 인터페이스는 아니다 ㅋ 추상 클래스이지. 하지만 추상 클래스나 인터페이스나 거의 비슷하다.
공통점은 둘다 인스턴스를 생성 못하고 다른 점은 추상 클래스를 필드를 만들 수 있지만 인터페이스를 불가능하다.
그리고 추상 클래스는 상속을 한번 밖에 못하지만 인터페이스를 여러개가 된다는 점..
뭐 여하튼 내가 할꺼는 인터페이스로도 가능한 거니까
아래의 것은 내가 만들은 OutputStream이다. OutputStream을 상속한 것이다.
뭐 보다 싶이 별거 없다.
그냥 byte 배열에다가 집어 넣는거 외에는 아무 것도 없다.
public class MyByteArrayOutputStream extends OutputStream { byte[] datas; int pos; int byteSize; public MyByteArrayOutputStream(int size) { datas = new byte[size]; pos = 0; byteSize = size; } @Override public void write(int b) throws IOException { datas[pos] = (byte) b; } @Override public void write(byte[] b) throws IOException { for (byte i : b) { datas[pos++] = i; } } @Override public void write(byte[] b, int off, int len) throws IOException { for (int i = off; i < len; i++) { datas[pos++] = b[i]; } } public int getByteSize() { return byteSize; } public byte[] getDatas() { return datas; } }
여하튼 이것을
압축을 해제하는 클래스에서 사용을 할 때는 이런식으로 사용할 것이다.
.....
MyByteArrayOutputStream stream = new MyByteArrayOutputStream(size);
p.extract(stream);
byte[] datas = stream.getDatas();
....
아주 간단하다.
extract라는 함수에서는 write 함수를 통해서 압축을 해제한 바이트를 전송할 것이다.
저 extract 함수는 내가 만든 MyByteArrayOutputStream 가 뭘 하는 신경을 안 쓴다. 그냥 wirte라는 인터페이스를 통해서 전송을 할 뿐이다.
뭐 인터페이스로도 저런식으로 한다.
java 에서의 인터페이스
//MyInterface.java interface MyInterface{ public void doSomething(); }
C++ 에서의 인터페이스
class MyInterface { public: virtual void doSomething() = 0; }
위에 보면 알겠지만 크게 차이가 없음.
자바는 명시적으로 인터페이스라는게 들어가는거고..
C++은 인터페이스라는게 없지만 저래 놓으면 인스턴스를 못 만드니 인터페이스와 다를게 없음.
'프로그래밍 > C,C++, Win32Api' 카테고리의 다른 글
[C/C++] C 언어에서 인라인 어셈블리 쓰기.. (0) | 2013.03.21 |
---|---|
[C++] C++ 'classname' dose not name a type 오류해결법 (2) | 2013.03.17 |
[C++]템플릿 만들어보기.. (0) | 2010.04.09 |
[C++] Class (0) | 2010.01.13 |
재귀 함수. (0) | 2009.12.24 |