<Java>
Collection은 바구니 add()를 통해서 데이터 추가, size()는 데이터 갯수를 알려줌. 바구니의 데이터를 꺼낼때 iterator사용, 꺼낼게 있는지 확인하는 것이 hasNext(), 꺼내주는 것이 next(). Collection자체로는 순서를 알수가 없음.
List()는 collection을 상속, 다른 점은 순서를 기억을 해준다. get(int)로 순서대로 리턴해줄 수 있음.
Set()은 중복을 허용하지 않음. 같은 데이터는 한번만 적용.
Map(), key와 value를 가지고 있는 자료구조. push()로 저장, get()으로 key에 해당되는 value리턴.
List()를 구현해준 클래스는 ArrayList()가 있고 Set()을 구현한 클래스는 HashSet(), Map()을 구현한애는 HashMap().
Interface의 좋음점. Collection API를 보면 Collection을 상속해서 구현한 자료구조가 굉장히 많다. 그럼으로 Collection 타입의 객체를 만들때 새로운 자료구조가 나오면 해당 new (여기)만 바꾸면 되서 굉장히 간편하다.
HashSet()에 중복된 값을 add()할 경우에는 boolean값 false가 리턴이 된다.
그리고 객체안에 필드가 여러개인 인스턴스를 add하려고 할때 필드의 값이 중복이 되어도 add가 되어버리는 현상이 있다. 이런 현상이 발생하는 이유는 HashSet이 add를 할때 hashcode란 메소드와 equals메소드를 호출해주는데 만약 해당 메소드들이 객체클래스에 선언이 되지 않으면 Object클래스의 메소드것을 그대로 가져다 쓰게 되는데 이는 아무 기능이 없는 메소드이다. 그럼으로 해당 객체의 클래스에서 equals와 hashcode 메소드를 오버라이드 시켜주어야한다. 해당 메소드들은 인텔리제이가 쉽게 생성해준다.
/**
…
..
*/
이런애들은 JavaDoc주석문이라고 하며 주로 클래스를 설명하기 위한 주석이다.
해당 주석문에서는 다양한 태그들을 사용한다.메소드의 버전, 작성자, 언제 수정되었는지 그러한 태그들이 존재한다. 필요할때 검색해서 써라.
자바에서 2가지 오류. Error: 수습할 수 없는 심각한 오류, 대표적으로 메모리가 죽거나 스택오버플로우.
두번째는 Exception(예외), 예외처리를 통해 수습할 수 있는 오류.
예외 떠넘기기(throws 사용하기), 해다 메소드를 호출한 쪽에 예외를 떠넘기는 방식.
RuntimeException과 Checked Exception.
runtimeException을 상속받고 있으면 다 runtimeException.
그 나머지는 다 checked exception이다.
실행시에 죽는 exception이 runtimeException.
FileInputStream같은 클래스를 보면 checkedException인데 해당 클래스는 코딩을 할때 exception처리를 해주지 않으면 컴파일 에러가 발생을 한다.
main메소드에다가 예외를 throw해주면 그냥 죽음.
되도록이면 runtimeException을 사용하자, 훨신 편하다.
변수가 특정범위의 값들만 갖게 하는 방법이 enum을 사용하는것.
EnumMap이란 클래스가 있는데 Enum타입을 키로 사용할 수 있도록 도와준다.
EnumSet도 있음,
자바 IO는 조립되어 사용되도록 만들어졌다. Decorator 패턴.
Java IO에서 Component역할하는 애들이 InputStream, OutputStream, Reader, Writer이다. 다 추상클래스이다. Decorator는 Component를 받아들이게 되어있다.
위의 component를 상속받는 클래스중 위 클래스가 생성자로 존재하지 않으면 주인공 클래스다. 얘네들은 어떤 대상으로부터 데이터를 읽을지 출력할지 그런 역할을 한다고 한다.
장식은 InputStream, OutputStream, Reader, Writer를 생성자에서 받아들인다.
자바 IO를 잘 다루려면 API를 잘 다루어야 한다. 쓰기전에 알아서 잘 찾아보고 사용하자….
FILE.createTempFile로 임시파일을 만들수가 있음. 파라미터는 (시작하는 문자, 끝나는 파일 형식). 그리고 deleteOnExit()을 사용하면 임시 파일을 삭제해준다.
ByteStream, 바이트 단위로 읽어드리는 메소드가 왜 바이트로 안읽고 int로 읽는가?
EOF때문. 2의 보수로 모든 비트가 1일때 그 값은 -1. EOF를 표현하기 위해서는 바이트 그 이상의 비트가 필요하기 때문에 바이트를 리턴하지만 해당 주어진 범위의 비트 이상값을 EOF로 표현하자.
stream같은 경우는 다 사용을 하고 나면 꼭 close()해주어야함.
뭐 Reader(), Writer(), Input(), Output()이런건 다 abstract이기 때문에 왠만하면 인스턴스를 만들때 앞에 File붙이면 완성된 클래스를 선언할 수가 있음.
(이런저런 디자인과 패턴들이 있고 여러 종류의 클래스가 있는데 좀 복잡하고 이해가 어렵다. 나중에 필요할때 다시 봐야할듯)
직렬화(Serializable). object가 bytestream으로 바꿔서 읽어드리는. 필드도 모두 직렬화 가능해야 된다.(여기도 예제 잘모르겠음) 직렬화를 하면 객체의 깊은 복사가 가능하다.
Thread.
병렬, 병행. 병행은 멀티스레드, 병렬은 멀티코어
프로세스간의 통신은 IPC로 한다. 프로세스간의 컨텍스트 스위칭 비용이 더 크기 때문에 스레드를 쓴다.
프로세스안에서 여러개의 스레드가 있을 수 있다.
thread를 상속, 반드시 run메소드를 오버라이드 해야된다. 실제로 호출하는 것은 start. run이 해당 스레드에서 실행되는 코드. start를 해야지 스레드 활성화.
이제는 모든 스레드가 종료가 되어야지 프로그램이 종료된다.
두번째 스레드 만드는 법은 Runnable 인터페이스를 구현. run을 오버라이드. start메소드가 없음. 그래서 custom 클래스를 만들고 Thread인스턴스를 생성하는데 생성자에 Runnable인스턴스를 넣어준다.
실행결과가 항상 같지는 않다.
맥에선 ifconfig로 ip알수 있음.
'What I Learned' 카테고리의 다른 글
[WIL] Day 8 (0) | 2023.05.14 |
---|---|
[WIL] Day 7 (0) | 2023.05.14 |
[WIL] Day 5 (0) | 2023.05.12 |
[WIL] Day 4 (0) | 2023.05.10 |
[WIL] Day 3 (0) | 2023.05.08 |
댓글