본문 바로가기
Programming/java 고급과정

java 고급과정 6일차

by 막이 2012. 3. 12.
String vs StringBuilder vs StringBuffer

String은 변경되지 않는(immutable) 반면에,
StringBuffer와 StringBuilder는 그 값을 변경할 수 있다.

StringBuffer와 StringBuilder의 유일한 차이점은,
StringBuffer가 동기화(synchronized)되고, StringBuilder는 동기화되지 않는(unsynchronized) 것이다.
따라서, 프로그램이 단일 쓰레드 환경(single thread)에서 동작해야 한다면,
StringBuilder를 쓰는 것이 낫다.
StringBuilder가 StringBuffer보다 더 효율적(efficient)이다.

다음은, String, StringBuffer, 그리고 StringBuilder를 선택하는 기준이다.
  1. 문자열(text)이 변경되지 않을 것이라면, String을 사용한다. 왜냐하면, String은 변경되지 않기 때문이다.
  2. 문자열(text)이 변경되고, 단일 쓰레드 환경(single thread)에서 동작한다면,
    StringBuilder를 사용한다. 왜냐하면, StringBuilder는 비동기적(unsynchronized)이기 때문이다.
  3. 문자열(text)이 변경되고, 다중 쓰레드 환경(multi threads)에서 동작한다면,
    StringBuffer를 사용한다. 왜냐하면, StringBuffer는 동기적(synchronized)이기 때문이다.





ArrayLIst : 단방향 포인터 구조, 순차적인 접근에 빠른 성능을 보임
생성방법 -  new ArrayList();
ArrayList 선언 시점에 어떤 타입의 레퍼런스를 담을 것인지 <>를 이용해서 명시해야함
ex) ArrayList<String> list = new ArrayList<String>();

add() 메소드를 이용해 문자열 추가. 내부적으로 인덱스를 가지고 있기 때문에 새로운 데이터가 추가될때마다 자동으로 인덱스 값을 변화시키며 데이터를 넣어줌.
add(1, "AAAA") ; 특정 인덱스 번호에 레퍼런스를 넣어줄 수 있음. 기존 데이터는 다음 위치로 밀려남.
set(1, "EEEE") : 기존 데이터를 대체(replace)하면서 데이터를 넣어줌.
get(1) 인덱스1번 데이터를 꺼내줌
remove(10) 인덱스1번 데이터를 삭제함

LinkedList : 양방향 포인터 구조로 빈번한 데이터의 삽입, 삭제에 빠른 성능을 보임
ArrayList와 LinkedLIst 모두 java.util.List라는 인터페이스를 구현한 클래스 이므로 List 타입으로 선언가능
List a = new ArrayList(); , List a = new LinkedLIst();

Vector  : ArrayList와 동작 방식은 같지만 속도가 느리고 멀티스레드에 대해서 좀 더 안전.

Vector 클래스

 Vector 클래스는 데이터를 한꺼번에 저장할 수 있는 클래스라는 점에서 배열과 유사하다. 하지만 배열의 크기는 일단 정의를 하면 변경할 수 없고 항상 같은 종류의 데이터만을 저장해야한다. 이러한 단점으로 보완하기 위해서 Vector 클래스를 사용한다.

Vector 클래스는 배열과 다르게 다른 타입의 데이터들을 저장할 수 있다. 단 참조형변수(객체변수)만이 가능하다. 또한 데이터가 가득차게되면 자동적으로 크기를 늘려준다.

 생성자


Vector()

디폴트 생성자로 빈 벡터 객체를 생성한다.

Vector(int init)

init로 주어진 수 만큼의 공간을 가진 벡터 객체를 생성한다.

Vector(int init, int ch)

init로 주어진 수 만큼의 공간을 가진 벡터 객체를 생성하되 저장공간이 다 차면 ch만큼 늘어나게된다

.주요 메소드

메   소   드

설         명 

 void addElemont(Object o)

 객체 o를 벡터의 맨 마지막에 추가한다.

 void insertElementAt(Object obj, int index)

 주어진 위치에 객체를 삽입한다.

 void setElementAt(Object obj, int index)

 주어진 위치에 객체를 obj로 바꾼다.

 Object elementAt(int index)

 주어진 위치에 있는 객체를 리턴한다.

 Object firstElement()

 첫번째 객체를 리턴한다.

 Object lastElement()

 마지막 객체를 리턴한다.

 boolean contains(Object o)

 주어진 객체 o를 포함하고 있는지 여부를 리턴한다.

 int indexOf(Object elem)

 주어진 객체의 위치를 리턴한다.

 int lastIndexOf(Object o)

 주어진 객체의 마지막 위치를 리턴한다.

 void removeAllElements()

 모든 객체를 제거한다.

 boolean removeElement(Object obj)

 주어진 객체를 제거한다. 첫번째로 찾은 obj 객체를 제거하라는 뜻이다.

 void removeElementAt(int index)

 주어진 index에 있는 객체를 제거한다.

 

 

 

예제

 

 
Calendar 클래스

Calendar 클래스는 날짜와 시간에 관한 정보를 제공하는 추상 클래스이다. 따라서 생성자를 제공하지않는다.

하지만 getInstance()를 사용하면 현재 날짜로 설정된 객체를 얻을수도있다.

Calendar 클래스의 int형 상수들 

상      수

설                  명 

 static int AM_PM

 get 및 set을 위한 필드값으로, HOUR 상수가 정오 전인지 후인지를 나타낸다.

 static int AM

 자정부터 정오 전까지의 시간을 나타내는 AM_PM 필드의 값이다.

 static int PM

 정오부터 자정 전까지의 시간을 나타내는 AM_PM 필드의 값이다.

 static int SECOND

 get 및 set을 위한 필드값으로 초를 나타낸다.

 static int MILLISECOND

 get 및 set을 위한 필드값으로 밀리 세컨드를 나타낸다.

 static int MINUTE

 get 및 set을 위한 필드값으로 분을 나타낸다.

 static int HOUR

 get 및 set을 위한 필드값으로 오전 또는 오후의 몇시인지를 나타낸다.

 static int HOUR_OF_DAY

 get 및 set을 위한 필드값으로 시각을 나타낸다.

 static int DST_OFFSET

 get 및 set을 위한 필드값으로 서머타임의 오프셋을 밀리 세컨드 단위로 나타낸다.

 static int DATE

 get 및 set을 위한 필드값으로 달의 일을 나타낸다.

 static int DAY_OF_MONTH

 get 및 set을 위한 필드값으로 달의 일을 나타낸다.

 static int DAY_OF_WEEK

 get 및 set을 위한 필드값으로 주의 일을 나타낸다.

 static int SUNDAY 

 일요일을 나타내는 DAY_OF_WEEK 필드의 값이다. (월:MONDAY, 화:TUESDYA, ...)

 static int DAY_OF_WEEK_IN_MONTH

 get 및 set을 위한 필드값으로 현재 달의 몇번째 일인지를 나타낸다.

 static int DAY_OF_YEAR

 get 및 set을 위한 필드값으로 올해의 며칠째인지를 나타낸다.

 static int WEEK_OF_MONTH

 get 및 set을 위한 필드값으로 현재 달의 몇번째 주인지를 나타낸다.

 static int WEEK_OF_YEAR

 get 및 set을 위한 필드값으로 올해의 몇번째 주인지를 나타낸다.

 static int MONTH

 get 및 set을 위한 달을 나타내는 필드값이다.

 static int JANUARY

 1월을 나타내는 MONTH 필드의 값이다. (2월:FEBRUARY, 3월:MARCH, ...)

 static int UNDECIMBER

 13번째의 달을 나타내는 MONTH 필드의 값이다.

 static int YEAR

 get 및 set을 위한 년을 나타내는 필드값이다.

 static int ERA

 get 및 set을 위한 필드값으로 율리우스력의 AD 또는 BC 등의 년대를 나타낸다.



주요 메소드

 

메  소  드

설                명 

 abstract void add(int field, int amount)

 주어진 달력 필드에 특정한 시간을 더하거나 뺀다.

 boolean after(Object when)

 현재 객체가 when 이후이면 true 아니면 false를 리턴한다.

 boolean before(Object when)

 현재 객체가 when 이전이면 true 아니면 false를 리턴한다.

 void clear()

 모든 시간 필드의 값을 소거한다.

 boolean equals(Object obj)

 지정된 obj와 Calendar 객체를 비교한다.

 int get(int field)

 지정된 시간 필드의 값을 얻는다.

 int getFirstDayOfWeek()

 주의 첫째 날을 얻는다.

 static Calendar getInstance()

 현재의 시간을 가진 Calendar 객체를 리턴한다.

 Date getTime()

 현재 시각을 얻는다.

 int hashCode()

 Calendar 객체의 해시코드를 리턴한다.

 void set(int year, int month, int date,

 int hour, int minute, int second)

 년, 월, 일, 시간, 분, 초의 필드에 값을 설정한다.

 void setFirstDayOfWeek(int value)

 주의 첫째 날을 설정한다.

 void setTime(Date date)

 현재의 시각을 지정된 Date 객체로 한다.

 protected void setTimeInMillis(long millis)

 현재 시각을 지정된 long 값으로부터 설정한다.

 String toString()

 달력의 문자열 표현을 리턴한다.


자바 날짜 시간 처리 GregorianCalendar 클래스

나라마다 쓰는달력 조금씩 다르기때문에 Calendar라는 클래스가 추상클래스로 선언되어있음

현재 우리가 쓰는 달력은 GregorianCalendar(국제표준시)로 Calendar를 상속받은 클래스다 

시스템상 서울시각으로 설정되어있으면 자동으로 서울 시각을 가져온다

만약 영국의 시간을 알고 싶으면 Locale을 영국으로 설정하면 된다






자바 Wrapper 클래스 박싱 Boxing, 파싱 parsing

Boxing : 프리미티브 타입값 을 객체로 변환하는것
박싱을 해주는 클래스가 Wrapper 클래스이다
char만 유일하게 String으로 박싱이 안된다 

Wrapper클래스 객체와 프리미티브타입간 or 객체와 객체의 연산시 박싱과 언박싱이 자동으로 일어남

 

자동 언박싱 예제

Integer num1 = new Integer(1);
Integer num2 = new Integer(2);
System.out.println(num1 + num2); //객체 + 객체 이지만 자동언박싱후 계산이 됨  3출력

 

 

parsing : 문자열을 프리미티브 타입값으로 바꾸는것

Integer.parseInt(str)와 같은 파싱 메소드가 Wrapper클래스의 정적 메소드이다  

 


 

public class WrapperEx{
 public static void main(String args[])
 {
  Integer obj1 = new Integer(12); //이부분이 Wrapper클래스의 생성자이다
  Integer obj2 = new Integer(7);  //int형을 Integer로 박싱하는 코드
  int sum1 = obj1.intValue() + obj2.intValue();
  System.out.println(sum1);
  
  Byte obj3 = new Byte((byte)12);//4바이트짜리 12(int)를 1바이트로 박싱 하려하면 형변환 필요
  Byte obj4 = new Byte((byte)7);
  Byte sum2 = (byte)(obj3 + obj4);//자바는 연산시 Integer로 연산하기때문에
                                               //byte로 형변환 필요
  System.out.println(sum2);
  
  
 }

}

출력결과

19

19

-------------------------------------------------------------------------------------------

 

 

//Wrapper 클래스를 이용한 int,long,float,double 을 전달해서 비트패턴을 출력하는 코드
//메인메소드 매개변수 배열로 9 100 1.5F 3.14 를 전달받아서 사용
public class BitPattern {
 public static void main(String[] args)
 {
  String bitInt = Integer.toBinaryString( Integer.parseInt(args[0]) ); 
  String bitLong = Long.toBinaryString( Long.parseLong(args[1]) );
  
  
  //Float과 Double은 비트 패턴의 값을 각각 int와 long형 정수로 리턴한다
  int bitFloatTemp = Float.floatToIntBits( Float.parseFloat(args[2]) );
  String bitFloat = Integer.toBinaryString( bitFloatTemp );
  
  long bitDoubleTemp = Double.doubleToLongBits( Double.parseDouble(args[3]) );
  String bitDouble = Long.toBinaryString( bitDoubleTemp );
  
  
  System.out.println("bitInt = " + bitInt);
  System.out.println("bitLong = " + bitLong);
  System.out.println("bitFloat = " + bitFloat);
  System.out.println("bitDouble = " + bitDouble);
  
  
 }

}

출력결과

bitInt = 1001
bitLong = 1100100
bitFloat = 111111110000000000000000000000
bitDouble = 100000000001001000111101011100001010001111010111000010100011111






Stack vs  Queue

1. stack : Last Input First Output 의 구조

  ▶ 패키지 : java.util.*

  ▶ 선언 방법 : Stack<Integer> s = new Stack<Integer>(); 

                     Stack<자료형> s = new Stack<자료형>();

  ▶ 관련 메소드 

       push() - 스택 자료구조에 데이터 삽입

       pop() -   스택 자료구조에 데이터를 가장 늦게 들어온 데이터를 뽑는다.(출력)

 

 =========================================================================================

 

2. Queue : First Input First Output 의 구조

  ▶ 패키지 : java.util.*

  ▶ 선언 방법 : Queue<Integer> queue = new LinkedList<Integer>();

                     Queue<자료형> s = new LinkedList<자료형>();

  ▶ 관련 메소드

        offer() - 스택과 같은 구조 큐 자료구조에 데이터를 삽입

        poll() -  큐에 있는 데이터를 들어온 순서데로 데이터를 뽑는다.(출력)


'Programming > java 고급과정' 카테고리의 다른 글

java 고급과정 8일차  (0) 2012.03.14
java 고급과정 7일차  (0) 2012.03.13
java 고급과정 5일차  (0) 2012.03.09
java 고급과정 4일차  (0) 2012.03.08
java 고급과정 3일차  (0) 2012.03.08