프로그래밍과 잡담

[JAVA,C++] 인터페이스.. 본문

프로그래밍/C,C++, Win32Api

[JAVA,C++] 인터페이스..

크레온 2012. 7. 1. 16:01

인터페이스란 어탭터라고 생각하면 된다.


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++은 인터페이스라는게 없지만 저래 놓으면 인스턴스를 못 만드니  인터페이스와 다를게 없음.








반응형
Comments