20230404 TIL
오늘은 자바 연산자, 조건문, 반복문, 배열, 및 컬렉션을 배웠다.
| 종류 | 예시 | 설명 |
|---|---|---|
| 산술 연산자 | +, -, *, /, %, <<, >> | 사칙 연산과 비트연산 |
| 비교 연산자 | <, >, <=, >=, ==, != | 크고 작음과 같고 다름을 비교 |
| 논리 연산자 | &&, ㅣㅣ, ! | 그리고(AND)와 또는(OR) 으로 조건을 연결 |
| 대입 연산자 | =, ++, -- | 우변의 값을 좌변에 저장, 연산 복합 대입 |
| 기타 연산자 | (type), ? :, instance of | 형변환 연산자, 삼항 연산자, instance of 연산자 |
// 사칙 연산
System.out.println(4 + 2); // 6, 덧셈
System.out.println(4 - 2); // 2, 뺄셈
System.out.println(4 * 2); // 8, 곱셈
System.out.println(4 / 2); // 2, 나눗셈 (몫)
System.out.println(5 / 2); // 2, 나눗셈 (몫)
System.out.println(2 / 4); // 0, 나눗셈 (몫)
System.out.println(4 % 2); // 0, 나눗셈 (나머지)
System.out.println(5 % 2); // 1, 나눗셈 (나머지)
// 우선 순위 연산
System.out.println(2 + 2 * 2); // 6
System.out.println((2 + 2) * 2); // 8
System.out.println(2 + (2 * 2)); // 6
// 비교 연산자 (참이면 true, 거짓이면 false)
System.out.println(10 > 9); // 10 는 9 보다 크다 (true)
System.out.println(10 >= 9); // 10 는 9 보다 크거나 같다 (true)
System.out.println(10 < 9); // 10 는 9 보다 작다 (false)
System.out.println(10 <= 9); // 10 는 9 보다 작거나 같다 (false)
System.out.println(10 == 10); // 10 는 10 와 같다 (true)
System.out.println(10 == 9); // 10 는 9 과 같다 (false)
System.out.println(10 != 10); // 10 는 10 와 같지 않다 (false)
System.out.println(10 != 9); // 10 는 9 과 같지 않다 (true)
// And 연산 (모든 피연산자가 true이면, true, 아니면 false )
System.out.println((5 > 3) && (3 > 1)); // 5 는 3 보다 크고, 3 은 1 보다 크다 (true)
System.out.println((5 > 3) && (3 < 1)); // 5 는 3 보다 크고, 3 은 1 보다 작다 (false)
// Or 연산 (피연산자 중 하나라도 true이면, true, 아니면 false )
System.out.println((5 > 3) || (3 > 1)); // 5 는 3 보다 크거나, 3 은 1 보다 크다 (true)
System.out.println((5 > 3) || (3 < 1)); // 5 는 3 보다 크거나, 3 은 1 보다 작다 (true)
System.out.println((5 < 3) || (3 < 1)); // 5 는 3 보다 작거나, 3 은 1 보다 작다 (false)
// 논리 부정 연산자 (반대 값)
System.out.println(!(5 == 5)); // false
System.out.println(!(5 == 3)); // true

//대입 기본 연산자
int number = 10;
number = number + 2;
System.out.println(number); // 12
number = number - 2;
System.out.println(number); // 10
number = number * 2;
System.out.println(number); // 20
number = number / 2;
System.out.println(number); // 10
number = number % 2;
System.out.println(number); // 0
//대입 복합 연산자
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
// 대입 증감 연산자
int a = 10;
int b = 10;
int val = ++a + b--; // a 는 연산전에 +1, b 는 연산후에 -1
System.out.println(a); // 11
System.out.println(b); // 9
System.out.println(val); // 21
// 11 + 9 가 왜 21 나오는 이유
// a 는 val 연산전에 ++ 가 수행되어서 11로 연산되었지만
// b 는 val 연산후에 -- 가 수행되어서 기존값이 10으로 연산된 후 -- 가 수행되었다.
// 따라서 연산된 a값인 11과 연산되기전 b값인 10이 더해져서 21이 된것이다.
기타 연산자
형변환 연산자 : (type)
int intNumber = 93 + (int) 98.8; // 93 + 98
double doubleNumber = (double) 93 + 98.8; // 93.0 + 98.8
삼향 연산자 : 비교 연산의 결과값에 따라 응답할 값을 직접 지정할 수 있는 연산자
// 삼항 연산자 (조건문) ? (참 결과) : (거짓 결과)
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
연산자 우선순위 : 괄호 안에 있는 연산 > 산술 > 비교 > 논리 > 대입
두 피연산자의 타입을 같게 일치시킨다. (둘중에 저장공간 크기가 더 큰 타입으로 일치)
short x = 10;
int y = 20;
int z = x + y; // 결과값은 더 큰 표현타입인 int 타입의 변수로만 저장할 수 있습니다.
Bit의 자리수를 옮기는 것
// 참고, 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 조건문
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 입니다."); // 출력
}
}
else {
if (number == 1) {
System.out.println("flag 값은 false, number 값은 1 입니다."); // 미출력
} else if (number == 2) {
System.out.println("flag 값은 false, number 값은 2 입니다."); // 미출력
}
}
// switch/case 문
int month = 8;
String monthString = "";
switch (month) {
case 1: monthString = "1월";
break;
case 2: monthString = "2월";
break;
case 3: monthString = "3월";
break;
case 4: monthString = "4월";
break;
case 5: monthString = "5월";
break;
case 6: monthString = "6월";
break;
case 7: monthString = "7월";
break;
case 8: monthString = "8월";
break;
case 9: monthString = "9월";
break;
case 10: monthString = "10월";
break;
case 11: monthString = "11월";
break;
case 12: monthString = "12월";
break;
default: monthString = "알수 없음";
}
System.out.println(monthString); // 8월 출력
if문과, switch문을 같이 사용해도 된다.
// for 문
for(int i=0; i < 4; i++) { // 변수 i 값은 0 ~ 3 까지 반복
System.out.println(i + "번째 출력"); // i 변수와 문자열 합치기
}
// 출력
0번째 출력
1번째 출력
2번째 출력
3번째 출력
// 향상된 for 문
int[] numbers = {3,6,9,12,15};
for(int number: numbers) {
System.out.print(number + " ");
}
// 출력
3 6 9 12 15
// while 문
int number = 0;
while(number < 3) {
number++;
System.out.println(number + "출력");
}
// 출력
1출력
2출력
3출력
// do-while 문
int number = 4;
do {
System.out.println(number + "출력");
} while(number < 3); // 연산을 한번 수행 후 조건문 체크
// 출력
4출력
// break 명령
int number = 0;
while(number < 3) {
number++;
if (number == 2) {
break; // 2일때 반복 중단
}
System.out.println(number + "출력");
}
// 출력
1출력
// continue 명령
int number = 0;
while(number < 3) {
number++;
if (number == 2) {
continue; // 2일때 반복 패스
}
System.out.println(number + "출력");
}
// 출력
1출력
3출력
여러개의 변수를 분류통 같은곳에 모아서 저장하고 사용하고 싶을 때 사용한다.
타입 [] 변수;
ex. int[] intArray;
타입 변수[];
ex. int intArray[];
new 타입 [] ;new int[];0, boolean 은 false, String 은 null 값과 같은 초기값이 정해져 있습니다.변수들을 하나씩 꺼내서 사용하는것
// 배열 생성
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}
// 생성한 배열을 '순회' -> 배열의 값을 하나씩 뽑아서 조회한다.
// (1) 단건 조회
System.out.println(intArray[1]);
// (2) 다건 조회
// .length : 길이를 구하는 메서드
for (int i = 0; i<intArray2.length; i++) {
System.out.println(intArray2[i]);
}
// 배열 초기화
//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
}
//3. 배열의 주소를 모두 같은값으로 초기화
Arrays.fill(intArray, 1);//배열의 모든 값을 1로 초기화
for (int i : intArray) {
System.out.print(i); // 11111
}
// 깊은 복사 메서드
// 1. clone() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone(); // 가장 간단한 방법이다.
// 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다.
// 2. Arrays.copyOf() 메서드
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어주어야한다.
}
}
문자열 = 문자배열
String = char[]
String을 더 많이 쓰는 이유는 참조형 변수가 더 많은 기능들을 가지고 있기 때문이다.
// 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차원 배열에 대괄호를 하나더 추가
타입 [][] 변수, 타입 변수[][];int[][] intArray;, int intArray[][]; new 타입 [][]new int[][];// 중괄호를 사용해 초기화
int[][] array = {
{1, 2, 3},
{4, 5, 6}
};
// 반복문을 통한 초기화
int[][] array = new int[2][3]; // 최초 선언
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
arr[i][j] = 0;
}
}
행마다 다른 길이의 배열을 저장할 수 있는 배열
// 가변 배열
// 선언 및 초기화
int[][] array = new int[3][];
// 배열 원소마다 각기다른 크기로 지정 가능합니다.
array[0] = new int[2];
array[1] = new int[4];
array[2] = new int[1];
// 중괄호 초기화할때도 원소배열들의 크기를 각기 다르게 생성 가능합니다.
int[][] array2 = {
{10, 20},
{10, 20, 30, 40},
{10}
};
배열보다 다수의 참조형 데이터를 더 쉽고 효과적으로 처리할 수 있는 기능을 많이 가지고 있다.

// 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
// (사용하기 위해선 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
// (사용하기 위해선 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 출력 (마지막 남은거 하나)
}
}
}
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 출력 (마지막 남은거 하나)
}
}
}
Set 는 생성자가 없는 껍데기라서 바로 생성할수는 없습니다. 그래서 생성자가 존재하는 클래스인 HashSet 를 사용하여 Set 를 생성해서 받을 수 있습니다.// 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 출력
}
}
}
// 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 출력
}
}
📓 오늘 느낀 점 한줄 요약
"자바의 숲으로!" 🏃♂️
20230404 TIL