[Design Pattern] Adapter 패턴



한국에서 쓰는 가전 기기를 110V를 쓰는 나라에 가져가면 쓸 수가 없다. 왜냐면 우리나라는 220V로 규격화 되어 있기 때문이다. 110V를 쓰는 나라에서 우리나라 가전기기를 사용하려면 뭐가 필요 할까? 바로 아답터다. 220V 가전기기를 110V에서 사용하기 위해 꼭 필요하다. 프로그램에서도 마찮가지 이다. 이미 구현 되어 있는 Util Class가 존재 한다. 내가 만든 프로그램에서 해당 클래스를 사용하는데 알맞는 인터페이스가 존재 하지 않을 때가 있다. 이때 아덥터 패턴을 사용해 이미 구현된 Class를 사용해 보자.


상속을 사용한 Adapter 패턴



는 내비게이션을 가지고 있다. 이것을 새 차에 장착하고 싶은데 붙일 방법이 없다. 그래서 거치대를 사서 붙였다.

이 상황을 프로그램 해보겠다.


[가전 제품과 예제 비교]

 예제 프로그램

가전 제품 비유

 Car

한국에서 쓰는 가전 제품 

 거치대(Adapter)

아뎁터 (Adapter)

 내비게이션

V110


[클래스 다이어그램]



[전체 예제]

[차에서 내비를 실행]

public class Main {


public static void main(String[] args) {

Car carHasNavi = new Adapter();

carHasNavi.powerOnNavi();

carHasNavi.powerOffNavi();


}

}


===========================================================================================

[차 에서 내비게이션을 동작 하고 싶다.]


public interface Car {

void powerOnNavi();

void powerOffNavi();

}


===========================================================================================

[이미 존재 하는 내비게이션]

public class Navigation {

public void onStart() {

System.out.println("내비게이션 시작");

}

public void onDestory() {

System.out.println("내비게이션 종료");

}

}


===========================================================================================

[거치대는 네비게이션과 차를 상속 받아 결국에 차에서 내비를 실행 할 수 있게 된다.]

public class Adapter extends Navigation implements Car {


@Override

public void powerOnNavi() {

onStart();

}


@Override

public void powerOffNavi() {

onDestory();

}

}



위임을 사용한 Adapter 패턴



앞에서 보여줬던 예제와 비슷하지만 이전에는 상속을 통한 거치대를 구현 했다면 이번엔 위임을 통해 아뎁터 패턴을 알아보겠다.


[클래스 다이어그램]



[파일 쓰는 예제]

[차에서 내비를 실행]

public class Main {


public static void main(String[] args) {

Car carHasNavi = new Adapter();

carHasNavi.powerOnNavi();

carHasNavi.powerOffNavi();


}

}


===========================================================================================

[차 에서 내비게이션을 동작 하고 싶다.]


public abstract class Car {

public abstract void powerOnNavi();

public abstract void powerOffNavi();

}


===========================================================================================

[이미 존재 하는 내비게이션]

public class Navigation {

public void onStart() {

System.out.println("내비게이션 시작");

}

public void onDestory() {

System.out.println("내비게이션 종료");

}

}


===========================================================================================

[거치대는 차를 상속 받아 내부적으로 내비를 생성해 실행하고 있다.]

public class Adapter extends Car {


private Navigation navi = new Navigation();


@Override

public void powerOnNavi() {

navi.onStart();

}


@Override

public void powerOffNavi() {

navi.onDestory();

}

}



반응형

"앱이 설치 되지 않습니다." 해결 방법



안드로이드 프로그램을 개발 후 APK를 만들어 핸드폰에 설치 할 때 "앱이 설치 되지 않습니다." 라는 문구가 발생 할 수 있다. 이런 문제가 발생시 어떻게 해결 해야 될지 하나씩 짚어보도록 하겠다.


해결 방법



[STEP 1]

안드로이드 스튜디오에서 clean 후 빌드 한다.

1. Build -> Clean Project

2. Build -> Make Project


[STEP 2]

핸드폰에 동일한 패키지로 설치된 프로그램을 삭제 한다.


[STEP 3]

signature version이 잘 못 된 경우 확인

안드로이드 스튜디오 2.3 이상에서 apk를 만들 때 아래 그림과 같이 V1, V2를 체크 할 수 있다.

핸드폰 OS가 7.0 미만이면 V1을 체크해야 되며 그 이상인 경우는 V2를 체크해야 된다. 

잘모르겠으면 두 개다 체크 해서 apk 파일을 만든다.







반응형

파일 읽고 쓰기 사용법



java 프로그램을 할 때 파일을 읽고 쓰는법을 설명하겠습니다. 


파일 쓰고 읽기 전체 예제



[전체 예제]

import java.io.*;


public class File {

final static String FILE_NAME = "test.txt";

public static void main(String[] args ) {

//=====================//

//========파일 쓰기=======//

//=====================//

FileWriter fw = null ;

BufferedWriter bw = null;

try{

//파일 쓰기

fw = new FileWriter( FILE_NAME );

bw = new BufferedWriter( fw );

bw.write("Hello World"); //버퍼에 데이터 입력

bw.newLine(); //버퍼에 개행 삽입

bw.write("Welcome to java");

bw.newLine();

bw.flush(); //버퍼의 내용을 파일에 쓰기

}catch ( IOException e ) {

System.out.println(e);

}finally{

try { fw.close(); } catch ( IOException e ) {}

try { bw.close(); } catch ( IOException e ) {}

}

//=====================//

//========파일 읽기=======//

//=====================//

FileReader rw = null ;

BufferedReader br = null;

try{

//파일 읽기

rw = new FileReader( FILE_NAME );

br = new BufferedReader( rw );


//파일을 한줄 씩 읽기

String readLine = null ;

while( ( readLine =  br.readLine()) != null ){

    System.out.println(readLine);

}

}catch ( IOException e ) {

System.out.println(e);

}finally{

try { rw.close(); } catch ( IOException e ) {}

try { br.close(); } catch ( IOException e ) {}

}

}

}


[실행 결과]

Hello World

Welcome to java


[메모장으로 파일 열었을 때]

eclipse에서 실행 하면 bin 폴더 상위에 파일이 생성 됩니다.

Hello World

Welcome to java



파일을 쓰는 방법



[import 목록]

import java.io.*;

java.io 패키지에 있는 모든 클래스를 import 합니다.


[파일 쓰는 예제]

//=====================//

//========파일 쓰기=======//

//=====================//

FileWriter fw = null ;

BufferedWriter bw = null;

try{

//파일 쓰기

fw = new FileWriter( "test.txt" );

bw = new BufferedWriter( fw );

bw.write("Hello World"); //버퍼에 데이터 입력

bw.newLine(); //버퍼에 개행 삽입

bw.write("Welcome to java");

bw.newLine();

bw.flush(); //버퍼의 내용을 파일에 쓰기

}catch ( IOException e ) {

System.out.println(e);

}finally{

try { fw.close(); } catch ( IOException e ) {}

try { bw.close(); } catch ( IOException e ) {}

}


[파일 쓰기 준비 동작]

FileWriter fw = null ;

BufferedWriter bw = null;

try{

fw = new FileWriter( "test.txt" ); <- 생성할 파일 명을 넣어 줍니다. <- eclipse에서 실행 하면 bin 폴더 상위에 파일이 생성 됩니다.

bw = new BufferedWriter( fw );  <- 파일을 쓸 때는 버퍼를 이용한다.

...


[버퍼에 파일 쓰기]

bw.write("Hello World"); //버퍼에 데이터 입력

bw.newLine(); //버퍼에 개행 삽입


[버퍼에 있는 내용 파일에 쓰기]

bw.flush(); //버퍼의 내용을 파일에 쓰기


파일을 읽는 방법



[import 목록]

import java.io.*;

java.io 패키지에 있는 모든 클래스를 import 합니다.


[파일 읽는 예제]

//=====================//

//========파일 읽기=======//

//=====================//

FileReader rw = null ;

BufferedReader br = null;

try{

//파일 읽기

rw = new FileReader( FILE_NAME );

br = new BufferedReader( rw );


//파일을 한줄 씩 읽기

String readLine = null ;

while( ( readLine =  br.readLine()) != null ){

    System.out.println(readLine);

}

}catch ( IOException e ) {

System.out.println(e);

}finally{

try { rw.close(); } catch ( IOException e ) {}

try { br.close(); } catch ( IOException e ) {}

}


[파일 읽기 준비 동작]

FileReader rw = null ;

BufferedReader br = null;

try{

//파일 읽기

rw = new FileReader( "text.txt"); <- 앞에서 파일을 생성했기 때문에 해당 파일이 존재 함

br = new BufferedReader( rw ); <- 버퍼를 이용해서 파일을 읽는다.

...


[버퍼를 이용한 파일읽기]

String readLine = null ;

while( ( readLine =  br.readLine()) != null ){  //버퍼 기능인 한줄 씩 읽기 함수를 이용해 파일 내용을 읽어 출력한다.

    System.out.println(readLine);

}



반응형

'프로그램 > Java' 카테고리의 다른 글

[java] NIO를 이용한 파일 쓰고 읽기  (0) 2018.06.05
[java] ByteBuffer 사용법  (0) 2018.06.03
[java] 스레드 사용법  (0) 2018.05.27
[java] 함수 가변 인자 사용 방법  (0) 2018.05.25
[java] Random 사용법  (0) 2018.05.24

자바 Thread 사용법



Thread(스레드)를 이해하기 위해서는 우선 프로세스를 알아야 한다. 프로세스는 하나의 프로그램이라고 보면 된다. 우리는 윈도우에서 음악을 들으며 웹서핑을 할 수 있다. 음악을 플레이 하는 프로그램도 있고 웹서핑을 할 수 있도록 브라우져 프로그램을 실행한다. 이 둘은 각각의 프로세스이다.

윈도우는 멀티프로세스 기반 OS이며 각각의 두 프로그램을 적절한 CPU 분배로 마치 동시에 실행 되는 것과 같다. 스레드는 하나의 프로세스 안에 독립적으로 수행되는 흐름이라고 보면된다. OS 안에 여러 프로세스가 존재하듯이 프로세스 안에는 1개 이상의 스레드가 존재하며 각각의 독립적 기능을 한다.


스레스 사용 방법



자바에스 스레드를 사용하는 방법은 2가지로 나눌 수 있다.

Thread 클래스나 Runnable 인터페이스를 상속 받아 사용할 수 있다.

아래 예제는 상속 받는 방법과 스레드를 생성하는 방법에 대한 예제가 있다.

각각 사용 방법이 다르니 주의해서 보도록 한다.


[Thread를 상속 받은 스레드 클래스]

public class MyThread extends Thread {

@Override

public void run() {

System.out.println("Thread 상속");

}

public static void main(String[] args) {

Thread mt = new MyThread();

mt.start();

}

}


[상속 방법]

public class MyThread extends Thread // Thread 클래스를 상속 받기 때문에 extends 를 사용한다.


[사용 방법]

Thread mt = new MyThread(); 

mt.start(); // 스레드를 시작하는 함수


[Runnable를 상속 받은 스레드 클래스]

public class MyRunnable implements Runnable{


@Override

public void run() {

System.out.println("Runnable 상속");

}

public static void main(String[] args) {

Thread mr = new Thread(new MyRunnable());

mr.start();

}

}


[상속 방법]

public class MyThread implements Runnable // Runnable 인터페이스를 상속 받기 때문에 implements 를 사용한다.


[사용 방법]

Thread mr = new Thread(new MyRunnable()); // Runnable은 Thread의 자식이 아니기 때문에 바로 생성 할 수 없고 이렇게 Thread 객체 생성시 인자로 넣어준다.

mr.start(); // 스레드를 시작하는 함수




반응형

'프로그램 > Java' 카테고리의 다른 글

[java] ByteBuffer 사용법  (0) 2018.06.03
[java] 파일 읽고,쓰기 사용법  (0) 2018.05.30
[java] 함수 가변 인자 사용 방법  (0) 2018.05.25
[java] Random 사용법  (0) 2018.05.24
[java] sleep 사용법  (0) 2018.05.23

+ Recent posts