jvm : 자바 가상 머신 가상기기를 만들어주는 것 , 자바 프포그램을 실해시킬수있는 자바 가상 기기를 만드렁준다.
pc 모바일 서버 등 어디서든 jvm을 깔아주면 자바 구동할 수 있게 해준다.
바이트 코드 : 자바코드를 변환한 코드 - 운영체제가 읽을 수 있는 코드 (.java -> .class)
컴파일러 : 자바파일을 클래스 파일로 변환해주는 것
자바라는 파일 컴퓨터가 이해할수없음 - > 컴퓨터가 이해할려면 class < - 변환하는 것이 컴파일러 이다.
인터프리터 : 운영체제가 읽은 바이트 코드를, 기계가 실행할 수 있는 기계어로 변환
jit컴파일러 빠르게 인터프리터의 효율을 높여준다.
메모리 영역 : 자바의 데이터를 저장하는 영역, 운영체제로 부터 jvm을 할당받은 메모리 영역
클래스 로더 : 바이트 코드를 메모리 영역을 담는 운반역할(클래스 파일를 운반하는!)
가비지 컬렉터 : 메모리영역에서 쓰이지 않는 영역을 주기적으로 제거
jvm 전체적인 흐름 다시보자! 메모 1-2
jre(자바를 실행할수있는 환경) 는 jvm을 설치하는 도구? - > .class 파일만 실행 가능
jdk(자바 개발 키트 - jre 역할 + .class로 변환(컴파일러 역할) + 디버깅 역할 )
디버깅 : 몇번째 코드를 면밀히 보겠다. 빨간 공 부분을!
파일은 java 지만 클래스라는 키워드로 클래스명을 만듬
클래스위 하위 요소 메소드 , 소괄호 바로앞 이 메소드명
jvm 약속 클래스에서 main 메도를 제일 먼저 실행한다.
public : (접근) 제어자 - 메인 클래스를 어디 까지 접급하게 하게 할꺼냐
static : 이프로그램이 시작 될때 무조건 실행
메서드 출력값의 출력 타입 : void(출력이 없다. 타입이 없다. ) <-> 인풋 아웃을 제한함( 처음에 정해줌)
매개변수 자리 : String[] args 쓰이는 곳 < - 인풋 // arg는 변수명 자리( 여긴 아무거나 상관없음)
객체 : 특징-속성변수 과 행동-메소드이 있다
sout도 객체이다! System이 객체 그안에있는 out // println 이 메서드
.은 하위를 나타냄
변수앞에 final을 붙이면 해당 변수의 값은 바꿀수 없다! - > 상수 마냥
기본형 숫자 문자(char - 문자를 작은 따옴표로 감싼다.) boolean(true = 1) 단, boolean 변수명 = 1; x boolean 변수명 = true; o
참조형 어딘가에 별도 저장 ( 문자열 , 객체 , 배열 , 리스트...)
래퍼 클래스 - 기본형 변수를 클로스로 한번 랩핑 - 박싱 감싸는것 , 언박싱 푸는 것
소문자인 기본형 같은 아이들을 대문자가 덮음으로 더 많은 기능을 하게 끔 해준다.
래퍼 클래스 메모 1-6강 - > 스캐너 와 배열을 할적에 쓰는것! - > new 클래스명(); < - 박싱
문자 문자 뒤에 \0(< - 널문자)가 없다. 어짜피 한글자 라 < - > 문자열은 문자열 마지막에 \0 필요! 어디서 끝날지 모름
heap 영역 : 참조형 자료를 위한 별도 공간(원본) - 동적으로 할당된 메모리 영역
stack 영역 : 기본형 변수(원본) , 참조형 변수(주소값) - 정적으로 할당된 메모리
Scanner.in 객체에 메서드 next() 사용
명시적 형변환 : 강제 형변환 (= 캐스팅)
논리연산자에서 부정 연산자 : ! 는 - > ! boolean형 변수 로 코드를 쓴다.
삼항연산자 비교연산자와 함께 쓰인다 항상!
조건 ? 참 : 거짓 < - 항이 세개라 삼항연산자 - > 조건 참이면 참에 코드 출력 < - > 거짓이면 거짓 코드
instance of : 피연산자가 조건에 명시된 클래의 객체인지 비교 -> 맞으면 true
비트연산자는 이진수에서 쓴다. >> // 2의 1/n << 2의 n승
두 개의 값을 비교하는 메서드 - > Objects.equals() < - 문자열에서도 쓰는 데 문자열도 객체로 보는 건가? 아니면 그냥 ?? 메모 /// 다른 거다! 변수.equals(변수); 이거랑 다른가? < - 문자열
Objects.equals(좌,우) : 좌우 가 같은 경우 true ? 예시는 그렇치 않은데?? 메모 2-6
배열 선언 법 2가지
boolean 초기값 0 - > false , 문자열은 null
Arrays 배열에 관한 모든 메서드가 있다(java.util.)
Arrays.fill(변수명, 초기화해줄 값); - > 배열 변수에 값들을 모두 해당 값으로 초기화해줌! <- fill 메서드
얕은 복사 : 주소값을 복사되는 것 - > 배열에서 // 주위 주소값만을 복사라는 표현 xx
EX) int[] a ={1,2,3}; - > int[] b =int[] a; = >> 이러면 b에는 주소값 복사! == >> 문제점 ! 배열 b가 배열의 값을 바꾸면, 해당 참조값을 통해 바꾸기 때문에(서로 같은 참조값을 가짐!!) 배열 a도 같이 바꿔게 되는 문제가 발생!!! // 주위 주소값만을 복사라는 표현 xx << 이 표현의 이유!! 메모 2-12
깊은 복사 :
1. for문을 통해서 하나하나 다꺼내서 바꿔줌 - > 배열 a의 배열값 하나 하나를 배열 b의 배열값 하나하나를 대입! - > 이러면 참조값이 서로 다름!
2. 배열 변수.clone(); : 해당 메서드를 이용하면 참조값이 서로 같지않고, 서로 다른 배열의 참조값을 가지며, 배열을 복사해준다!!! 단, .clone() 또한 2차원 배열이상에서는 얕은 복사로 동작한다!!!
3. Arrays.copyOf(배열 변수,배열 변수의 크기); : 위에 .clone 메서드는 1차원만 가능하지만, 해당 메서드는 다 된다!? 다 되나?
기본형 변수는 소문자로 시작!
참조형 변수는 대문자로 시작!
ps ) 소문자를 감싸주는 애는 대문자! 래퍼 클래스에서 ex) 당하는 아 > int / 를 감싸는 아 > Intiger 로 감쌈
String 기능
String 변수.length()
String 변수.charAt(추출하려는 인덱스 번호 )
String 변수.substring(int fromIdx(자르기 시작할 인데스 번호), int toIdx(까지(x), 전 까지(o)!! 자를 인데스 번호))
String 변수.equals(비교 값)
String 변수.toCharArray() : 문자열을 배열인 문자로(한글자씩 하여 배열값마다 넣음) 바꿔주는 메서드
위에 메서그와 반대!! - > String 문자열의 변수명 = new String(배열인 문자 변수);
2차원 배열 선언
int[][] array
int array[][]
int[] array[]
2차원 배열 생성
new int[][];
{
{},{}, ...
}
가변 배열 : ex) new int[3][]; - > 행은 정해져있지만, 열은 정해지지 않은 가변! // 크기가 정해지지 않고, 다 다르게 크기를 줄 수 있다는 뜻!
배열 원소마다 각기 다른 크기로 지정 - >> 위 예에서 배열 변수[0] = new int[2]; 배열 변수[1] = new int[3]; 배열 변수[2] = new int[4]; = >> 이차원 배열에 3행인 배열에서 열 [0]은 크기가 2, 배열에서 열 [1]은 크기가 3, 배열에서 열 [2]은 크기가 4
이것 뿐만아니라 중괄호로 되어있을때도 사용 가능!
int[][] array2 = {
{10,20},{10,20,30},{10,20,30,40}
} = >> 이렇게도 가능!
다차원 배열 조회
단건 - > 지정
다건 - > for < - 가변일때도 가능!!(단, 반복문에 조건 파트에서 length를 이용!)
배열에서 최대값 구하기
최대값의 변수 초기화 - > 배열에 0번째(그 값을 한 변수에 넣고)를 기준으로 잡고 크면 순서를 바꾸면 된다.
컬렉션 : 배열에 한계를 보완? 해줌 , 크기 자동조정.추가.수정.삭제.반복.순회.필터.포함확인 등등... , 대문자이니 참조형!
의 종류 : List Set Queue Map 가 있다.
List : 순서가 있는 데이터의 집합(데이터 중복을 허용한다. - > 1 2 1 3 -> 1 중복 o < - array와 비슷
Queue : 한쪽 에서 데이터를 넣고, 뺄 수 있다. FIFO 구조! < - > FILO
Set : 집합으로 생각 , 순서가 없는 데이터의 집합(데이터 중복 허용 안함!) - 순서없고 중복없는 배열
Map : 순서가 없는 (Key,Value) 쌍으로 이루어진 데이터 집합 (Key값 중복 허용 안함!(unique) - > 키로 값을 찾는다.
List 는 array와 비슷하지만 다른점 :
Array는 최초 크기(길이)를 알아야하고, List는 그렇지 않다.
Array는 정적 배열 - 최초에 지정한 크기만큼 저장공간을 받음 // List( = ArrayList )는 동적 배열 (크기가 가변적으로 늘어난다.) - 생성시점에 작은 연속된 공간을 요청해서 참조형 변수를 담아놓는다. - 메모 2-15
ArrayList는 import java.util.ArrayList; 해야 쓸 수 있다.
ArrayList (x) <- > ArrayList (o)
ArrayList<Integer(타입 자리)> 변수명 = new ArrayList (); // 선언과 생성을 동시에
intList.add(해당 타입에 맞는! 넣을 값 입력);
ArrayList에 intList에서 get이라는 메서드를 제공
intList.get(0) - > ArrayList타입의 변수에 0번째자리의 값을 가지고 옴
ArrayList에 intList에서 set 메서드를 제공
intList.set(1,10); - > 1번째 자리의 값을 10으로 바꾼다!
ArrayList에 intList에서 remove 메서드를 제공
intList.remove(1); - > 리스트에 1번째 값을 삭제 하겠다 = >> 이때 1번째 자리가 삭제되어 2번째 자리가 1번째 자리로 이동한다!
ArrayList에 intList에서 toString() 메서드를 제공
리스트 값을 사람이 보기 쉽게 만들어주는 함수
ArrayList에 intList에서 clear 메서드를 제공
intList.clear(); - > 리스트의 값들을 모두 삭제
LinkedList : 메모리에 남는 공간을 요청해서 여기 저기 나누어서 실제 값을 담아둠. 실제 값이 있는 주소값으로 리스트를 구성하고 저장하는 자료구조, 기본적 기능은 ArrayList와 동일 , LinkedList는 값 조회가 느리다. ( < - 값을 여기저기에 나누어져 있어서) 그렇지만, 값을 추가하거나, 삭제할 때는 빠르다.( < - 값을 여기저기에 나누어져 있어서 - ps )순서 보정이 필요 없어서)
LinkedList ArrayList에 =new LinkedList();
LinkedList.add(넣을 위치 , 값);
LinkedList.set(바꿀 위치, 값);
LinkedList.remove(삭제할 위치); - > 이때도 마찬가로 삭제되면 앞으로 땡겨짐
LinkedList.clear();
Stack (바구니 모양 생각) : 값을 넣고(push), 꺼내고(pop) , 조회(peek) 의 기능을 한다.
최근 저장된 값들을 나열하고 싶을 때 사용, 데이터의 중복 처리를 막을 때 -메모 2-16
Stack 도 마찬가지로 import를 해준다 . java.util.Stack;
Stack<Integer(타입 선언자리)> 변수명 = new Stack(); 선언 및 선언
변수명.push(10); : 변수에 10 값을 넣음
변수명.isEmpyt(); : 현재 변수에 값이 있니? 없니? 를 반환해줌 - 비어있으면 true
변수명.pop(); : Stack에 최상단을 빼줌 FILO 이므로 - > 최근에 넣은 것을 빼줌
변수명.peek(); : Stack에 최상단을 조회 FILO 이므로 - > 최근에 넣은 것을 조회
변수명.size(); : Stack에 사이즈를 알려줌
Queue : 넣고(add), 조회(peek), 꺼낸다(poll). Queue는 생성자(new)가 없는 인터페이스 - > 그래서 선언시 new Queue 를 안쓰고 LinkedList로 쓴다 ? -메모 2-16 .
Queue import를 해준다 . java.util.Queue;
Queue 변수명 = new LinkedList<>(); 선언 및 생성
변수명.add(1);
변수명.isEmpyt(); : 현재 변수에 값이 있니? 없니? 를 반환해줌 - 비어있으면 true
변수명.poll(); Queue 최하단을 빼줌 FIFO 이므로 - > 먼저 넣은 것을 빼줌
변수명.peek(); : Queue 최하단을 조회 FIFO 이므로 - > 먼저 넣은 것을 조회
변수명.size(); : Queue 사이즈를 알려줌
ps) Stack 이나 Queue 데이터의 입출입의 순서가 정해져있어서 데이터를 추가 ,삭제 혹은 조회 시 위치를 지정안해줘도 된다.
Set : 순서없고, 중복 없음 < - 이런 프로그램에서 사용할 수 있는 자료 구조
Set은 그냥 쓰일 수 있고, HashSet, TreeSet 등으로 응용해서 같이 사용 가능하다.
Set은 생성자가 없어서 바로 생성 불가!
생성자가 존재하는 HashSet을 이용해서 - > set 을 구현해 볼 수 있다. 2-16 메모
약간 Queue에 생성자가 없어서, LinkedList를 쓰는 것과 비슷한 건가봄...
Set import를 해준다 . java.util.Set;
Set 변수명 = new HashSet<>(); 선언 및 생성
변수명.add(1); :
변수명.add(1); :
for(Integer value: 변수명){sout(변수명)} 2-16 메모
출력이 1 한개만 나옴 ->> Set 은 순서는 상관안하지만, 값은 중복을 허용안해서 =>> 출력 값으로 1 한개만 나옴
변수명.contains(); : 포함하는냐 안하느냐 -> 포함하면 true
변수명.contains(포함 여부를 확인할 변수 안에 값)
remove 등은 다 위와 같이 코드를 작성한다. - 메모 -값 어떻게 나오나 해봐야할듯
Map : Key : value 가 쌍으로 !~ - > Key라는 값으로 unique함이 보장되야한다. Map도 HashMap, TreeMap 으로 응용 가능 2-16 메모
Map import를 해준다 . java.util.Map;
Map<String(키 자리), Integer(벨류 자리)> 변수명 = new HashMap<>(); 선언 및 생성
put(위에 정해준 타입1(키),위에 정해준 타입2(벨류)) : 키값을 넣는 메서드
변수명.put("a",1);
변수명.put("a",2);
for(String Key : 변수명.keySet()(<- 변수명에서 키만 빼서 배열로 만들어 주는 함수)){}
for(Integer value : 변수명.values()(<- 변수명에서 벨류값만 빼서 배열로 만들어 주는 함수)){}
제일 마지막에 입력한 2로 값이 출력 키 a에 값은 2로 ! 앞에 쓴 중복은 삭제된다!
변수명.get(키 값) - > 키 값으로 벨류 값을 가지고 옴
수정은 내일...