🦁멋쟁이사자처럼 백엔드 부트캠프 13기 🦁
TIL 회고 - [3]일차
🚀3일차에서는 기본 배열부터 다차원 배열, Arrays클래스 등과 객체에 대한 용어들을 배웠습니다!
<자바의 문법>
❓문자열 더하기
문자열과 더해지면 문자열이 됩니다.
문자열 + 정수 = 문자열 >> hello1
문자열 + 불린 = 문자열 >> hellotrue
문자열 + 실수 = 문자열 >> hello50.4
String str1 = "안녕";
String str2 = "하세요";
int i = 50;
char a = 'a';
double d = 5.0;
boolean flag = true;
String str3 = str1 + i; // 이 경우에도 i는 문자열로 포함이 된다.
// 문자열 + 문자열
System.out.println(str1 + str2);
// 문자열 + 정수
System.out.println(str1 + i);
// 문자열 + 문자
System.out.println(str1 + a);
// 문자열 + 실수
System.out.println(str1 + d);
// 문자열 + 불린
System.out.println(str1 + flag);
// 정의된 타입 모두 더하기
System.out.println(str1 + str2 + i + a + d + flag);
❓중첩반복문
: 반복문 안에 조건문이 올 수 있는 것처럼 반복문 안에 반복문이 올 수 있습니다.
api PrintStream ← API를 살펴보면
println의 메소드가 오버로딩 된 부분을 보면
boolean, char처럼 따로 매개변수로 지정되어있지만,
어떤 타입들이 더해지면 "무엇이 된다"라는 내용이 별도로 없습니다.
두 타입이 더해지면 단순히 String이 됩니다.
▶️실습 - 구구단 (세로)
for(int i = 1; i <= 9; i++){
for(int j = 1; j <= 9; j++){
System.out.println(i + " * " + j + " = " + (i*j));
}
System.out.println("----------");
}
이러한 방식으로 구구단이 세로로 출력됩니다. 중첩반복문을 통해
i 와 j 값을 활용하여 구구단을 출력할 수 있습니다.
▶️실습 - 구구단 (가로)
for(int i = 1; i <= 9; i++){
for(int j = 2; j <= 9; j++){
System.out.print(j + " * " + i + " = " + (j*i) + "\t|\t");
}
System.out.println();
}
구구단을 한눈에 보기 쉽게 가로로 출력한 실습입니다.
i가 뒤의 인자 역할을 j가 앞의 단수 역할을 합니다.
▶️실습 - 별 출력 프로그램 (일반)
// 일반 별 출력 프로그램
public class NestedLoopExam01 {
public static void main(String[] args) {
int end = 5;
for(int i = 0; i < end; i++){
for(int j = 0; j < i+1; j++){
System.out.print("*");
}
System.out.println();
}
}
}
end 변수를 통해 별의 출력 높이를 지정하고, 그 값에 따라 중첩반복문을 통해 별을 출력하는 실습입니다.
▶️실습 - 별 출력 프로그램 (피라미드)
// @@**@@
// 별 피라미드 프로그램 (중첩반복문 활용)
public class NestedLoopExam02 {
public static void main(String[] args) {
int end = 3; // 피라미드의 층 수를 지정함
for(int i = 0; i < end; i++) { // 줄 진행
// 공백 진행
for(int j = (end-i-1); j > 0; j--){ //
System.out.print(" ");
}
// 별 진행
for(int s = 0; s < (i*2)+1; s++){
System.out.print("*");
}
// 줄바꿈
System.out.println();
}
}
}
별을 출력하기 이전에 공백을 출력함으로써 피라미드 형식의 별을 출력하는 실습을 해보았습니다.
▶️실습 - 별 출력 프로그램 (역피라미드)
// @@**@@
// 별 역피라미드 프로그램 (중첩반복문 활용)
public class NestedLoopExam03 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int end = Integer.parseInt(br.readLine()); // 피라미드의 층 수를 지정함
for(int i = 0; i < end; i++) { // 줄 진행
// 공백 진행
for(int j = 0; j < i; j++){
System.out.print(" ");
}
// 별 진행
for(int s = ((end*2)-1)-(i*2); s > 0; s--){
System.out.print("*");
}
// 줄바꿈
System.out.println();
}
}
}
사용자에게 피라미드 "층 수"를 입력받아 역으로 피라미드를 출력하는 실습을 해보았습니다.
이전 예제와는 달리 별의 개수가 줄어나가야하므로, 별을 출력하는 s의 for문은 s-- 감소연산자를 통해 실습하였습니다.
▶️실습 - 별 출력 프로그램 (마름모)
// @@**@@
// 별 마름모 프로그램 (중첩반복문 활용)
public class NestedLoopExam04 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int end = Integer.parseInt(br.readLine()); // 마름모의 가장 긴 변(가로)을 지정함
// 위 피라미드
for(int i = 0; i < (end*2-1); i++) { // 줄 진행
if(i < end){
// 공백 진행
for(int j = end-i-1; j > 0; j--){
System.out.print(" ");
}
// 별 진행
for(int s = 0; s < (i*2)+1; s++){
System.out.print("*");
}
// 줄바꿈
System.out.println();
}
}
// 아래 피라미드
for (int i = 0; i < (end*2-1) ; i++) {
for (int j = 0; j < i+1 ; j++) {
System.out.print(" ");
}
for(int s = end*2 - 1; s > i*2 + 2; s--){
System.out.print("*");
}
System.out.println();
}
}
}
위의 피라미드와 아래 피라미드의 중첩반복문을 나누어서 출력해보았습니다.
위에서 진행했던 예제들을 단순히 합치는 것이 아닌 응용해서 실습해보았습니다.
❓라벨 Label
⭐반복문의 흐름을 제어하는 “라벨”
break문의 경우 자기를 감싸고 있는 반복문에 대해서만 빠져나갈수 있지만
중첩 반복문과 같은 전체 반복문을 빠져나갈 때 쓰이는 것이 라벨입니다.
// 중첩반복문 전체를 빠져나가는 Label 예제
a: for(int i = 1; i <= 9; i++){
for(int j = 2; j <= 9; j++){
if(j == 5) break a; // 5 * 1 이후로 아예 출력되지 않도록 함 (for i문도 순회하지 않음)
System.out.print(j + " * " + i + " = " + (j*i) + "\\t|\\t");
}
System.out.println();
}
// 일반적으로 쓰는 label의 이름 = outter
outter: for(int i = 1; i <= 9; i++) {
for (int j = 2; j <= 9; j++) {
System.out.print(j + " * " + i + " = " + (j * i) + "\\t|\\t");
}
if (i == 6) break outter; // j * 5 이후로 아예 출력되지 않도록 함 (모든 for문을 빠져나옴)
System.out.println();
}
Label은 위 코드처럼 a, outter, 아무 변수를 써도 관련 없습니다.
break문 뒤에 Label을 적어주고, 나가고 싶은 지점의 앞에 "Label : " 과 같은 형식으로 적어주면 됩니다.
일반 break문의 경우 j의 for문만 빠져나가지만, Label을 통해 i의 for문까지 빠져나갈 수 있는 것을 확인할 수 있습니다.
❓for each문
for(타입 변수명 : 배열명){
…
}
: 배열에 값이 남아있는 동안 계속 꺼내는 방식
사실 값을 꺼내는 방식으로 Iterator(반복자) 로 활용하는데,
이는 Iterator로부터 값이 있는지 검사하고 꺼내고, 검사하고 꺼내고 하는 방식입니다.
이를 편하게 쓰기 위해 등장한 개념이 for each구문입니다.
❓Arrays
배열을 다룰때 사용하는 유틸리티 클래스
즉, 배열에 유용한 기능을 편리하게 사용할 수 있게 제공해주는 클래스(=객체)
자바의 util 패키지 안에 포함된 Arrays클래스이며,
이 util 패키지에는 자바에서 편리하게 쓰일 수 있는 클래스들이 들어가있습니다.
Arrays클래스의 다양한 메소드들이 static으로 만들어진 것을 확인할 수 있습니다.
static 키워드를 통해 Arrays클래스의 다양한 메소드들을 알아서 쓸 수 있게 한 것입니다.
Arrays클래스는 메소드만 존재하고, 값을 저장하는 공간이 없어서 필드가 존재하지 않는 것을 확인할 수 있습니다.
new로 객체를 만들지 않음을 확인할 수 있는 겁니다.
간단하게 메소드들이 있는 것만 확인할 수 있습니다.
<배열>
데이터를 잘 관리하는 방법을 “자료구조”라고 합니다.
그 데이터를 관리하는 방법 중에 가장 기본이 되는 방법이 “배열”입니다.
int score1 = 0;
int score2 = 0;
score1, score2 같은 값들은 “스택” 메모리에 직접적으로 저장이 될 것입니다.
int[] arr;
배열을 사용할 것이라 “선언만 한 상태”
스택 메모리에는 int[] arr 라는 변수만 담깁니다. (=주소만 담깁니다)
스택메모리에는 기본데이터타입만 “값을 직접적으로 담을 수 있고”
따라서 그 외의 타입들은 “주소”가 저장됩니다.
이러한 데이터타입들을 레퍼런스 데이터타입이라고 합니다.
스택메모리는 한정되어있고, 여러개의 값을 담는 것이 불가능합니다.
arr = new int[5];
위에서 선언한 배열을 초기화하여 배열의 "인스턴스"를 만들게되면,
이 인스턴스들은 힙 메모리에 저장이 되고,
스택메모리에있는 arr변수가 이 인스턴스를 가리키게됩니다 (arr변수에는 주소값이 있으므로)
new라는 키워드를 통해 실체(=인스턴스)를 만들어냅니다.
배열은 고정길이이기때문에 한번 정할때, 메모리의 공간을 정해놓고 사용하게됩니다.
가변적으로 하나 더 저장하고 싶어질때 담을 수는 없는 것입니다.
값을 여러개 담을 수 있는 것들을 “자료구조”라고 합니다.
<배열의 예외>
배열은 인덱스를 가집니다. 어떤 언어는 인덱스를 1번부터 시작하지만, 자바는 0번부터 시작하는 언어입니다.
배열의 크기가 초과하게되면, ArrayIndexOutOfBoundsException이 발생하는데,
이는 "배열의 범위를 벗어나서 접근할때 발생" 합니다.
이러한 예외는 자바가 이미 정의해놓은 예외입니다.
Exception이 발생하면 프로그램은 정상적으로 처리되지 않으므로 종료됩니다.
❓배열에 값 넣기
int[] arr = new int[5];
// 1) 배열에 값 넣는 첫번째방법
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;
첫번째는 5칸의 공간을 갖는 배열을 선언하고,
배열의 가장 처음인덱스인 0번인덱스부터 끝인덱스인 4번인덱스까지 10, 20, 30, 40, 50 순서로 넣는 예제 입니다.
// 2) 배열에 값 넣는 두번째 방법 (배열 선언과 동시에 값을 넣어줌)
int[] arr2 = {11, 12, 13, 14, 15};
두번째는 선언과 동시에 값을 넣어주는 방법입니다.
// 2-1) 배열에 값 넣는 두번째 방법 (배열 선언과 동시에 값을 넣어줌 2)
int[] arr2_1 = new int[]{11, 12, 13, 14, 15};
이렇게도 표현할 수 있습니다.
// 3) 배열에 값 넣는 세번째 방법 (반복문 활용)
int[] arr3 = new int[5];
int value = 50;
for(int i = 0; i < arr3.length; i++){
arr3[i] = value;
value+=10;
}
세번째는 value라는 변수를 활용해 증감값을 가지고, for문을 반복하며 값을 넣는 방법입니다.
❓2차원 배열
변수명[행인덱스][열인덱스] = 값;
// 2차원 배열
int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
// 2차원 배열
int[][] arr2 = {{1, 2}, {4, 5, 6, 7, 8, 9, 10}};
- arr배열
arr의 변수는 스택메모리에 저장되어, 2차원 배열의 3칸 공간을 참조합니다.
그 3칸 중 [1]번째 칸은 {1, 2, 3}이 저장된 메모리를 가리키고,
그 3칸 중 [2]번째 칸은 {4, 5, 6}이 저장된 메모리를 가리킵니다.
그 3칸 중 [3]번째 칸은 {7, 8, 9}가 저장된 메모리를 가리킵니다. - arr2배열
arr2의 변수는 스택메모리에 저장되어, 2차원 배열의 2칸 공간을 참조합니다.
그 2칸 중 [1]번째 칸은 {1, 2}가 저장된 메모리를 가리키고,
그 2칸 중 [2]번째 칸은 {4, 5, 6, 7, 8, 9, 10}이 저장된 메모리를 가리키게됩니다.
정리하자면, 2차원 배열이 만들어졌을때
스택메모리에는 arr, arr2 만 저장되어있습니다.
여기서 arr2는 2차원배열 공간을 가리킵니다.
2차원 배열은 각 칸에 주소값이 저장되어있고,
각 주소값이 저장된 칸들은 또 다시 1차원 배열들을 가리킵니다.
<2차원 배열에 각기 다른 1차원 배열의 크기 할당하기>
// arr변수는 스택메모리에 담기고, 2차원 배열의 주소값을 가지고 있다.
// 실제 2차원 배열의 공간은 힙메모리에 담기고,
// 3칸으로 지정해줌에 따라 3칸의 2차원 배열의 공간이 만들어진다.
int[][] arr = new int[3][];
3칸으로 지정해줌에 따라 3칸의 2차원 배열의 공간이 만들어집니다.
여기서 arr[0][0] = 10; 을 하면 NullPointerException이 발생합니다. 이 공간이 만들어지지 않았다는 것입니다.
(= 포인터가 Null 값을 가리킴)
해결하기위해서는
"2차원 배열의 첫번째 칸에는 2칸의 공간을 만들것이다." 구문을 선언해줘야합니다.
arr[0] = new int[2];
이렇게 되면 3칸 중 첫번째 공간은 2칸의 1차원 배열을 가리키는 주소값이 담기고,
arr[0][0] = 10;
System.out.println(arr[0][0]);
10이 정상 출력됩니다.
이러한 방식으로 3,4차원 배열도 활용할 수 있습니다.
❓다차원배열
public static void main(String[] args) {
// 2차원 배열
int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
// 2차원 배열
int[][] arr2 = {{1, 2}, {4, 5, 6, 7, 8, 9, 10}};
// 다차원 배열
int[][][] arr3 = new int[2][3][4];
int COUNT = 1;
for(int i = 0; i < arr3.length; i++){
for(int j = 0; j < arr3[i].length; j++){
for(int k = 0; k < arr3[i][j].length; k++){
arr3[i][j][k] = COUNT++;
}
}
}
// 다차원 배열 출력 (for each문)
for(int[][] x : arr3){
for(int[] y : x){
for(int z : y){
System.out.print(z + "\t");
}
System.out.println();
}
System.out.println();
}
}
다차원 배열을 중첩반복문으로 1부터 배열의 크기까지 순서대로 값을 넣어주고,
for each문으로 점차 배열의 차원을 낮추며 출력하는 실습을 해보았습니다!
❓배열 복사하기
// 1) Arrays 클래스를 사용하지 않고 배열 복사
int[] copyFrom = {1, 2, 3};
int[] copyTo = new int[copyFrom.length];
for(int i = 0; i < copyFrom.length; i++){
copyTo[i] = copyFrom[i];
}
// 2) Arrays 클래스의 메소드를 활용하여 배열 복사 ( copyOf() )
int[] copyTo2 = Arrays.copyOf(copyFrom, copyFrom.length);
for(int x : copyTo2){
System.out.print(x + "\\t");
}
Arrays.copyOf(복사”할” 배열, 복사”될”배열의 길이)
Arrays.copyOfRange(”복사’할’배열, 복사할배열의 첫번째 인덱스, 복사할배열의 마지막 인덱스)
: 첫번째 인덱스부터 마지막인덱스의 “이전 값까지” 복사
Arrays클래스의 copyOf() 메소드와 copyOfRange()메소드를 이용하여 간단히 배열을 복사할 수 있습니다.
<메소드와 필드>
public class ItemForArray {
private int price;
private String name;
public ItemForArray(int price, String name) {
this.price = price;
this.name = name;
}
public int getPrice() {
return price;
}
public String getName() {
return name;
}
}
price와 name은 “필드”를 의미합니다. 필드는 데이터(속성)을 나타냅니다.
필드는 클래스의 가장 기본이 되는 구성요소입니다.
객체지향언어에서 객체(=클래스)의 속성(=필드)은 private한 것이 “일반적”입니다.
따라서 필드는 아무나 내 필드를 바꾸면 안되므로, private한 것이 좋습니다.
이 객체(=클래스)의 속성(=필드)에 대해서 이 객체만(=이 클래스에서만) 쓰겠다는 의미입니다.
private한 이 필드들을 외부에서 가져다 쓸 수 있게만드는 “메소드”를 만들어야합니다.
이 “가져다 쓸 수 있는 메소드”가 Getter 메소드라고 합니다.
메소드는 가장 기본적인 문법(형식)
>> [접근제한자] [리턴타입] 메소드명 (매개변수들…) { 실행할문장 }
getter, setter는 메소드의 형태가 지정되어있습니다.
그 약속을 정해놓은 것이 getter, setter 메소드입니다.
값을 얻어내거나, 값을 수정하는 메소드이므로 형태가 일정할 것입니다.
❓Getter 메소드
// getter)
public 리턴타입 get대문자필드(){
return 필드;
}
이러한 형태가 getter의 약속입니다.
필드 price와 name의 getter메소드를 각각 만들어보면,
public int getPrice(){
return price;
}
public String getName(){
return name;
}
이렇게 만들 수 있고, 이 Getter메소드를 통해 각 price와 name을 가져다 쓸 수 있게됩니다.
💡여기서 getPrice()의 목적은 "가격이 얼마인지 물어볼때 가격이 얼마인지를 말해주는 기능"을 합니다.
누구든지 이 getPrice()메소드에는 접근할 수 있도록 public접근제한자로 지정합니다.
결과값으로는 어떠한 것을 주겠다 (ex. return price) >> "리턴타입"이라고 합니다.
즉 나는 이 메소드가 수행이 되었을때 나에게 “어떠한 것”을 주기를 원한다.
return “어떠한 것” 으로 해주는 것입니다.
💡그렇다면 매개변수는 어떻게 전달할까
(매개변수는 이 메소드 수행에 필요한 변수들을 넣어주게됩니다.)
public String makeCoffee(String bean, String water){
커피콩을 간다.
물을 끓인다.
return 커피;
}
콩 (bean)과 water (물)을 매개변수로 전달받아 makeCoffee 메소드는 "커피콩을 갈고, 물을 끓이는" 기능을 수행합니다.
커피가 다 만들어지면 return 커피; 를 통해 메소드를 호출한 사용자에게 "커피"를 전달합니다.
❓Setter 메소드
외부에서 가격과 이름을 알아낼 순 있지만, 아직 가격과 이름을 “바꿀 순 없다”
필드를 바꾸기 위해서는 필드 중 숨길 부분은 숨기고, 알려줄 부분은 알려주는 것이 가능한 것이
"객체지향언어의 특성"
필드 중 숨길 부분은 (유저의 ID, 비밀번호 정보)일 것
필드 중 알려줄 부분은 (가격, 상품이름)과 같은 공유되어도되는 정보일 것
그 중 알려줄 필드 중에 수정이 되어도 되는 필드는 Setter메소드로 수정해주어도 된다는 것입니다.
Setter메소드는 필드의 값을 바꾸기 위한 메소드이다. 목적이 “필드의 값을 바꾸기 위함”
return타입은 기능이 수행된 다음 사용자에게 돌려주는 것을 말하므로,
setter메소드는 필드의 값만 바꿔주고, return타입으로 돌려줄 필요는 없기떄문에
void라는 예약어를 사용합니다. (=돌려줄 값이 없다)
ex. 3천원의 가격을 4천원으로 바꾸고 싶다.
public void setPrice(int price){
this.price = price;
}
사용자가 값을 주면 이 그릇에다 받을거다 라는 것을 선언합니다.
사용자가 값을 주는 것이 매개변수의 int price입니다.
이 그릇은 this.price입니다.
private int price에 사용자로부터 받은 (int price) 값을 넣어주어 업데이트해주는 것이다.
따라서 this 키워드를 통해 이 클래스 안에 있는 price이다. 라고 알려주어야한다.
this키워드는 “나 자신”을 말하며 . (온점)은 “가리키는 것”을 의미합니다.
따라서 “나 자신을 가리킵니다”
코드로 보면 “내 객체의 price를 가리키는 것” 을 의미합니다.
public class ItemForArray {
private int price;
private String name;
public ItemForArray(int price, String name) {
this.price = price;
this.name = name;
}
public int getPrice() {
return price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
private한 이 필드들의 값을 얻고자 하는 외부에 값을 반환해주는 "메소드"가 Getter 메소드 입니다.
private한 이 필드들의 값을 변경하고자 하는 외부에서 값을 전달받아 수정해주는 “메소드”가 Setter 메소드입니다.
<생성자>
public ItemForArray(int price, String name) {
this.price = price;
this.name = name;
}
위 예제 코드의 이 부분은 생성자를 말하며,
클래스의 이름과 똑같이 생성하되 매개변수를 받는 “메소드”
int i = 10; 은 “초기화”라고 말하듯 객체도 처음 만들어질때부터 초기화하고 싶다면 이 생성자를 사용
변수는 단순하게 값을 주면 끝이지만, 객체는 어느 값을 주어야할지 모르기때문에
객체를 이 메소드를 통해서 “초기화”할 수 있습니다.
생성자는 객체를 초기화하는 메소드이며, 객체가 “생성될때 딱 한번 실행”됩니다.
객체가 처음 생성될때부터 값을 갖고 생성되게 만들고 싶기때문에 생성자를 사용합니다.
ex. 사람 객체
태어날때부터 눈동자 색, 머리카락 색 등 생성자를 이용해서 초기화된 후 태어난 것입니다.
생성자는 생성하고 끝낼 것이므로, 리턴타입이 없습니다. 따라서 void나 int, String처럼 리턴타입 자체가 붙지 않습니다.
❓생성자의 형식
[접근제한자] [메소드명](클래스명과 똑같이 지정) (매개변수들…) { 필드 초기화 }
public ItemForArray(int price, String name) {
this.price = price;
this.name = name;
}
위의 코드는 이 객체가 생성될때부터 가격과 이름을 초기화시켜서 생성시켜주고 싶었음에
매개변수로 int price, String name을 받고
초기화로 this.price = price;
this.name = name;을 해주는 것
<ItemForArray 객체를 관리, 실행할 Main 클래스 작성>
public static void main(String[] args) {
ItemForArray[] item = new ItemForArray[3]; // 가격과 이름을 갖는 item을 5개 가짐
item[0] = new ItemForArray(19000, "상의");
item[1] = new ItemForArray(20000, "하의");
item[2] = new ItemForArray(8000, "모자");
int listIndex = 0;
for(ItemForArray x : item){
System.out.println("오늘의 아이템 [" + item[listIndex].getName()
+ "] - 가격 : " + item[listIndex++].getPrice());
}
}
아이템을 담고 출력하는 실습을 해보았습니다.
▶️실습 - 아이템 출력 프로그램
<ItemForArray 프로그램 - 전체코드>
public static void main(String[] args) {
ItemForArray[] item = new ItemForArray[3]; // 가격과 이름을 갖는 item을 5개 가짐
// 아이템 만들기 (적재)
item[0] = new ItemForArray(19000, "상의");
item[1] = new ItemForArray(20000, "하의");
item[2] = new ItemForArray(8000, "모자");
// 아이템 리스트 출력
int listIndex = 0;
int itemNumber = 1;
for(ItemForArray x : item){
System.out.println((itemNumber++) + ". 오늘의 아이템 [" + item[listIndex].getName()
+ "] - 가격 : " + item[listIndex++].getPrice() + "원");
}
System.out.println();
// 모든 상품의 관련 정보 출력
int allPrice = 0;
for(ItemForArray p : item){
allPrice += p.getPrice();
}
System.out.println("모든 상품을 합친 가격 = " + allPrice + "원");
System.out.println("모든 상품의 평균 가격 = " + allPrice/item.length + "원\n");
// 최저가 아이템 가져오기
int minPrice = Integer.MAX_VALUE; // 2147483647
for(ItemForArray p : item){
if(minPrice > p.getPrice()){
minPrice = p.getPrice(); // 최저가 갱신
}
}
System.out.println("----------핫 딜----------");
System.out.println("\t최저가 : " + minPrice + "원\n");
// 아이템 고르기 (선택)
String pickItemName = item[1].getName();
int pickItemPrice = item[1].getPrice();
System.out.println("내가 고른 아이템은 ['" + pickItemName + "', (가격 : " + pickItemPrice + "원)] 입니다.\n");
}
- ItemForArray[]로 아이템 배열을 만들고, item[0] = new ItemForArray(19000, "상의"); 와 같이
가격, 이름을 넣어주어 객체를 생성하였습니다. - 총 3개의 객체를 생성하고, 생성한 객체들을 출력합니다.
- 상품의 총 가격과 평균 가격을 알아내기위해 for each문을 통해 누적 합하였습니다.
- 최저가 상품을 알아내기위해 Integer.MAX_VALUE 메소드와 비교조건문을 이용해 최저가 상품을 출력합니다.
- 임의의 상품을 정하고, 고른 아이템의 이름과 가격을 출력하는 출력문을 작성합니다.
❓Java IO패키지
자바 입력과 출력을 담당하는 패키지
하지만 Scanner 클래스는 Java IO패키지가 아닌 ‘utility’ 패키지에 포함되어있습니다.
Scanner클래스는 입출력 편하게 하라고 추가된 객체여서 자바 5.0 부터 추가되었습니다.
Scanner클래스에 포함된 nextInt() 메소드는
Integer.parseInt()를 실행시켜서 변수를 자동으로 형변환하여 정수형으로 변수에 넣습니다.
// 유틸리티 패키지의 Scanner 클래스 활용
public class InputExam01 {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
System.out.println("숫자를 입력해주세요 : ");
int num = keyboard.nextInt();
System.out.println("입력된 숫자 = " + num);
// 입력된 숫자의 번호판
System.out.println("-----[번호판]-----");
for(int i = 0; i < num; i++){
if(i!=0 && i % 5 == 0) System.out.println();
System.out.print((i+1) + "\\t");
}
}
}
Scanner 클래스로 사용자에게 입력을 받아 반복문을 통해 숫자 번호판을 만드는 실습을 해보았습니다.
<Random 클래스>
숫자를 랜덤하게 뽑아주는 기능을 하는 클래스
random.nextInt(100)+1)
: 1부터 100까지의 숫자 중에 출력
▶️실습 - 오늘의 불쾌지수는?
public static void main(String[] args) {
Random random = new Random();
int percent = (random.nextInt(100) + 1); // 1~100 숫자를 랜덤하게 출력
System.out.println("오늘의 불쾌지수 : " + percent + "%");
}
Random클래스를 통해서 오늘의 불쾌지수를 1~100까지 랜덤하게 출력하는 실습을 해보았습니다!
▶️실습 - 옷가게 프로그램 (ItemStore)
위의 객체와 Getter, Setter메소드에 대해 배울때 했던 실습 (ItemForArray 프로그램)을
클래스를 분리하여 코드를 개선해보았습니다.
<main 메소드>
public static void main(String[] args) throws Exception{
// 아이템 만들기 (적재)
item[0] = new ItemForArray(19000, "상의");
item[1] = new ItemForArray(20000, "하의");
item[2] = new ItemForArray(8000, "모자");
System.out.println("~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~");
// 아이템 리스트 출력
printItems();
// 모든 상품의 관련 정보 출력
printItemsDetail();
// 최저가 아이템 가져오기
printMinPrice();
System.out.println("~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~");
// 아이템 고르기
printPickItem();
}
- main함수에서는 아이템의 생성 및 출력, 고르기 등과 같은 전체적인 관리를 합니다.
static ItemForArray[] item = new ItemForArray[3]; // 가격과 이름을 갖는 item을 5개 가짐
static BufferedReader br;
static boolean pickked;
- main함수의 위에는 static키워드를 이용하여 전역적으로 사용할 수 있게 변수를 선언하였습니다.
- ItemForArray객체 : 아이템을 생성하는 배열 선언
- BufferedReader객체 : 사용자에게 입력을 받기 위한 클래스 선언
<printItems 메소드>
private static void printItems(){
int listIndex = 0;
int itemNumber = 1;
for(ItemForArray x : item){
System.out.println((itemNumber++) + ". 오늘의 아이템 [" + item[listIndex].getName()
+ "] - 가격 : " + item[listIndex++].getPrice() + "원");
}
System.out.println();
}
- 생성된 아이템의 출력을 담당합니다.
<printItemsDetail 메소드>
private static void printItemsDetail() {
int allPrice = 0;
for(ItemForArray p : item){
allPrice += p.getPrice();
}
System.out.println("\t* 모든 상품을 합친 가격 = " + allPrice + "원");
System.out.println("\t* 모든 상품의 평균 가격 = " + allPrice/item.length + "원\n");
}
- 상품의 상세한 정보를 출력합니다.
- 모든 상품을 합친 가격 : for each문을 통해 아이템의 getPrice()를 누적 합 합니다.
- 모든 상품의 평균 가격 : 합친 가격에서 배열의 총 길이를 나눕니다.
<printMinPrice 메소드>
private static void printMinPrice() {
int minPrice = Integer.MAX_VALUE; // 2147483647
for(ItemForArray p : item){
if(minPrice > p.getPrice()){
minPrice = p.getPrice(); // 최저가 갱신
}
}
System.out.println("\t-------핫 딜-------");
System.out.println("\t<< 최저가 : " + minPrice + "원 >>");
System.out.println("\t------------------\n");
}
- 상품의 최저가를 출력합니다.
- Integer.MAX_VALUE 메소드를 활용하여
- 비교조건문을 통해 최소값이 발생할 경우 minPrice의 값을 갱신합니다.
<printPickItem 메소드>
private static void printPickItem() throws Exception{
// 아이템을 고르기 위한 사용자의 입력 Reader객체
br = new BufferedReader(new InputStreamReader(System.in));
outter : while(true){
System.out.print("구매할 아이템을 선택해주세요 : ");
int pickNumber = Integer.parseInt(br.readLine());
switch(pickNumber){
case 1:
System.out.println("내가 고른 아이템은 ['" + item[0].getName() + "', (가격 : " + item[0].getPrice() + "원)] 입니다.\n");
break outter;
case 2:
System.out.println("내가 고른 아이템은 ['" + item[1].getName() + "', (가격 : " + item[1].getPrice() + "원)] 입니다.\n");
break outter;
case 3:
System.out.println("내가 고른 아이템은 ['" + item[2].getName() + "', (가격 : " + item[2].getPrice() + "원)] 입니다.\n");
break outter;
default:
System.out.println("올바르지 않은 번호입니다. 다시 입력해주세요. \n");
break;
}
}
}
- 사용자에게 구매할 아이템을 입력받을 메소드입니다.
- switch문을 통해 사용자가 입력한 번호에 따라 아이템의 정보를 출력합니다.
- 올바른 번호를 입력하면, Label을 이용하여 break outter를 통해 while문을 한번에 빠져나옵니다.
- default 처리로 아이템을 벗어나는 번호가 입력되면 다시 while문으로 돌아가 반복을 진행합니다.
💡 3일차에는 자바에서 자주 사용되는 문법들을 배우며 다양하게 활용하여 실습을 진행하였습니다!🚀
'Recording > 멋쟁이사자처럼 BE 13기' 카테고리의 다른 글
[멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_6일차_'상속과 메소드 오버라이딩' (1) | 2024.12.09 |
---|---|
[멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_5일차_'메소드, 필드, static' (3) | 2024.12.06 |
[멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_4일차_'객체지향프로그래밍' (1) | 2024.12.05 |
[멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_2일차_'자바 기초와 문법' (0) | 2024.12.03 |
[멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_1일차_'자바 기초' (0) | 2024.12.02 |