항해 99 : TIL - 2
학습 참조 : 강의 - Java 문법 종합반 2주차
팀과제 - 숫자 야구 프로그램
조건
- 컴퓨터는 0 과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑는다 (ex) 123, 490
- 사용자는 컴퓨터가 뽑은 숫자를 맞추기 위해 시도한다
- 컴퓨터는 사용자가 입력한 세자리 숫자에 대해서, 아래의 규칙대로 스트라이크(S)와 볼(B)를 알려준다
- 숫자의 값과 위치가 모두 일치하면 S
- 숫자의 값은 일치하지만 위치가 틀렸으면 B
- 기회는 무제한이며, 몇 번의 시도 후에 맞췄는지 기록
- 숫자 3개를 모두 맞춘 경우, 게임을 종료
import java.util.Random;
import java.util.Scanner;
public class BaseballGame {
public static void main(String[] args) {
// 컴퓨터 점수 지정
int[] computerNumbers = getComputerNumbers();
// 사용자 입력 부분
playBaseball(computerNumbers);
}
private static void playBaseball(int[] computerNumbers) {
Scanner sc = new Scanner(System.in);
System.out.println("컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!");
int tryCount = 1;
while (true) {
System.out.print(tryCount + "번째 시도 : ");
int userNumber = sc.nextInt();
int[] userNumbers = {userNumber / 100, userNumber % 100 / 10, userNumber % 10};
int strike = 0;
int ball = 0;
for (int i = 0; i < computerNumbers.length; i++) {
for (int j = 0; j < userNumbers.length; j++) {
if (computerNumbers[i] == userNumbers[j]) {
if (i == j) {
strike++;
} else {
ball++;
}
}
}
}
showBaseballScore(strike, ball);
if (strike == 3) {
System.out.println(tryCount + "번만에 맞히셨습니다.");
System.out.println("게임을 종료합니다.");
break;
}
tryCount++;
}
}
private static void showBaseballScore(int strike, int ball) {
if (ball == 3) {
System.out.println(ball + "B");
} else if (strike == 3) {
System.out.println(strike + "S");
} else {
System.out.println(ball + "B" + strike + "S");
}
}
private static int[] getComputerNumbers() {
int[] computerNumbers = new int[3];
Random random = new Random();
for (int i = 0; i < computerNumbers.length; i++) {
int randomNumber = random.nextInt(10); // 0 ~ 9
computerNumbers[i] = randomNumber;
// 중복 체크
for (int j = 0; j < i; j++) {
if (computerNumbers[j] == randomNumber) {
i--;
break;
}
}
}
return computerNumbers;
}
}
설계
- 컴퓨터 랜덤 숫자 선택부 제작
- Java util Random 으로 랜덤 숫자 생성
- 중첩 반복문과 조건문을 사용해 랜덤한 3개의 숫자(0 ~9)를 중복 없이 컴퓨터 선택 숫자 배열에 저장.
- 컴퓨터 선택 숫자를 메서드로 만들기
- 사용자 입력 및 숫자 야구 게임 메인 제작
- Java util Scanner 로 사용자가 3자리 숫자를 입력
- 사용자가 입력한 3자리 수를 자릿수 별로 나눠서 배열에 순서대로 저장( / 100 , % 100 / 10, % 10)
- 중첩 반복문과 조건문을 사용해 컴퓨터 선택 숫자와 순서와 값이 모두 같을 경우 strike, 숫자만 같을 경우 ball 값을 증가
- while문을 사용해 사용자의 값을 반복해서 입력 받고, 사용자의 입력 값이 3 strike가 될 경우 break문을 통해 반복문 종료
- print 문을 사용해 반복 횟수 및, ball 과 strike 값을 출력
- ball , strike 출력부 제작
- ball, strike가 각각 3이 될 경우 다른 값을 print하지 않도록 조건문 사용(예 : ball 이 3일 경우 ball 값만 출력 "3B")
- 실제 사용을 통한 테스트 및 각 부분 메서드로 변경.
학습 내용 정리
산술연산자
피연산 대상을 계산하는 역할 수행을 하는 연산자.
종류
- 더하기 +
- 빼기 -
- 곱하기 *
- 나누기(몫) / : 예) 4 / 2, 4를 2로 나눈 몫 2
- 나누기(나머지) % : 예) 5 % 2, 5를 2로 나눈 나머지 1
- 비트연산 << , >> : 잘 사용하지 않음
package test;
public class W02 {
public static void main(String[] args) {
// 산술 연산
int x = 7, y = 4;
// 더하기
int z = x + y;
System.out.println("x + y = " + z);
// 빼기
z = x - y;
System.out.println("x - y = " + z);
// 곱하기
z = x * y;
System.out.println("x * y = " + z);
// 나누기(몫)
z = x / y;
System.out.println("x / y = " + z);
// 나머지
z = x % y;
System.out.println("x % y = " + z);
}
}
비교연산자
두 개의 값을 비교하는 연산자로 boolean 값을 반환한다.
종류
- >, < : 크고 작음
- >=, <= : 크거나 같음, 작거나 같음
- == : 두 값이 같음
- != : 두 값이 다름
package test;
public class W02_1 {
public static void main(String[] args) {
// 비교 연산
int x = 10, y = 6;
// 값이 크거나 작은지
System.out.println(x > y);
System.out.println(x < y);
// 값이 크거나 같은지 , 작거나 같은지
System.out.println(x >= y);
System.out.println(x <= y);
// 두 값이 같은지, 다른지
System.out.println(x == y);
System.out.println(x != y);
}
}
논리연산자
비교 연산의 결과값으로 받는 boolean 값을 연결하는 연산자
종류
- &&(AND) : 모든 조건이 참이면 true, 하나라도 거짓이면 false 반환
- ||(OR) : 조건 중 하나라도 참이면 true, 모두 거짓이면 false 반환
- !(NOT) : 조건의 반대 값을 반환 참일 경우 false, 거짓이면 false 반환
package test;
public class W04 {
public static void main(String[] args) {
// 논리 연산자
int x = 10, y = 5, z = 3;
// AND 연산 - 2개 다 true일 때만 true 출력
System.out.println(x > y && y > z);
System.out.println(x > y && z > y);
// OR 연산 - 2개 중 1개만 true이면 true 출력
System.out.println(x > y || z > y);
System.out.println(y > x || z > y);
System.out.println(x > y || y > z);
// NOT 연산 - 반대로 출력
System.out.println(!true);
System.out.println(!false);
}
}
대입연산자
변수를 연산해서 저장하는 연산자(왼쪽의 변수에 오른쪽 변수의 값을 대입)
종류
- = (기본 대입 연산자) : 변수를 연산한 결과를 저장
- +=, -= (복합 대입 연산자) : 기본 대입 연산자를 간단하게 기록하는 방법
- 전위, 후위 증감 연산
- ++, -- 처럼 복합 대입 연산자를 사용할 수 있음
- 전위(연산 대상의 앞)에서 사용할 경우 증감 연산 이후 다른 연산을 실행하고
- 후위(연산 대상의 뒤)에서 사용할 경우 다른 연산 이후 증감 연산이 수행된다.
package test;
public class W05 {
public static void main(String[] args) {
// 대입 연산자
int x;
x = 10;
System.out.println("대입 연산: " + x);
// 복합 대입 연산
System.out.println("복합 대입 연산");
System.out.println(x += 2);
System.out.println(x /= 2);
// 전위 증감
int count = 0;
System.out.println("전위 증감 연산");
System.out.println(++count);
System.out.println(--count);
// 후위 증감
System.out.println("후위 증감 연산");
System.out.println(count++);
System.out.println(count--);
System.out.println(count);
}
}
기타연산자
형변환 연산자, 삼항 연산자, instance of 등이 해당
종류
- 형변환 연산자 : (type)
- 다른 타입의 변수를 연산할 때 사용하며 (type)을 형을 변환할 변수 앞에 쓴다.
- int number = 9 + (int) 8.5; 이면 double인 8.5를 int 8로 변환해서 연산
- 삼항 연산자 : (조건)? 참 값 : 거짓 값
- 조건을 비교해서 참일 때 값과 거짓일 때의 값을 반환함
- int number = (8 > 5)? 1 : 0; 이면 조건이 참이므로 number에 1을 대입
- instance of : 클래스, 객체를 비교할 때 사용함
package test;
public class W06 {
public static void main(String[] args) {
// 기타 연산자
// 형변환 연산자
int intNum = 94 + (int)96.7; // 명시적 형변환
System.out.println(intNum);
double doubleNum = 94 + 96.7; // 자동 형변환 (double) 생략 가능
System.out.println(doubleNum);
// 삼항 연산자
int result = (3 > 0)? 1 : 2;
System.out.println(result);
// instanceof
// 클래스, 객체 비교 연산자
}
}
연산자 우선순위
산술 연산자 → 비교 연산자 → 논리 연산자 → 대입 연산자
- 연산자 여러 개를 동시에 사용할 때는 연산자 우선 순위에 따라 연산 수행
- ( ) 괄호를 사용하는 경우 괄호 안의 연산이 최우선 순위로 수행
- 피연산자의 타입이 다를 경우 형 변환 연산자를 사용하거나 큰 범위의 변수 타입으로 자동으로 형 변환되어 연산 수행
if 조건문
특정 조건에 따른 다른 연산을 수행할 때 사용 (예: a 가 b 보다 크면 c 수행, a 가 b 보다 작으면 d 수행)
if문 : 특정 조건에 따른 연산 수행
- if ( 조건 ) { 연산 } 형태로 사용 : ( ) 안의 조건이 boolean true일 경우 { } 안의 연산을 수행
else문 : if 문의 조건을 만족하지 못할 경우 else 문의 연산 수행
- if ( 조건 ) { 연산 } else { 연산 } 형태로 사용 : ( ) 안의 조건이 true일 경우 if { } 안의 연산을 수행하고 false일 경우 else { } 안의 연산을 수행
else-if 문 : 다양한 조건을 사용할 때 사용 if 문에 else if 로 조건 추가
- if ( 조건1 ) { 연산 } else if ( 조건2 ) { 연산 } 형태로 사용 : if ( ) 안의 조건이 false 일 경우 else if ( ) 조건을 체크하여 true 일 경우 else if { } 안의 연산을 수행
- if , else if , else 문은 같이 사용할 수 있으며, else if 조건은 여러 개 만들 수 있음
중첩 조건문 : 조건문 안에 조건문을 넣어 조건을 여러 개 만족해야 연산을 수행하도록 설계 가능(if, else if, else 문에 if 문 추가 가능)
package test;
public class IfElse {
public static void main(String[] args) {
// if 조건문
int x = 10;
if (x > 5) {
System.out.println("x는 5보다 크다.");
}
//if else 조건문
if (x == 5) {
System.out.println("x는 5 입니다.");
} else {
System.out.println("x는 5가 아닙니다.");
}
// if else-if 문
if (x > 10) {
System.out.println("x는 10보다 큽니다.");
} else if (x > 5) {
System.out.println("x는 5보다 큽니다.");
} else {
System.out.println("x는 5보다 작습니다.");
}
// 중첩 if문
int y = 5;
if (x <= 10) {
System.out.println("x는 10보다 작거나 같습니다.");
if (y == 5) {
System.out.println("y는 5 입니다.");
}
}
}
}
switch 조건문
조건이 하나일 때 코드의 중복을 줄이고 가독성이 좋은 조건문 표현식
- switch ( 피연산자 ) { case( 조건 ) : ( 연산 ) } 형태로 사용
- 피연산자가 case ( 조건 )을 만족할 경우 해당 case의 연산을 수행
- case 문의 마지막에 break를 사용해서 해당 조건의 연산을 수행한 후 switch문 종료(break가 없으면 모든 case를 실행함)
- 모든 case를 만족하지 못할 경우 default(기본값)을 수행(기본 조건 없을 시 생략 가능)
package test;
public class Switch {
public static void main(String[] args) {
// switch 조건문
int number = 1;
switch (number) {
case 1:
System.out.println("남자입니다.");
break;
case 2:
System.out.println("여자입니다.");
break;
default:
System.out.println("회원이 아닙니다.");
}
}
}
if문과 switch문의 차이점
- if문은 복합 조건을 사용할 수 있음 ( ) 안에 조건 여러 개를 지정할 수 있음
- if ( 5 > 3 && 3 > 1 ) { 연산 } 같이 사용 가능
- switch문은 피연산자 1개에 대한 조건만 지원
- if문은 상대적으로 코드 중복이 많음
- switch문은 상대적으로 코드 중복이 적음
for 반복문
특정 조건에 따라 연산을 반복 수행할 때 사용, (예: a 가 b보다 작을 동안 c를 반복해서 출력)
- for (초기값; 조건문; 증가연산) { ( 연산 ) } 형태로 사용
- 향상된 for문은 for (변수 타입 변수명 : 목록변수) { ( 연산 ) } 형태로 사용(연속된 목록 변수를 출력할 때 사용 - 배열 출력)
- 특정 조건은 초기값과 조건문을 통해서 정의, 조건문을 만족할 경우 연산을 수행하고 초기값에 증가연산 수행, 다시 조건문 체크 후 만족할 경우 반복(연산, 증가연산)하고 조건문을 만족하지 못할 경우 반복문 종료
- for문을 중첩하여 중첩 반복문으로 사용 가능 (예: 구구단 출력), for문 안에 조건문을 추가적으로 사용 가능.
package test;
public class For {
public static void main(String[] args) {
// for 반복문
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
// 중첩 반복문
System.out.println("구구단 출력");
for (int i = 1; i <= 9; i++) { // 특정 단만 나오도록 수정도 가능
for (int j = 1; j <= 9; j++) {
System.out.println(i + " x "+ j + " = " + i * j);
}
}
// 향상된 반복문
int[] numbers = {1, 2, 3, 4, 5, 6, 7};
for (int number : numbers) {
System.out.println(number);
}
// 반복문 안에 조건문 사용
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
System.out.println(i + "는 짝수입니다.");
} else {
System.out.println(i + "는 홀수입니다.");
}
}
}
}
while 반복문
for문과 동일하게 특정 조건에 따라 연산을 반복 수행할 때 사용
- while( 조건문 ) { ( 연산 ) } 형태로 사용.
- 조건문을 만족해야 연산을 수행하며 조건을 만족하지 못할 때까지 반복해서 연산 수행(반복 시 마다 조건 체크)
- while( true ) { ( 연산 ) , if ( 조건 ) { break; } } 형태로 특정 if 조건문을 만족할 때까지 반복을 수행하는 무한 반복문의 형태로도 사용 가능
- do { ( 연산 ) } while( 조건 ) 형태로 사용하는 do while문의 경우 무조건 연산을 한 번 수행하고 while ( 조건 ) 의 조건문 체크하여 조건을 만족하면 반복하는 문맥(조건을 만족하지 못하더라도 연산을 1번 수행함).
package test;
public class While {
public static void main(String[] args) {
// while 반복문
int n = 0;
while (n < 5) {
System.out.println(n);
n++;
}
// do while 반복문 - 무조건 한 번은 실행되는 while 문
n = 6;
do {
System.out.println(n);
} while (n < 5);
// 무한반복 while 문
n = 0;
while (true) {
System.out.println(n);
if (n == 3) { // if 문과 break 문을 사용해서 무한 반복문 종료
break;
}
n++;
}
}
}
break, continue
반복문에서 반복문을 중단하거나 다음 loop(반복)으로 넘어가는 명령문
break
- 반복문을 종료시키고 반복문의 밖으로 나간다(중첩 반복문의 경우 가장 가까운 블록의 반복문을 중단함)
- switch문에서 case 뒤에서 조건문을 빠져 나오거나 반복문에서 특정 조건(if 문)을 만족할 경우 반복문을 중단하도록 사용
continue
- 반복문에서 다음 loop(반복)으로 넘어간다(continue 아래의 연산은 수행하지 않고 다음 loop로 넘어가서 조건을 체크 후 true일 경우 반복을 실행)
- 조건문(if문)을 사용해 특정 조건을 만족할 경우에만 다음 loop로 넘어가도록 사용 가능
package test;
public class BreakContinue {
public static void main(String[] args) {
// break - 반복문 종료
for (int i = 0; i < 10; i++) {
if (i > 3) {
System.out.println("반복문 종료");
break;
}
System.out.println(i);
}
// continue - 다음 loop로 이동
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // i % 2 의 나머지가 0일 경우 다음 loop로 이동
}
System.out.println(i);
}
// break, continue 동시 사용
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue;
}
if (i > 5) {
System.out.println("반복문 종료");
break;
}
System.out.println(i);
}
}
}
반복문 활용
반복문과 조건문을 잘 활용하면 다양한 프로그램을 설계할 수 있음.
구구단 출력 프로그램(특정 단수 제외, 특정 단수만 출력)
package test;
import java.util.Scanner;
public class W07 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("출력 제외할 단수 선택: ");
int num = sc.nextInt();
for (int i = 2; i <= 9; i++) {
if (i == num) {
continue;
}
for (int j = 1; j <= 9; j++) {
System.out.println(i +" x "+ j +" = "+ i*j);
}
}
System.out.print("출력할 단수 선택: ");
num = sc.nextInt();
for (int i = 2; i <= 9; i++) {
if (i == num) {
for (int j = 1; j <= 9; j++) {
System.out.println(i + " x " + j + " = " + i * j);
}
break;
}
}
}
}
배열
자료구조 : 기본형 변수가 1개의 값만 저장할 수 있는 것과 달리 배열형 변수는 여러 개의 값을 저장할 수 있음.
- 배열형 변수는 참조형 변수로 변수에 값을 직접 저장하는 것이 아닌 참조값을 저장한다.
- 배열은 정적 배열로 생성 시 크기를 지정해야 사용할 수 있다(동적 배열은 크기를 지정하지 않고 사용 가능).
- 배열에는 생성 시 정한 타입의 변수만 저장할 수 있고 다른 타입의 값은 저장할 수 없다.
- 배열의 인덱스는 0부터 시작 됨(new int[8] 배열의 경우 인덱스는 0 ~ 7까지만 있음, index는 배열 크기 - 1)
선언 및 조회, 초기화
- 배열을 사용하기 위해서는 배열의 타입과 이름을 선언하고 크기를 지정해서 배열을 생성해야 한다.
- 선언 : int[ ] intArr(변수명); 형태로 선언할 수 있다.
- 생성 : intArr = new int[3]; 형태로 생성할 수 있다.
- 선언과 생성은 동시에 할 수 있음 ( int[ ] intArr = new int[3]; )
- 배열의 값을 조회하는 방법으로는 index를 사용한 단 건 조회와 for문을 통한 순회(배열의 모든 값 조회)가 있다(향상된 for문 사용 가능).
- 초기화는 { }를 사용해 직접 값을 입력하는 방법과, for문(향상된 for문 포함)을 사용해 값을 입력하는 방법, Arrays.fill 메서드를 사용해서 초기화하는 방법이 있음
package test;
import java.util.Arrays;
public class Array1 {
public static void main(String[] args) {
// 배열 생성
int[] intArr = new int[3];
boolean[] boolArr = new boolean[3];
String[] strArr = new String[3];
// 배열 선언만
int[] intArr2;
// 배열 초기화
intArr2 = new int[3];
// 단건 조회
System.out.println(intArr[0]);
// 다건 조회
for (int i : intArr) {
System.out.println(i);
}
for (int i = 0; i < intArr2.length; i++) {
System.out.println(intArr2[i]);
}
// 초기화
int[] intArr3 = {1, 2, 3, 4, 5};
String[] strArr2 = {"A", "B", "C"};
// for문으로 초기화
for (int i = 0; i < intArr3.length; i++) {
intArr3[i] = i -1;
}
// 조회 향상된 for문 사용
for (int i : intArr3) {
System.out.println(i);
}
// 배열 주소 모두 같은 값으로 초기화
Arrays.fill(intArr, 2);
for (int item : intArr) {
System.out.println(item);
}
}
}
얕은 복사, 깊은 복사
- 배열의 경우 참조형 변수이기 때문에 a 배열을 b 배열에 대입하는 얕은 복사를 하는 경우에는 참조 값이 복사되기 때문에 b 배열의 값을 변경할 때 a 배열의 값까지 같이 변경된다.
- 깊은 복사의 경우 for문을 사용한 복사와 .clone( ) , Arrays.copyOf( )등을 사용해서 a 배열의 값을 복사해서 새로운 배열 b를 만들 수 있다.
- 2차원 이상의 다차원 배열에서는 .clone( )이 얕은 복사가 된다.
package test;
import java.util.Arrays;
public class Copy {
public static void main(String[] args) {
// 얕은 복사
int[] a = {1, 2, 3, 4, 5};
int[] b = a;
System.out.println(a);
System.out.println(b);
a[2] = 0;
System.out.println("a 배열: " + a[2] + " b 배열: " + b[2]);
// 깊은 복사
int[] c = new int[a.length];
for (int i = 0; i < a.length; i++) {
c[i] = a[i];
}
System.out.println(a);
System.out.println(c);
a[2] = 3;
System.out.println("a 배열: " + a[2] + " c 배열: " + c[2]);
// 깊은 복사 메서드
int[] d = a.clone(); // 다차원 배열에서는 얕은 복사
System.out.println(a);
System.out.println(d);
int[] e = Arrays.copyOf(a, a.length); // 복사할 배열, 복사할 길이(length = 배열의 길이)
System.out.println(a);
System.out.println(e);
}
}
String 배열
문자열을 다룰 때 사용하는 문자열 배열로 선언과 생성 방법은 기존 배열과 동일(초기화 방법도 기존 배열과 동일)
String 배열의 다양한 기능
- length( ) : 문자열 길이를 반환 (int)
- charAt(int index) : 문자열에서 해당 index의 문자를 반환 (char)
- subString(int from, int to) : 문자열에서 해당 범위의 문자열을 반환(to는 미포함) (String)
- equals(String str) : 문자열의 내용이 같은지 확인 같으면 true, 다르면false 반환 (boolean)
- toCharArray( ) : 문자열을 문자배열로 변환해 반환 (char[ ])
- new String(char[ ] charArr) : 문자배열을 받아서 String으로 복사해서 반환 (String)
package test;
public class Array2 {
public static void main(String[] args) {
// 문자, 문자열
char ch = 'a';
String str = "abcd";
// length
int strLength = str.length();
System.out.println(strLength);
// charAt(int index)
char strChar = str.charAt(2);
System.out.println(strChar);
// subString(int fromIdx, int toIdx)
String strSub = str.substring(0, 1);
System.out.println(strSub);
// equals(String str)
String newStr = "abcd";
boolean strEqual = newStr.equals(str);
System.out.println(strEqual);
// toCharArray() : String -> char[]
char[] strCharArr = str.toCharArray();
//Char[] -> String -> char
char[] charArr = {'A', 'B', 'C'};
String strArr = new String(charArr);
System.out.println(strArr);
}
}
다차원 배열
기본 배열은 열이 1개인 1차원 배열이고 열이 2개 이상인 배열을 2차원 배열이라고 하며 2차원 배열부터 다차원 배열이라고 부름
선언, 생성, 초기화
- 선언 시 int[ ] [ ] array 형태로 [ ] 를 만들 차원 수만큼 추가한다(int[ ] [ ] [ ] array 는 3차원 배열)
- 생성 시 array = new int[1][ ] 형태로 선언할 수 있다(1차원은 크기를 지정해야 되고, 2차원부터는 크기를 지정하지 않고 생성 가능)
- 초기화는 1차원 배열과 동일한 방법으로 가능하다( { { 1, 2 } , { 3 , 4 } } 처럼 중괄호를 이용한 초기화와 중첩 반복문을 사용한 초기화 가능)
- 가변 배열 : 2차원 배열을 생성할 때 행마다 다른 길이의 배열을 요소로 저장할 수 있음 { {1, 2, 3} , { 4 } , { 5, 6 } } 형태로 가변 배열 초기화 가능
다차원 배열 조회
- 중첩 반복문을 통해 2차원 배열 및 가변 배열을 출력할 수 있음
package test;
public class Array3 {
public static void main(String[] args) {
// 2차원 배열
// 생성
int[][] arr2D = new int[2][3];
// 선언
String[][] str2D;
// 초기화
str2D = new String[1][2];
// 값 넣어서 생성
int[][] array2D = {{1, 2}, {3, 4}, {5, 6}};
// 단건 조회
System.out.println(array2D[0][1]);
// 다건 조회
for (int i = 0; i < array2D.length; i++) {
for (int j = 0; j < array2D[i].length; j++) {
System.out.println(array2D[i][j]);
}
}
// 가변 배열
int[][] array = new int[2][];
// 배열 원소마다 다른 크기로 지정
array[0] = new int[3];
array[1] = new int[1];
int[][] array2 = {{1, 2, 3}, {4}, {5, 6}};
// 다차원 배열
int[][][] arr3D = new int[1][2][2];
int[][][] array3D = {{{0, 1}, {2, 3}}, {{1, 2}, {3, 4}}};
// 단건 조회
System.out.println(array3D[0][1][1]);
// 다건 조회
for (int i = 0; i < array3D.length; i++) {
for (int j = 0; j < array3D[i].length; j++) {
for (int k = 0; k < array3D[i][j].length; k++) {
System.out.println(array3D[i][j][k]);
}
}
}
}
}
컬렉션
Java에서 배열을 고도화시켜 컬렉션이라는 이름으로 제공하는 자료구조(참조형 분류통), 참조형 변수만 저장하고 여러 기능을 제공함
컬렉션 기능
- 크기 자동조정 / 추가 / 수정 / 삭제 / 반복 / 순회 / 필터 / 포함 확인 / ....
종류
- List : 순서가 있는 데이터의 집합(데이터 중복 허용) - 배열과 비슷
- Stack : 데이터를 수직으로 쌓아놓고 넣고 빼서 조회하는 형식(First In - Last Out)
- Queue : 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합(First In - First Out)
- Set : 순서가 없는 데이터의 집합(데이터 중복 불가) - 순서 없고 중복 없는 배열
- Map : 순서가 없는 (key, value)쌍으로 이루어진 데이터의 집합(key 값 중복 안 됨)
List
ArrayList : 배열처럼 일렬로 데이터를 저장 및 조회(인덱스로 값을 1개씩 조회 가능)
- 동적 배열로 List에 값이 추가될 때마다 크기가 늘어남
- 기능
- 선언 및 생성 : ArrayList<Integer> intList = new ArrayList<Integer>( ); 형태로 선언 및 생성
- 초기화 : 사이즈 지정 없어서 필요 없음
- 값 추가 : intList.add( 추가할 값) 형태로 값을 추가
- 값 수정 : intList.set(수정할 값의 index, 수정할 값) 형태로 값을 수정
- 값 삭제 : intList.remove(삭제할 값의 index) 형태로 값을 삭제
- 전체 출력 : intList.toString() 형태로 전체 값을 출력
- 전체 제거 : intList.clear( ) 형태로 전체 값을 삭제
LinkedList : 메모리의 남는 공간을 요청해 여러 곳에 나누어서 실제 값을 담고, 값이 있는 주소값으로 목록을 구성하고 저장
- LinkedList는 모든 값을 조회하는 속도가 느린 대신, 값을 중간에 추가하거나 삭제하는 속도는 빠름
- 기능(ArrayList와 다른 부분만 기록, 나머지는 ArrayList를 LinkedList로 바꾸기만 하면 동일)
- 값 중간에 추가 : linkedList.add(추가할 index , 추가할 값) 형태로 중간에 값을 추가
package test;
import java.util.ArrayList;
import java.util.LinkedList;
public class Col1 {
public static void main(String[] args) {
// List -> 동적 배열
// ArrayList
ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언 및 생성
// List에 값 추가
intList.add(1);
intList.add(2);
// List 값 읽기
System.out.println(intList.get(1));
// List 값 변경
intList.set(0, 4);
System.out.println(intList.get(0));
// List 값 삭제
intList.remove(0);
System.out.println(intList.get(0));
// List 전체 값 삭제
System.out.println(intList.toString());
System.out.println("리스트 값 전체 삭제");
intList.clear();
System.out.println(intList.toString());
// LinkedList
LinkedList<Integer> intList2 = new LinkedList<Integer>(); // 선언 및 생성
intList2.add(1);
intList2.add(3);
intList2.add(2);
// 전체 출력
System.out.println(intList2.toString());
// 값 추가
intList2.add(2, 5);
System.out.println(intList2.toString());
// 값 변경
intList2.set(1, 4);
System.out.println(intList2.toString());
// 값 지우기
intList2.remove(0);
System.out.println(intList2.toString());
// 값 삭제
intList2.clear();
System.out.println(intList2.toString());
}
}
Stack
- 상자에 물건을 넣고 빼듯이 밑에서 위로 쌓고, 꺼낼 때는 위에서부터 꺼냄
- 넣기(push( )) , 조회(peek( )), 꺼내기(pop( )) 기능만 존재
- 최근 데이터를 나열하거나 데이터의 중복처리를 막기위해 사용
- 기능
- 선언 및 생성 : Stack<Integer> intStack = new Stack<Integer>( );
- 추가 : intStack.push(추가할 값)
- 조회 : intStack.peek( ) 맨 위에 값을 조회
- 꺼내기 : intStack.pop( ) 맨 위 값부터 꺼내고 삭제
package test;
import java.util.Stack;
public class Col2 {
public static void main(String[] args) {
// Stack
// 선언, 생성
Stack<Integer> stack = new Stack<Integer>();
// push
stack.push(2);
stack.push(4);
stack.push(6);
// stack.isEmpty()
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
stack.push(2);
stack.push(4);
stack.push(6);
//peek
System.out.println(stack.peek());
// size
System.out.println(stack.size());
}
}
Queue
- 먼저 들어간 순서대로 값을 조회할 수 있음
- add( ) : 넣는 기능 , peek( ) : 조회 , poll( ) : 꺼내기 기능만 있음
- 생성자가 없으므로 바로 생성 불가, LinkedList를 사용해 Queue를 생성하고 받을 수 있음\
- 기능
- 선언 및 생성 : Queue<Integer> intQeueu = new LinkedList<Integer>( );
- 추가 : intQueue.add(추가할 값)
- 조회 : intQueue.peek( ) 가장 먼저 들어간 값 조회
- 꺼내기 : intQueue.poll( ) 가장 먼저 들어간 값 꺼내고 삭제
package test;
import java.util.LinkedList;
import java.util.Queue;
public class Col3 {
public static void main(String[] args) {
//Queue
//선언, 생성
Queue<Integer> queue = new LinkedList<Integer>();
// 값 추가
queue.add(3);
queue.add(2);
queue.add(7);
// 값 추출
while (!queue.isEmpty()) {
System.out.println(queue.poll());
}
queue.add(3);
queue.add(2);
queue.add(7);
// 값 조회
System.out.println(queue.peek());
// 크기
System.out.println(queue.size());
}
}
Set
- 순서가 보장되지 않는 대신 중복을 허용하지 않음
- Set은 Set으로 쓸 수 있지만, HashSet, TreeSet 등으로 응용 가능
- Set은 생성자가 없어서 바로 생성 불가, HashSet을 사용해서 Set을 생성하고 받을 수 있음
- 기능
- 선언 및 생성 : Set<Integer> set = new HashSet<Integer>( );
- 추가 : set.add(추가할 값)
- 삭제 : set.remover(삭제할 값)
- 포함 확인 : set.contains(포함 확인 할 값) 값이 포함 되었는지 boolean 타입으로 반환
package test;
import java.util.HashSet;
import java.util.Set;
public class Col4 {
public static void main(String[] args) {
//Set
//선언, 생성
Set<Integer> set = new HashSet<Integer>();
//값 추가
set.add(1);
set.add(4);
set.add(8);
//값 확인
for (Integer num : set) {
System.out.println(num);
}
//contains
System.out.println(set.contains(1));
System.out.println(set.contains(3));
}
}
Map
- key-value 형태로 데이터를 저장, key값을 기준으로 value를 조회
- key 값 중복 허용 안 됨
- HashMap, TreeMap 등으로 응용하여 사용 가능
- 기능
- 선언 : Map<String, Integer> map = new HashMap<>();
- 추가 : map.put(추가 key 값, 추가 value 값)
- 조회 : map.get(조회할 key 값)
- 전체 key 조회 : map.keySet()
- 전체 value 조회 : map.valueSet()
- 삭제 : map.remover(삭제할 key 값)
package test;
import java.util.HashMap;
import java.util.Map;
public class Col5 {
public static void main(String[] args) {
//Map key - value pair
// 선언, 생성
Map<String, Integer> map = new HashMap<>();
//key 값, value
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4);
//key 출력
for (String key : map.keySet()) {
System.out.println(key);
}
//value 출력
for (Integer value : map.values()) {
System.out.println(value);
}
//key 값으로 value 출력
System.out.println(map.get("a"));
}
}
length vs length( ) vs size( )
- length : 배열의 길이 조회
- length( ) : 문자열 길이 조회
- size( ) : 컬렉션 타입목록 길이 조회
담임 매니저님과 면담 기록 요약
- 공부하는 과정에서 기록으로 남기는 것이 중요함
- TIL, WIL 등으로 배운 내용을 기록하면 기록하지 않을 때보다 기억하고 내것으로 만들기 좋음
- 취업할 때 Histroy나 경험 등으로 살릴 수도 있음
- 주특기 과정에서 도움되는 방법
- 인텔리제이의 내장 Git 관련 기능을 활용하면 팀 프로젝트에 도움이 됨
- ChatGPT에게 코드 리뷰를 받은 후 구글링 또는 StackOverflow 등으로 코드에 대해 검사하고 내 생각을 넣어서 코드를 수정하면 내 것으로 만들 수 있음
- 항해 99 과정 수료 후 도움이 되는 정보
- 항해 99의 잡담 방을 확인하면 다양한 사이드 프로젝트에 참여할 기회를 얻을 수 있음
'항해 99 > Java' 카테고리의 다른 글
Java 기초 12 - 다형성 (1) | 2024.02.08 |
---|---|
객체 지향, 상속, 다형성 (1) | 2024.02.07 |
Java 기초 개념 (0) | 2024.02.05 |
Java 기초 12 - final , 상속 (1) | 2024.01.30 |
Java 기초 11 - 자바 메모리 구조와 Static (1) | 2024.01.29 |