Java 개념 공부 시작합니다. 객체지향 개념 시리즈에서 이어집니다.
내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일(일반 클래스는 제어자로 default와 public만 되는 반면 내부 클래스는 전체 제어자 사용 가능)static 멤버(cv)를 가지기 위한 내부 클래스는 당연히 static class 이어야 한다.(why? c
컴파일 에러런타임 에러 : 실행 중 발생한 에러1) Error: 심각한 에러2) Exception : 미약한 에러 (Exception과 그 자손, RuntimeException과 그 자손)논리적 에러예외가 발생하면, 이를 처리할 catch 블럭을 찾아 내려감일치하는 c
예외가 발생하면 예외 객체가 생성이 되는데, 거기에는 예외에 대한 정보가 들어있고 메서드들을 통해서 그 정보를 가져올 수 있다.printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.ge
throw 사용checked 예외 : 컴파일러가 예외처리 여부를 체크(예외처리(try-catch) 필수)ex. Exception과 그 자손unchecked 예외 : 컴파일러가 예외처리 여부를 체크 안함(예외처리(try-catch) 선택) ex. RuntimeExcept
예외를 처리하는 방법 : try-catch문(직접 처리), 예외 선언하기(예외 떠넘기기(알리기))메서드가 호출시 발생가능한 예외를 호출하는 쪽에 알리는 것(checked 예외만 선언하는 것이 정석임)메소드가 try-catch문을 사용하여 예외처리 하지 않고 자신을 호출
직접 예외 클래스를 정의할 수 있다.조상은 Exception과 RuntimeException중에서 선택 Exception : 사용자가 발생시키는 예외 RuntimeException : 프로그래머의 실수로 발생시키는 예외 가능하면 선택처리(try-catch 필수 X
연결된 예외 : 어떤 예외를 다른 예외로 감싸는 것언제 사용? 1.세부적인 사항을 포괄적인 사항으로 포함시킬 때 사용 2.uncheked 예외를 unchecked 예외로 변경시 사용(try-catch문 사용을 줄일 수 있음) 한 예외가 다른 예외를 발생시킬 수 있
모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.notify(), wait() 등은 쓰레드와 관련된 메서드이다.객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false.Object클래스의 equals()는 객체의 주소
객체의 해시코드(hash code)를 반환하는 메서드Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환equals()를 오버라이딩하면, hashCode()도 오버라이딩 해야한다.(∵ equals() 결과가 true인 두 객체의 해시코드는 같아
데이터(char\[]) + 메서드(문자열 관련)내용을 변경할 수 없는 불변(immutable) 클래스0x100번지의 "a"가 바뀌는 것이 아니라 / 새로운 0x300번지에 값을 담고 a는 0x300을 가리키게 된다.덧셈 연산자(+)를 이용한 문자열 결합은 성능이 떨어짐
join()은 여러 문자열 사이에 구분자를 넣어서 결합한다.숫자를 문자열로 바꾸는 방법문자열을 숫자로 바꾸는 방법
문자열을 저장하고 다룬다.String처럼 문자열 배열(char\[])을 내부적으로 가지고 있다.그러나, String과 달리 내용을 변경할 수 있다.(mutable(가변))배열은 길이 변경불가. 공간이 부족하면 새로운 배열을 생성해야 한다.StringBuffer는 저장할
지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성StringBuffer인스턴스의 버퍼크기 반환StringBuffer인스턴스에 저장되어 있는 문자열의 길이 반환지정된 범위(start<= scope < end)의 문자를 제거
싱글 쓰레드 프로그램에서는 StringBuilder를 사용하는 것이 좋다.StringBuffer는 동기화 되어있다.(데이터 보호) 멀티쓰레드에 안전(thread-safe)(cf. 싱글 쓰레드 : 한 번에 1개 작업 / 멀티 쓰레드 : 한 번에 n개 작업)멀티 쓰레드 프
기본형 값을 감싸는 클래스8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스Q. 기본형은 객체가 아니다. Java는 모든 것을 객체로 하지 않고 왜 기본형을 두었나?A. 성능 문제. 기본형은 바로 직접 접근이 가능한 반면 객체형은 객체를 생성해야 하므로모든 숫자 Wra
문자열을 숫자 & Wrapper로 변환하는 다양한 방법n진법의 문자열을 숫자로 변환하는 방법기본형과 참조형간의 자동변환오토박싱 : 기본형 int -> Wrapper 클래스인 Integer로 자동 변환언박싱 : Wrapper 클래스인 Integer -> 기본형 int로
날짜와 시간을 다룰 목적으로 만들어진 클래스(JDK1.0)Date는 메서드는 거의 deprecated되었지만(앞으로 사용 X), 여전히 쓰이고 있다.Date클래스를 개선한 새로운 클래스(JDK1.1). 여전히 단점이 존재(단점 : 항상 날짜와 시간을 같이 다룬다.)Da
set()으로 날짜와 시간지정날짜 지정 방법. (※ MONTH는 0부터 시작)시간 지정 방법.clear()는 Calendar 객체의 모든 필드를 초기화clear(int field)는 Calendar 객체의 특정 필드를 초기화
add()는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향 O)roll()는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향 X)
java.text 패키지의 DecimalFormat, SimpleDateFormat숫자와 날짜를 원하는 형식으로 쉽게 출력 가능(숫자, 날짜 -> 형식 문자열)형식 문자열에서 숫자와 날짜를 뽑아내는 기능(형식 문자열 -> 숫자, 날짜)cf. Integer.parseIn
날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.특정 형식으로 되어 있는 문자열에서 날짜와 시간을 뽑아낼 수도 있다.
컬렉션 프레임워크(collections framework) 컬렉션(collection) 여러 객체(데이터)를 모아 놓은 것을 의미 프레임워크(framework) 표준화 정형화된 체계적인 프로그래밍 방식 컬렉션 프레임워크(collections framework) 컬렉
List : 순서 O 중복 OSet : 순서 X 중복 XMap : 순서 X 중복 (키 X, 값 O)Collection : List, Set 인터페이스에서 공통 부분을 뽑아낸 것(조상)(부모 관계 이므로 Collection 인터페이스의 모든 메서드는 List, Set 인
ArrayList는 기존의 Vector를 개선한 것으로 구현 원리와 기능적으로 동일 (Array와 달리 Vector는 자체적으로 동기화 처리되어 있음)List 인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용한다.데이터의 저장공간으로 배열을 사용한다.(배열 기
장점 : 배열은 구조가 간단하고, 데이터를 읽는데 걸리는 시간(access time)이 짧다.단점 1 : 크기를 변경할 수 없다.크기를 변경해야 하는 경우 새로운 배열을 생성 후 데이터를 복사해야 함.크기 변경을 피하기 위해 충분히 큰 배열을 생성하면, 메모리가 낭비됨
Stack : 배열로 구현하는 것이 유리(remove는 뒤에서부터 한다.)Queue : Linked list 구현이 유리Stack의 메서드Queue의 메서드 예외가 발생하지 않는 메서드 : offer, poll, peekJava에서 Queue는 인터페이스(객체 생성 불
스택의 활용 예 - 수식계산, 수식괄호검사, 워드프로세서의 undo/redo, 웹브라우저의 뒤로/앞으로큐의 활용 예 - 최근사용문서, 인쇄작업 대기목록, 버퍼(buffer)스택을 활용한 수식괄호검사 예제큐를 활용한 최근사용단어 예제
\- Iterator만 알면 된다.컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스Enumeration은 Iterator의 old 버전Iterator 인터페이스의 메서드Enumeration 인터페이스의 메서드: Iterator 인터페이스 메서드와 이름만 다를뿐 같
배열을 다루기 편리한 메서드(static) 제공배열의 출력 : toString()배열의 복사 : copyOf(), copyOfRange()배열 채우기 : fill(), setAll()배열의 정렬과 검색 : sort(), binarySearch() (정렬된 배열일 때만
객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스Comparator : 기본 정렬기준(사전순) 외에 다른 기준으로 정렬하고자 할 때 사용Comparable : 기본 정렬기준(사전순)을 구현하는데 사용compare()와 compareTo()는 두 객체의 비교
순서 X, 중복 XSet 인터페이스를 구현한 대표적인 컬렉션 클래스순서를 유지하려면, LinkedHashSet 클래스를 사용범위 검색과 정렬에 유리한 컬렉션 클래스HashSet보다 데이터 추가, 삭제에 시간이 더 걸림예제1예제2
HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인 (같은 객체가 없으면 저장, 있으면 저장하지 않는다.) boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출하여 확인 (equals()와 hashCode
이진 탐색 트리(binary search tree)로 구현. 범위 검색과 정렬에 유리한 컬렉션 클래스이진 트리는 모든 노드가 최대 2개의 하위 노드를 가짐(각 node가 tree형태로 연결. LinkedList의 변형)부모보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장데
순서 X, 중복(키X 값O)Map 인터페이스를 구현. 데이터를 키와 값의 쌍으로 저장HashMap(동기화 X)은 Hashtable(동기화 O)의 new 버전Map 인터페이스를 구현한 대표적인 컬렉션 클래스순서를 유지하려면, LinkedHashMap 클래스를 사용하면 된
예제 1예제 2
컬렉션을 위한 유용한 메서드(static)를 제공(cf. Objects - 객체, Arrays - 배열을 다룰 때 유용한 메서드 제공)컬렉션 채우기, 복사, 정렬, 검색 - fill(), copy(), sort(), binarySearch() 등컬렉션의 동기화 - sy
컴파일시 타입을 체크해 주는 기능(compile-time type check) - JDK 1.5 Generics 사용하지 않은 경우 컴파일 에러 > 실행시 에러 컴파일 에러가 발생하는 것이 실행시 에러가 발생하는 것보다 좋다. 실행시 에러가 발생하면 프로그램이 죽는
클래스를 작성할 때, Object 타입 대신 타입 변수(E)를 선언해서 사용. 객체를 생성 시, 타입 변수(E) 대신 실제 타입(Tv)을 지정(대입)
클래스를 작성할 때, Object 타입 대신 T와 같은 타입 변수를 사용여러 개의 타입 변수가 필요한 경우, 콤마(,)를 구분자로 선언
extends로 대입할 수 있는 타입을 제한인터페이스인 경우에도 extends를 사용타입 변수에 대입은 인스턴스 별로 다르게 줄 수 있다.static 멤버에 타입 변수 사용 불가 (static 멤버 : 모든 인스턴스에 공통)배열, 객체 생성할 때(new 뒤에) 타입 변
하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능메서드의 매개변수에 와일드 카드를 사용지네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)클래스의 타입 매개변수<'T'>와 메서드의 타입 매개변수 <'T'>는 별개메서드를 호출할 때마다 타입을
지네릭 타입과 원시 타입 간의 형변환은 바람직 하지 않다.(경고 발생)다른 지네릭 타입간 형변환 불가능와일드 카드가 사용된 지네릭 타입으로는 형변환 가능컴파일러는 지네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.<'T'> -> Object. 하위 호완성을 위
관련된 상수들을 같이 묶어 놓은 것Java는 타입에 완전한 열거형을 제공 (Java의 열거형은 값 & 타입 모두 체크)위 코드를 다음과 같이 열거형으로 작성할 수 있다.열거형을 정의하는 방법열거형 타입의 변수를 선언하고 사용하는 방법열거형 상수의 비교에 ==와 comp
불연속적인 열거형 상수의 경우, 원하는 값을 괄호() 안에 적는다.괄호()를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해 줘야 한다.열거형의 생성자는 묵시적으로 private 이므로, 외부에서 객체생성 불가
주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보를 제공(Junit과 같은 특정 프로그램에 설정 정보를 제공)에너테이션의 사용 예Java에서 제공하는 애너테이션메타애너테이션 - 애너테이션을 만들 때 사용
오버라이딩을 올바르게 했는지 컴파일러(javac.exe)가 체크하게 한다.오버라이딩할 때 메서드 이름을 잘못적는 실수를 하는 경우가 많다.오버라이딩할 때는 메서드 선언부 앞에 @Override를 붙이자 (실수를 잡아줌!)앞으로 사용하지 않을 것을 권장하는 필드나 메서드
'애너테이션을 위한 애너테이션'java.lang.annotation 패키지에 포함애너테이션을 정의할 때, 적용대상 지정에 사용애너테이션이 유지(retention)되는 기간을 지정하는데 사용컴파일러에 의해 사용되는 애너테이션의 유지 정책은 SOURCE 이다.실행시에 사용
애너테이션을 직접 만들어 쓸 수 있다.애너테이션의 메서드는 추상 메서드(구현 X)이며, 애너테이션을 적용할 때 지정(순서 X)애너테이션 정의애너테이션 사용적용시 값을 지정하지 않으면, 사용될 수 있는 기본값 지정 가능(null 제외)요소가 하나이고 이름이 value일
프로세스 : 실행 중인 프로그램, 자원(resource)과 쓰레드로 구성(자원 : 메모리, CPU 등 컴퓨터 device)쓰레드 : 프로세스 내에서 실제 작업을 수행. 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.프로세스 : 쓰레드 = 공장 : 일꾼싱글 쓰레드
Thread 클래스를 상속 (java는 단일상속. 덜 유연)Runnable 인터페이스를 구현 (better. 더 유연)쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다.run()을 작성했는데 왜 start()를 호출할까?main에서 start()
main 메서드의 코드를 수행하는 쓰레드쓰레드는 '사용자 쓰레드'와 '데몬 쓰레드' 두 종류가 있다.실행 중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다.(main 쓰레드가 종료되어도, run 쓰레드가 종료되지 않았다면 프로그램은 계속 실행)싱글 쓰레드멀티 쓰
작업의 중요도에 따라 쓰레드의 우선순위를 다르게하여 특정 쓰레드가 더 많은 작업을 갖게 할 수 있다.서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야 한다.쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 'mai
일반 쓰레드(non-daemon thread)의 작업을 돕는 보조적인 역할을 수행일반 쓰레드가 모두 종료되면 자동적으로 종료된다.가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다.무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고
현재 쓰레드를 지정된 시간동안 멈추게 한다.예외처리를 해야 한다.(InterruptedException이 발생하면 깨어남)(항상 예외처리 하기가 귀찮기 때문에 다음과 같은 method를 만들어서 사용하는 편)특정 쓰레드를 지정해서 멈추게 하는 것이 불가능하다.(∵ st
쓰레드의 실행을 일시정지, 재개, 완전정지 시킨다.suspend(), resume(), stop()은 교착상태에 빠지기 쉬워서 deprecated 되었다.다음과 같은 방식으로 직접 구현할 수 있다.RAM에 올라간 변수 suspended 값 false를 CPU의 코어 내
일반쓰레드 <-> 데몬쓰레드(보조쓰레드)지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다.예외처리를 해야 한다.(InterruptedException이 발생하면 작업 재개)garbage collector남은 시간을 다음 쓰레드에게 양보하고, 자신(현재 쓰레드)
멀티 쓰레드 프로세스에서는 다른 쓰레드의 작업에 영향을 미칠 수 있다.진행중인 작업이 다른 쓰레드에게 간섭받지 않게 하려면 '동기화'가 필요(동기화 - 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는 것)동기화 하려면 간섭받지 않아야 하는 문장들을 '임
데이터가 보호되지만, 한 번에 한 쓰레드만 임계영역에 들어갈 수 있어서 프로그램의 효율이 떨어진다.동기화의 효율을 높이기 위해 wait(), notify() 사용Object 클래스에 정의되어 있으며, 동기화 블록 내에서만 사용할 수 있다.객체의 lock을 풀고, 쓰레드
함수(메서드)를 간단한 '식(expression)'으로 표현하는 방법익명 함수(이름이 없는 함수, anonymous function)함수와 메서드의 차이 \- 근본적으로 동일. 함수는 일반적 용어, 메서드는 객체지향개념 용어 \- 함수는 클래스에 독립적, 메서드는
함수형 인터페이스 단 하나의 추상 메서드만 선언된 인터페이스 위에서 선언한 익명 함수를 아래와 같은 람다식으로 변경할 수 있다. 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음.
자주 사용되는 다양한 함수형 인터페이스를 제공Q. 아래의 빈 칸에 알맞은 함수형 인터페이스(java.util.function 패키지)를 적으시오.A. 정답매개변수가 2개인 함수형 인터페이스만약 매개변수 3개이상을 가진 함수형 인터페이스가 필요하면 다음과 같이 직접 만들
(인터페이스는 추상 메서드, default 메서드(JDK 1.8~), static 메서드(JDK 1.8~)를 가질 수 있다.) Predicate의 결합 and(), or(), negate()로 두 Predicate를 하나로 결합(default 메서드) 등가비교를 위한
메서드 참조(method reference) 하나의 메서드만 호출하는 람다식은 '메서드 참조'로 더 간단히 할 수 있다. 생성자의 메서드 참조
CF(컬렉션 프레임워크) : List, Set, Map 사용방법이 달라서 사실상 표준화 실패(반쪽짜리 표준화)다양한 데이터 소스(컬렉션, 배열)를 표준화된 방법으로 다루기 위한 것(JDK 1.8)스트림 생성 방법데이터 소스 -> Stream -> 중간 연산(n번) ->
스트림 만들기 - 컬렉션 Collection 인터페이스의 stream()으로 컬렉션을 스트림으로 변환 스트림 만들기 - 배열 객체 배열로부터 스트림 생성하기 기본형 배열로부터 스트림 생성하기 스트림 만들기 - 임의의 수 난수를 요소로 갖는 스트림 생성하기 지정된
스트림 자르기 - skip(), limit() 스트림의 요소 걸러내기 - filter(), distinct() 스트림 정렬하기 - sorted() Comparator의 comparing()으로 정렬 기준을 제공 추가 정렬 기준을 제공할 때는 thenComparing()을 사용
ex) 파일 스트림(Stream<'File'>)에서 파일 확장자(대문자)를 중복없이 뽑아내기위의 결과가 아닌 아래와 같이 하나의 stream으로 만든 결과를 원할 때가 많다.
T 타입 객체의 wrapper 클래스 - Optional<'T'>(wrapper 클래스 : Integer, Long, ... 9-25 Wrapper, Number 클래스 참고)null을 직접 다루는 것은 위험하다. (NullpointerException)null
스트림의 모든 요소에 지정된 작업을 수행 - forEach(), forEachOrdered()기본적으로 직렬 스트림이므로 생략해도 동일병렬 스트림에서 forEach의 경우 순서 보장이 안됨순서 보장을 위해서는 forEachOrdered 사용스트림의 요소를 하나씩 줄여가