반응형
리눅스 상에서 tar 명령어를 이용할때 절대경로를 이용해서 하면  원하는 곳에 풀수가 없고 만들때 지정된 절대경로를 사용해서 그대로 풀린다.
얼마전 하루넘게 절대경로로 압축된 tar 파일을 상대경로로 풀기 위해 삽질을 하여 이곳에 적어둔다. 이는 다시 상대경로를 이용해서 압축하는 방법을 이용하는 수밖에 없다. 아니면 임시폴더를 이용하여 압축을 풀고 cp를 하던가..

그럼 상대경로를 이용하여 tar 압축을 하는 법을 알아보자

예를 들어 /root/aaa/bb/ex폴더를 압축할때 

tar cfP new.tar /root/aaa/bb/ex      

이렇게 지정하면 압축풀때 /root/aaa/bb/ex 폴더로 풀리게 된다.

따라서  tar 로 압축할때는 상대경로로 이동해서 압축을 하여야 한다.

이미 절대경로를 사용해서 만들었다면 이걸 상대경로로 푸는방법이 있긴 하다. pax 명령어를 이용하는 것이다.
# cd /target 
# /usr/bin/pax -r -s ',^/,,' -f /test.tar 

$ pax -r -s ',^ __없앨 경로들___ , __원하는 경로들___ ,' -f 파일.tar
---> 없앨 경로 : 이미 압축 파일에 포함되어있는 없애고 픈 경로들
---> 원하는 경로 : 압축 파일에 있지만, 압축 해제와 동시에 새로운 경로로 풀리기를 바라는 경로

단,  파일 이름이 . 으로 시작하는 hidden file들은 풀리지 않고 tar -C 처럼 지정한 경로에 풀수 없다는 단점이 있다.


참고

https://kldp.org/node/90185


반응형
반응형
이 내용은 디자인패턴 스터디를 준비하며 정리한 내용이다. 첫 시간에 팩토리패턴을 맡게 되어 정리해보았다.

먼저, 디자인 패턴에는 포함되지 않지만 팩토리 구조에 대해 먼저 이해해보는 시간을 가져보자.

팩토리를 사용하는 이유

클라이언트에서 사용할 객체를 생성하는 부분을 캡슐화하여 느슨한 결합 상태로 만들어, 변화에는 닫혀있고 확장에는 열려있는 코드를 만들 수 있다.

 Duck duck;

 if ( type == picnic ) duck = new MallardDuck();

 else if ( type == hunting ) duck = new DecoyDuck();

 else if ( type == inBathTub) duck = new RubberDuck();


뭔가 변경하거나 확장해야 할 때 코드를 다시 확인하고 추가 또는 제거해야 한다는 것을 의미함.
구상클래스를 많이 사용하면 새로운 요구사항이 생길때마다 코드를 고쳐야 하기때문에 많은 문제가 생긴다. 

- 이 문제를 해결하기 위해 자주 바뀌는 코드를 바뀌지 않는 코드와 분리 시켜야한다.

 Pizza orderPizza(String type) {

       Pizza pizza;

         

     if(type.equals("cheese")) pizza = new CheesePizza();

       else if(type.equals("greek")) pizza = new GreekPizza();

       else if(type.equals("pepperoni")) pizza = new PepperoniPizza();       

  

       pizza.prepare();

       pizza.bake();

       pizza.cut();

       pizza.box();

       return pizza;

 } 


굵게 표시된 부분을 캡슐화 해보자. 아래 예제 처럼 일반적으로 팩토리라 하면은 객체 생성을 처리하는클래스로 사용된다. 

 public class SimplePizzaFactory {

    public Pizza createPizza(String type){ //이런 경우에는 static메소드로 선언하는 경우가 종종 있음.

         Pizza pizza = null;

         if(pizza.equals("cheese")) pizza = new CheesePizza();

         if(pizza.equals("pepper")) pizza = new PepperoniPizza();

         if(pizza.equals("clam")) pizza = new ClamPizza();

         if(pizza.equals("veggie")) pizza = new VeggiePizza();

         return pizza;

    }

 }


생성을 한군데 에서 관리할 수 있다는 이점이 있다. 이것은 팩토리 패턴이라기 보다 팩토리라 불리는 관용구에 가깝다.
팩토리의 정의는 객체 생성 처리 클래스이다. 하지만 이러한 팩토리만 이용한다고 해서 팩토리 패턴이라 부를 수 없다.

팩토리 메소드 패턴(Factory Method Pattern)

객체를 만들어내는 부분을 서브클래스에 위임하는 패턴이다. 이를 위해서는 다음과 같은 조건이 필요하다.

첫째, 객체 생성을 위한 인터페이스를 정의하여야 하고, 

생산자 클래스는 서브클래스로 인해 성질이 정의되어야한다.

또한, 팩토리에서 객체를 생성하여 제품 클래스에서 실제로 재작한다.


메인 프로그램에서 new 키워드가 없다. 객체 생성을 팩토리 클래스에 위임하였기 때문이다.

팩토리 패턴을 사용하는 이유는 클래스간 결합도를 낮추기 위해서 즉,  변경점이 생겼을때 다른 클래스의 영향을 최소화 하기 위해서이다.팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거한다.


* 다이어그램



product 인터페이스 : 생성할 대상의 클래스를 추상화시킨 인터페이스. 생성 대상이 되는 구상 클래스는 이 인터페이스를 구현해야 한다.
Creator: product를 생성하기 위한 기능이 정의되어있는 추상클래스(또는 인터페이스), product를 만드는 메소드는 구현이 없는 추상메소드로 정의해여야한다. 팩토리의 역할을 가진 모든 클래스는 이 인터페이스를 구현해야 한다.

이러한 구조를 갖기 때문에 Product를 생성하는 factoryMethod()는 Creator의 구상클래스에서 구현한다.
Product를 만드는 방법은 Creator의 구상클래스가 구현하므로 생성 대상의 구상 클래스를 만들어내는 작업은 해당 클래스에서 책임지며 추후 변경사항이 생겨도 이 클래스만 변경한다.






출처: http://jusungpark.tistory.com/14 [정리정리정리]
https://cheolhojung.github.io/2018/03/21/%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%86%8C%EB%93%9C-%ED%8C%A8%ED%84%B4/


반응형

'개발공부 > 디자인패턴' 카테고리의 다른 글

디자인패턴  (0) 2021.01.14
반응형
String
String은 새로운 값을 할당할 때마다 새로 생성된다.
char형의 배열형태로 저장되며 final형이기 때문에 초기값으로 주어진 String의 값은 불변으로 바꿀 수가 없게 되는 것이다.

StringBuilder, StringBuffer

둘 다 객체의 공간이 부족해지면 기존의 버퍼 크기를 늘리면서 유연하게 동작한다.

StringBuffer는 멀티스레드 환경에서의 동기화를 지원하지만 StringBuilder는 단일스레드 환경에서만 동기화를 지원한다. 물론 단일스레드 환경에서 StringBuffer를 사용해서 문제가 되는 것은 아니지만 동기화와 관련된 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.

StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원.


※ JDK 1.5 버전 이후에는 String 객체를 사용하더라도 컴파일 단계에서 StringBuilder로 컴파일되도록 변경되었다. 따라서 일반적으로 String 클래스를 활용해도 StringBuilder와 성능상으로 차이가 없다고 한다.


하지만 반복 루프를 사용해서 문자열을 더할 때에는 객체를 계속 추가한다는 사실에는 변함이 없습니다. 그러므로 String 클래스를 쓰는 대신, 스레드와 관련이 있으면 StringBuffer를, 스레드 안전 여부와 상관이 없으면 StringBuilder를 사용하는 것을 권장합니다.

 

단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String 입니다.


검색을 통하여

출처: http://12bme.tistory.com/42 [길은 가면, 뒤에 있다]


반응형

+ Recent posts