연산자 & 피연산자
연산자 : 연산에 사용되는 표시나 기호
피연산자 : 연산이 되는
다양한 연산자
- 산술연산자 : +, -, *, /(몫), %(나머지), <<, >>
- 비교연산자 : >, <, >=, <=, ==, !=
- 논리연산자 : &&, ||, !
- 대입연산자 : =, ++, --
- 기타연산자 : (type)형변환, ? :, instance of
조건문
- if문
if(조건식) {
조건식이 참일 때 수행할 연산
} else if(조건식) {
else if의 조건식이 참일 때 수행할 연산
} else {
if의 조건식 else if의 조건식 모두 참이 아닐 때 즉 if문 조건이 거짓일 때 수행할 연산
}
else if의 경우 여러개도 수행 가능. else는 꼭 쓰지 않아도 되지만 if와 else if의 조건을 모두 만족하지 않을 시 처리하기 위해 필요
- switch문
switch(피연산자) {
case(조건):
연산;
break;
}
< if문과 switch문의 차이점 >
1. if문의 경우 복합조건이 가능하다. switch문의 경우 case별 단일조건만 가능하다.
2. if문의 경우 코드 중복이 빈번히 발생하는 반면 switch문의 상대적으로 적게 발생한다.
반복문
- for문
for(초기값; 조건식; 증감값) {
수행할 연산
}
- 향상된 for문
// 배열과 함께 사용
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) { // numbers의 요소를 하나씩 뽑아 number에 입력
수행할 연산
}
- while 문
while(조건식) {
연산
}
while문은 조건식이 참일 때 연산을 수행한다. 반복문이 무한루프에 빠지지 않도록 주의하자
- do-while문
do {
연산
} while(조건식)
do-while문은 최소 1번은 무조건 수행되는 반복문이다. do에 있는 연산을 수행하고 조건식이 거짓인 경우 while문을 빠져나온다.
- break
int number = 0;
while(number < 3) {
number++;
if(number == 2) { // number가 2인 경우 break. 가장 근처에 있는 while문 종료
break;
}
System.out.println(number); // 1
}
break를 사용할 경우 가장 근처에 있는 반복문을 빠져나온다.
- continue
int number = 0;
while(number < 3) {
number++;
if(number == 2) {
// number가 2인 경우 continue. 아래 코드를 수행하지 않고 다시 반복문으로 복귀
continue;
}
System.out.println(number); // 1,3
}
배열
배열의 선언에는 두가지 방법이 있다.
1. 타입[] 변수 -> ex) int[] intArray
2. 타입 변수[] -> ex) int intArray[]
new를 통해 배열 생성
int[] intArray = new int[3] // 길이 3인 int형 배열 {0, 0, 0}
boolean[] booleanArray = new boolean[3] // 길이 3인 boolean형 배열 {false, false, false}
String[] stringArray = new String[3] // 길이 3인 String형 배열 {"", "", ""}
여기서 주의할건 변수에 주소(참조)값이 저장된다. 주소값은 Stack영역에 실제로 할당한 값은 Heap영역에 저장된다. (뒤에 얕은 복사, 깊은 복사에서 필요)
얕은 복사 & 깊은 복사
얕은 복사의 경우 주소값을 복사해온다.
// clone()
int[] a = {1, 2, 3, 4, 5}
int[] b = a.clone(); // 아주 간다. 허나 2차원 배열에서는 얕은 복사에 해당
// 얕은 복사
int[] a = {1, 2, 3};
int[] b = a; // a의 주소값을 복사
b[0] = 3;
System.out.println(a[0]); // 출력값 : 3
b배열의 0번째 인덱스에 값을 3으로 변경했지만 a배열과 같은 주소값을 공유하고 있기 때문에 a배열에도 영향을 끼친다.
값은 같으나 별도의 배열로 복사하기 위해 깊은 복사를 활용
// 깊은 복사
int[] a = {1, 2, 3, 4, 5};
int[] b = new int[a.length]; // a배열과 같은 길이의 배열 생성(값은 아직 할당 전)
for (int i = 0; i < b.length; i++) {
b[i] = a[i]; // 깊은 복사
}
b[0] = 3;
위와 같이 for문을 써서 복사 할 수 있지만 복사 메서드를 사용하는 방법도 있다.
clone()과 Arrays.copyOf() 메서드가 이에 해당한다.
// clone()
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone(); // 아주 간다. 허나 2차원 배열 복사할 경우 얕은 복사에 해당
// Arrays.copyOf()
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 2. Arrays.copyOf() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
}
}
다차원 배열
2차원 배열 선언
int[][] array
int array[][]
int[] array[]
생성 및 초기화
// 생성
int[][] array = new int[][];
// 초기화
// 1. 중괄호 초기화
int[][] array = {
{1, 2, 3},
{4, 5, 6}
}
// 2. 반복문 초기화
int[][] array = new int[2][3];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.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}
};
컬렉션(Collection)
컬렉션은 참조형 변수만 저장하고 다양한 기능(추가, 수정, 삭제 등등)들을 제공한다.
컬렉션에는 List, Set, Queue, Map이 있다.
List
List는 순서가 있는 데이터의 집합(데이터 중복 허용)
ArrayList와 LinkedList에 대해 배워보자
* ArrayList *
ArrayList는 배열처럼 일렬로 데이터를 저장하고 조회하여 순번 값(인덱스)로 값을 하나씩 조회할 수 있다.
※ 배열과 ArrayList의 차이는 배열의 경우 정적 배열이고 ArrayList의 경우 동적 배열이다.
선언 및 생성 : ArrayList<참조할 변수 타입> 변수명 = new ArrayList<참조할 변수 타입>(); 사이즈를 지정할 필요가 없기 때문에 초기화 또한 할 필요 없다.
기능
- add(추가할 값) : 값 추가
- set(수정할 인덱스, 수정할 값) : 값 수정
- remove(제거할 인덱스) : 값 삭제
- toString() : 전체 출력. 결과 값은 대괄호[] 로 묶여서 출력
- clear() : 전체 값을 삭제
* LinkedList *
LinkedList는 메모리에 남는 공간을 요청해서 여기저기 나누어서 실제 값을 담아 놓고, 실제 값이 있는 주소값으로 목록을 구성하고 저장한다. LinkedList는 값을 나누어 담기 때문에 조회 속도면에서는 ArrayList 보다 현저히 떨어진다. 허나 추가하거나 삭제할 때는 빠르다.
선언 및 생성 : LinkedList<참조할 변수 타입> 변수명 = new LinkedList<참조할 변수 타입>(); 사이즈를 지어할 필요가 없기 때문에 초기화 또한 할 필요 없다.
기능
- add(추가할 값) : 값 추가
- add(추가할 인덱스, 추가할 값) : 값 중간에 추가
- set(수정할 인덱스, 수정할 값) : 값 수정
- remove(삭제할 인덱스) : 값 삭제
- toString() : 전체 출력
- clear() : 전체 삭제
Stack
Stack은 값을 수직으로 쌓아놓고 넣었다 빼서 조회하는 형식으로 데이터를 관리한다. Last in First out (LIFO)
Stack은 최근 저장된 데이터를 나열하고 싶거나 데이터의 중복처리를 막고 싶을 떄 사용한다.
선언 및 생성 : Stack<참조할 변수 타입> 변수명 = new Stack<참조할 변수 타입>();
기능
- push(추가할 값) : 값 추가
- peek() : 맨 위에 값을 조회
- pop() : 맨 위에 값을 꺼냄. (꺼낸 값은 삭제 된다)
Queue
Queue는 터널과 같다. 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있다. First in First out (FIFO)
Queue의 경우 생성자가 없는 인터페이스이기 때문에 바로 생성할 수 없다. 생성자가 존재하는 클래스인 LinkedList를 통해 Quere를 생성할 수 있다.
선언 및 생성 : Queue<참조할 변수 타입> 변수명 = new LinkedList<참조할 변수 타입>();
기능
- add(추가할 값) : 값을 가장 뒤에 추가
- peek() : 맨 앞에 값을 조회
- poll() : 맨 앞에 값을 꺼냄. (꺼낸 값은 삭제 된다)
Set
Set은 순서가 없는 데이터의 집합(데이터 중복 허용 안함) -> 순서 없고 중복 없는 배열
Set은 Set, HashSet, TreeSet 등으로 사용할 수 있다.
Set은 생성자가 없는 인터페이스이기 때문에 바로 생성할 수 없다. 생성자가 존재하는 클래스인 HashSet을 통해 Set을 생성할 수 있다.
선언 및 생성 : Set<참조할 변수 타입> 변수명 = new HashSet<참조할 변수 타입>();
기능
- add(추가할 값) : 값을 맨 위에 추가
- remove(추가할 값) : 삭제할 값을 직접 지정
- contains(포함 확인 할 값) : 해당 값이 포함되어 있는지 boolean으로 결과를 받음
Map
Map은 key - value 형식으로 데이터를 저장한다. key 값을 기준으로 value를 조회할 수 있다.(key값은 중복 허용이 안됨) Map은 Map, HashMap, TreeMap 등으로 사용할 수 있다.
선언 및 생성 : Map<key의 타입, value의 타입> 변수명 = new HashMap<>();
기능
- put(추가할 key값, 추가할 value값) : key에 value를 추가
- get(조회할 key값) : 조회할 key에 해당하는 value값을 조회
- keySet() : 전체 key값들을 조회
- values() : 전체 value값들을 조회
- remove(삭제할 key값) : key에 해당하는 value값을 삭제
'항해99 플러스 > 사전스터디' 카테고리의 다른 글
[TDD방법론 사전스터디] 2주차 (2) | 2024.09.03 |
---|---|
[Java 스터디] 강의 3주차 (1) | 2024.09.03 |
[TDD방법론 사전스터디] 1주차 (4) | 2024.08.26 |
[SpringBoot 사전스터디] 1주차 (0) | 2024.08.19 |
[Java 스터디] 강의 1주차 (0) | 2024.08.16 |