기술 블로그
java 복습 3일 차 본문
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()사용
- 정적 변수는 직렬화 되지 않는다.
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 |
1 2 | BufferedWriter writer = new BufferedWriter(new FileWriter(aFile));//FileWriter객체에 대한 레퍼런스를 만들 필요도 없다. //메소드를 호출할 때 실제로 사용하는 BufferedWriter만 제대로 챙기면 된다. 이것을 닫으면 나머지도 연쇄적으로 닫힌다. | cs |
- 텍스트파일에 저장할때는 FileWriter부터 시작한다.
- FileWriter를 BufferedWriter에 연쇄시키면 효율을 향상시킬 수 있다.
- File객체는 특정경로파일을 나타낸다.이로 디렉토리 생성이나 제거 조회에 이용할 수 있다.
- String파일명가진 스트림에서도 File객체 사용가능 하며 권장함
- 텍스트파일을 읽을때는 FileReader부터 시작함 이에도 BufferedReader 연쇄 가능
- String을 분리시키기 위해 split();메소드 사용
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 |
- inputStreamReader는 고수준 버퍼리더와 저수준 소켓입력 스트림사이에 들어가는 다리역할임
- 서버에서는 클라이언트 요청을 기다리기위해 ServerSocket을 사용함
- 요청이 들어오면 그 클라이언트와 Socket연결함으로서 수락함
스레드
자바와 멀티스레딩
1 2 3 | Thread t - new Thread(); t.start(); //실행 스레드 만들자마자 죽음 작업이 빠졌기 때문 | cs |
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 |