반응형
도서명 | 쪽수 | 저자, 출판사 | 발행일 | |||||
Java의 정석 : 최신 Java 8.0 포함 |
1022 | 남궁성(저),도우출판 | 2016년 01월 27일 |
1. 자바를 시작하기 전에
- 자바 API 문서 : Oracle Java Technologies | Oracle
2. 변수(Variable)
- 정수형은 int, 실수형은 double 을 주로 사용
- 상수(constant) 는 한 번 값 저장 시 변경 불가, 대문자와 ‘_’ 사용 → final int MAX_SPEED = 20;
- 정수형 리터럴 중간 구분자 ‘_’ (JDK 1.7 이후) → long big = 100_000_000_000L;
- float 타입을 int 타입으로 변환 시 소수점 이하의 값은 버림 처리 됨
3. 연산자(Operator)
- 나누기 연산 시 올바른 연산결과를 얻기 위해서는 두 피연산자 중 한 쪽을 실수형으로 형변환 해야 함
- 대소문자 구별하지 않고 문자열 비교 → equalsIgnoreCase()
4. 조건문과 반복문
- switch문은 break문 빼먹지 않도록 주의 (break나 블럭 끝을 만날때까지 모두 수행함)
- 기본 for문 → for(int i=0; i<5; i++) {}
- 배열과 컬렉션 요소 읽기 용 for문 (JDK 1.5 이후) → for(int tmp: arr) {}
- 이름 붙은 반복문 : break문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우에는 반복문에 이름을 지정해 벗어날 수 있음.
// for문에 Loop1 이라는 이름 붙임 Loop1: for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { // code.. break Loop1; } } // end of Loop1
5. 배열(Array)
- 배열 복사
- System.arraycopy(num, 0, newNum, 0, num.length)
: num[0] 에서 newNum[0] 으로 num.length 개의 데이터 복사
- System.arraycopy(num, 0, newNum, 0, num.length)
- String 클래스는 char배열에 기능을 추가한 것이므로, char배열을 사용하는 것보다 String 클래스를 사용하는 것이 문자열을 다루기 더 편리함
6. 객체지향 프로그래밍 I
- 클래스의 인스턴스화 : 클래스로부터 객체를 만드는 과정
- 클래스의 인스턴스 : 어떤 클래스로부터 만들어진 객체
- 변수
- 클래스변수 : 클래스 영역에 위치, ‘static’, 클래스가 메모리에 올라갈 때 생성, 모든 인스턴스가 공통된 변수를 공유해야 할 때 사용
- 인스턴스변수 : 클래스 영역에 위치, 인스턴스가 생성되었을 때 생성
- 지역변수 : 클래스 영역 이외의 영역에 위치 (메서드, 생성자, 초기화 블럭 내부), 변수 선언문이 수행되었을 때 생성, 메서드가 종료되면 소멸
- 메서드
- 인자(argument) : 메서드를 호출할 때 괄호()안에 지정해준 값들
- 매개변수(parameter) : 호출된 메서드에 선언된 값들, 인자의 개수 및 순서와 동일
- 기본형 매개변수 : 변수의 값을 읽기만 할 수 있음
- 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있음
- static메서드는 같은 클래스 내의 인스턴스 메서드 및 인수턴스 변수를 사용할 수 없음 단, 객체를 생성하면 인스턴스멤버 참조, 호출 가능 (이렇게 사용하는 경우는 드물다)
- 재귀호출 : 메서드의 내부에서 메서드 자신을 다시 호출하는 것, 조건문으로 종료 해줘야 함 (비효율적이므로 재귀호출에 드는 비용보다 재귀호출의 간결함이 주는 이득이 충분히 큰 경우에만 사용, while문으로 대체 가능)
- 오버로딩(overloading) : 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
- 메서드 이름이 같아야 하고 매개변수의 개수 또는 타입이 달라야 함
- 생성자(Constructor) : 인스턴스가 생성될 때 호출되는 ‘인스턴스 초기화 메서드’ 생성자의 이름은 클래스의 이름과 같고 리턴 값이 없음.
- 생성자가 하나도 없을 경우 컴파일러에 의해 ‘기본 생성자’ 가 자동으로 추가 되지만, 매개변수가 있는 생성자를 정의 할 경우 기본 생성자도 같이 추가해서 작성해주어야 함.
- 인스턴스를 생성한 다음에 인스턴스변수의 값을 변경하는 것보다 매개변수르 갖는 생성자를 사용하는 것이 코드를 보다 간결하고 직관적으로 만든다.
- 생성자에서 다른 생성자 호출 : 생성자의 이름으로 클래스 이름 대신 this() 를 사용, 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능
- this 는 참조변수로 인스턴스 자신을 가리킴 (인스턴스멤버만 사용 가능)
- 변수의 초기화 : 멤버변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본 값으로 초기화가 이루어지므로 초기화하지 않고 사용해도 되지만, 지역변수는 사용하기 전에 반드시 초기화 해야 함.
- 초기화 블럭
- 클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용 static { }
-> 클래스가 메모리에 처음 로딩될 때 한번만 수행 - 인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용 { }
-> 생성자와 같이 인스턴스를 생성할 때 마다 수행
- 클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용 static { }
- 초기화 블럭
7. 객체지향 프로그래밍 II
- 상속(inheritance) : 기존의 클래스를 재사용하여 새로운 클래스를 작성
class Child extends Parent { ... }- 생성자와 초기화 블럭은 상속되지 않고 멤버만 상속됨
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많음
- 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성됨.
- 단일 상속만 가능
- 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스를 상속 받음
- 상속관계 : ~은 ~이다 , 포함관계 : ~은 ~을 가지고 있다.
- 오버라이딩(overriding) : 조상 클래스에 정의된 메서드와 같은 메서드를 자손 클래스에 정의하는 것
- 조상 클래스의 메서드와 이름, 매개변수, 반환타입이 같아야 함
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없음 public > protected > (default) > private
- public : 전체, 접근 제한 없음
- protected : 같은 패키지, 다른 패키지의 자손 클래스 에서 접근 가능
- default : 같은 패키지 내에서만 접근 가능
- private : 같은 클래스 내에서만 접근 가능
- 예외는 조상 클래스의 메서드보다 많이 선언 할 수 없음
- 인스턴스메서드를 static 메서드로 또는 그 반대로 변경할 수 없음
- super : 상속받은 멤버와 자신의 멤버 이름이 같을 때 super 를 붙여서 구별
- super() : 조상 클래스의 생성자 호출, 입력하지 않을 경우 자동으로 생성자 첫줄에 삽입 됨
- final 클래스 : 다른 클래스의 조상이 될 수 없음, final 메서드 -> 오버라이딩 재정의 불가
- 다형성 : 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것
- 추상 클래스 (abstract class) : 미완성 설계도, 상속을 통해서 자송클래스에 의해서만 완성될 수 있음. 추상 메서드를 포함하고 있다는 것을 제외하고는 일반 클래스와 전혀 다르지 않음
- 상속 : 자손 클래스를 만드는데 조상 클래스를 사용, 확장하는 작업
- 추상화 : 기존의 클래스의 공통 부분을 뽑아내서 조상클래스를 만드는 것, 자손은 반드시 구현해야 함
- 인터페이스 (interface) : 기본 설계도, 추상화 정도가 높아서 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않음.
- 인터페이스로부터만 상속 받을 수 있고 다중상속 가능
- 메서드의 리턴타입이 인터페이스이면 -> 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미
- 인터페이스 장점 : 개발시간 단축, 표준화, 서로 관계없는 클래스들 관계 맺어줌, 독립적인 프로그래밍
- 디폴트 메서드를 사용할 수 있음
interfac 인터페이스이름 { public static final 타입 상수이름 = 값; public abstract 메서드이름(매개변수목록); // jdk 1.8 은 static 과 default 허용 } // 인터페이스 구현 class 클래스명 implements 인터페이스 이름 { // 인터페이스에 정의된 추상메서드 구현 }
- 내부 클래스 : 클래스 내에 선언된 클래스 (두 클래스가 서로 긴밀한 관계에 있을때 선언)
- 장점 : 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근 가능, 코드의 복잡성을 줄임 (캡슐화)
- 익명 클래스 : 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용되는 일회용 클래스
8. 예외처리(Exception Handling)
- Exception : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
- RuntimeException : 프로그래머의 실수로 발생하는 예외
- printStackTrace() : 예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
- getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시디를 얻을 수 있음
- 멀티 catch 블럭 ( jdk 1.7~ ) : ‘|’ 기호를 이용하여 하나의 catch 블럭으로 합칠 수 있음
catch (ExceptionA | ExceptionB e) { } - 예외 발생 시키기 → throw new Exception("예외 발생")
- 메서드에 예외 선언 → void method() throws Exception1, Exception2 { }
- finally 블럭 : 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용
- try - with - resources ( jdk 1.7 ~ ) : 주로 입출력에 사용되는 클래스의 자원을 자동 반환
/** 괄호() 안에 객체를 생성하는 문장을 넣으면, 이 객체는 따로 close() 를 호출하지 않아도 try 블럭을 벗어나는 순간 자동적으로 close() 가 호출된다. 그다음 catch 또는 finally 블럭 수행 **/ try (FileInputStream fis = new FilwInputStream("score.dat"); DataInputStream dis = new DataInputStream(fis)) { // ... } catch (EOFException e) { }
- 사용자정의 예외 → class MyException extends Exception { }
- 연결된 예외 : 여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위해 사용
- 지정된 예의를 원인 예외로 등록 → Throwable initCause(Throwable cause)
- 원인 예외를 반환 → Throwable getCause()
9. java.lang패키지와 유용한 클래스
- Object 클래스
- equals(), hashCode(), toString(), clone(), getClass() 등
- String 클래스
- jon() : 여러 문자열 사이에 구분자를 넣어 결합, split() 과 반대
- valueOf() : 기본형을 문자열로 변경, parse**() 와 동일
- Math 클래스
- 예외를 발새시키는 메서드 ( jdk 1.8 ~ ) : 메서드 이름에 ‘Exact’가 포함된 메서드들
- 래퍼(wrapper) 클래스
- 래퍼 클래스들은 모두 equals()가 오버라이딩되어 있어서 주소값이 아닌 객체가 가지고 있는 값을 비교한다.
- 오토박싱(autoboxing) : 기본형 값을 래퍼 클래스의 객체로 자동 변환해주는 것
- 언박싱(unboxing) : 래퍼 클래스의 객체를 기본형 값으로 자동 변환해주는 것
- Objects 클래스
- Object 의 equals() 와는 다르게 Objects의 equals() 는 null 검사를 하지 않아도 된다.
- Scanner 클래스
- JDK 1.5 이전은 BufferedReader 를 사용했지만, 이후에는 Scanner 가 추가 되었음. 화면, 파일, 문자열과 같은 입력소스로부터 문자데이터를 읽어오는데 도움을 줌
- BigInteger 클래스
- 가장 큰 정수형 타입인 long 보다 큰 값을 다룰 수 있음
- 가장 큰 정수형 타입인 long 보다 큰 값을 다룰 수 있음
10. 날짜와 시간 & 형식화
- Calendar 가 새로 추가되면서 Date 는 대부분의 메서드가 ‘deprecated’ 되었으므로 잘 사용되지 않음.
- jdk 1.8 이후, 기존의 단점들을 개선한 ‘java.time패키지’ 가 추가됨.
- 형식화 클래스
- java.text 패키지에 포함되어 있으며 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현 할 수 있는 방법을 객체지향적으로 설계하여 표준화
- DecimalFormat
- SimpleDateFormat
- ChoiceFormat
- MessageFormat
- java.text 패키지에 포함되어 있으며 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현 할 수 있는 방법을 객체지향적으로 설계하여 표준화
- java.time패키지
- LocalDate (날짜) + LocalTime (시간) = LocalDateTime (날짜&시간)
- LocalDateTime + 시간대 = ZonedDateTime
- 날짜 - 날짜 = Period
- 시간 - 시간 = Duration
- 현재 날짜 or 시간 → .now()
- 날짜 or 시간 지정 → .of() / .with()
- 날짜 or 시간 더하거나 뺄 때 → .plus() / .minus()
- 문자열을 날짜와 시간으로 변환 → .parse()
- 지정된 것보다 작은 단위의 필드를 0으로 만들 때 → .truncatedTo()
- 날짜와 시간 비교 → .compareTo() / .isAfter() / .isBefore() / .isEqual()
- 서로 다른시간대에 존재하는 컴퓨터간의 통신에는 OffsetDateTime 사용
- 파싱과 포맷 : DateTimeFormatter
11. 컬렉션 프레임웍
- 컬렉션 프레임웍이란 : 데이터 군을 저장하는 클래스들을 표준화한 설계
- List, Set, Map 등
- ArrayList 와 LinkedList 비교
- 순차적으로 추가/삭제하는 경우에는 ArrayList 가 빠름
- 중간 데이터를 추가/삭제하는 경우에는 LinkedList 가 빠름
- 스택(Stack) : 마지막에 저장한 데이터를 가장 먼저 꺼내는 LIFO
- 수식계산, 수식괄호검사, 워드프로세서의 undo/redo, 웹브라우저 뒤로/앞으로 등
- 큐(Queue) : 처음에 저장한 데이터를 가장 먼저 꺼내는 FIFO
- 최근사용문서, 인쇄작업 대기목록, 버퍼 등
- Iterator : 컬렉션에 저장된 각 요소에 접근하는 기능 (단방향, 재사용 안됨)
- hasNext(), next(), remove() 등
- ListIterator : Iterator를 상속받아서 기능을 추가한 것, 양방향
- Arrays : 배열을 다루는데 유용한 메서드 정의
- copyOf(), copyOfRange(), sort(), binarySearch()
- Comparable : 기본 정렬기준을 구현하는데 사용
- Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
- HashMap : 키와 값을 묶어서 하나의 데이터로 저장, 해싱을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 가짐
- TreeMap : 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터, 범위검색이나 정렬이 필요한 경우 사용
- Properties : 주로 애플리케이션의 환경설정과 관련된 속성을 저장하는데 사용
- Collections : 컬렉션과 관련된 메서드 제공
12. 지네릭스, 열거형, 애너테이션
- 지네릭스
- 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능
- class Box<T> { // 지네릭 타입 T를 선언
- 지네릭 타입에 extends 를 사용하면 특정 타입의 자손들만 대입할 수 있도록 제한
- class FruitBox<T extends Fruit> {
- 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능
- 열거형(enums)
- 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용
- 애너테이션(annotation)
- 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것, 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공할 수 있음
- @Override , @Deprecated , @FunctionalInterface , @SuppressWarnings , @SafeVarargs 등
- 메타 애너테이션 → 애너테이션에 붙이는 애너테이션
- @Target , @Retention , @Documented , @Inherited , @Repeatable , @Native 등
- @Target , @Retention , @Documented , @Inherited , @Repeatable , @Native 등
- 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것, 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공할 수 있음
13. 쓰레드(Thread)
- 쓰레드 구현 방법 : Runnable 인터페이스 구현
class MyThread implements Runnable { public void main() { /* 작업내용 */ } }
- 쓰레드의 실행
- main메서드에서 쓰레드의 start() 호출
- start()는 새로운 쓰레드를 생성하고, 쓰레드가 작업하는데 사용 될 호출스택을 생성
- 새로 생성된 호출스택에 run() 이 호출되어, 쓰레드가 독립된 공간에서 작업을 수행
- 이제는 호출스택이 2개이므로 스케줄러가 정한 순서에 의해서 번갈아 가면서 실행
- 한 쓰레드가 예외가 발생해서 종료되어도 다른 쓰레드의 실행에는 영향을 미치지 않음
- 컨텍스트 스위칭(context switching) : 프로세스 또는 쓰레드 간의 작업 전환
- 싱글 코어에서 단순이 CPU만을 사용하는 계산작업이라면 오히려 멀티쓰레드보다 싱글쓰레드로 프로그래밍하는 것이 더 효율적임.
- 쓰레드의 우선순위
- 시각적인 부분이나 사용자에게 빠르게 반응해야하는 작업을 하는 쓰레드의 우선순위는 다른 작업을 수행하는 쓰레드에 비해 높아야 함. (1~10 까지 숫자가 높을수록 우선순위가 높음, 쓰레드를 실행하기 전에만 우선순위를 변경할 수 있음)
- 멀티코어에서는 쓰레드의 우선순위에 따른 차이가 전혀 없음
- 쓰레드 그룹 (thread group)
- 서로 관련된 쓰레드를 그룹으로 다루기 위한 것
- 쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 자동적으로 main쓰레드 그룹에 속하게 됨
- 데몬 쓰레드 (daemon thread)
- 다른 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 쓰레드
- 일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동종료 됨
- ex) 가비지 컬렉터, 워드프로세서의 자동저장, 화면자동갱신 등
- 쓰레드의 실행제어
- sleep, join, interrupt, stop, suspend, resume, yield 등
- 쓰레드의 동기화 (synchronization)
- 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것
- 공유 데이터를 사용하는 코드 영역을 ‘임계 영역 (critical section)’ 으로 지정해놓고, 공유 데이터(객체)가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 이 영역 내의 코드를 수행할 수 있게 한다.
- 임계 영역은 멀티쓰레드 프로그램의 성능을 좌우하기 때문에 가능하면 메서드 전체에 락을 거는 것보다 synchronized 블럭으로 임계 영역을 최소화해서 보다 효율적인 프로그램이 되도록 해야 함.
- fork() : 작업을 쓰레드의 작업 큐에 넣는 것. 작업 큐에 들어간 작업은 더 이상 나눌 수 없을 때가지 나뉨 (비동기 메서드)
- join() : 해당 작업의 수행이 끝날 때까지 기다렸다가, 수행이 끝나면 그 결과를 반환 (동기 메서드)
14. 람다와 스트림
- 람다식 : 메서드를 하나의 식으로 표현한 것, 메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통 {} 사이에 -> 를 추가 (a, b) -> a > b ? a : b
- 함수형 인터페이스 (functional interface) : 람다식을 다루기 위한 인터페이스, 하나의 추상 메서드만 정의되어 있어야 함 Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
- 메서드 참조 (method reference) : 람다식이 하나의 메서드만 호출하는 경우 간략히 하는 방법
Function<String, Integer> f = Integer::parseInt; // '클래스이름::메서드이름’ 또는 ‘참조변수::메서드이름’ - 스트림 (stream) : 데이터소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의
- 스트림 특징
- 데이터 소스를 변경하지 않음
- 일회용
- 작업을 내부 반복으로 처리
- 최종 연산이 수행되기 전까지는 중간 연산이 수행되지 않음
- 병렬 처리가 쉬움
- 스트림 연산
- 중간 연산 : 연산 결과가 스트림인 연산. 스트림에 연속해서 중간 연산할 수 있음
- 최종 연산 : 연산 결과가 스트림이 아닌 연산. 스트림의 요소를 소모하므로 단 한번만 가능 stream.distinct().limit(5).sorted().forEach(System.out::println)
- 빈 스트림 → Stream.empty()
- 두 스트림의 연결 (같은 타입만 가능) → concat()
- 중복 제거 → distinct()
- 주어진 조건에 맞지 않는 요소 제외 → filter()
- 스트림 자르기 → skip(), limit()
- 정렬 → sorted() , 정렬 조건 추가 → thenComparing()
- 중간 연산 확인 → peek()
- 조건 검사 → allMatch(), anyMatch(), noneMatch(), findFirst(), findAny()
- 통계 → count(), sum(), average(), max(), min()
- 리듀싱 (스트림의 요소를 줄여나가면서 연산을 수행하고 최종결과 반환) → reduce()
- Optional : 널 체크를 위한 if문 없이도 NullPointerException이 발생하지 않는 보다 간결하고 안전한 코드를 작성 가능하게 함
- 만일 참조변수의 값이 null일 가능성이 있으면, of() 대신 ofNullable()을 사용해야 함
- collect() : 스트림의 요소를 수집하는 최종 연산, 매개변수로 컬렉터를 필요로 함
- 스트림을 컬렉션과 배열로 변환 → toList(), toSet(), toMap(), toCollection(), toArray()
- 문자열 결합 → joining()
- 그룹화와 분할 → groupingBy() , partitioningBy()
- 스트림 특징
15. 입출력(I/O)
- 바이트기반 스트림 : InputStream, OutputStream
- 보조 스트림 : 실제 데이터를 주고받는 스트림이 아니기 때문에 데이터를 입출력할 수있는 기능은 없지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있음
- 문자기반 스트림 : Reader, Writer
- 파일 입출력 스트림 : FileInputStream, FileOutputStream
- 바이트기반의 보조 스트림 : BufferedInputStream, BufferedOutputStream
- 보조스트림을 사용한 경우에는 기반스트림의 close()나 flush()를 호출할 필요없이 단순히 보조스트림의 close()를 호출하기만 하면 됨
- try - with - resources문을 이용해서 close()를 직접 호출하지 않아도 자동호출되도록 할 수 있음
try (FileInputStream fis = new FileInputStream("score.dat");
DataInputStream dis = new DataInputStream(fis)) {
// 내용
} catch (EOFException e) {
} catch (IOException ie) {
}
- File 클래스 : 파일과 디렉토리를 다룰 수 있음
- 직렬화 (Serialization) : 객체를 데이터 스트림으로 만드는 것, ObjectOutputStream 사용
- 역직렬화 (deserialization) : 스트림으로부터 데이터를 읽어서 객체를 만드는 것, ObjectInputStream 사용, 역직렬화 시 직렬화할 때의 순서와 일치해야 함. 직렬화 할 객체가 많을 때는 각 객체를 개별적으로 직렬화하는 것보다 ArrayList와 같은 컬렉션에 저장해서 직렬화하는 것이 좋음.
- 직렬화 가능한 클래스의 버전관리 : 클래스 내에 serialVersionUID 를 정의
16. 네트워킹(Networking)
- 두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것
- InetAddress : IP주소를 다루기 위한 클래스
- URL : URL을 다루기 위한 클래스
- URLConnection : 어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스
- 소켓 프로그래밍
- TCP : 연결 기반, 파일을 주고받는데 적합
- UDP : 비연결기반, 게임이나 동영상의 데이터를 전송하는 경우와 같이 데이터가 중간에 손실되어 좀 끊기더라도 빠른 전송이 필요할 때 적합
반응형
'Programming > Java, Kotlin' 카테고리의 다른 글
[Java] Spring Boot 특정 url 로 리다이렉션 하기 (0) | 2024.06.15 |
---|---|
[Java] length, length(), size() 차이 (0) | 2024.05.24 |
[Java] 형 변환 (0) | 2024.05.24 |
[Java] 배열 (0) | 2024.05.24 |
[Java] 향상된 for 문 (0) | 2024.05.24 |