기술 블로그

java 복습 3일 차 본문

백엔드/JAVA

java 복습 3일 차

jaegwan 2018. 9. 25. 17:00
반응형


11.예외처리


thorws키워드를 메소드 선언에서 찾으면 예외를 발생시킬 수있다는 것을 알 수 있다.


try/catch


1
2
3
4
try{
//위험한 일을 함
} catch(Exception e){
 //예외 시 문제를 처리함
}
cs


컴파일러에서는 RuntimeException을 제외한 모든 것을 확인함


코드에서 예외를 던진다면 반드시 메소드를 선언하는 부분에서 throw키워드를 써서 선언해야함(회피하기)


throws Exception


예외 발생여부와 상관없이 무조건 실행할 떄는 finally

1
2
3
4
5
try{
} catch(Exception e){
 
} finally {
}
cs




12,13은 구식기술(swing gui)을 설명하는 파트이기 때문에 넘어갔습니다.



14. 객체 저장

 자바에서만 사용한다면 ? 직렬화 사용


다른프로그램에서도 사용한다면? 일반 텍스트 파일로 저장


상태저장


데이터는 스트림 형태로 이동함


연결스트림은 출발지 또는 목적지로의 연결을 나타낸다.


연쇄스트림은 혼자서는 어디에 연결될 수 없고 반드시 연결 스트림에 연쇄되어야 한다.


FileOutputStream(연결스트림)은 파일에 바이트를 저장하기위한 메소드가 들어있으나 바이트 단위를 직접 저장하는 일은 적다 저수준이기 때문에 


ObjectOutputStream(연쇄스트림)은 객체를 스트림으로 보낼 수 ㅆ는 형태의 데이터로 바꿔주는 역할을 함


*객체 ㅡ>ObjectOutputStream(연쇄스트림)(객체를 직렬화(눌러 압축) 하고) ->FileOutputStream(연결스트림)(그 객체를 바이트 형태로 저장) ㅡ>파일(0101101)



1
2
3
4
5
Foo myFoo = new Foo();
 
FileOutputStream fs = new FileOutputStream("foo.ser"); //foo.ser 파일에 연결되는 파일스트림을 만든뒤
ObjectOutputStream os = new ObjectOutputStream(fs); //거기에 객체스트림(연쇄스트림)을 연쇄시키고
os.writeObject(myFoo);//그 연쇄스트림에 myFoo객체를 넣음
cs


! 직렬화를 하면 그 객체와 관련된 것이 몽땅 저장된다. 직렬화되는 객체에서 시작해서 인스턴스 변수로 참조된 모든 객체가 줄줄이 엮여서 저장된다.


객체가 아닌 클래스를 직렬화 하려면? Serializable 인터페이스를 구현해야 한다.

이 인터페이스는 인터페이스를 구현하는 클래스가 직렬화 할 수 있는 클래스라는 것을 나타내는 역할만 한다.


또한 인터페이스를 구현한 클래스를 상속받는 하위클래스도 마찬가지로 직렬화 가능해진다.


1
2
3
예를 든 코드 :objectWriteStream.writeObject(myBox)://여기에 들어가는 객체는 반드시 serializable이어야만 한다.
 
public class Box implements Serializable//대문자 유의 ,구현해야하는 메소드는 없지만 그냥 적어면 jvm이 알아서 처리한다.
cs


변수를 직렬화 할수 없으면 그 객체 전체가 직렬화불가 


어떤 인스턴스 변소를 저장해선 안된다면 그 변수를 transient로 지정하면 된다.

1
transient String currentID; //ex
cs


[역직렬화:객체 복구]
1
2
3
4
5
6
7
8
9
FileInputStream fileStream = new FilenputStream //FileInputStream을 만듭니다.
 
ObjectInputStream os - new ObjectInputStream//ObjectInputStream을 만듭니다.
 
Object one = os.readObject();//객체를 읽습니다.
 
GameCharacter elf = (GameCharacter) one;//readObject();의 리턴값은 Object유형이다. 따라서 우리가 알고있는 유형으로 캐스팅 해야한다.
 
os.close//ObjectInputStream를 닫는다.
cs


파일을 읽어서 바이트형태 읽고(FIleInputStream)  연쇄시켜 ObjectOutputStream으로 그 다음 캐스팅으로 압축한걸 펴주면 됨

*단 직렬화된 객체의 생성자는 실행되지 않는다.


  • 객체를 직렬화하면 객체의 상태를 저장할 수 있다. 
  • 스트림에는 연결과 연쇄스트림이 있다.
  • 직렬화 하고싶다면 파일아웃풋스트림을 만들고 그 스트림에 오브잭트 아웃풋 스트림을 연쇄시키면 된다.
  • 객체를 직렬화 할 때는 ObjectOutputStream의writeObject(theObject)메소드를 쓰면 된다. 
  • serializable 인터페이스를 implements 한 객체만 직렬화 할 수 있다. 그 연관객체도 직렬화 된다. 
  • 연관객체중 건넏뛰고싶은 것이 있다면 transient 키워드를 사용하면 된다.
  • 객체를 읽을때는 readObject()사용
  • 정적 변수는 직렬화 되지 않는다.

String의 텍스트파일 저장

1
2
3
4
5
6
7
8
9
objectOutputStream.writeobject(someObject);//직렬화된 객체를 저장하는 방법
 
fileWriter.write("dddd");//String 을 저장하는 방법
 
//ex)
FileWriter writer = new FileWriter("Foo.txt");//Foo라는 파일이 없으면 새로만듬
writer.write("hello foo!");//write메소드는 String을 인자로 받아들임
writer.close();//작업이 끝나면 
 
cs


1
File f = new File("ddd.txt");//이미 존재하는 파일을 나타내는 File객체를 만듭니다.
cs


버퍼
string이 전달 -> BufferedWriter(문자에 대해 작동하는 연쇄스트림)ㅡ>FileWrite ㅡ>목적지 파일


1
2
BufferedWriter writer = new BufferedWriter(new FileWriter(aFile));//FileWriter객체에 대한 레퍼런스를 만들 필요도 없다.
//메소드를 호출할 때 실제로 사용하는 BufferedWriter만 제대로 챙기면 된다. 이것을 닫으면 나머지도 연쇄적으로 닫힌다.


cs

  • 텍스트파일에 저장할때는 FileWriter부터 시작한다.
  • FileWriter를 BufferedWriter에 연쇄시키면 효율을 향상시킬 수 있다.
  • File객체는 특정경로파일을 나타낸다.이로 디렉토리 생성이나 제거 조회에 이용할 수 있다.
  • String파일명가진 스트림에서도 File객체 사용가능 하며 권장함
  • 텍스트파일을 읽을때는 FileReader부터 시작함 이에도 BufferedReader 연쇄 가능
  • String을 분리시키기 위해 split();메소드 사용

직렬화 시 버전id로 제어하는게 좋다

serialver 클래스명  라는 키워드로 버전을 알수 있따 이를 

1
2
stattic final long serialVersionUID=1111111111;
//이런식으로 클래스에 저장하여 문제없게 만듬
cs

15 네트워크와 스레드

소캣을 연결하려면 서버에대해 ip주소와 포트를 알아야 함

1
Socket chatSocket = new Socket("0.0.0.0"5000);
cs

소켓에 저수준(연결)입력 스트림에 연쇄된 인풋스트림리더를 만듬

1
InputStreamReader stream - new InputStreamReader(Chatsocket.getInputStream()):
cs

데이터를 Socket으로 쓸때는 printWriter 씀
  • inputStreamReader는 고수준 버퍼리더와  저수준 소켓입력 스트림사이에 들어가는 다리역할임
  • 서버에서는 클라이언트 요청을 기다리기위해 ServerSocket을 사용함
  • 요청이 들어오면 그 클라이언트와 Socket연결함으로서 수락함



스레드


자바와 멀티스레딩

1
2
3
Thread t - new Thread();
t.start();
//실행 스레드  만들자마자 죽음 작업이 빠졌기 때문 
cs

여러 스레드를 사용할 수 있지만 Thread 클래스는 하나뿐 새로 만들때는 꼭 인스턴스를 만들어야함 

Thread에는 start(),join(),sleep()등이 들어있다.



스레드 시작방법 
1
2
3
Runnable threadjob = new MyRunnable();//Runnable객체(스레드에서 할 작업)를 만듭니다. (추후 추가)
Thread myThread = new Thread(threadjob);//Tread객체(일꾼)를 만들고 그 객체에 Runnalble객체(작업)을 전달합니다.
myThread.start();//Thread객체를 실행시킵니다.
cs


스레드를 시작하려면 Runnable인터페이스를 implements(구현) 시켜야 한다 실행시 스택 맨아래로 들어간다. 다른스레드를 실행시키려면  지금스레드는 sleep();시킨다.


병행성문제lock으로 해결


어떤 메소드를 한번에 한 스레드만 접근하게하고싶으면synchronized라는 키워드 사용 (static자리에 넣음)

반응형

'백엔드 > JAVA' 카테고리의 다른 글

점프 투 자바 학습계획  (0) 2018.09.26
java 복습 4일차  (0) 2018.09.26
java 복습 2일 차  (1) 2018.09.24
자바 복습 계획  (0) 2018.09.24
java 복습 1일 차  (1) 2018.09.23
Comments