Developer Factory

22. JAVA parseInt,Collection(List, Set,Map . .) 본문

Developer/Java

22. JAVA parseInt,Collection(List, Set,Map . .)

Jeremy.Park 2014. 7. 3. 00:16


parseInt() 함수

parseInt() 함수는 문자열을 정수로 변환시켜주는 함수입니다. 얼핏보기에는 eval() 함수나 Number() 함수와 비슷해 보이지만, parseInt() 함수는 매개변수를 이용하여 8진수, 16진수 등의 수로도 변환이 가능하며, 숫자형과 문자형이 혼합된 문자열에서 숫자형 뒤에오는 문자형은 0을 반환하여 숫자만 출력 시켜 줍니다.

또, 소수인 경우에는 소숫점 이하를 버리고 정수만 반환합니다.

형식은 다음과 같습니다.

parseInt(숫자형문자열,[진수])

위의 형식에서 [진수] 부분을 생략하면 보통의 10진수로 반환됩니다.

구체적으로 예문을 보며 알아볼까요?

  1. <SCRIPT LANGUAGE="JavaScript">
  2. <!--
  3. document.write("parseInt('33') + parseInt('55') ===> " + (parseInt('33') + parseInt('55')) + "<br>");
  4. document.write("parseInt('33',8) ===> " + parseInt('33',8) + "<br>");
  5. document.write("parseInt('33',16) ===> " + parseInt('33',16) + "<br>");
  6. document.write("parseInt('worldcup2002') ===> " + parseInt('worldcup2002') + "<br>");
  7. document.write("parseInt('2002worldcup') ===> " + parseInt('2002worldcup') + "<br>");
  8. document.write("parseInt('33') + parseInt('55.123') ===> " + (parseInt('33') + parseInt('55.123')) + "<br>");
  9. //-->
  10. </SCRIPT>

첫 번째 예문에서는 문자열로 저장된 숫자형을 숫자로 변환하여 계산된 결과값 88을 반환합니다.

두 번째와 세 번째 예문에서는 33이라는 10진 숫자를 각각 8진수, 16진수로 변환하여, 27과, 51을 반환합니다.

6번라인의 네 번째 예문에서는 'worldcup2002' 의 첫 번째에 문자가 들어가 있으므로 isNaN을 반환하고, 7번라인의 예문에서는 숫자형뒤에 문자가 있으므로 문자열을 무시하고 2002 만 반환하게 됩니다.

마지막으로 8번 라인을 보면 소수가 입력되면 소숫점 아래부분은 버리고 정수로 변환하여 33+55=88을 반환하여 줍니다.

<기본 데이터형 랩퍼 클래스>
java 는 기본 데이터형(정수형, 문자형, 논리형) 에 대응하는 클래스가 있다.
이 클래스들을 랩퍼 클래스라고 한다.
랩퍼 클래스의 오브젝트는 변수와 같이 사용할 수 있다.

기본데이터형 : 랩퍼 클래스

byte : Byte
short : Short
char : Character
int : Integer
long : Long
float : Float
double : Double
boolean : Boolean



<수치형 랩퍼 클래스>
수치형 랩퍼 클래스 Byte, Short, Integer, Long, Double 에는 아래와 같은 메서드가 있다.
byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()

위 메서드를 이용하면 다른 형으로 변환한 값을 얻을 수 있다.

Integer a = new Integer(30);
double b = a.doubleValue();  //double 형으로 변환된 30.0 을 반환한다.

처럼 같이 사용한다.

그런데, 자바 버전 6.0(내부버전 1.4?) 에서는 Auto-Boxing 이 되기 때문에, 변환할 필요가 없다고 한다.

<equals 메서드를 이용한 비교>
랩퍼 클래스의 오브젝트끼리 비교하기 위해서 equals() 메서드를 이용할 수 있다.


public class a
{
  public static void main(String [] args)
  {
    Integer a = new Integer(10);
    Integer b = new Integer(5);
    boolean c = a.equals(b);
    
    System.out.println(c);
  }
}

결과값은 false 이다.
형은 같지만, 들어있는 값이 틀리기 때문이다.

그러나, 아래와 같은 식은 사용할 수 없다.

    int a=10;
    int b=5;
    boolean c = a.equals(b);
    System.out.println(c);

에러가 발생하는데, equals 는 객체로 선언되지 않았기 때문에, a. 이라는 표현을 쓰지 못해서 생기는듯 하다.
객체로 선언하려면 new 연산자를 이용해서 선언해줘야 한다.

스트링을 equals() 메서드로 비교할때는 아래와 같이 가능하다.

String a = new String();

라고 선언하면 스트링(String) 비교가 가능해진다.


<문자열 변환>

정수형의 랩퍼 클래스인 Byte, Short, Long 에는 각각 문자열을 정수형으로 변환하는 메서드가 있다.

클래스 : 메서드 : 기능
Byte : parseByte() : 문자열을 byte 형으로 변환
Short : parseShort() : 문자열을 short 형으로 변환
Long : parseLong() : 문자열을 long형으로 변환
Integer : parseInt() : 문자열을 int 형으로 변환

예시)

int a = Integer.parseInt("5");

사용예시)

class Change{
  public static void main(String [] args){
    String a = "34";
    int b = 50;
    int c = Integer.parseInt(a);
    int d = c + b;
    System.out.println(a + " + " + b + " = " + d);
  }
}

즉, a 라는 스트링변수에 문자로 34 를 대입한후,
a 문자열을 숫자형으로 변환(parseInt) 한다.
물론, parseInt 할때, 해당 문자열은 숫자값이어야 한다.
만약, 아래와 같이 문자열에 숫자가 아닌 문자가 포함되어 있다면 parseInt 에서 에러가 발생한다.

String a = "가나다34";
int c = Integer.parseInt(a);

라고 한다면, NumberFormatException.forInputString 에러가 발생한다.






컬렉션 프레임워크(Collection Framework)
 - 데이터 군(群)을 저장하는(Vector와 같은) 클래스들을 표준화한 설계를 뜻한다.
   쉽게 말해 객체들을 한 곳에 모아 관리하고 또 그것을 편하게 사용하기 위해서 제공해주는 것을 의미한다.

객체들은 구현화되어 주소로 관리가 된다. 그러나 일반 변수는 컬렉션 프레임워크로 관리를 할 수가 없다.
이러한 이유로 Wrapper 클래스(Integer, Long 등)로 객체화하여 컬렉션 프레임워크로 관리할 수 있다.



 
컬렉션 프레임워크에서는 컬렉션(데이터 그룹)을 크게 3가지 타입이 존재한다고 인식하고 각 컬렉션을 다루는데 필요한 기능을 가진 3개의 인터페이스를 정의하였다.




List 인터페이스
- 중복을 허용하면서 저장 순서가 유지되는 컬렉션을 구현하는데 사용된다.
- ArrayList, LinkedList, Vector, Stack 등

Set 인터페이스
- 중복을 허용하지 않고 저장 순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용됨.
- HashSet, TreeSet 등

Map 인터페이스
- 키와 값을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는데 사용.
- 키는 중복될 수 없지만 값은 중복을 허용한다. 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.
- Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등





java.util 팩키지의 ArrayList에 대해서 살펴보자.

Array는 배열이고, ArrayList는 배열을 리스트처럼 삽입, 삭제가 쉽도록 만든 Collection이다.
(※참고 : ArrayList는 동기화되어 있지 않다. 따라서 Thread 사용시 동기화과정이 필요하다.)

ArrayList에서 자주 사용하는 메소드는

add(Object o)
     객체 매개변수(o)를 목록에 추가한다.

remove(int index)
     index 매개변수로 지정한 위치에 있는 객체를 제거한다.

contains(Object o)
     객체 매개변수 o에 매치되는 것이 있으면 ‘참’을 리턴한다.

isEmpty()
     목록에 아무 원소도 없으면 ‘참’을 리턴한다.

indexOf(Object o)
     객체 매개변수(o)의 인덱스 또는 -1을 리턴한다.

size()
     현재 목록에 들어있는 원소의 개수를 리턴한다.

get(int index)
     주어진 index 매개변수 위치에 있는 객체를 리턴한다.




             // HashSet의 사용
             // - 데이터가 중복되지 않는다.
             //   => 인스턴스가 달라도 해시값과 equals() 결과가 같다면 같은 데이터로 취급
             //     => 중복하여 저장되지 않는다.
             // - 꺼낼 때 순서를 따지지 않는다.
             // - 값을 보관할 때 인스턴스의 해시값으로 라벨을 붙인다.
             HashSet< String> list = new HashSet< String>();
             list.add( new String( "홍길동"));
             list.add( new String( "임꺽정"));
             list.add( new String( "장국영"));
             list.add( new String( "홍길동"));
            
             for( String name : list) {
                   System. out.println( name);
            }





             // Local inner class
             class Student {
                   String name;
                   int age;
                  
                   public Student (String n , int age) {
                         // 로컬변수 이름과 충돌나지 않는다면 this 생략가능.
                         /*this.*/name = n ;
                         this.age = age ; // 파라미터 이름과 동일 => this 생략 불가능.
                  }
                  
                   public String toString() {
                         return name + "," + age ;
                  }
            }
             // HashSet의 사용2
             // - 임의로 만든 클래스 저장
             HashSet< Student> list = new HashSet< Student>();
             list.add( new Student( "홍길동", 18));
             list.add( new Student( "임꺽정", 20));
             list.add( new Student( "장국영", 30));
             list.add( new Student( "홍길동", 18));
            
             for( Student name : list) {
                   System. out.println( name);
            }




             // HashSet의 사용3
             // - hashCode() 와 equals()를 재정의 했을 때
             // Local inner class
             class Student {
                   String name;
                   int age;
                  
                   public Student (String n , int agHashe) {
                         // 로컬변수 이름과 충돌나지 않는다면 this 생략가능.
                         /*this.*/name = n ;
                         this.age = age; // 파라미터 이름과 동일 => this 생략 불가능.
                  }
                  
                   public String toString() {
                         return name + "," + age ;
                  }

                   @Override
      public int hashCode() {
            final int prime = 31 ;
            int result = 1;
            result = prime * result + age;
            result = prime * result + (( name == null) ? 0 : name.hashCode());
            return result ;
      }

                   @Override
      public boolean equals(Object obj) {
            if ( this == obj )
                  return true ;
            if ( obj == null)
                  return false ;
            if ( getClass() != obj. getClass())
                  return false ;
            Student other = ( Student) obj;
            if ( age != other. age)
                  return false ;
            if ( name == null) {
                  if ( other. name != null)
                        return false ;
            } else if (!name .equals(other .name ))
                  return false ;
            return true ;
      }
                  
                  
            }
            
             Student s1 = new Student( "홍길동", 18);
             Student s2 = new Student( "임꺽정", 20);
             Student s3 = new Student( "장국영", 30);
             Student s4 = new Student( "홍길동", 18);
            
             if ( s1 == s4) System. out.println( "s1 == s2");
             if ( s1.equals( s4)) System. out.println( "s1.equals(s4)");
             if ( s1.hashCode() == s4.hashCode()) System.out.println("해시값 같다" );
            
             HashSet< Student> list = new HashSet< Student>();
             list.add( s1);
             list.add( s2);
             list.add( s3);
             list.add( s4);
            
             for( Student name : list) {
                   System. out.println( name);
            }


             // HashMap 사용
             // - 데이터를 저장할 때 키 객체가 필요함.
             // - 데이터를 꺼낼 때도 키 객체가 필요함.
             // - 값이 중복 저장되는 것은 허용.
             // - 키가 중복되는 것은 허용하지 않는다.
             HashMap< String, String> map = new HashMap< String, String>();
             map.put( "100", "홍길동" );
             map.put( "200", "임꺽정" );
             map.put( "300", "장국영" );
             map.put( "400", "홍길동" );
            
             map.put( "400", "오호라" ); // 기존의 값을 덮어씀.
            
             System. out.println( map.get( "100") );
             System. out.println( map.get( "200") );
             System. out.println( map.get( "300") );
             System. out.println( map.get( "400") );
            
             // 값 목록만 꺼낼 수 있다.
             System. out.println( "--------------------------");
             for ( String name : map.values()) {
                   System. out.println( name);
            }
            
             // 키 목록만 꺼낼 수 있다.
             System. out.println( "--------------------------");
             for ( String key : map.keySet()) {
                   System. out.println( key);
            }
            



             // HashMap의 키를 Integer로 교체
             HashMap< Integer, String> map = new HashMap<Integer,String >();
             map.put( new Integer( 100), "홍길동");
             map.put( 200, "임꺽정");
             map.put( 300, "장국영");
             map.put( 400, "홍길동");
            
             map.put( 400, "오호라"); // 기존의 값을 덮어씀.
            
             // Integer 인스턴스 비교 테스트
             Integer i1 = new Integer( 100);
             Integer i2 = new Integer( 100);
             if ( i1 == i2) System. out.println( "같다......");
             if ( i1.equals( i2)) System. out.println( "equals..ok");
             if ( i1.hashCode() == i2.hashCode()) System.out.println("hash...ok" );
                        
             System. out.println( map.get( new Integer( 100)) );
             System. out.println( map.get( 200) );
             System. out.println( map.get( 300) );
             System. out.println( map.get( new Integer( 400)) );
            
             // 값 목록만 꺼낼 수 있다.
             System. out.println( "--------------------------");
             for ( String name : map.values()) {
                   System. out.println( name);
            }
            
             // 키 목록만 꺼낼 수 있다.
             System. out.println( "--------------------------");
             for ( Integer key : map.keySet()) {
                   System. out.println( key);
            }
            



             // HashMap의 키를 MyKey로 교체
             class MyKey {
                   int keyNo;
                  
                   public MyKey (int keyNo) {
                         this.keyNo = keyNo ;
                  }
            }
            
             MyKey k1 = new MyKey( 100);
            
             HashMap< MyKey, String> map = new HashMap< MyKey, String>();
             map.put( k1, "홍길동");
            
             MyKey k2 = new MyKey( 100);
            
             if ( k1 == k2) System. out.println( "인스턴스 같다......" );
             if ( k1. equals( k2)) System. out.println( "equals..ok");
             if ( k1. hashCode() == k2. hashCode()) System.out.println("hash...ok" );
            
             // 비록 내용은 같지만 hashCode()와 equals()를 재정의하지 않았다.
             System. out.println( map.get( k2) ); // null 리턴 








             // HashMap의 키를 MyKey로 교체
             // - hashCode()와 equals() 재정의
             class MyKey {
                   int keyNo;
                  
                   public MyKey (int keyNo) {
                         this.keyNo = keyNo ;
                  }

                   @Override
      public int hashCode() {
            final int prime = 31 ;
            int result = 1;
            result = prime * result + keyNo;
            return result ;
      }

                   @Override
      public boolean equals(Object obj) {
            if ( this == obj )
                  return true ;
            if ( obj == null)
                  return false ;
            if ( getClass() != obj. getClass())
                  return false ;
            MyKey other = ( MyKey) obj;
            if ( keyNo != other. keyNo)
                  return false ;
            return true ;
      }
            }
            
             MyKey k1 = new MyKey( 100);
            
             HashMap< MyKey, String> map = new HashMap< MyKey, String>();
             map.put( k1, "홍길동");
            
             MyKey k2 = new MyKey( 100);
            
             if ( k1 == k2) System. out.println( "인스턴스 같다......" );
             if ( k1.equals( k2)) System. out.println( "equals..ok");
             if ( k1.hashCode() == k2.hashCode()) System.out.println("hash...ok" );
            
             // 비록 내용은 같지만 hashCode()와 equals()를 재정의하지 않았다.
             System. out.println( map.get( k2) ); // null 리턴