package collection.ex;
import java.util.ArrayList;
public class MarketDemo {
public static void main(String[] args){
Market m = new Market();
m.adNewItem( new Item( "분유" , 45000, "아기맘" , 20.2));
m.adNewItem( new Item( "TV", 235000, "금성" , 10.2));
m.adNewItem( new Item( "라디오" , 121000, "금성" , 5.2));
m.adNewItem( new Item( "컴퓨터" , 1280000, "삼성" , 8.2));
m.adNewItem( new Item( "아이폰" , 820000, "애플" , 15.2));
m.adNewItem( new Item( "갤럭시S5" , 920000, "삼성" , 11.2));
m.adNewItem( new Item( "아이튠즈" , 45000, "애플" , 5.2));
//ArrayList<Item> item = m.searchItemsByMaker("애플");
ArrayList<Item> item = m.searchItemsByPriceRange(10000, 500000);
//for(Item list : item){
//System.out.println("정렬전" + list);
//}
m.displayItems();
System. out.println( "----------------------------정렬후----------------------------" );
m.ArraySort();
/*결과___________________________________________________
Item [name=분유, price=45000, maker=아기맘, discountRate=20.2]
Item [name=TV, price=235000, maker=금성, discountRate=10.2]
Item [name=라디오, price=121000, maker=금성, discountRate=5.2]
Item [name=컴퓨터, price=1280000, maker=삼성, discountRate=8.2]
Item [name=아이폰, price=820000, maker=애플, discountRate=15.2]
Item [name=갤럭시S5, price=920000, maker=삼성, discountRate=11.2]
Item [name=아이튠즈, price=45000, maker=애플, discountRate=5.2]
----------------------------정렬후----------------------------
Item [name=분유, price=45000, maker=아기맘, discountRate=20.2]
Item [name=아이튠즈, price=45000, maker=애플, discountRate=5.2]
Item [name=라디오, price=121000, maker=금성, discountRate=5.2]
Item [name=TV, price=235000, maker=금성, discountRate=10.2]
Item [name=아이폰, price=820000, maker=애플, discountRate=15.2]
Item [name=갤럭시S5, price=920000, maker=삼성, discountRate=11.2]
Item [name=컴퓨터, price=1280000, maker=삼성, discountRate=8.2]
*/
}
}
package collection.ex;
import java.util.ArrayList;
public class ItemUtils {
//전달받은 상품들중에서 가장 비싼 상품을 찾아서 반환하는 기능
public Item getMaxPriceItem(ArrayList<Item> items){
Item item = null;
int max = 0;
for(Item i : items){
if( i.getPrice() > max){
item = i;
max = i.getPrice();
}
}
return item;
}
//전달받은 상품들중에서 지정된 제조사의 상품들을 찾아서 반환하는 기능
public ArrayList<Item> getManufacturer(ArrayList<Item> items){
ArrayList<Item> item = new ArrayList<Item>();
for(Item i : items){
if( "애플" .equals(i .getMaker())){
item.add( i);
}
}
return item;
}
//전달받은 상품들의 전체 가격을 반환하는 기능
public int getAllPrice(ArrayList<Item> items){
int fullPrice = 0;
for(Item i : items){
fullPrice += i.getPrice();
}
return fullPrice;
}
//전달받은 상품들중에서 지정된 가격범위내의 상품들을 찾아서 반환하는 기능
public ArrayList<Item> getPricerange(ArrayList<Item> items){
ArrayList<Item> item = new ArrayList<Item>();
for(Item i : items){
if( i.getPrice() >= 10000 && i.getPrice() <= 500000){
item.add( i);
}
}
return item;
}
//전달받은 상품들을 화면에 표시하는 기능
public void disPlay(ArrayList<Item> items){
for(Item i : items){
System. out.println( i);
}
}
@Override
public String toString() {
return "ItemUtils [getClass()=" + getClass() + ", hashCode()="
+ hashCode() + ", toString()=" + super.toString() + "]";
}
}
package collection.ex;
import java.util.ArrayList;
public class ItemDemo {
public static void main(String[] args){
ArrayList< Item> items = new ArrayList<Item >();
items.add( new Item( "분유", 45000, "아기맘" , 20.2));
items.add( new Item( "TV", 235000, "금성" , 10.2));
items.add( new Item( "라디오", 121000, "금성" , 5.2));
items.add( new Item( "컴퓨터", 1280000, "삼성" , 8.2));
items.add( new Item( "아이폰", 820000, "애플" , 15.2));
items.add( new Item( "갤럭시S5", 920000, "삼성" , 11.2));
items.add( new Item( "아이튠즈", 45000, "애플" , 5.2));
ItemUtils iu = new ItemUtils();
System. out.println( iu.getMaxPriceItem( items));
//iu.disPlay(items);
}
}
http://www.google.com/trends/ -> 꿀잼
package collection.iterator;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args){
HashSet<Integer> numbers = new HashSet<Integer>();
numbers.add(23);
numbers.add(34);
numbers.add(53);
numbers.add(3);
ArrayList<Integer> numbers1 = new ArrayList<Integer>();
Iterator<Integer> it = numbers.iterator();
boolean isExist = it.hasNext();
System. out.println( isExist);
//하나씩 hasnext를 할때마다 하나씩 소모됨 실제 객체가 사라지는건 아님
// if(it.hasNext()){
// int value = it.next();
// System.out.println(value);
// }
//
// if(it.hasNext()){
// int value = it.next();
// System.out.println(value);
// }
//
// if(it.hasNext()){
// int value = it.next();
// System.out.println(value);
// }
// if(it.hasNext()){
// int value = it.next();
// System.out.println(value);
// }
while( it.hasNext()){
int value = it.next();
System. out.println( value);
}
}
}
오픈소스 라이센스가 무엇인지 변형하여 돈을 벌어도 됨 변형한것을 공개해야함.
GPL 라이센스가 무엇인지MISL 라이센스
오픈소스SW는 소스코드가 공개되어 있는 SW를 말하며, 일반적으로 자유롭게 사용/복제/배포/수정할 수 있다. 오픈소스SW의 대표적인 예로는 Linux 커널 및 아파치 웹서버, FireFox 웹브라우저, MySQL 등이 있다.
전 세계적으로 오픈소스SW는 FSF(Free Software Foundation)의 자유SW(Free Software)를 포함한 넓은 의미로 사용되고 있다. 하지만 자유SW와 오픈소스SW는 역사 및 추구하는 이념 등에서 미묘한 차이가 있다.
1980년대부터 소프트웨어가 거대 부가가치 산업으로 발전하자, 지적재산권 및 라이선스 계약을 통하여 소프트웨어의 사용, 복제, 배포, 수정에 제한을 가하려는 움직임이 나타났다. 이런 움직임에 반대하여 리처드 스톨만은 FSF를 설립하고 자유SW(Free Software) 운동을 전개하였다.
그러나 자유SW의 ‘자유(Free)’라는 단어가 일반인들에게 ‘무료’로 인식되고, 엄격한 GPL조항 때문에 상용SW개발에 이용할 수 없어 대다수 기업들이 자유SW운동에 참여를 꺼려하자 소스코드 공개에 보다 많은 참여를 이끌어내기 위하여 에릭 레이먼드, 브루스 페런스 등은 '오픈소스 (Open Source)' 라는 새로운 용어를 제안했다.
그리고 이러한 ‘오픈소스’는 1998년 오픈소스SW 활성화 및 오픈소스SW에 대한 인증을 담당하는 OSI (Open Source Initiative)가 결성되면서 널리 사용되기 시작했다. OSI는 오픈소스에 해당하는 라이선스의 최소한의 기준을 정의 (Open Source Definition, OSD)해놓고 이 정의에 따라 인증, 관리 및 촉진시키는 일을 한다.
- GPL 전문(한국어 번역본): http://korea.gnu.org/documents/copyleft/gpl.ko.html
- GPL FAQ(한국어 번역본): http://www.gnu.org/licenses/gpl-faq.ko.htm
- LGPL 전문(한국어 번역본):http://korea.gnu.org/people/chsong/copyleft/lgpl.ko.html
- KLDP 오픈소스 SW 라이센스 가이드:http://wiki.kldp.org/wiki.php/OpenSourceLicenseGuide
GLP/LGPL 전문은 읽어봐도 내용이 어려워서 무슨 말인지 알기가 쉽지 않네요. 하지만 KLDP 가이드를 보면 여러 오픈소스 SW 라이센스(GPL/LGPL/BSD 등)들이 잘 비교 정리되어 있습니다.
GNU GPL(General Public License)
GPL은 Free Software Foundation(FSF)에서 만든 Free 소프트웨어 라이센스로 1989년 1차 버전, 1991년 2차 버전, 2007년 3차 버전까지 발표되었습니다.
기본적으로 어떤 프로그램을 개발할 때, GPL 코드를 일부라도 사용하게 되면 그 프로그램은 GPL이 됩니다. GPL을 가진 프로그램을 유료로 판매하는 것은 가능하지만, 반드시 전체 소스코드는 무료로 공개해야 합니다.
GPL 코드를 사용한 SW를 내부적인(개인, 기관, 단체 등) 목적으로만 사용할 때에는 소스코드를 공개할 필요가 없지만 어떤 형태로든(유료든 무료든) 외부에 공표/배포할 때에는 전체 소스코드를 공개해야 합니다.
예를 들어, GPL 코드를 수정하거나 일부 사용하여 프로그램을 개발했습니다. 이제 개발된 프로그램을 개인적으로 혹은 기관, 단쳬 내부적으로만 사용하자고 하면 코드를 공개할 의무는 없으며 그냥 사용하면 됩니다. 그런데 이 프로그램을 외부에 공개하거나 판매하고자 할 경우에는 반드시 GPL 규정에 따라서 프로그램의 전체 소스코드를 무료로 공개해야 합니다.
전체 소스코드를 무료로 공개하면서 프로그램을 유료로 판매하는 것이 얼핏 이해가 안가지만, 개발자가 아닌 일반 소비자 입장에서는 충분히 구매할 수 있다고 생각됩니다. 그리고 기관 등에 프로그램을 판매할 때에는 단순한 소스코드가 아닌 시스템 구축, 관리, 유지보수 등 토탈 솔루션을 판매한다고 생각할 수 있습니다. 이러한 것들은 아무리 소스가 공개되어 있어도 비전문가가 하기 힘든 일이기 때문입니다.
그런데, 코드를 공개하면 다른 개발자가 이를 기반으로 좀더 개선된 버전의 제품을 개발하여 판매할 수도 있을 것입니다. 일견 억울할 수도 있겠네요..
GPL 관련하여 한가지 햇갈리기 쉬운 점이 있는데, 그건 자신이 개발한 SW에서 GPL 코드를 일부만 사용한 경우입니다.
GPL 전문에 보면, '만일 배포하고자 하는 프로그램의 특정 부분이 GPL 코드로부터 파생된 것이 아닌 독립적인 저작물일 경우에는 독립 저작물 모듈의 개별적인 배포에는 GPL이 적용되지 아니한다 (즉, 코드를 공개할 필요가 없다). 하지만 프로그램을 전체(GPL코드에서 파생된 모듈 + 독립 저작물 모듈)적으로 배포할 때에는 GLP을 따라야 한다.' 고 되어 있습니다.
결론적으로, 'GPL과 관련되지 아니한 부분만 독립적으로 팔거나 배포하는 경우는 관계가 없다. 하지만 GPL 코드를 일부라도 사용한 프로그램 전체를 배포할 때에는 GPL을 적용(즉, 프로그램의 전체 소스코드 공개)해야 한다'는 말이겠네요.. 상당히 강도가 세군요..
기타 세부적인 내용에 대해서는 GPL 전문과 GPL FAQ를 참조하시면 좋습니다. 특히 GPL FAQ를 읽어보면 GPL을 이해하는데 도움이 많이 됩니다.
GPL 전문에 있는 '보통의 소프트웨어 라이센스들이 SW에 대한 공유와 수정의 자유를 제한하려는 목적을 가진 반면에 GPL은 공유와 수정의 자유를 보장하기 위한 규정이다'라는 말이 꽤나 인상적이네요..
GNU LGPL(Lesser General Public License)
LGPL은 GPL보다는 훨씬 완화된(lesser) 조건의 공개 소프트웨어 라이센스입니다.
가장 큰 차이점은 LGPL 코드를 정적(static) 또는 동적(dynamic) 라이브러리로 사용한 프로그램을 개발하여 판매/배포할 경우에 프로그램의 소스코드를 공개하지 않아도 된다는 점입니다. LGPL 코드를 사용했음을 명시만 하면 됩니다.
단, LGPL 코드를 단순히 이용하는 것이 아니라 이를 수정한 또는 이로부터 파생된 라이브러리를 개발하여 배포하는 경우에는 전체 코드를 공개해야 합니다.
BSD (Berkeley Software Distribution) 라이센스
소스코드 공개의 의무가 없으며 상용(상업적) 소프트웨어에서도 무제한 사용 가능한 라이센스라고 하는데.. 그렇다면 아무런 제한이 없는 라이센스라는 의미겠네요.
참고로 OpenCV는 BSD 라이센스를 따릅니다. GPL 정신에는 맞지 않겠지만 쓰는 사람 입장에서는 정말 편하네요..
GNU
문득 GNU는 무엇의 약자일까? 하는 궁금증이 생겨서 같이 찾아보았습니다.
"GNU's Not Unix"의 약자라는군요. gnu는 unix가 아니다.. ㅡ.ㅡ
이런 것을 재귀약자라고 한다네요.
참고로 아프리카 영양중에 gnu(누~ 라고 발음)라는 것이 있는데, 이것과 구분하여 GNU는 '그누~'라고 발음한답니다. 그리고 GNU 홈페이지(http://www.gnu.org/)에 가보면 이 영양 머리모양을 마크로 하고 있음을 알 수 있습니다.