오랜만에 Java 강의를 다시 들으면서 기억이 잘 안났던 부분만 집중적으로 필기를 하게 됐으며, 복습의 효과가 나오는 것 같았다. 복습 내용을 적어보겠다.
Java의 장점
- 공통 실행환경이 있어 여러 기기에서 실행이 가능하다
- 코드를 이해하기 쉽고 유지 보수가 쉽다
- 안정성이 높아 프로그래밍 오류를 방지하고 보안상 안전하다
- 대규모 앱 개발이 가능하다
- 다양한 개발 도구와 라이브러리를 사용할 수 있다
JVM : 자바 가상 머신 (여러 가지의 기기 위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어주는 것)
- 바이트 코드 (Java 프로그램 변환 코드) : 내가 작성한 코드가 OS가 읽을 수 있는 코드로 Java 컴파일러가 변환한 코드
- Java 컴파일러 : 내가 작성한 Java 코드를 운영체제가 읽을 수 있는 바이트 코드로 변환시켜줌
- 인터프리터 (코드 해석기) : OS가 읽은 바이트 코드를 기기가 실행할 수 있는 기계어로 번역
- JIT 컴파일러 (빠른 코드 해석기) : 인터프리터의 효율을 높여주는 서포터
- 메모리 영역 (데이터 저장 영역) : OS로부터 JVM이 할당받은 메모리 영역
- 클래스 로더 (바이트 코드 --> 메모리 영역) : JVM으로 바이트 코드를 불러와 메모리에 저장
- 가비지 컬렉터 (쓰레기 청소) : 메모리 영역에 안쓰는 데이터를 주기적으로 청소
JRE와 JDK
- JRE : 자바 실행 환경이며, .class 파일만 실행 가능 (.java -> .class 변환이 필요함)
- JDK : JRE의 기능을 갖고 있으며, .java -> .class 변환해주는 Java Compiler 기능이 있고, 코드 디버깅 기능이 있음
Scanner : 변수에 직접 입력을 하게 해주는 라이브러리
- next() : 띄어쓰기 공백 이전의 문자만 읽는다
- nextLine() : 엔터치기 이전의 문자를 모두 읽는다
복합대입연산자
int a = 10;
int b = 10;
int val = ++a + b--;
// val=21 a=11 b=9
왜 ? : ++a는 a에 +1이 되면서 val값에 들어가는 것이고, b--는 b값이 val에 들어가고 -1 되는 것이다
비트 연산자
- val1 << val2 : val1의 2진수 값을 val2만큼 우측으로 이동
- 예시 : 3 << 2 = 3(11) << 2 ==> (1100) 즉, 10진수로 12
- val1 >> val2 : val1의 2진수 값을 val2만큼 좌측으로 이동
- 예시 : 16 >> 2 = 16(10000) >> 2 ==> (100) 즉, 10진수로 4
복사
int[] a = {1, 2, 3};
int[] b = a;
// clone 메서드 사용
int[] a = {1, 2, 3};
int[] b = a.clone();
// Arrays.copyOf() 메서드 사용
int[] a = {1, 2, 3};
int[] b = Arrays.copyOf(a, a.length);
String 함수들
- 문자열.length() : 문자열의 길이를 반환
- 문자열.charAt(index) : 문자열의 index 부분의 값을 반환
- 문자열.subString(beginIndex, toIndex) : 문자열의 beginIndex에서 toIndex까지의 값을 반환
- 문자열.equals(String) : 두 문자열이 같은지 확인해 같으면 true, 다르면 false 반환
2차원 배열 : 배열 위에 배열을 하나 더 쌓은 것 (행과 열로 나누어진다)
- 가변 배열 : 2차원 배열을 생성할 때, 열의 길이를 생략해 행마다 다른 길이의 배열을 요소로 저장 가능
Collection : 배열보다 다수의 참조형 데이터를 더 쉽고 효과적으로 처리할 수 있는 기능을 많이 가지고 있음
기능 : 배열의 크기 자동조정, 추가, 수정, 삭제, 반복, 순회, 필터, 포함확인 등...
List : 순서가 있는 데이터의 집합이다 (데이터 중복 허용, 배열과 비슷함)
- Array List : 배열처럼 일렬로 데이터를 저장, 조회하며, 동적 배열이다
- 리스트.add(value) : 리스트에 value를 추가 ( 리스트.add(index, value) : 리스트의 index번 째에 value를 추가)
- 리스트.get(index) : 리스트의 index번 째 값을 가져옴
- 리스트.set(index, value) : 리스트의 index번 째의 값을 value로 변경
- 리스트.indexOf(value) : value를 가지고있는 인덱스를 받아옴
- 리스트.remove(index) : 리스트의 index번 째의 값을 삭제
- 리스트.remove(리스트.indexOf(value)) : 리스트의 value를 가지고 있는 인덱스를 리턴해 삭제
- 리스트.clear() : 리스트 전체 삭제
- 리스트.contains(value) : 리스트에 value가 있는지 여부 확인
- Linked List : 메모리에 남는 공간을 요청해 여기저기 나누어서 실제 값을 담고, 값들이 있는 주소값으로 목록을 구성
- Array List보다 조회는 느리지만 추가, 삭제가 빠르다
- 명령어들은 Array List와 같음
- Stack : 수직으로 값을 쌓아놓는 형식이며, 아래부터 넣었다가 위에서 빼는 형식
- First In Last Out(FILO) : 먼저 들어간 데이터가 나중에 나온다(후입선출)
- 스택.push(value) : 스택에 value를 집어넣는다
- 스택.isEmpty() : 스택이 비어있는지 알려준다
- 스택.pop() : 스택에 있는 값을 빼준다 (마지막에 넣은 값부터 빠짐)
- 스택.peek() : 다음에 빠질 값을 본다
- 스택.size() : 스택의 사이즈를 리턴
- Queue : 한 쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합 (생성자가 없는 인터페이스)
- First In First Out(FIFO) : 먼저 들어간 데이터가 먼저 나온다(선입선출)
- 큐.add(value) : 큐에 value를 집어넣는다
- 큐.isEmpty() : 큐가 비어있는지 알려준다
- 큐.poll() : 큐에 있는 값을 빼준다 (처음에 넣은 값부터 빠짐)
- 큐.peek() : 다음에 빠질 값을 본다
- 큐.size() : 큐의 사이즈를 리턴한다
- Set : 순서가 없고 중복이 없는 데이터의 집합
- Set 셋 = new HashSet<>();
- 셋.add(value) : 셋에 value를 추가
- 셋.contains(value) : 셋에 value가 있는지 확인 (있으면 true, 없으면 false)
- Map : 순서가 없는 (Key, Value)쌍으로 이루어진 데이터의 집합이며, Key 값은 중복 안됨 (Key 값으로 Value를 찾음)
- 만약 Key가 중복이 있다면 제일 나중에 넣은 Value 값으로 덮어씌워진다
- Map<Key, Value> 맵 = new HashMap<>();
- 맵.put(Key, Value) : 맵에 Key Value 쌍으로 넣어준다
- 맵.keySet() : 맵에 있는 Key들을 가져온다
- 맵.values() : 맵에 있는 Value들을 가져온다
- 맵.get(Key) : 해당 키의 Value를 가져온다