산술 연산자
+(덧셈), - (뺄셈), *(곱셈), /(나눗셈/몫), % (나눗셈/나머지)
비교 연산자
> (크다) , < (작다), >= (크거나 같다), <= (작거나 같다), == (같다), != (다르다)
논리 연산자
&& (AND = 피연산자 모두 참), ||(OR = 피연산자 둘 중 하나라도 참), !(피연산자의 반대 boolean 값)
대입 연산자
기본 대입 연산자인 = 와 다른 연산을 함께 쓰는 복합 대입 연산자가 있다. (+=, -=, *= …)
+= 1는 ++ 과 동일(피연산자에 1 더해주기)
-= 1 은 --와 동일(피연산자에 1 빼주기)
int number = 10;
number += 2;
System.out.println(number); // 12
number -= 2;
System.out.println(number); // 10
number *= 2;
System.out.println(number); // 20
number /= 2;
System.out.println(number); // 10
number %= 2;
System.out.println(number); // 0
주의!
피연산자 뒤에 붙이냐, 앞에 붙이냐에 따라서 연산 순서가 달라진다.
++{피연산자} / val = ++num; num값+1 후에 val변수에 저장
{피연산자}++ / val = num++; num값을 val변수에 저장 후 num+1
--{피연산자} / val = --num; num값-1 후에 val변수에 저장
{피연산자}-- / val = num--; num값을 val변수에 저장 후 num-1
// 대입 증감 연산자
int a = 10;
int b = 10;
int val1 = ++a + b--; // a 는 연산전에 +1, b 는 연산후에 -1
System.out.println(a); // 11
System.out.println(b); // 9
System.out.println(val1); // 21
// 11 + 9 가 왜 21이 나오는거죠??
// 그 이유는
// a 는 val1 연산전에 ++ 가 수행되어서 11로 연산되었지만
// b 는 val1 연산후에 -- 가 수행되어서 기존값이 10으로 연산된 후 -- 가 수행되었습니다.
// 따라서 연산된 a값인 11과 연산되기전 b값인 10이 더해져서 21이 된겁니다!
int c = a--; // c 에 a 값 대입 후 a-1 (즉, a=10, c=11)
int d = ++b; // b 값 +1 후에 d 에 대입 (즉, b=10, d=10)
int val2 = c-- * ++d; // c 는 연산후에 -1, d 는 연산전에 +1
System.out.println(a); // 10
System.out.println(b); // 10
System.out.println(c); // 11
System.out.println(d); // 10
System.out.println(val2); // 11 * 11 = 121
// 11 * 10 이 왜 121이 나오는거죠??
// 그 이유는
// c 는 val2 연산후에 -- 가 수행되어서 기존값이 11로 연산된 후 -- 가 수행되었지만
// d 는 val2 연산전에 ++ 가 수행되어서 11로 연산되었습니다.
// 따라서 연산전 c값인 11과 연산된 d값인 11이 곱해져서 121이 된겁니다!
}
기타 연산자
-형변환 연산자
int intNumber = 93 + (int) 98.8; // 93 + 98
double doubleNumber = (double) 93 + 98.8; // 93.0 + 98.8
-삼항 연산자
3가지 피연산자가 존재 " (조건) ? (참 결과) : (거짓 결과) "
int x = 1;
int y = 9;
boolean b = (x == y) ? true : false;
System.out.println(b); // false
String s = (x != y) ? "정답" : "땡";
System.out.println(s); // 땡
int max = (x > y) ? x : y;
System.out.println(max); // 9
int min = (x < y) ? x : y;
System.out.println(min); // 1
instance of 연산자
피연산자가 조건에 명시된 클래스의 객체인지 비교하여 참/거짓을 응답 " (객체명) instance of (클래스명) "
연산자 우선순위
1산술 > 2비교 > 3논리 > 4대입
단, 괄호로 감싸주면 괄호 안의 연산이 최우선 순위로 계산
산술 변환
두 피연산자의 타입을 같게 일치(둘중에 저장공간 크기가 더 큰 타입으로 일치)
short x = 10;
int y = 20;
int z = x + y; // 결과값은 더 큰 표현타입인 int 타입의 변수로만 저장할 수 있습니다.
long lx = 30L;
long lz = z + lx; // 결과값은 더 큰 표현타입인 long 타입의 변수로만 저장할 수 있습니다.
float fx = x; // 결과값은 더 큰 표현타입인 float 타입의 변수로만 저장할 수 있습니다.
float fy = y; // 결과값은 더 큰 표현타입인 float 타입의 변수로만 저장할 수 있습니다.
float fz = z; // 결과값은 더 큰 표현타입인 float 타입의 변수로만 저장할 수 있습니다.
System.out.println(lz); // 60
System.out.println(fx); // 10.0
System.out.println(fy); // 20.0
System.out.println(fz); // 30.0
비트 연산
// 비트 연산
// 참고, 3의 이진수값은 11(2) 입니다. 12의 이진수값은 1100(2) 입니다.
// (2) 표기는 이 숫자가 이진수값이라는 표식 입니다.
System.out.println(3 << 2);
// 3의 이진수값인 11(2) 에서 왼쪽으로 2번 옮겨져서 1100(2) 인 12값이 됩니다.
System.out.println(3 >> 1);
// 3의 이진수값인 11(2) 에서 오른쪽으로 1번 옮겨져서 1(2) 인 1 값이 됩니다.
조건문 : if, switch case(+ 반드시 break)
-if 문은 복합 조건을 지원
복합 조건이란? 괄호( )안에 조건 여러 개를 지정하여 조건문을 수행할 수 있다.
-switch 문은 피연산자 한 개에 대한 조건만 지원
*중첩 if(조건)
if 문에 else, else if로 해결할 수 없는 복잡한 조건이 있을 수 있다.
이럴 때 중첩해서 if 문 또는 else if문 또는 else 문 안에 if 문을 넣을 수 있다.
// 중첩 조건문
boolean flag = true;
int number = 2;
if (flag) {
if (number == 1) {
System.out.println("flag 값은 true, number 값은 1 입니다."); // 미출력
} else if (number == 2) {
System.out.println("flag 값은 true, number 값은 2 입니다."); // flag 값은 true, number 값은 2 입니다. 출력
}
} else {
if (number == 1) {
System.out.println("flag 값은 false, number 값은 1 입니다."); // 미출력
} else if (number == 2) {
System.out.println("flag 값은 false, number 값은 2 입니다."); // 미출력
}
}
반복문 : for, while, do-while
*향상된 for 문
-기존 for 소괄호 안에 값이 3개나 들어가기 때문에 이걸 2개로 줄여주는 방법이 향상된 for문이다.
-향상된 for 문은 연속된 변수 목록을 출력할 때 쓰인다.
-for (변수타입 변수명 : 목록변수) { (연산) } 형태로 사용
-변수타입과 변수명 은 for 문안에서 연산을 수행할 변수를 정의
-목록변수(배열)는 3, 6, 9, 12, 15처럼 값 여러개를 하나의 변수로 저장하고 싶을 때 사용
// 향상된 for 문
int[] numbers = {3, 6, 9, 12, 15};
for (int number : numbers) {
System.out.print(number + " ");
}
// 출력값
3 6 9 12 15
------------
// 만약 기존 for 문으로 구현한다면?
int[] numbers = {3,6,9,12,15};
for(int i = 0; i < numbers.length; i++) { // 배열에 .length 를 붙이면 길이값이 응답됩니다.
System.out.print(numbers[i]);
}
// 출력값
3 6 9 12 15
+) break : 가장 가까운 블럭의 for 문 또는 while 문을 중단(또는 switch)
continue : for 문 또는 while 문에서 해당 순서를 패스하고 싶을 때 continue 명령을 사용
배열(Array)
선언 방법은 아래 2가지 방법
1) 타입 [ ] 변수;
ex. int[ ] intArray;
2) 타입 변수[ ];
ex. int intArray[ ];
생성
int[ ] intArray = new int[3]; // 초기값 {0,0,0}
boolean[ ] boolArray = new boolean[3]; // 초기값 {false, false, false}
String[ ] stringArray = new String[3]; // 초기값 {"","",""}
배열 선언만 해놓고 나중에 초기화를 시킬 수도 있다.
int[ ] intArray2;
intArray2 = new int[3]; // 초기값 {0, 0, 0}
순회 [ i ]
//길이가 3인 정수배열 선언
int[] intArray = new int[3];
// 배열이 초기화된 값을 출력해본다.
for(int i=0; i<intArray.length; i++) { // .length 는 배열의 길이
System.out.println(intArray[i]);
}
// 출력
0
0
0
초기화
//1. 배열에 특정값 대입하며 선언
int[] intArray = {1, 2, 3, 4, 5};
String[] stringArray = {"a", "b", "c", "d"};
//2-1. for문을 통해 값을 대입
for (int i = 0; i < intArray.length; i++) {
intArray[i] = i;
}
//2-2. 향상된 for문을 통한 배열 출력
for (int i : intArray) {
System.out.print(i); // 01234
}
System.out.println(); // 줄바꿈
//3. 배열의 주소를 모두 같은값으로 초기화
Arrays.fill(intArray, 1);//배열의 모든 값을 1로 초기화
for (int i : intArray) {
System.out.print(i); // 11111
}
복사
// 얕은 복사
int[] a = { 1, 2, 3, 4 };
int[] b = a; // 얕은 복사
b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
System.out.println(a[0]); // 출력 3 <- a 배열의 0번째 순번값도 3으로 조회됩니다.
// 깊은 복사
int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = a[i]; // 깊은 복사
}
b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로 입니다.
// 깊은 복사 메서드
// 1. clone() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone(); // 가장 간단한 방법입니다.
// 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!
// 2. Arrays.copyOf() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
String 배열
// String 배열을 아래와 같이 선언과 생성할 수 있습니다.
String[] stringArray = new String[3];
// 선언 후 하나씩 초기화 할 수 있습니다.
String[] stringArray = new String[3];
stringArray[0] = "val1";
stringArray[1] = "val2";
stringArray[2] = "val3";
// 선언과 동시에 초기화 할 수 있습니다.
String[] stringArray1 = new String[]{"val1", "val2", "val3"};
String[] stringArray2 = {"val1", "val2", "val3"};
// String 기능 활용하기
String str = "ABCD";
// length()
int strLength = str.length();
System.out.println(strLength); // 4 출력
// charAt(int index)
char strChar = str.charAt(2); // 순번은 0부터 시작하니까 2순번은 3번째 문자를 가리킵니다.
System.out.println(strChar); // C 출력
// substring(int from, int to)
String strSub = str.substring(0, 3); // 0~2순번까지 자르기 합니다. (3순번은 제외)
System.out.println(strSub); // ABC 출력
// equals(String str)
String newStr = "ABCD"; // str 값과 같은 문자열 생성
boolean strEqual = newStr.equals(str);
System.out.println(strEqual); // true 출력
// toCharArray()
char[] strCharArray = str.toCharArray(); // String 을 char[] 로 변환
// 반대로 char[] 를 String로 변환하는 방법
char[] charArray = {'A', 'B', 'C'};
String charArrayString = new String(charArray); // char[] 를 String 으로 변환
컬렉션
배열보다 다수의 참조형 데이터를 더 쉽고 효과적으로 처리할 수 있는 기능을 많이 가지고 있다.
사이즈를 지정하는 것이 없기 때문에 초기화가 필요 없다.
기능 : 크기 자동 조정/ 추가/ 수정/ 삭제/ 반복/ 순회/ 필터/ 포함 확인 등
*종류
1) List : 순서가 있는 데이터의 집합 (데이터 중복 허용) - 배열과 비슷
① ArrayList
-ArrayList는 배열(Array)처럼 일렬로 데이터를 저장하고 조회하여 순번 값(인덱스)으로 값을 하나씩 조회할 수 있다.
-배열(Array)처럼 크기가 정해져 있지 않고 필요할 때마다 크기가 점점 더 늘어난다.
-기본형 변수로 저장하는 Array는 정적 배열이고, 참조형 변수로 저장하는 ArrayList는 동적 배열이라고 기억하면 된다.
// ArrayList
// (사용하기 위해선 import java.util.ArrayList; 를 추가해야합니다.)
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언 및 생성
intList.add(1);
intList.add(2);
intList.add(3);
System.out.println(intList.get(0)); // 1 출력
System.out.println(intList.get(1)); // 2 출력
System.out.println(intList.get(2)); // 3 출력
System.out.println(intList.toString()); // [1,2,3] 출력
intList.set(1, 10); // 1번순번의 값을 10으로 수정합니다.
System.out.println(intList.get(1)); // 10 출력
intList.remove(1); // 1번순번의 값을 삭제합니다.
System.out.println(intList.toString()); // [1,3] 출력
intList.clear(); // 전체 값을 삭제합니다.
System.out.println(intList.toString()); // [] 출력
}
}
② LinkedList : 메모리에 남는 공간을 요청해서 여기저기 나누어서 실제 값을 담아 놓고, 실제 값이 있는 주소값으로 목록을 구성하고 저장
-기본적인 기능은 ArrayList 와 동일하지만 LinkedList는 값을 나누어 담기 때문에 모든 값을 조회하는 속도가 느리다다. 대신에, 값을 중간에 추가하거나 삭제할 때는 속도가 빠르다.
-중간에 값을 추가하는 기능이 있다. (속도 빠름)
// LinkedList
// (사용하기 위해선 import java.util.LinkedList; 를 추가해야합니다.)
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
LinkedList<Integer> linkedList = new LinkedList<>(); // 선언 및 생성
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
System.out.println(linkedList.get(0)); // 1 출력
System.out.println(linkedList.get(1)); // 2 출력
System.out.println(linkedList.get(2)); // 3 출력
System.out.println(linkedList.toString()); // [1,2,3] 출력 (속도 느림)
linkedList.add(2, 4); // 2번 순번에 4 값을 추가합니다.
System.out.println(linkedList); // [1,2,4,3] 출력
linkedList.set(1, 10); // 1번순번의 값을 10으로 수정합니다.
System.out.println(linkedList.get(1)); // 10 출력
linkedList.remove(1); // 1번순번의 값을 삭제합니다.
System.out.println(linkedList); // [1,4,3] 출력
linkedList.clear(); // 전체 값을 삭제합니다.
System.out.println(linkedList); // [] 출력
}
}
③ Stack : 수직으로 쌓아놓고 넣었다가 빼서 조회하는 형식으로 데이터를 관리한다. “나중에 들어간 것이 가장 먼저 나온다(Last-In-First-out)” 성질을 가졌다고 표현하며, 주로 상자와 비유해서 설명
-상자에 물건을 넣고 빼는 것처럼 밑에서 위로 쌓고, 꺼낼 때는 위에서부터 꺼내는 형식이다.
-그렇기 때문에 넣는 기능(push()) 과 조회(peek()), 꺼내는(pop()) 기능만 존재한다.
-이렇게 불편하게 쓰는 이유는 최근 저장된 데이터를 나열하고 싶거나 데이터의 중복 처리를 막고 싶을 때 사용한다.
// Stack
// (사용하기 위해선 import java.util.Stack; 를 추가해야합니다.)
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack<Integer> intStack = new Stack<Integer>(); // 선언 및 생성
intStack.push(1);
intStack.push(2);
intStack.push(3);
while (!intStack.isEmpty()) { // 다 지워질때까지 출력
System.out.println(intStack.pop()); // 3,2,1 출력
}
// 다시 추가
intStack.push(1);
intStack.push(2);
intStack.push(3);
// peek()
System.out.println(intStack.peek()); // 3 출력
System.out.println(intStack.size()); // 3 출력 (peek() 할때 삭제 안됬음)
// pop()
System.out.println(intStack.pop()); // 3 출력
System.out.println(intStack.size()); // 2 출력 (pop() 할때 삭제 됬음)
System.out.println(intStack.pop()); // 2 출력
System.out.println(intStack.size()); // 1 출력 (pop() 할때 삭제 됬음)
while (!intStack.isEmpty()) { // 다 지워질때까지 출력
System.out.println(intStack.pop()); // 1 출력 (마지막 남은거 하나)
}
}
}
2) Queue : 빨대처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합
-First In First Out : 먼저 들어간 순서대로 값을 조회할 수 있다.
-그렇기 때문에 넣는 기능(add()), 조회(peek()), 꺼내는(poll()) 기능만 존재한다.
-Queue는 생성자가 없는 껍데기라서 바로 생성할 수는 없다. (껍데기 = 인터페이스)
-생성자가 존재하는 클래스인 LinkedList를 사용하여 Queue를 생성해서 받을 수 있다.
// Queue
// (사용하기 위해선 java.util.LinkedList; 와 import java.util.Queue; 를 추가해야합니다.)
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
Queue<Integer> intQueue = new LinkedList<>(); // 선언 및 생성
intQueue.add(1);
intQueue.add(2);
intQueue.add(3);
while (!intQueue.isEmpty()) { // 다 지워질때까지 출력
System.out.println(intQueue.poll()); // 1,2,3 출력
}
// 다시 추가
intQueue.add(1);
intQueue.add(2);
intQueue.add(3);
// peek()
System.out.println(intQueue.peek()); // 1 출력 (맨먼저 들어간값이 1 이라서)
System.out.println(intQueue.size()); // 3 출력 (peek() 할때 삭제 안됬음)
// poll()
System.out.println(intQueue.poll()); // 1 출력
System.out.println(intQueue.size()); // 2 출력 (poll() 할때 삭제 됬음)
System.out.println(intQueue.poll()); // 2 출력
System.out.println(intQueue.size()); // 1 출력 (poll() 할때 삭제 됬음)
while (!intQueue.isEmpty()) { // 다 지워질때까지 출력
System.out.println(intQueue.poll()); // 3 출력 (마지막 남은거 하나)
}
}
}
3) Set : 순서가 없는 데이터의 집합 (데이터 중복 허용 안 함) - 순서 없고 중복 없는 배열
-순서가 보장되지 않는 대신 중복을 허용하지 않도록 유지할 수 있다.
-Set은 그냥 Set으로 쓸 수도 있지만 HashSet, TreeSet 등으로 응용하여 사용할 수 있다.
-Set는 생성자가 없는 껍데기라서 바로 생성할 수는 없다. (껍데기 = 인터페이스)
-생성자가 존재하는 클래스인 HashSet를 사용하여 Set를 생성해서 받을 수 있다.
🔎 HashSet 외에도 TreeSet, LinkedHashSet 이 있다.
보통 HashSet 을 쓰는데 순서 보장이 필요하면 LinkedHashSet 을 주로 사용한다.
-HashSet : 가장 빠르며 순서를 전혀 예측할 수 없음
-TreeSet : 정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있음
-LinkedHashSet : 추가된 순서, 또는 가장 최근에 접근한 순서대로 접근 가능
// Set
// (사용하기 위해선 import java.util.Set; 와 java.util.HashSet; 를 추가해야합니다.)
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<Integer> intSet = new HashSet<Integer>(); // 선언 및 생성
intSet.add(1);
intSet.add(2);
intSet.add(3);
intSet.add(3); // 중복된 값은 덮어씁니다.
intSet.add(3); // 중복된 값은 덮어씁니다.
for (Integer value : intSet) {
System.out.println(value); // 1,2,3 출력
}
// contains()
System.out.println(intSet.contains(2)); // true 출력
System.out.println(intSet.contains(4)); // false 출력
// remove()
intSet.remove(3); // 3 삭제
for (Integer value : intSet) {
System.out.println(value); // 1,2 출력
}
}
}
3) Map : key-value 구조로 구성된 데이터를 저장
-key-value 형태로 데이터를 저장하기 때문에 기존에 순번으로만 조회하던 방식에서, key 값을 기준으로 value를 조회할 수 있다.
-key 값 단위로 중복을 허용하지 않는 기능을 가지고 있다.
-Map 은 그냥 Map으로 쓸 수도 있지만 HashMap, TreeMap 등으로 응용하여 사용할 수 있다.
-Map으로 쓸 수도 있지만 HashMap, TreeMap 등으로 응용하여 사용할 수 있다.
🔎 HashMap 외에도 TreeMap 이 있다.
-HashMap : 중복을 허용하지 않고 순서를 보장하지 않음, 키와 값으로 null이 허용
-TreeMap : key 값을 기준으로 정렬을 할 수 있다. 다만, 저장 시 정렬(오름차순)을 하기 때문에 저장시간이 다소 오래 걸림
// Map
// (사용하기 위해선 import java.util.Map; 를 추가해야합니다.)
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> intMap = new HashMap<>(); // 선언 및 생성
// 키 , 값
intMap.put("일", 11);
intMap.put("이", 12);
intMap.put("삼", 13);
intMap.put("삼", 14); // 중복 Key값은 덮어씁니다.
intMap.put("삼", 15); // 중복 Key값은 덮어씁니다.
// key 값 전체 출력
for (String key : intMap.keySet()) {
System.out.println(key); // 일,이,삼 출력
}
// value 값 전체 출력
for (Integer key : intMap.values()) {
System.out.println(key); // 11,12,15 출력
}
// get()
System.out.println(intMap.get("삼")); // 15 출력
}
}
*삭제 : intMap.remove({삭제할 Key값}) 형태로 Key에 있는 Value값을 삭제한다.
< length vs length() vs size() - 길이값 가져오기 >
1. length
- arrays(int[], double[], String[])
- length는 배열의 길이를 조회
2. length()
- String related Object(String, StringBuilder etc)
- length()는 문자열의 길이를 조회(ex. “ABCD”.length() == 4)
3. size()
- Collection Object(ArrayList, Set etc)
- size()는 컬렉션 타입 목록의 길이를 조회
'개발 > 부트캠프' 카테고리의 다른 글
| 본캠프 : Java 문법 종합반 3주차_2 (0) | 2025.01.07 |
|---|---|
| 본캠프 : Java 문법 종합반 3주차_1 (0) | 2025.01.06 |
| (토요일)주말에도 쓰는 TIL : JAVA 기초 유튜브 강의 수강_chap06_01-08(feat. 무료 강의 완강!) (0) | 2025.01.04 |
| 본캠프 : JAVA 기초 유튜브 강의 수강_chap05_01-05 (0) | 2025.01.03 |
| 본캠프 : JAVA 기초 유튜브 강의 수강_chap04_01-11 (0) | 2025.01.02 |