본문 바로가기

   
Programming/Java

12일차!

반응형
package collection.set;

import java.util.HashMap;

public class MapDemo3 {
     
      public static void main(String[] args){
           HashMap<String, Object> personMap = new HashMap<String, Object>();
            personMap.put( "name", "홍길동" );
            personMap.put( "age", 23); //personMap.put("age", new Integer(23));
            personMap.put( "height", 65.4); //personMap.put("age", new Double(65.4));
            personMap.put( "phone", "010-1234-5678");
           
            //HashMap에 지정된 고객정보를 꺼내기
           String value1 = (String) personMap.get( "name");
            int value2 = (Integer) personMap.get( "age");
            double value3 = (Double) personMap.get( "height");
           String value4 = (String) personMap.get( "phone");
           
           System. out.println( "이름은 : " + value1 );
           
            //Set<E> List>E>
            //->Set과 List는 값을 여러 개 담을 수 있다.
            //<E>는 Set과 List에 담고 싶은 값의 타입을 지정하는 자리다.
           
            //Set과 List에 값을 저장하는 경우 add(E e)를 사용한다.
            //Set과 List에 값을 추출하는 경우 for()문을 사용한다.
            //Set과 List에 저장된 값으 갯수는 size()를 사용해서 조회한다.
            //Set과 List에 비어있는 값을 확인할때는 isEmpty()를 사용해서 알아낸다.
            //Set과 List에서 특정한 값을 지울때는 remove(Object o)를 사용한다.
           
            //Map<K,V>
            //-> Map의 {key와 Value}의 묶음을 여러 개 담을 수 있다.
            //-> <K>는 key의 타입이다. 주로 String으로 지정된다.
            //-> <V>는 Value의 타입이다. 저장하려는 값을 저장한다.
           
            //Map에 값을 저장하는 경우 put(K k, V v)를 사용한다.
            //Map에서 값을 추출하는 경우 V get(K k)를 사용한다.
            //Map에 저장된{key와 Value}의 갯수는 size()를 사용해서 조회한다.
            //Map이 비어있는지 확인할 때는 isEmpty()를 사용해서 알아낸다.        
            //Map에서 특정한 값을 지울 때는 remove(Object key)를 사용한다.
     }
}


package collection.ex;
import java.util.HashSet;

public class NumberRepo {
      // 숫자들이 저장된 Set객체
      private HashSet<Integer> numbers = new HashSet<Integer>();
     
      //numbers에 전달받은 숫자를 하나씩 저장하는 기능
      public void addNewNumber( int num){
            numbers.add( num);
     }
     
      //numbers에 저장된 전체 숫자의 총합을 제공하는 기능
      public int getTotal(){
            //리스트에 들어간 숫자를 차례대로 더해준다.         
            int sum = 0;
           
            for(Integer n : numbers){
                 sum += n;
           }
           
            return sum;
     }
     
      //numbers에 저장된 숫자중에서 가장 큰 값을 제공하는기능
      public int getMax(){
            int max = Integer. MIN_VALUE;
            for(Integer n : numbers){
                 if( max < n){
                      max = n;
                }
           }
           
            return max;
     }
     
      //numbers에 저장된 숫자중에서 가장 작은 값을 제공하는기능
      public int getMin(){
            int min = Integer. MAX_VALUE;
            for(Integer n : numbers){
                 if( min > n){
                      min = n;
                }
           }
            return min;
     }
     
      //numbers에서 짝수인 숫자들만 뽑아서 제공하는기능
      public HashSet<Integer> getEvenNumbers(){

            HashSet<Integer> even = new HashSet<Integer>();
            for(Integer n : numbers){           
                 if( n%2==0){
                      even.add( n);
                 }
            }
            return even;
      }
     
      //numbers에 저장된 숫자를 화면에 표시하는 기능
      public void displayNumbers(){
           System. out.print( "랜덤 나온숫자 : " );
            for(Integer n : numbers){
                System. out.print( n + " ");
           }
     }
     
}


package collection.set;

import collection.ex.NumberRepo;

import java.util.HashSet;
import java.util.Random;

public class NumberRepoDemo {
      public static void main(String[] args){
           NumberRepo n = new NumberRepo();
           Random r = new Random();
            //기능을 모두 쪼개어서 구현하도록한다. 잘게 쪼개서 구현
            for( int i=0; i<20; i++){
                 n.addNewNumber( r.nextInt(10000)+1);
           }
           
           System. out. println( "합계 : " + n.getTotal());
           System. out. println( "가장큰값 : " + n.getMax());
           System. out. println( "가장큰값 : " + n.getMin());       
           
            n.displayNumbers();
           
           HashSet<Integer> even = n.getEvenNumbers();
           System. out.println();
           System. out. println( "짝수만 출력 : " + even);
           
            /**
           합계 : 98904
           가장큰값 : 9643
           가장큰값 : 528
           랜덤 나온숫자 : 6211 5380 5670 5127 4999 3850 9643 6477 5198 528 1233 1395 4822 5047 5049 8476 6493 6077 2206 5023
           짝수만 출력 : [528, 5380, 5670, 4822, 3850, 8476, 5198, 2206]
            */
     }
}


package collection.ex;

public class Item implements Comparable<Item>{

      private String name;
      private int price;
      private String maker;
      private double discountRate;
     
      public Item(){}
     
      public Item(String name, int price, String maker, double discountRate) {
            super();
            this. name = name;
            this. price = price;
            this. maker = maker;
            this. discountRate = discountRate;
     }
     
      public String getName() {
            return name;
     }
      public void setName(String name) {
            this. name = name;
     }
      public int getPrice() {
            return price;
     }
      public void setPrice( int price) {
            this. price = price;
     }
      public String getMaker() {
            return maker;
     }
      public void setMaker(String maker) {
            this. maker = maker;
     }
      public double getDiscountRate() {
            return discountRate;
     }
      public void setDiscountRate( double discountRate) {
            this. discountRate = discountRate;
     }

      @Override
      public String toString() {
            return "Item [name=" + name + ", price=" + price + ", maker=" + maker
                     + ", discountRate=" + discountRate + "]" ;
     }

      @Override
      public int compareTo(Item o) {
            // TODO Auto-generated method stub
            return ( this. price - o. price);
     }
     
}


package collection.ex;

import java.util.ArrayList;
import java.util.Collections;

public class Market {
      //여러 상품을 보유하고 있다.
      private ArrayList<Item> items = new ArrayList<Item>();
     
     
      //새로운 상품을 저장하는 기능
      public void adNewItem(Item item){
            items.add( item);
     }
     
      // 제조사별 상품을 반환하는 기능
      public ArrayList<Item> searchItemsByMaker(String maker){
           ArrayList<Item> item = new ArrayList<Item>();
           
            for(Item i : items){
                 if( maker.equals( i.getMaker())){
                      item.add( i);
                }
           }
            return item;
     }
     
      // 지정된 가격범위내의 상품을 반환하는 기능
      public ArrayList<Item> searchItemsByPriceRange( int minprice, int maxprice){
            ArrayList<Item> item = new ArrayList<Item>();
           
            for(Item i : items){
                      if( i.getPrice() >= minprice && i.getPrice() <= maxprice){
                            item.add( i);
                     }
                }
            return item;
      }
     
      //보유하고 있는 모든 상품정보를 표시하는 기능
      public void displayItems(){
            for(Item i : items){
                 System. out.println( i);
            }
      }
     
      public void ArraySort(){
            Collections. sort( items);
            displayItems();
      }
     
}


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< Itemitems = 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/)에 가보면 이 영양 머리모양을 마크로 하고 있음을 알 수 있습니다.


반응형