posted by changhozz 2012. 7. 18. 11:26

우선 Enumeration, Iterator, ListIterator는 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다. Enumeration은 Iterator의 구버전이며, ListIterator는 Iterator의 기능을 향상 시킨 것이다.

1. Iterator
iterator()는 Collection인터페이스에 정의된 메서드이므로 Collection인터페이스의 자손인 List와 Set에도 포함되어 있다.
그래서 LIst나 Set인터페이스를 구현하는 컬렉션은 iterator()가 각 컬렉션의 특징에 알맞게 작성되어 있다.

boolean    hasNext()     ㅡ> 읽어올 요소가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다.

Object   next()     ㅡ>다음 요소를 읽어 온다. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.

void     remove()      ㅡ>next()로 읽어 온 요소를 삭제한다. next()를 호출한 다음에 remove()를 호출해야한다.(선택적 기능)

 

posted by changhozz 2012. 7. 17. 22:00

LinkedList와 떨어질수없는 관계 배열.

우선 배열이라 하면 , 가장 기본적인 형태의 자료구조 구조가 간단하며 사용하기 쉽고 데이터를 읽어 오는데 걸리는 시간(접근시간)이 가장 빠르다는 장점을 가지고 있지만 다음과 같은 단점도 가지고 있다.

1.크기를 변경할 수 없다
-크기를 변경할 수 없기 때문에 새로운 배열을 생성해서 데이터를 복사하는 작업이 필요하다.
-실행속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야하므로 메모리가 낭비된다.

2.비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
-차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만,
-배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야한다.

이처럼 배열은 모든 데이터가 연속적으로 존재하지만 LinkedList는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있기 때문에 데이터를 추가하거나나 삭제하기 용이하다.
그러나 각 요소들이 불연속적으로 연결되어 있기때문에 처음부터 찾고자하는 데이터까지 차례대로 따라가야만 원하는 값을 얻을 수 있다. 

 

배열은 배열 전체가 한개의 주소를 갖는반면 ,
LinkedList는 각 요소마다 주소값이 있어, 요소(node)가 그 다음 요소의 주소값을 가르켜 꼬리를 무는 형태이다.

'JAVA > 팀장님 JAVA수업' 카테고리의 다른 글

Collection 보충설명 HashSet  (0) 2012.07.18
Collection 보충설명중 Iterator  (0) 2012.07.18
Collection 보충설명중 (Vector와 ArrayList)  (0) 2012.07.17
팀장님 수업 10  (0) 2012.07.13
스트림정리  (0) 2012.07.10
posted by changhozz 2012. 7. 17. 16:52

배열 정렬

Collections.sort(배열);

add (index , object);    ㅡ> add는 몇번째 인덱스에다가 값을 추가하여 나머지가 뒤로 한칸씩 밀리는 것이고

set (index , object)     ㅡ>set은 몇번째 인덱스에 값을 지정 값으로 바꾸겠다는 뜻. 따라서 뒤에가 밀리지 않는다.

 

list1.containAll(list2);

list1이 list2의 값들을 모두 갖고있으면 true

list1.containAll(3);

이렇게해도됨 3을 list1이 가지고있으면 true

 

list1.retainAll(list2);    

list1는 유지한다 오직 list2에 있는값들만.(즉,ist1에다가 list1과2의 교집합만 저장하겠단뜻).

 

Vector에서 v.clear(); 를 해줬을때

size가 0이되는 것이고 용량(capacity)는 그대로 유지된다.

 

v.ensureCapacity(int minCapacity);     ㅡ> 크기(capacity)를 최소한 지정숫자만큼 늘리겠단뜻.

최소한이므로, 원래 용량이 지정숫자보다 크다면 아무런 변화가 없다.

만약 바뀔시엔 새로운 배열을 생성하여 변수 v가 가리키는 주소값이 달라지는것 뿐.  

 

'JAVA > 여러가지 메서드' 카테고리의 다른 글

IndexOf , Substring  (0) 2012.07.20
기본형 ㅡ>문자열 , 문자열 ㅡ>기본형  (0) 2012.07.20
int를 String으로 parse  (0) 2012.07.20
랜덤  (0) 2012.07.11
string을 int로 parse  (0) 2012.05.31
posted by changhozz 2012. 7. 17. 15:50

java.util.Collection은 인터페이스이고,
java.util.Collections는 클래스이다.


List인터페이스 - 중복허용, 저장순서유지
Set인터페이스 - 중복허용 안함, 저장순서유지 안함.
Map인터페이스 - Map인터페이스는 키(key)와 값(value)을
하나의 쌍으로 묶어서 저장.  키는 중복될 수 없지만 값은 중복 허용.
기존의 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.
Map.Entry인터페이스 - Map.Entry인터페이스는 Map인터페이스의
내부 인터페이스이다. 내부 클래스(inner class)와 같이 인터페이스도
이처럼 인터페이스 안에 인터페이스를 정의하는 내부 인터페이스를
정의하는 것이 가능하다.
Map에 저장되는 key-value쌍을 다루기 위해 내부적으로 Entry인터페이스를
정의해 놓았다.

이것은 보다 객체지향적으로 설계하도록 유도하기 위한 것으로 Map인터페이스를 구현하는 클래스에서는 Map.Entry인터페이스도 함께 구현해야한다.

 

Vector와 ArrayList

공통점 

차이점 

-List인터페이스를 구현한다.
저장순서가 유지되고 중복을 허용한다.

-데이터의 저장 공간으로 배열을 사용한다.

 -Vector는 멀티쓰레드에 대한 동기화가
되어있으나 ArrayList는 그렇지 않다.

 

Vetor와 ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장한다. 예를 들면, 첫번째로 저장한 객체는 Object배열의 0번째 위치에 저장되고 그 다음에 저장하는 객체는 1번째 위치에 저장된다. 이런 식으로 계속 배열에 순서대로 저장되며, 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장된다.

ArrayList는 removeRange()를 제외한 모든 메서드는 Vector의 메서드와 일치한다.

 

Vector와 ArrayList 같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만, 용량을 변경해야할 때는 새로운 배열을 생성한 후 기존의 배열로부터 새로 생성된 데이터를 복샇야하기 때문에 상당히 효율이 떨어진다는 단점을 가지고 있다.

 

 

posted by changhozz 2012. 7. 13. 01:29
Collection이란 간단히 말해 객체들의 집합이며 다른말로 "자료구조"라고도 한다.
객체들을 한 곳에 모아 저장하고 관리를 편하게 하기 위해 제공되는 일종의 객체들이다.
(서로 다른 형도 linked 시킬수 있음)

Collection의 종류엔 여러가지가 있는데 ,
그 중 Vector란,
객체를 저장하는 배열과 같은 동작을 하지만, 고정된 길이의 배열과 달리 필요할 때
용량이 자동으로 증가하는 가변적 길이의 특징을 가진 Data Structure이다.

Vector에서 size란 실제 Vector안에 들어있는 object의 갯수를 뜻하고,
Capacity란 Vector의 전체 용량을 말한다.
(Vector의 마지막 용량까지 다 써버리면 현재 있던 용량의 두배 만큼 용량을 확대한다.
그리고 중간의 0,1,2,3중 중간의 2를 지워버리면 3이 자동적으로 앞으로 땡겨온다.)

-Iterator Class-
Collection(자료구조)이 가지는 요소들에게 순차적으로 접근하여 처리하는 데 사용되는 객체다.
즉 원번 Collection에서 움지는 Cursor(pointer?)와 같은 존재로 작업의 위치를 알리는 눈금과 같은 것이다.

-Stack이란-
Stack 클래스는 Vector Class의 subClass로서 객체들의 last - in -first - out(LIFO) 스택을 표현한다.
push -> Stack의 가장 위쪽에 데이터를 집어 넣는 작업.
pop -> Stack의 가장 위에 있는 데이터를 가져오는 작업.

Queue란 JDK 1.5Version 부터 새롭게 추가된 Interface이다.
요소가 들어가는 입구와 요소가 나오는 출구가 따로 준비되어 있어 가장 먼저 들어간 요소가 가장 먼저 나오는
선입선출(First In First Out) 즉 FIFO방식 이다.
( ex)편의점의 음료수 배치방식 )

 

posted by changhozz 2012. 7. 11. 17:02

랜덤함수 Math.random();

반환형이 double형이다.

반환값의 범위는 0.0포함~ 1.0미포함

따라서 소수 반환하려고 사용

수식: (int) (Math.random() * 범위 + 시작값);

'JAVA > 여러가지 메서드' 카테고리의 다른 글

IndexOf , Substring  (0) 2012.07.20
기본형 ㅡ>문자열 , 문자열 ㅡ>기본형  (0) 2012.07.20
int를 String으로 parse  (0) 2012.07.20
Collection  (0) 2012.07.17
string을 int로 parse  (0) 2012.05.31
posted by changhozz 2012. 7. 10. 22:22


스트림(Stream)
자바에서 입출력을 수행하려면, 즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면,
두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을
스트림(Steam)이라고 정의했다.

스트림이란 데이터를 운반하는데 사용되는 연결통로이다.

스트림은 연속적인 데이터의 흐름을 물에 비유해서 붙여진 이름인데 여러가지로
유사한 점이 많다. 물이 한쪽 방향으로만 흐르는 것과 같이 스트림은 단방향통신만
가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.
그래서 입력과 출력을 동시에 수행하려면 입력을 위한 입력스트림(input stream)과 출력을 위한
출력스트림(output stream), 모두 2개의 스트림이 필요하다.

스트림은 먼저 보낸 데이트를 먼저 받게 되어 있으며 중간에 건너뜀 없이 연속적으로 데이터를
주고받는다.


바이트기반이라 함은 입출력의 단위가 1byte라는 뜻이다. Java에서는 한 문자를 의미하는
char형이 1byte가 아니라 2byte이기 때문에 바이트기반의 스트림으로 2byte인 문자를
처리하는 데는 어려움이 있다.
이 점을 보완하기 위해서 문자기반의 스트림이 제공된다. 문자데이터를 입출력할 때는
바이트기반 스트림 대신 문자기반 스트림을 사용하자.

바이트기반  문자기반
InputStream  Reader
OutputStream  Writer

 

프로그램이 종료될 때, 사용하고 닫지 않은 스트림을 JVM이 자동적으로 닫아 주기는 하지만,
스트림을 사용해서 모든 작업을 마치고 난 후에는 close()를 호출해서 반드시 닫아 주어야 한다.
[참고] ByteArrayInputStream과 같이 메모리를 사용하는 스트림과 System.in ,System.out과 같은
표준입출력스트림은 닫아 주지 않아도 된다.

'JAVA > 팀장님 JAVA수업' 카테고리의 다른 글

Collection 보충설명중 (Vector와 ArrayList)  (0) 2012.07.17
팀장님 수업 10  (0) 2012.07.13
중요정리!!(부모클래스와 자식클래스)  (0) 2012.07.06
팀장님 수업9  (0) 2012.07.06
팀장님 수업 8  (0) 2012.07.03
posted by changhozz 2012. 7. 6. 19:00

부모클래스에 age라는 정수형 변수를 멤버변수로 추가하면,
자손 클래스는 조상의 멤버로 상속받기 때문에, 자식클래스는 자동적으로
age라는 멤버변수가 추가된 것과 같은 효과를 얻는다.

반면 자식클래스에 새로운 멤버로 play()메서드를 추가했을시엔
부모클래스는 아무런 영향도 받지않는다.

따라서 자식클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상 클래스보다
같거나 많은 멤버를 갖는다. 즉, 상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는
점점 늘어나게 된다.

생성자와 초기화 블럭은 상속되지 않는다.??

자식 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에 따로 조상 클래스의
인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다.

즉, 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진
하나의 인스턴스로 생성된다.

조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

ex)Class Parent{
void parentMethod() throws IOException, SQLException{
 }
}
Class Child extends Parent{
void parentMethod() throws IOException{
 }
}

ex)
Class Child extends Parent{
void parentMethod() throws Exception{
 }
}
이것은 부모클래스보다 갯수는 적게 선언했지만,
범위가 크므로 하나만 선언한 것 이 아니다.
따라서 부모클래스보다 갯수도 적으면서 범위도 좁아야한다.


------------------------------------------------------------
오버로딩 - 기존에 없는 새로운 메서드를 정의하는 것.
동일이름이지만 매개변수의 갯수나, 타입이 다른 새로운 메서드를
정의하는것.

오버라이딩 - 조상으로부터 그대로 상속받아 내용만 변경하는 것.
-----------------------------------------------------------
super

조상의 멤와 자신의 멤버를 구별하는데 사용된다는 점을 제외하고는 super와
this는 근복적으로 같다. 모든 인스턴스메서드에는 자신이 속한
인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이된다.
static메서드(클레스메서드)는 인스턴스와 관련이 없다. 그래서 this와 마찬가지로
super역시 staic메서드에서는 사용할 수 없고 인스턴스메서드에서만 사용할 수 있다.


public class SuperTest {
 public static void main(String args[]) {
  Child c = new Child();
  c.method();
 }
}

class Parent {
 int x = 10;
}

class Child extends Parent {

 void method() {
  System.out.println("x=" + x);
  System.out.println("this.x=" + this.x);
  System.out.println("super.x=" + super.x);

 }
}


이경우 Child Class에 변수x가 없어도 자식클래스는 부모클래스의 멤버변수를
포함하고 있기때문에 x가 출력이 되는것이다.
게다가 this.x또한 자식클래스에 없으므로 부모클래스의 x를 찾게되는것이다.
super는 원래 부모꺼를 찾는다.


public class SuperTest {
 public static void main(String args[]) {
  Child c = new Child();
  c.method();
 }
}

class Parent {
 int x = 10;
}

class Child extends Parent {
 int x = 5;

 void method() {
  System.out.println("x=" + x);
  System.out.println("this.x=" + this.x);
  System.out.println("super.x=" + super.x);

 }
}
이경우엔 부모클래스에도 x가있고 자식클래스에도 x가있다.
이경우에 자식클래서 x를 출력하면 자신(자식클래스)의 클래스의
x를 출력하게되고 this또한 자신(자식클래스)의 클래스의 x를 가리키게된다.
여전히 super는 부모클래스의 x를 가리킨다.

super() - 조상 클래스의 생성자
자식 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 모두 합쳐진
하나의 인스턴스가 생성된다. 그래서 자손 클래스의 인스턴스가 조상클래스의 멤버들을
사용할 수 있는 것이다.
이 때 조상 클래스 멤버의 생성과 초기화 작업이 수행되어야 하기 때문에 자손 클래스의
생성자에서 조상 클래스의 생성자가 호출 되어야한다.
생성자의 첫 줄에서 조상클래스의 생성자를 호출해야하는 이유는 자손 클래스의 멤버가
조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야
하기 때문이다.
이와 같은 조상 클래스 생성자의 호출은 클래스의 상속관계를 거슬러 올라가면서
계속 반복된다. 마지막으로 모든 클래스의 최고 조상인 Object클래스의 생성자인
Object()까지 가서야 끝이 난다.
그래서 Object클래스를 제외한 모든 클래스의 생성자는 첫 줄에 반드시 자신의
다른 생성자 또는 조상의 생성자를 호출해야한다. 그렇지 않으면 컴파일러는
생성자의 첫 줄에 'super()'를 자동적으로 추가할 것이다.


public class PointTest {
 public static void main (String [] args){
 Point3D p3 = new Point3D(1,2,3);
 
}
}

class Point {
 int x;
 int y;

 Point(int x, int y) {
  this.x = x;
  this.y = y;
 }

 String getLocation() {
  return "x :" + x + ", y:" + y;
 }

}

class Point3D extends Point {
 int z;

 Point3D(int x, int y, int z) {
  this.x = x;
  this.y = y;
  this.z = z;
 }
}


이것은 컴파일에러가 발생한다.
이유는 Point3D의 객체를 만들때 Point3D의 생성자를 호출한다.
이때 생성자 첫줄에 다른 생성자를 호출하지 않기 때문에 컴파일러가
super()를 삽입한다.
그러나 Point3D의 조상인 Point클래스에는 default생성자인
Point()가 없기 때문에 컴파일이 발생한다.
default생성자는 어떠한 생성자가 정의되어 있을시엔 자동 생성이되지않는다.

public class PointTest {
 public static void main(String[] args) {
  Point3D p3 = new Point3D(1, 2, 3);

 }
}

class Point {
 int x;
 int y;

 Point(int x, int y) {
  this.x = x;
  this.y = y;
 }

 String getLocation() {
  return "x :" + x + ", y:" + y;
 }

}

class Point3D extends Point {
 int z;

 Point3D() {
  this(1,2,3);
 }

 Point3D(int x, int y, int z) {
  super(1, 2);
  this.x = x;
  this.y = y;
  this.z = z;
 }

}

이런식으로 객체 생성시 Point3D(int x, int y, int z) 생성자를
호출하고, 그안에서 부모 생성자 Point(int x, int y))를 호출해주도록
super(1,2)를 정의해줬기때문에 컴파일 에러가 나지 않는다.
Point3D()생성자는 super가 생략이 된것이아니라,
생성자를 호출하였기때문에(super의 것들을)건드리지 않았기때문에(토스한다는개념)
컴파일 에러가 뜨지 않는것이다.

결국엔 생성자의 호출은 계속 이어져서 결국 Object클래스의 생성자인
Object()까지 호출되어야 끝나는 것이다.

'JAVA > 팀장님 JAVA수업' 카테고리의 다른 글

팀장님 수업 10  (0) 2012.07.13
스트림정리  (0) 2012.07.10
팀장님 수업9  (0) 2012.07.06
팀장님 수업 8  (0) 2012.07.03
팀장님 수업 7  (0) 2012.06.29
posted by changhozz 2012. 7. 6. 13:14

Exception 2번째.

throws 예약어-

throws는 예외를 처리하기보다는 발생한 예외 객체를 양도하는 것이다.

현재 메소드에서 예외처리를 하기가 여러운 상태일 때 현재영역을 호출해준 곳으로

발생한 예외객체를 대신 처리해 달라며 양도하는 것이다.

내부적으로 많은 try~catch를 발생하게 되면 시스템이 과부하가 발생한다.

그렇기 때문에 throws로 양도하여 한 곳에서 처리하는 것이 효과적이다.

throw new -

thorw new 발생시킬 에외객체 생성자

throw new 는 예외객체를 발생시키는 예약어이다. 

ex)

public void test() throws SQLException{

throw new SQLException();

}

test() 메서드를 호출시

throw new SQLExeption(); 이 사용됐으므로 SQLException 예외객체가 발생된다.

게다가 throws SQLException을 써주어 SQLException을 호출 했던 부분으로

양도해준다.

따라서 호출해준 부분에서 catch 해주게 된다.

*주의사항!

throws 예약어에 사용된 예외객체는

thorws new 예약어에 사용된  예외객체보다 동등하거나 상위클래스여야 한다.

but, RuntimeException과 그 하위 클래스들은 throws 예약어를 사용하지 않아도

예외객체르 양도해준다.

 

finally -

예외가 발생하든 발생하지 않든 무조건 수행하는 부분이 바로 finally 영역이다.

Useful Class들을 공부함.

 

'JAVA > 팀장님 JAVA수업' 카테고리의 다른 글

스트림정리  (0) 2012.07.10
중요정리!!(부모클래스와 자식클래스)  (0) 2012.07.06
팀장님 수업 8  (0) 2012.07.03
팀장님 수업 7  (0) 2012.06.29
팀장님수업 6번째 보충자료(접근 제한자)  (0) 2012.06.22
posted by changhozz 2012. 7. 3. 16:13

Wrapper Class -
 
primitive type은 Class는 기본적으로 java.lang.*; 의 하위클래스이다.
 
Wrapper Class를 쓰는 이유는 primitive Type의 변수를 객체화 할 때 쓰인다.
8개의 primitive Type에 맞는 Class들을 Wrapper Class라고 통칭
 
Primitive type의 값을 Wrapper Class로 만드는 것을 Boxing이라 한다.
Wrapper Class Object를 primitive type값으로 만드는 것을 Unboxing이라한다.
 
Wrapper Class가 쓰여야 할 자리에 Primitive Type의 값이 사용되면,
자동적으로 boxing을 해주는데, 이를 Auto Boxing이라 한다.
 
Primitive Type의 값이 쓰여야 할 자리에 Wrapper Object를 사용하면
자동적으로 unboxing을 해주는데, 이를 Auto Unboxing이라 한다.
 
--------------------------------------------------------------------------------

Exception -
 

 
Exception - program실행 시 컴퓨터가 예상치 못해 발생한 오류/예외
 
Exception은 -> Throwable -> Object를 상속받는다.
 
일반적인 예외(Checked Exception) - compile시 발생하는 예외이다.
                                   반드시 예외처리를 해야만 한다.
 실행시 예외(Unchecked Exception) -프로그램이 실행되다가 발생하는 예외이다.
                                   예외처리를 하지 않아도 컴파일에는 무리가 없다.
 
Exception 처리 구조 - Try~catch()~finally
 
catch문 사용시 하위 예외객체일수록 위로, 상위 예외객체일수록 밑으로
정의해 줘야한다.
일반적으로 예외에서 가장 상위인 클래스가 Exception이다.
그러므로 가장 아래쪽에 정의 해야 한다. 이렇게 하는 이유는
예외는 상위 클래스가 모든 예외를 가지고 있으므로 가장 위에 정의를
하게 되면 모든 예외를 처리하게 되므로 두번째 catch문 부터는
절대로 비교 수행할 수 없게 된다.


하나의 메서드 내에 여러 개의 try-catch문이 사용될 수 있으며, try블럭 또는 catch블럭에
또 다른 try-catch문이 포함될 수 있다.
catch블럭의 괄호 내에 선언된 변수는 catch블러 내에서만 유효하기 때문에,
모든 catch블럭에 참조변수 'e'하나 만을 사용해도 된다.
하지만, catch블럭 내에 또 하나의 try-cath문이 포함된 경우, 같은 이름의 참조변수를
사용해서는 안된다.

즉 catch블럭의 괄호 내에 선언된 변수는 catch블럭 내에서만 유효하기 때문에,
catch문안에 try-catch문은 서로 참조변수 이름이 달라야한다.


메서드에 예외 선언하기

메서드에 예외를 선언하려면, 메서드의 선언부에 키워드 throws를 사용해서 메서드 내에서
발생할 수 있는 예외를 적어주기만 하면 된다. 그리고,예외가 여러 개일 경우에는
쉼표(,)로 구분한다.
ex)
void method() throws Exception1, Exception2, Exception3  ......{
//메서드 내용
}