1. 내가설계한 template method pattern 예제

제목 : 프로그래밍

template method pattern이란 알고리즘의 뼈대를 만들어 전체적인 레이아웃을 통일 시키지만 상속받은 클래스로 하여금 어느정도 유연성을 주도록하는 패턴이다.

추상 메소드와 훅 메소드를 적절히 사용해서 전체적인 알고리즘의 뼈대를 유지하되 유연하게 기능을 변경 할 수 있도록 하고자 할 때 사용한다.

이번에 내가 설계한 template method pattern예제는 프로그래밍 시스템이다. c언어와 자바언어를 작성할 때 각각 맞는 툴은 다르지만 코드를 작성하고 컴파일하는 전체적인 구조는 같기 때문에 선정하였다.

 

 

2. 코드 설명

1)client 클래스

client 클래스에서 시스템이 시작한다. programming클래스를 상속받은 cjava programming클래스를 이용하여 각각의 언어에 맞는 프로그래밍을 한다.

public class client {

public static void main(String[]args) {

programming cp = new CProgramming();

programming jp = new JavaProgramming();

cp.working();

System.out.println();

jp.working();

}

}

 

 

2)programming 추상 클래스

programming 추상 클래스는 시스템에서 전체적인 골격을 잡아주는 역할을한다. 코드작성과 컴파일부분은 같기 때문에 하나로 작성하였고 개발툴은 다르기 때문에 추상 메소드로 만들었다.

abstract public class programming {

public void working() {

intro();

tool();

System.out.println("코드를 작성한다.");

System.out.println("코드를 컴파일 한다.");

System.out.println("A+를 받는다.");

}

public abstract void tool();

public abstract void intro();

}

 

 

3)CProgramming 클래스

CProgramming 클래스는 programming클래스를 상속받아 c언어 개발에 맞는 visualstudio tool을 사용한다.

public class CProgramming extends programming{

public void intro() {

System.out.println("C프로그래밍 입니다.");

}

public void tool() {

System.out.println("Visual Studio를 실행한다.");

}

 

 

4)JavaProgramming

JavaProgramming 클래스는 programming클래스를 상속받아 c언어 개발에 맞는 eclipse tool을 사용한다.

public class JavaProgramming extends programming{

public void intro() {

System.out.println("java프로그래밍 입니다.");

}

public void tool() {

System.out.println("eclipse를 실행한다.");

}

 

 

3. 클래스다이어그램

 

 

4. 코드 실행결과

 

 

'학교공부' 카테고리의 다른 글

텔넷  (0) 2018.12.03
이해하기쉬운 command pattern 예제  (0) 2018.11.25
이해하기쉬운 bridge pattern 예제  (0) 2018.11.23
쉽게설명한 전자상거래 유형  (0) 2018.11.22
이해하기쉬운 abstract factory pattern 예제  (2) 2018.11.22

1. 내가 설계한 Command pattern 예제

제목 : 돌려 돌려 선풍기

Command pattern이란 classobject들이 상호작용하는 방법과 책임을 분산하는 방법을 정의한 것이다. 여러 가지 행위 관련 pattern을 사용하여 독립적으로 일을 처리하고자 할 때 사용한다.

이번 과제에서 내가 설계한 Command patern예제는 선풍기이다. 선풍기는 바람을 일으키는 기능 이외에 회전이라는 별도의 기능이 따로 있다. 그렇기 때문에 이번 과제인 Command pattern예제로 선정하였다. 선풍기 프로그램의 클래스는 총 7가지이다. 하나하나 살펴보겠다.

 

 

1) client클래스

client클래스는 프로그램이 처음 시작하는 클래스이다. client클래스에서 바람을 일으키는 button1과 회전을 시키는 button2를 생성하여 이용자는 pressed()함수를 이용하여 해당 버튼의 기능을 수행한다.

public class client {

public static void main(String[] args){

Wind wind = new Wind();

Command WindCommand = new WindCommand(wind);

Button button1 = new Button(WindCommand);

 

Rotation rotation = new Rotation();

Command RotationCommand = new RotationCommand(rotation);

Button button2 = new Button(RotationCommand);

 

button1.pressed();

button2.pressed();

button2.pressed();

button1.pressed();

button1.pressed();

}

}



 

2) Button클래스

Button클래스는 setCommand함수를 이용하여 어떤 버튼을 생성할 것인가에 대해 Command클래스를 설정 할 수 있고 pressed()함수를 이용하여 기능을 실행시킨다.

public class Button {

private Command theCommand;

public Button(Command theCommand){

setCommand(theCommand);

}

public void setCommand(Command newCommand){

this.theCommand = newCommand;

}

public void pressed(){

theCommand.execute();

}

}

 

 

 

3) Command클래스

각 기능의 Command를 수행시키는 매개체 역할을 하는 클래스이다.

public interface Command {

public abstract void execute();

}

 

 

 

4) WindCommand클래스

Command클래스를 상속받고 Wind클래스를 이용하여 execute()함수를 통해 바람을 일이키는 기능을 수행시키는 클래스이다.

public class WindCommand implements Command{

private Wind wind;

public WindCommand(Wind wind){

this.wind = wind;

}

public void execute(){

wind.start();

}

}

 

 

 

5) RotationCommand클래스

Command클래스를 상속받고 Rotation클래스를 이용하여 execute()함수를 통해 회전기능을 수행시키는 클래스이다.

public class RotationCommand implements Command{

private Rotation rotation;

public RotationCommand(Rotation rotation){

this.rotation = rotation;

}

public void execute(){

rotation.start();

}

}

 

 

 

6) Wind클래스

start()함수를 이용하여 power변수에 따라서 해당하는 기능을 수행한다.

power=0일 때, power1증가시키고 바람세기를 약으로 선풍기를 가동시킨다.

power=1일 때, power1증가시키고 바람세기를 강으로 선풍기를 가동시킨다.

power=2일 때, power0으로 초기화하고 선풍기를 중지시킨다.

public class Wind {

private int power = 0;

public void start(){

if(power == 0){

power++;

System.out.println("선풍기 가동 (바람세기:)");

}else if(power == 1){

power++;

System.out.println("선풍기 가동 (바람세기:)");

}else{

power =0;

System.out.println("선풍기 가동 중지");

}

}

}

 

 

 

7) Rotation클래스

start()함수를 이용하여 run변수에 따라서 해당하는 기능을 수행한다.

run=false일 때, runtrue로 바꾸고 선풍기를 회전시킨다.

run=true일 때, runfalse로 바꾸고 선풍기 회전을 중지시킨다.

public class Rotation {

private boolean run=false;

public void start(){

if(run==false){

run = true;

System.out.println("선풍기를 회전시킵니다.");

}else{

System.out.println("선풍기 회전을 중지시킵니다.");

run = false;

}

}

}

 


2. 선풍기 클래스다이어그램



 

3. 실행화면

button1.pressed(); #button1=바람

button2.pressed(); #button2=회전

button2.pressed();

button1.pressed();

button1.pressed();

 

1. 내가설계한 bridge pattern 예제

제목 : 카드결제 시스템

bridge pattern이란 새로 추가한 객체의 interface가 기존 시스템에 맞지 않을 경우 새로운 interface를 정의하지 않고 단지 조상 class만을 상속받아 classabstract method를 구현하면서 새로운객체가 가진 method와 데이터를 사용하는 것이다.

이번 과제에서 bridge patter의 예제로 카드 결제시스템을 선택하였다. 한 계열사의 인터넷 쇼핑몰에서 해당 계열사의 카드뿐만아니라 새로운 interface인 다른 계열사의 카드를 사용하기 때문에 brigde pattern을 사용해야겠다고 생각했다.

 

2. 코드 설명

1)client 클래스

client 클래스에서 프로그램이 시작된다. client가 상품을 결정했다고 가정하고 바로 knushop 클래스 객체를 생성하여 card 선택하고 계산한다.

public class client {

public static void main(String[]args) {

System.out.println("상품을 선택하였습니다.");

knushop kns = new knushop();

kns.discount_product();

}

}

 

2)knushop 클래스

knushop클래스는 생성자를 통해 어떤카드를 선택할지 선택하고 discount_product함수를 통해서 선택된 카드를 통해서 상품을 계산한다.

import java.util.Scanner;

 

public class knushop {

private String card;

public knushop() {

System.out.println("어떤카드로 계산하시겠습니까?");

System.out.println("1.knucard, 2.dccard");

Scanner sc = new Scanner(System.in);

String selectCard = sc.nextLine();

if(selectCard.equals("knucard")||selectCard.equals("1")) {

set_card("knucard");

}

else if(selectCard.equals("dccard")||selectCard.equals("2")) {

set_card("dccard");

}

else {

set_card("error");

}

}

public void discount_product() {

discount dc = new discount();

card cd = dc.return_card_object(this);

cd.discount();

}

public String get_card() {

return card;

}

public void set_card(String selectCard) {

card = selectCard;

}

}

 

3)discount 클래스

discount클래스는 선택된 카드의 이름에 따라 card객체를 결정하는 중간다리 역할을 한다.

public class discount {

public card return_card_object(knushop knushop) {

knushop kns = knushop;

if(kns.get_card().equals("knucard")) {

return new knucard();

}

else if(kns.get_card().equals("dccard")) {

return new dccardAdapter();

}

else {

return new error();

}

}

}

 

4)card 추상클래스

card 추상클래스는 discount함수를 통해서 knushop의 물건을 계산한다.

abstract class card {

public abstract void discount();

}

 

5)knucard 클래스

knucard클래스는 card클래스를 상속받아서 knu인터넷 쇼핑몰에서 knucard를 사용할 수 있게 해준다.

class knucard extends card {

public knucard() {

System.out.println("knucard가 선택되었습니다.");

}

public void discount() {

System.out.println("knucard로 계산하였습니다.");

}

}

 

6)dccardAdapter 클래스

dccardAdaptercard를 상속받고 knu인터넷 쇼핑몰의 인터페이스에 맞지않은 dccard를 사용할 수 있게 해주는 역할을 한다.

class dccardAdapter extends card{

private dccard dccard;

public dccardAdapter() {

dccard = new dccard();

}

public void discount() {

dccard.discount();

}

}

 

7)dccard 클래스

dccard클래스는 dccardAdapter를 통해서 dccardknu 인터넷 쇼핑몰에서 사용가능하게 된다.

class dccard {

public dccard() {

System.out.println("dc카드가 선택되었습니다.");

}

public void discount() {

System.out.println("dc카드로 계산하였습니다.");

}

}

 

8)error클래스

사용할 수 없는 카드가 선택될 때 오류메세지가 출력된다.

class error extends card{

public void discount() {

System.out.println("존재하지 않는 카드입니다.");

}

}

 

3. 클래스다이어그램


 

 

4. 코드 실행결과


 

한글을 볼 수 있지만 키보드로 한글을 입력하려면 한글 입력기 설치가 따로 필요합니다.

그래서 이번에는 한글 입력기 설치를 해보겠습니다.
여기서 다루는 입력기는 fcitx입력기입니다.
(i-bus라는 입력기도있습니다.꼭 이 입력기를 사용하지 않아도됩니다. )


1. apt-get install fcitx-hangul (fcitx입력기 설치)






2. apt-get install fcitx-lib* (fcitx라이브러리 설치)






3. im-config(입력기설정)






4-1. 입력하면 이런표시가나온다.






4-2. yes버튼을 누른다.






4-3. fcitx부분을 선택하고 확인을 누른다.






4-4. 확인버튼 클릭






5. 바탕화면 우측상단 전원버튼 옆에 화살표를 누르고 설정버튼을 누른다.





6. 지역 및 언어를 선택한다






7. 아래사진과같이 옵션을 누르고 바꾼다.





8. fcitx-configtool (fcitx설정창)을 입력한다.





9-1. 아래사진같이 아무것도 뜨지 않는다면 reboot(재부팅) 후 다시 fcitx-configtool을 입력한다. (무엇인가 나온다면 9-2로가시면됩니다.)






9-2. 컴퓨터 마다 다르다 아래사진에서 Hangul만 남겨 놓고 지운다.





10. 그 후 추가 버튼(+)을 누르고 영어(또는 English)를 추가시킨다.





11. 이렇게하면 한글키 입력 패치가 완료됩니다.







부록 

1. apt-get install iceweasel-l10n-ko(파이어폭스 한글화패치)
칼리리눅스는 기본적으로 파이어폭스브라우저가 깔려있는데 아래 명령어는 영어로된 파이어폭스를 한글로 패치시켜준다.






2-1. 한영변환키 변경
fcitx-configtool에서 상단메뉴에 Global Config를 누르면 입력기 전환이라는 부분이보인다.
입력기 전환에 Ctrl+Space부분을 누른다.






2-2. 아래와같이 떳을때 윈하는 키를 입력한다.






문제점 : 키보드 한영키가 입력기전환에 입력이 안된다. 추후에 해결책을 다시 올리겠습니다.


한글패치를 하기 위해 실습하던 도중 이상한 오류를 만났다.


E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?


몹시 당황스러웠다. 직역하면 잠금파일을 열 수 없습니다인데 실제오류내용은 이러하다.
오류 : 다른사람이나 자신이 apt-get을 사용하고 있어 지금 사용할 수 없습니다.

하지만 실제로 사용하는 사람은 나고 다른 작업은 하고 있지 않다. 이럴 경우 재접속을해도
되지만 lock이 걸려있는 파일을 삭제해주면된다.

rm /var/lib/dpkg/lock (/var/lib/dpkg/lock 파일을 지우라는 뜻이다.)





그랬더니 아래와 같이 잘 실행된다



현재 화면을 보면 로그인창이나 바탕화면 곳곳에 한글패치가 안되 한글이깨져 있다는 것을 알 수 있다.

그림이 아니라 한글이깨져서 흰 박스가 생긴것이다.






그렇다면 이제 한글을 패치하러 가봅시다




1. 터미널을켜고 apt-get update를해준다.
(apt-get update란? 사용가능한 패키지와 그의버전 리스트들을 업데이트하는 것이다. 실제로 패키지를 업그레이드하는 것이아니라 다운로드 할 것이 있는가 없는가만 알려준다. 만약 리스트가 나온다면 apt-get upgrade를 통해 업데이트를 하길 바란다.)






2. (나눔폰트 설치)명령어를 입력한다.
   apt-get install fonts-nanum*






3.아래 사진을보면 흰사각형이 한글이 되었다는 것을 알 수 있습니다. 그래도 혹시 모르니까 리부트 명령어로 재부팅해줍니다.
reboot(재부팅)






4.로그인 화면까지 한글로 바뀌었습니다.



이상으로 한글패치를 마치겠습니다.


미러사이트란? 

거울사이트 즉 원래의 사이트가있는데 사이트가 한곳에만있으면 많은 사람들이 이용하면서 트래픽이 빈번해지고 속도가 떨어지기도하고 국내사이트가 아니라 해외 사이트일 경우 사이트의 접근하거나 다운로드할때 거리때문에 속도가 느려지는 것을 해결하기 위해 동일한 정보를 복사하여 저장시켜 놓은 사이트이다.



미러사이트는 주로 소프트웨어패키지를 다운로드 할 때 사용 된다.
아래를 보면 현재 필자의 미러사이트는 "http://mirrors.neusoft.edu.cn"임을 확인할 수 있다다.



미러사이트 마다 가지고 있는 정보가 다르기때문에 항상 최신화가 잘되는 미러사이트로 설정해 놓는 것이 바람직합니다.
이제 미러사이트를 바꾸는 방법에대해 설명하겠습니다.



1.미러사이트가 저장된 폴더를 편집하기위해 명령어를 입력한다.(필자는 vim편집기를 사용했습니다.)
  명령어 : vi /etc/apt/sources.list






2.아래 사진에 빨간색 화살표로 표시된 부분에 맨앞에 #으로 주석처리를한다.





3.아래 그림과 같이 "deb 미러사이트URL kali-rolling main non-free contrib"형식으로 미러사이트를 입력한다.
(필자는 http://ftp.yzu.edu.tw/Linux/kali 미러사이트를 이용했습니다.)
그 후 ESC :wq를 입력한다.(변경내용을 저장하고 나간다라는 의미입니다.)






4.apt-get update 명령어를 통해 미러사이트가 바뀌었다는 것을 확인 할 수 있다.




이상으로 칼리리눅스 미러사이트 설정편을 마치겠습니다.


apt-get install update를 입력 하면 한글로 설정해놨기때문에 어떤 에러가 났는지 알 수 없다.
이유는 칼리리눅스를깔때 한글로 설정했는데 한글이 locale(언어)부분에 설치되지 않았기 때문이다. 한글을 깔기전에 임시로 영어로 바꾸는 방법에 대해 알아보겠다.






아래와 같이 명령어 
LANG=C(언어를 표준으로 바꾸겠다는 의미이다.)
export LANG(언어를 적용한다.)
두가지를 입력한다.






명령어를 입력했을때 에러메세지가 영어로 나오는 것을 알 수 있다.



+ Recent posts