posted by changhozz 2012. 7. 19. 16:41

FileOutputStream에서 바이트 배열에 값을 입력시킨 후
바이트배열 by를 write한 경우이다.

      package fileTest;

import java.io.File;
import java.io.FileOutputStream;


public class FileOutputStreamTest {
public static void main (String [] args) throws Exception{
 byte [] by = new byte[]{'a','b','c'};   // 내가 원하는곳에 쓸 내용을 byte배열에 담는다.
 File directory = new File("d:\\테스트중");       
 File file_name = new File  (directory, "test1.txt");     //여긴 FileIntputStream과 다를게 없다.
 if(!directory.isDirectory()){                 //*중요* 디렉토리가 없을수도 있으므로 없다면 
  directory.mkdir();                              만들어주는 if문을 만든다.
 }
 
 FileOutputStream fos = new FileOutputStream(file_name,true);  
 fos.write(by);
 fos.close();


}
}

--------------------------------String에 담은후 getBytes()메서드 이용 ----------------

package fileTest;

import java.io.File;
import java.io.FileOutputStream;

public class FileOutputStream2 {
public static void main (String [] args)throws Exception{
 
 
 File directory = new File("d:\\테스트중");
 File file_name = new File(directory,"test2.txt");
 if(!directory.isDirectory()){
  directory.mkdir();
 }
 
 FileOutputStream fos = new FileOutputStream(file_name,true);
 String msg = "안녕하세요,김창호입니다.";
 fos.write(msg.getBytes()); //String형 msg를 바이트로 바꾸어 줌.
 fos.close();
}
}

-----------------------BufferedOutputStream 사용!!----------------

package fileTest;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;

public class BufferedOutputStreamTest {
public static void main( String [] args)throws Exception{
 File directory = new File("d:\\테스트중");
 File file_name = new File(directory,"test3.txt");
 if(!directory.isDirectory()){
  directory.mkdir();
 }
  
FileOutputStream fos = new FileOutputStream(file_name,true);
 BufferedOutputStream bos= new BufferedOutputStream(fos);
 String msg = "dfdf안녕하세요,김창호입니다.";
 bos.write(msg.getBytes());
 bos.close();
}
}

 

------------------------------FileWriter--------------------------------

주의사항!!!!   쓰고싶은 메시지를 String형에 담고 write()를 해주기위해
char 배열로 형변환을 해줘야함 그것이 바로 toCharArray();

 

package fileTest;

import java.io.File;
import java.io.FileWriter;

public class FileWriterTest  {
 public static void main(String[] args) throws  Exception {
  File directory = new File("d:\\테스트중");
  File file_name = new File(directory, "test4.txt");
  if (!directory.isDirectory()) {
   directory.mkdir();
  }
  FileWriter fw = new FileWriter(file_name,true);
  String msg = "이야이오";
  
  fw.write(msg.toCharArray());   //이런식으로 toCharArray() 외워라!!
  fw.close();
  
  
 
 }
}

-----------------BufferedWriter도 똑같음!!------------------------------------------

package fileTest;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class BufferedWriterTest {

  public static void main(String[] args) throws  Exception {
   File directory = new File("d:\\테스트중");
   File file_name = new File(directory, "test5.txt");
   if (!directory.isDirectory()) {
    directory.mkdir();
   }
   FileWriter fw = new FileWriter(file_name,true);
   BufferedWriter bw = new BufferedWriter(fw);
   String msg = "이야이오";
   
   bw.write(msg.toCharArray());    //Char배열로 바꿔줘야함.
   bw.close();
   
   
  
  }
 }

 

 

 

 

posted by changhozz 2012. 7. 19. 15:49

(byte 기반)                                     (char 기반)
바이트기반 스트림은                      문자기반 스트림은

FIleInputStream              이고         FileReader
FileOutputStream                           FileWriter                 이다.

즉 InputStream =>  Reader
   OutputStream => writer  로 바뀐것뿐.

보조스트림 또한

BufferedInputStream        이고         BufferedReader
BuffredOutputStream                       BufferedWriter        이다.

 

FileInputStream에서 원하는 파일의 내용을 읽어올때.

public class FileInputStreamTest {
 public static void main(String[] args) throws Exception {
  byte[] by = new byte[100];   //바이트기반이므로 무조건 바이트단위로 읽어오기때문에
                                              //읽어올 내용을 바이트 형으로 담아줄 배열이 필요
  File directory = new File("d:\\"); // 원하는(찾고자하는 파일이있는) 디렉토리를 File객체에 담아줌.
  File file = new File(directory, "cv.txt"); //원하는 파일의 디렉토리와 원하는 파일의 이름을 File객체에 담음
  FileInputStream fis = new FileInputStream(file);   //이제 담은 파일 객체를 읽어올수있도록 스트림 형성.
  System.out.println(fis.read(by));  // read()메서드를 이용하여 파일을 읽어옴.
  
 }
}

read()에는 내용을 담아올 바이트 배열을 넣어줌.

근데 read는 int 형이기 때문에 숫자가 나올거임.

내가 cv.txt쓴글 "안녕해"를 그대로 출력하려면?

public class FileInputStreamTest {
 public static void main(String[] args) throws Exception {
  byte[] by = new byte[100];   //바이트기반이므로 무조건 바이트단위로 읽어오기때문에
                                              //읽어올 내용을 바이트 형으로 담아줄 배열이 필요
  File directory = new File("d:\\");       // 원하는(찾고자하는 파일이있는) 디렉토리를 File객체에 담아줌.
  File file = new File(directory, "cv.txt");   //원하는 파일의 디렉토리와 원하는 파일의 이름을 File객체에 담음
  FileInputStream fis = new FileInputStream(file);   //이제 담은 파일 객체를 읽어올수있도록 스트림 형성.
  fis.read(by);  // 배열 by에 파일 내용을 담았단 뜻.
  System.out.println(new String (by)); //byte는 1byte단위로 끊어 읽어오기때문에 String형으로 캐스팅해줌.(자바에서 한 문자는 2byte임)
fis.close();  //닫는버릇!

 }
}
 

근데 BufferedInputStream을 하면 성능이 좋아지기 땜에 웬만하면 BufferedInputStream을 이용하자
이용방법은 그냥 추가만하면됨

package fileTest;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

public class BufferedInputStreamTest {

 public static void main (String [] args)throws Exception{
  
  byte [] by = new byte[100];
  File directory = new File ("d:\\");
  File file_name = new File(directory,"cv.txt");
  FileInputStream fis = new FileInputStream(file_name);
  BufferedInputStream bis = new BufferedInputStream(fis);     //FileInputStream의 객체를 넣고
  bis.read(by);    //read를 할때 BufferedInputStream객체를 통해 접근하면 됨.
  System.out.println(new String(by));    //그냥 버퍼가 파일인풋 안고 간다생각하면됨.
  bis.close()  //닫는버릇!
  
 }
}

-------------------------그리고 문자기반 스트림도 똑같음!!!-----------------------------

차이점이라곤 배열을 byte가 아닌 char형으로만해주면됨!!!!!!!!!!!


 package fileTest;

import java.io.File;
import java.io.FileReader;

public class FileReaderTest {
public static void main (String [] args)throws Exception{
 
 char [] ch = new char [100];
 //File directory = new File("d:\\");   //이거 밑에줄로 한번에 쓸수있음.
 File file_name = new File("d:\\","cv.txt");
 FileReader fr = new FileReader(file_name);
 fr.read(ch);
 System.out.println(ch);
fr.close(); //닫는버릇!
}
}

 

-------------------BufferedReader 또한 똑같음--------------------------------

package fileTest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class BufferedReaderTest {
public static void main (String [] args)throws Exception{
 
 char [] ch = new char [100];
 File file_name = new File("d:\\","cv.txt");
 FileReader fr = new FileReader(file_name);
 BufferedReader br = new BufferedReader(fr);
 br.read(ch);
 System.out.println(ch);
 br.close();      //닫는버릇!

}
}

 

 

posted by changhozz 2012. 7. 18. 12:13

HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션이며, Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다.

HashSet에 새로운 요소를 추가할 때는 add메서드나 addAll메서드를 사용하는데, 만일 HashSet에 이미 저장되어 있는 요소와 중복된 요소를 추가하고자 한다면 이 메서드들은 false를 반환함으로써 중복된 요소이기 때문에 추가에 실패했다는 것을 알린다.

이러한 HashSet의 특징을 이용하면, 컬렉션 내의 중복된 요소들을 쉽게 제거할 수 있다.

ArrayList와 같이 List인터페이스를 구현한 컬렉션과 달리 HashSet은 저장순서를 유지하지 않으므로 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다.

 

생성자 또는 메서드  

설명 

HashSet() 

HashSet객체를 생성한다. 

HashSet(Collection c) 

주어진 컬렉션을 포함하는 HashSet객체를 생성한다. 

HashSet(int initialCapacity) 

주어진 값을 초기용량으로하는 HashSet객체를 생성한다. 

HashSet(int initialCapacity, float loadFactor) 

초기용량과 load factor를 지정하는 생성자. 

boolean add(Object o) 

새로운 객체를 저장한다. 

boolean addAll(Object o)

주어진 컬렉션에 저장된 모든 객체들을 추가한다.(합집합) 

void clear() 

저장된 모든 객체를 삭제한다. 

Object clone() 

HashSet을 복제해서 반환한다. 

boolean contains(Object o) 

지정된 객체를 포함하고 있는지 알려준다. 

boolean containsAll(Collection c) 

주어진 컬렉션에 저장된 모든 객체들을 포함하고 있는지 알려준다. 

boolean isEmpty() 

HashSet이 비어있는지 알려준다. 

Iterator iterator() 

iterator를 반환한다. 

 boolean remove(Object o)

지정된 객체를 HashSet에서 삭제한다.(성공하면 true, 실패하면 false) 

boolean removeAll(Collection c) 

주어진 컬렉션에 저장된 모든 객체와 동일한 것들을 HashSet에서 모두 삭제한다. 

 boolean retainAll(Collection c)

주어진 컬렉션에 저장된 객체와 동일한 것만 남기고 삭제한다.(교집합) 

int size() 

저장된 객체의 개수를 반환한다. 

 Object[] toArray()

저장된 객체들을 객체배열의 형태로 반환한다. 

Object[] toArray(Object[] a) 

저장된 객체들을 주어진 객체배열(a)에 담는다. 

HashSet의 add메서드는 새로운 요소를 추가하기 전에 기존에 저장된 요소와 같은 것인 판별하기 위해 추가하려는 요소의 equals()와 hashCode()를 호출하기 때문에 equals()와 hashCode()를 목적에 맞게 오버라이딩해야 한다.

 

 

String클래스는 문자열의 내용으로 해시코드를 만들어 내기 때문에 내용이 같은 문자열에 대한 hashCode()호출은 항상 동일한 해시코드를 반환한다.
반면에 Object클래스는 객체의 주소로 해시코드를 만들어 내기 때문에
실행할 때마다 해시코드값이 달라질 수 있다.

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. 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. 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