
자바에서 Scanner
-> 사용자로부터 키보드 입력을 받을 수 있게 해주는 표준 입력 처리 도구
java.util 패키지에 포함되어 있으며, 숫자, 문자열 등 다양한 형식의 데이터를 쉽게 입력받을 수 있도록 도와준다.
java.util
콘솔에서 입력을 받을 때 사용되며, System.in을 통해 표준 입력 스트림을 읽는다.
import java.util.Scanner; 선언
Scanner sc = new Scanner(System.in); 객체 생성
sc.nextInt(), sc.nextLine(), sc.nextDouble() 등 다양한 메서드를 사용해 입력 받기.
사용이 끝나면 sc.close();를 호출해서 자원 정리.
next() 단어 하나 (공백 전까지) 읽음
nextLine() 한 줄 전체 입력 (공백 포함)
nextInt() 정수 입력
nextDouble() 실수 입력
nextBoolean() true/false 입력
package lesson01;
import java.util.Scanner;
public class Ex05_Scanner {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("이름을 입력하세요: ");
String name = sc.nextLine();
System.out.print("나이를 입력하세요: ");
int age = sc.nextInt(); // int 먼저 쓰면 안 됨.
System.out.print("안녕하세요, "+name+"님! 당신의 나이는 "+age+"세 입니다.");
sc.close();
}
}
이름을 입력하세요: apple
나이를 입력하세요: 20
안녕하세요, apple님! 당신의 나이는 20세 입니다.
💥 nextInt() 후에 nextLine()을 바로 쓰면 입력이 꼬일 수 있다.
-> sc.nextLine()을 한 번 더 호출해서 버퍼를 비워줘야 한다.
int age = sc.nextInt();
sc.nextLine(); // 개행 문자 제거
String name = sc.nextLine();
System.in : 자바에서 표준 입력 장치를 의미하며, 일반적으로 키보드 입력을 받을 때 사용되는 입력 스트림(InputStream)이다.
Scanner, BufferedReader와 함께 사용되어 입력값을 읽는 데 활용되며, 바이트 단위로 데이터를 읽는다.
package lesson01;
import java.io.IOException;
public class Ex06_SystemIn {
public static void main(String[] args) throws IOException {
System.out.print("문자 하나를 입력하세요: ");
int input = System.in.read(); // 한 글자(바이트)를 읽음
System.out.println("입력한 문자: "+(char) input);
}
}
문자 하나를 입력하세요: a
입력한 문자: a
자바에서 배열(Array)
-> 같은 자료형의 값들을 여러 개 저장할 수 있는 연속된 공간
배열은 한 번 생성되면 크기가 고정되며, 각 요소는 인덱스(순번)를 통해 접근할 수 있다.
인덱스는 0부터 시작하고, 배열의 크기보다 큰 인덱스를 참조하면 오류가 발생한다.
int[], String[], double[] 등)arr[0], arr[1], …)int[] scores = new int[5]; // 정수형 5개를 저장할 수 있는 배열 생성
또는
int[] scores = {90, 80, 100, 70, 40}; // 배열 생성과 동시에 값을 저장
scores : 배열이 저장된 메모리의 위치(주소)를 참조.
package lesson01;
import java.util.Scanner;
public class Ex07_ArrayInput {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int [] scores = new int[3];
System.out.print("1번째 점수를 입력하세요: ");
scores[0] = sc.nextInt();
System.out.print("2번째 점수를 입력하세요: ");
scores[1] = sc.nextInt();
System.out.print("3번째 점수를 입력하세요: ");
scores[2] = sc.nextInt();
System.out.println("1번째 점수: " + scores[0]);
System.out.println("2번째 점수: " + scores[1]);
System.out.println("3번째 점수: " + scores[2]);
sc.close();
}
}
1번째 점수를 입력하세요: 80
2번째 점수를 입력하세요: 90
3번째 점수를 입력하세요: 100
1번째 점수: 80
2번째 점수: 90
3번째 점수: 100
배열 안에 또 다른 배열이 있는 구조
행(row)마다 각각의 1차원 배열이 따로 존재한다.
1차원 배열: int[]
2차원 배열: int[][] ← 배열의 배열
package lesson01;
public class Ex08_JaggedArray {
public static void main(String[] args) {
int[][] jagged = new int[3][];
// 가변 배열
jagged[0] = new int[] {1, 2};
jagged[1] = new int[] {3, 4, 5};
jagged[2] = new int[] {6};
System.out.println("jagged[0][0] = " + jagged[0][0]);
System.out.println("jagged[0][1] = " + jagged[0][1]);
System.out.println("jagged[1][0] = " + jagged[1][0]);
System.out.println("jagged[1][1] = " + jagged[1][1]);
System.out.println("jagged[1][2] = " + jagged[1][2]);
System.out.println("jagged[2][0] = " + jagged[2][0]);
}
}
jagged[0][0] = 1
jagged[0][1] = 2
jagged[1][0] = 3
jagged[1][1] = 4
jagged[1][2] = 5
jagged[2][0] = 6
값 자체를 복사하는 게 아니라 주소(참조값)를 복사하는 것.
두 변수가 같은 객체(또는 배열)를 가리키게 된다.
int[] a = {1, 2, 3};
int[] b = a; // 얕은 복사
b[0] = 99;
System.out.println("a[0] = " + a[0]); // 99
System.out.println("b[0] = " + b[0]); // 99
내용을 완전히 새로 복사하는 것.
새로운 공간을 만들고 값만 복사하므로 완전 독립적이다.
package lesson01;
public class Ex09_DeepCopy {
public static void main(String[] args) {
int[] a = {1, 2, 3}; // 원본 배열
int[] b = new int[3]; // 새로운 배열(깊은 복사용)
b[0] = a[0];
b[1] = a[1];
b[2] = a[2];
System.out.println("a[0]: "+a[0]);
System.out.println("b[0]: "+b[0]);
System.out.println("-------------------------");
b[0]=99;
System.out.println("a[0]: "+a[0]);
System.out.println("b[0]: "+b[0]);
}
}
a[0]: 1
b[0]: 1
-------------------------
a[0]: 1
b[0]: 99