요즘 일본과 한국의 정치 문제로 인해 화이트 리스트에서 한국이 제외되는 상황이 벌어지고 있습니다. 이에 따라서 많은 기업들이 대체재를 찾기 위해 노력하고 있다는 기사를 쉽게 볼 수 있는데요. 대체재, 보완재, 독립재, 연관재와 같은 단어들은 경제에서 쉽게 사용하는 용어들입니다. 오늘은 그 중에서 대체재와 보완재에 대해서 알아보도록 하겠습니다.


대체재는 서로 다른 물건이지만 비슷하거나 같은 효용을 넣을 수 있는 것을들 의미합니다. 이런 대체재들은 주변에서 쉽게 찾아볼 수 있는데요. 예를 들면 밥과 빵, 소고기와 돼지고기, 버터와 마가린 같은 것들이 있습니다. 즉 서로가 서로를 대체할 수 있는 것들이죠. 대체재는 일반적으로 한쪽 가격이 상승하면 해당 물품은 수요가 줄어들고 상대 물품의 수요가 늘어나는 경우가 있습니다. 이번 일본의 규제로 인해서 다른 나라에서 비슷한 물건을 수출하는데 유리해진 셈이죠. 이는 장기적으로 볼때 일본 수출 기업에게도 불리한 요소로 작용하게 됩니다. 이미 경쟁력을 갖고 있던 일본 제품을 수출하기 어려워지기 때문에 경쟁국가에게 기회를 제공하게 되기 때문이죠. 


대체재와 상반되는 개념으로 보완재가 있습니다. 보완재는 2개 이상의 물건이 함께 있을때 효용을 넣을 수 있는 물건들인데요. 예를 들면 자동차와 석유, 샤프와 샤프심과 같은 것들입니다. 즉 보완재의 경우 한쪽 수요가 늘어나면 다른쪽 수요도 함께 늘어나는 관계를 갖습니다. 자동차가 늘어나면서 자연스럽게 석유의 이용량이 늘어난 것도 이런 관계에서 비롯된 것입니다. 


만약에 이번 일본 규제로 인해서 우리가 투자를 하게 된다면 어디에 투자하는 것이 좋을까요? 일본 기업에서 한국으로 주로 수출하고 있던 물건들이 수입하기 어려워지면서 한국 기업들은 비슷한 대체재를 찾기 위해서 다른 나라의 비슷한 물건을 찾게 될 것이고 이에 따라서 해당 국가에 해당 물품의 수출이 늘어나게 됩니다. 또 비슷한 기술력을 가진 국내의 중소기업이 성장할 수 있는 기회를 넣게 되기도 합니다. 이번 규제로 인해 반도체 산업 전반적으로 사용되는 재화들의 공급루트가 막히면서 국내에서 이를 공급할 수 있는 채널을 만들기 위해서 노력하고 있는데요. 이번을 기회로 성장하는 기업들이 늘어날 것으로 보입니다. 

(물론 이건 제 개인적인 생각이니 그냥 이런 소리를 하는 사람도 있구나 이정도로 생각해주세요. 저는 공부를 하면서 포스팅을 하는 사람이지 전문적인 투자자가 아닙니다. :D)

1. 요약

GoF 중 생성 패턴으로 프로토 타입 패턴은 Clone을 이용하여 객체를 생성하는 방법입니다. 추상 팩토리 패턴의 경우 객체를 생성하는 코드를 파생 클래스에서 작성을 하였다면, 프로토 타입 패턴의 경우 파생 클래스에서는 객체를 생성하는 코드가 별도로 만들어지지 않습니다. 기존에 생성된 객체를 이용하여 해당 타입의 객체를 생성하게 됩니다. 

 

2. 프로토 타입 패턴

프로토 타입 패턴을 이용하기 위해서는 Prototype이 되는 추상 클래스가 필요합니다. 그리고 해당 클래스에서는 Clone이라는 메서드를 추상으로 선언하게 됩니다. 그리고 나머지 파생 클래스에서는 Clone 함수를 구현하게 됩니다. 그리고 실제 객체가 필요한 경우 PrototypeFactory를 이용해 필요한 객체를 만들 수 있습니다. 객체를 구분하는데 여러가지 방법이 있습니다. enum을 사용하거나, 객체별 id를 부여하거나, type를 비교할 수도 있습니다. 이렇게 객체의 타입을 구분할 수 있는 방법을 하나 선정하여서 이미 프로토 타입으로 인스턴스화된 객체로부터 새로운 객체를 가져오게 됩니다. 여기서 C#을 기준으로 예제 코드가 만들어지는데요. MemberwiseClone 이라는 함수를 사용하게 되는데요. 해당 함수는 객체를 복사한 새로운 객체를 object 타입으로 반환해주는 함수입니다. 

3. 예제

가장 기본이 되는 ProtoType 클래스입니다. 해당 클래스는 추상으로 되어있고, 여기에 id나 다른 변수와 메서드를 추가할 수 있습니다. 그리고 이 추상 클래스를 상속 받아 ConcreteProtoType1, 2, 3 .... 여러가지 파생 클래스를 생성할 수 있습니다. 현재는 생성된 클래스에 모두 Clone 함수를 재정의 해줘야합니다.

이런식으로 MemberwiseClone 함수를 이용해서 별도의 생성자를 통한 인스턴스를 생성하는게 아닌 기존의 객체를 복사하게 됩니다. 그렇다면 이제 ProtoType Factory를 만들어보도록 하겠습니다. 

Generic 을 활용하여 Type을 직접 입력 받아서 해당 타입에 맞는 객체를 생성하는 Factory 입니다. Factory 생성시 프로토 타입에 해당하는 인스턴스를 미리 만들어서 등록하는 것이 포인트입니다. 이렇게 되면 생성자에서 생성된 인스턴스를 기즌으로 새로운 객체들이 생성되게 됩니다.

실제 Main 함수에서는 이와 같이 만들어지게 됩니다. 이 방법 외에도 enum을 활용하거나 index를 활용하는 방법이 있는데.. 저는 위의 방법을 가장 선호합니다. 가장 직관적이고 별도로 enum이나 index를 생성하지 않아도 구현이 가능하기 때문입니다. 이렇게 구현을 하게 되면 향후 유지보수에 유리하게 됩니다.

요즘 일본과 무역 전쟁으로 많은 이슈들이 생기고 있는데요. 가장 많이 들리는 이야기가 바로 화이트 리스트입니다. 화이트 리스트는 백색국가라고도 하고, 일본의 첨단제품 수출 허가신청을 면제 받는 국가를 의미하고 한국, 미국을 포함해서 27개 국가가 화이트 리스트에 해당됩니다. 여기서 제외된다면 일본 첨단제품을 수입하는 과정에서 수입 물품 개별로 허가를 받아야하고 이로인해 비용이 증가하게 됩니다. 그렇기 때문에 일본의 첨단제품을 수입하는 업체에서는 비상에 걸린 것입니다. 이번 일본과의 마찰은 개인적으로 각 국가의 현 정부 사이에 실리를 넣을 수 있을 것으로 판단하고 이루어진 조치라고 생각합니다. 이로인해 경제주체들이 큰 타격을 입게 되었습니다. 어째든 이미 벌어진 일이고 우리가 해야할 일은 이번 화이트 리스트 제외 조치를 정확히 알고 이를 대처할 수 있는 정보력을 갖추는 것입니다. 그렇다면 이제부터 화이트 리스트에 대해서 자세히 알아보도록 하겠습니다.


백색국가

백색국가는 일본 정부에서 자신들의 우방국으로 지칭한 국가들로 독일, 미국, 영국, 한국 등 27개 국가가 백색국가에 포함되어 있습니다. 한국의 경우 2004년 아시아에서 처음으로 백색국가로 지정되었지만, 지금은 제외되었습니다. 백색국가의 장점으로 일본 제품을 수입할때 허가 절차에서 우대를 받아 경제적으로 유일한 위치에 놓이게 됩니다. 

(일본 화이트 리스트)

미국, 영국, 프랑스, 독일, 아르헨티나, 호주, 오스트리아, 벨기에, 불가리아, 캐나다, 체코, 덴마크, 핀란드, 그리스, 헝가리, 아일랜드, 이탈리아, 룩셈부르크, 네덜란드, 뉴질랜드, 노르웨이, 폴란드, 포르투칼, 스페인, 스위스


일본이 백색국가를 지정하여 일본의 제품을 수출할때 국가별로 허가를 차등적으로 실시합니다. 여기서 허가를 받아야 하는 품목중 전략물자라는 것이 있습니다. 전략 물자란 군사적으로 사용할 가능성이 있는 물자를 의미합니다. 일본은 우리의 생각보다 다양한 분야에서 첨단기술을 보유하고 있는 국가로 원자력, 화학무기, 미사일과 같은 국사적으로 직접적인 관련이 있는 분야부터 첨단소재, 전자제품, 센서와 같은 첨단기술을 포함한 항목까지 다양한 분야에서 기술력을 인정 받고 있습니다. 

특히 이번에 이슈가 된 품목으로 고순도 불화수소, 포토레지스트, 플루오린 폴리이미드가 있는데요. 이 품목들은 대일 수입의존도가 크게는 90%가 넘기 때문에 큰 문제가 되고 있습니다. 그리고 이 품목들은 반도체, 디스플레이 산업에서 주로 사용되고 있습니다. 한국의 주력 수출품으로 반도체와 전자제품이기 때문에 생산에 차질이 생길 수 밖에 없게 됩니다. 삼성전자나 SK하이닉스는 아주 큰 문제가 생긴 것이죠. 따라서 삼성전자의 성장이 눈에 거슬렸던 일본으로써는 이번 조치가 하나의 발판으로 생각할 수 있겠습니다. 

따라서 이번 화이트 리스트 제외로 인해 많은 기업들이 피해를 입고 있는데요. 이번 규제로 인해 일본기업도 피해를 보고 있는 상황입니다. 정말 정치적 문제로 시작된 이번 사건이 각 국가의 기업 및 경제에도 영향을 주는데 그들이 정말 민생의 안전과 기업의 성장을 위한 조치인지 의문이 드는 부분이긴 합니다.

화이트 리스트 제외로 한국 기업이 해당 품목을 수입하기 위해서는 물품마다 개별 심사를 받아야하고 이는 통상 90일정도의 기간이 소요될 것으로 보입니다. 따라서 이번 규제가 장기화 된다면 이에 맞는 조치가 필요한 것으로 판단됩니다. 삼성전자나 SK하이닉스와 같은 대기업이 이번 규제가 장기화되어 생산에 차질이 생긴다면 중소기업 및 하청업체까지 연쇄적으로 영향을 받기 때문에 경제 전체적으로 문제가 되고 이로인해 기업 도산으로 금융권에도 영향을 주게 되겠죠. 가장 좋은 해결 방법은 정치적으로 일본과 협상을 통해 화이트 리스트 규제를 철회하고 일본과 우호적으로 지내는 것이 되겠습니다.

1. 요약

빌더 패턴은 생성 패턴의 한 종류로 복잡한 단계로 생성되는 생성자를 더 쉽고 가독성이 높게 생성할 수 있도록 고안된 패턴입니다. 대부분의 디자인 패턴이 그러하듯 기본적인 개념을 갖고 더 좋고 편리하게 확장할 수 있습니다. 빌더 패턴의 경우 기존 생성자를 통해서 객체를 생성하는 방식이 아닌, 객체를 생성하는 클래스를 만들어 해당 클래스에서 인스턴스를 생성하므로 가독성과 유지보수가 쉽도록 고안된 패턴입니다.

2. 빌더 패턴

빌더 패턴에서는 빌더라는 클래스가 필요합니다. 빌더 클래스는 해당 객체의 값을 설정하고 다시 반환하는 역할을 합니다. 예를 들어 학생의 점수를 기록하는 객체가 있다고 할때, 과목이 10개가 있다고 하면 각 과목마다 점수를 저장하는 변수가 있을 것이고 이 변수에 값을 하나하나 입력을 해야합니다. 이런 경우 각 과목의 점수를 모두 생성자를 이용해서 입력을 한다거나, 직접 접근해서 점수를 입력할 수 있지만 이런 경우 새로운 과목이 추가될 경우 변경사항을 적용하는데 귀찮음이 생기게 됩니다. 따라서 이런 경우 각 과목의 점수를 입력하는 Builder를 만들어 해당 Builder에서 점수를 기록하는 방식으로 변경하게 된다면 기존의 방식보다 훨씬 더 가독성이 좋고 유지보수하기 쉽게 변경할 수 있습니다. 빌드 패턴을 이용하는 목적은 편리함과 가독성에 중점을 두고 있기 때문에 성능상에 큰 차이는 없지만 작업능률에 큰 차이가 있을 수 있습니다. 그렇다면 이제 학생들의 점수를 기록하는 빌더 패턴을 코드를 보면서 예제를 만들어보도록 하겠습니다. 

3. 예제

해당 예제는 개념적인 설명을 위해 아주 간단하게 작성하였고, 추가적으로 다양한 개념을 추가하여 자신만의 빌더 패턴을 완성할 수 있습니다...

우선 학생들의 점수를 저장하는 클래스가 필요합니다. 해당 클래스의 이름은 StudentScore라고 하고 해당 클래스에는 수학(Mat), 영어(Eng), 국어(Kor), 사회(Soc), 과학(Sci), 기술(Ski), 체육(Ath), 미술(Art), 음악(Mus) 이렇게 과목이 있다고 가정하겠습니다.

생성자는 다음과 같이 만들 수 있습니다. 생성자 내부는 귀찮아서 패스하겠습니다. 이렇게 많은 값들을 입력을 해야지 객체를 생성할 수 있습니다. 따라서 입력을 할때 자신도 모르게 실수를 하거나 중간에 입력을 추가하게 되는 경우, 혹은 입력값이 바뀌는 경우 이를 변경하기 쉽지 않습니다. 따라서 이런 경우 빌더 패턴을 이용하여 쉽게 객체를 생성할 수 있습니다. 

해당 빌더에서는 StudentScore 라는 객체를 들고 있고 하나의 빌더가 생성될때 StudentScore가 같이 생성이 됩니다. 그리고 각 과목의 점수를 설정할때마다 값이 설정되고 설정이 된 빌더 객체를 반환하도록 설계되어 있습니다. 이런 경우 각 과목마다 값을 설정하는 함수를 만들어 값을 설정하기 때문에 생성자를 사용해서 값을 설정하는 것보다 더 직관적으로 값을 설정할 수 있기 때문에 문제를 덜 만들게 됩니다. 그렇다면 실제 값을 설정하여 인스턴스를 생성하는 과정을 보도록 하겠습니다.

이런식으로 객체를 생성할 수 있고 여기에 Builder 객체에서 ToBuild() 라는 함수를 추가해서 설정한 StudentScore 객체를 반환 받으면 Builder를 이용하여 복잡한 객체를 생성할 수 있게 되는 것입니다. 

지금까지 설명한 빌더 패턴의 기본 구조를 유지한 상태로 더 다양한 기능을 추가하여 자신만의 빌더 패턴을 만들 수 있습니다.

1. 요약

팩토리 메소드 패턴은 생성패턴의 한 종류로 객체를 생성하는 방법을 해당 클래스를 상속 받은 클래스에서 명시하도록 하는 패턴입니다. 일반적으로 클래스에서 객체를 생성하기 위해서는 생성자를 만드는게 일반적인데요. 팩토리 메소드 패턴은 이런 행위를 위임하게 됩니다. 

2. 팩토리 메소드 패턴

팩토리 메소드 패턴을 이해하기 위해서는 추상 클래스에 대한 이야기부터 해야합니다. 추상 클래스는 아래 링크에서 찾아볼 수 있습니다. https://math-development-geometry.tistory.com/40?category=708726

 

C# - 추상 클래스, 가상 클래스 - abstract, virtual 사용법

지난 포스팅 인터페이스에서 잠시 언급된 추상과 가상에 대한 이야기를 하도록 하겠습니다. 추상과 가상을 먼저 이야기 했으면 좋았겠지만, 제 포스팅은 그냥 의식의 흐름으로 적는 포스팅이기 때문에 순서가 엉망..

math-development-geometry.tistory.com

추상 클래스는 해당 클래스의 기능을 구현할 수 있기도 하지만 파생 클래스에서 해당 기능을 직접 구현할 수 있도록 인터페이스를 제공하는 기능을 하게 됩니다. 여기서 팩토리 메소드 패턴을 사용하기 위해서는 메소드를 추상으로 선언하여 해당 클래스를 상속 받은 파생 클래스에서 생성하는 기능을 구현하게 됩니다. 이렇게 되면 기본적인 구조가 잡힌 상태에서 여러 사람이 각자 파생 클래스를 구현하게 되면서 협업이 가능하게 됩니다. 또 기능이 바뀌거나 새로운 기능을 추가할때 해당 객체만 변경하면 되기 때문에 객체를 생성하는 코드가 유연하게 변경할 수 있는 장점이 있습니다. 그리고 필요한 경우 증복 기능을 묶어 다른 클래스로 생성하여 구조를 잡을 수 있습니다. 

일반적으로 팩토리 메소드 패턴의 경우 Product, ConcreteProduct, Creator, ConcreteCreator로 4가지로 나눠 구현을 하게 됩니다. Product는 팩토리 메서드로 생성될 공용 객체입니다. 그리고 ConcreteProduct 는 Product를 상속받아 생성되는 클래스입니다. ConcreteProduct는 필요에 따라서 생성이 가능합니다. Creator는 Product를 생성하는 메서드가 있는 클래스입니다. ConcreteCreator는 팩토리 메서드를 구현하는 클래스로 Creator를 상속받아 각각의 ConcreteProduct를 구현하는 메서드가 명시되어 있습니다.

  Product Creator
- Product Creator
Concrete ConcreteProduct ConcreteCreator

4가지를 구분하는 방법은 Product는 실제 객체 클래스를 표현하고 Creator는 생성되는 메서드가 있는 클래스입니다. 그리고 - 는 상속을 할 클래스이고 Concrete는 -를 상속 받은 클래스입니다. 

3. 예제

해당 예제를 통해서 자세하게 알아보도록 하겠습니다. 해당 코드는 삼각형, 사각형과 같은 도형을 표현하는 클래스를 팩토리 메서드 패턴을 이용하여 제작한 것입니다. 

Shape은 모든 도형의 파생 클래스가 됩니다. 팩토리 메소드 패턴의 Product가 됩니다. 그리고 Shape을 상속 받아서 다양한 도형을 만들 수 있습니다. 그렇게 만들어진 도형이 ConcreteProduct입니다.

이제 Creator 클래스입니다.

그리고 Circle과 Triangle를 생성하는 Creator는 아래와 같습니다. 

예제 코드는 아주 간단한 코드만 작성한 것인데요. 이를 좀 더 자세하게 작성하면서 생성하는 코드와 실제 코드를 구분하며 객체를 생성하는 Factory를 따로 작성하는 것입니다.

1. 요약

싱글톤 패턴은 아주 간단하거나 단순한 프로그램을 만들때 유용하게 사용할 수 있는 디자인 패턴입니다. 싱글톤 패턴을 사용하게 되면 모든 데이터를 전역으로 관리할 수 있기 때문에 쉽게 접근할 수 있다는 장점이 있습니다. 하지만 이는 복잡하고 체계적인 프로그램을 만드는데 다양한 문제를 만들 수 있는 가능성이 있는 디자인 패턴으로 조금해서 사용해야 합니다. 

2. 싱글톤 패턴

싱글톤 패턴은 해당 객체의 메모리를 정적으로 할당하여 하나의 객체에만 접근하는 방법입니다. 따라서 프로그램이 동작하는 동안 최초로 생성된 객체 하나에만 접근하게 되므로 데이터를 접근하고 수정하는데 아주 용이한 특징이 있습니다. 그리고 생성자를 다른 곳에서 새롭게 선언을 하더라도 이미 정적으로 선언된 객체가 반환되기 때문에 중복되어 생성되는 것을 방지 할 수 있습니다. 그리고 초기 객체를 생성을 하게 되면 정적 메모리에 올라가기 때문에 이후 호출하는데 아주 빠르게 접근할 수 있는 장점이 있습니다. 

하지만 싱글톤 패턴을 사용할때 문제점도 많이 생기는데요. 우선 정적 메모리에 할당된 객체로 해당 객체에 너무 큰 메모리가 쌓이게 되면 프로그램 성능이 현저하게 낮아질 수 있습니다. 이는 정적 메모리에 할당할 수 있는 메모리 크기가 제한적이기 때문입니다. 그리고 프로그램이 복잡해지면서 서로 다른 데이터를 공유하게 되는데 이때 다른 객체들과 결합도가 낮아지게 됩니다. 이는 디버깅 과정 등 협업을 하는데 어려움이 됩니다. 또 하나의 정적 메모리를 사용하기 때문에 병렬처리나 동기화와 같이 여러방법으로 메모리에 접근하는데 문제가 생기게 됩니다.  

따라서 싱글톤 패턴을 사용하는데 있어서 그 용도와 한계를 명확하게 알고 사용하는 것이 중요합니다. 싱글톤의 경우 병렬처리나 동기화를 위해서 사용되는 방법이 따로 존재하지만, 이는 프로그래밍 언어가 발전하면서 다양한 기법들이 나오면서 가능해진 것입니다. 따라서 싱글톤과 멀티쓰레드를 동시에 사용할 일이 있다고 하더라도 이를 둘다 선택하는게 아닌 다른 방법이 있는지 찾아보는 것이 더 좋은 방법이 됩니다.   

 3. 예제

지금부터 싱글톤 패턴이 어떻게 사용되는지 실제 코드를 가지고 이야기하도록 하겠습니다. 

Singleton으로 클래스를 생성한 기본 코드입니다. Singleton 이라는 클래스 이름을 갖고, 내부에는 static 으로 객체를 하나 생성합니다. 그리고 static 함수로 해당 객체의 정적 객체를 반환하는 함수를 만들었습니다. 그리고 해당 객체가 null 인 경우에만 다시 생성을 하게 됩니다. 따라서 한번 생성된 객체가 null 이 되기 전까지는 기존에 생성된 static 객체를 사용하게 됩니다.

실제 Main 함수에서는 Singleton.Instance() 함수를 이용해서 생성된 객체에 접근할 수 있습니다. 그리고 objectA, objectB, objectC를 생성하더라도 각 객체는 모두 같은 객체입니다.

+ Recent posts