2024년 12월 27일 JAVA 기초 공부

코드 입력전에 pseudo 코드로 간단하게 만들어보고 그 이후에 코딩하는게 올바른 순서
코드 작성하면서 유효성 검사도 넣어주는게 좋음
1. Scanner 객체 사용 이유
int a=10; int b=20; 이런식으로 변수 초기화를 한 후에 진행을 할 수 있지만 매번 숫자를 바꿔가면서 진행하고 싶다는 생각이 들어 scanner.nextInt()를 통해 정수값을 입력받기 위해 Scanner 객체를 사용했습니다.
2. Scanner 객체는 무엇?
주로 세가지가 있는데 키보드에서 입력을 받는 역할, 파일에서 데이터를 읽어들이는 역할, 문자열을 분석하는 역할이 있고 다양하게 사용 가능하다.
if문 예제
- 성인인증
만약 회원가입한 회원의 나이가 14세 미만이라면 어린이 회원입니다. 라고 출력
14세 이상이라면 성인 회원입니다. 라고 출력해주세요.
package class01;
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
// 제어문
// 1. 조건문 2. 반복문
// if - else if - else
Scanner scanner = new Scanner(System.in); //scanner 객체 생성
System.out.println("나이를 입력하세요 : "); //나이 입력하기
int age = scanner.nextInt(); //scanner nextInt로 정수값 입력받기
if(age < 14){ // 14세 미만일 때는 어린이 회원임
System.out.println("어린이 회원입니다.");
} else if (age < 20) { // 14세 이상 20세 미만일 때는 청소년
System.out.println("청소년 회원입니다.");
} else { // 그 외에는 성인
System.out.println("성인 회원입니다.");
}
scanner.close(); //scanner 닫기
}
}
위의 코드는 유효성 검사가 없는 코드임
package class01;
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
// 제어문
// 1. 조건문 2. 반복문
// if - else if - else
Scanner scanner = new Scanner(System.in); //scanner 객체 생성
System.out.println("나이를 입력하세요 : "); //나이 입력하기
int age = scanner.nextInt(); //scanner nextInt로 정수값 입력받기
if(age<1 || age >120){ // 유효성 검사(1세 미만 혹은 120세를 초과하는 경우에는 유효하지 않음)
System.out.println("올바른 나이를 입력했는지 확인해주세요!");
} else if (age < 14) { // 14세 미만인 경우에는 어린이 회원으로 분류
System.out.println("어린이 회원입니다");
} else if (age < 20) { // 14세 이상 20세 미만인 경우에는 청소년 회원으로 분류
System.out.println("청소년 회원입니다.");
} else {
System.out.println("성인 회원입니다.");
}
scanner.close(); //scanner 닫기
}
}
유효성 검사가 들어간 코드
2. a와 b는 랜덤한 정수입니다 a와 b의 크기를 비교해서
- a가 크다면 a는 b보다 크다
- b가 크다면 a는 b보다 작다
- a와 b가 같다면 a와 b는 같다 를 출력하면 됩니다.
pseudo 코드
스캐너 nextint(a값 입력)
스캐너 nextint(b값 입력)
if(a값이 b값보다 큰 경우) a는 b보다 크다 출력
else-if(b값이 a보다 큰 경우) a는 b보다 작다 출력
else(a와 b가 같은 경우) a와 b는 같다 출력
package class01;
import java.util.Scanner;
/*1. a와 b는 랜덤한 정수입니다
int a = 10;
int b = 20;
a와 b의 크기를 비교해서
- a가 크다면 a는 b보다 크다
- b가 크다면 a는 b보다 작다
- a와 b가 같다면 a와 b는 같다.
*/
public class Test03 {
public static void main(String[] args) {
//scanner 객체 생성
Scanner scanner = new Scanner(System.in);
// 첫 번째 정수 입력 받기
System.out.println("첫 번째 정수를 입력하세요 : ");
int a = scanner.nextInt();
// 두 번째 정수 입력 받기
System.out.println("두 번째 정수를 입력하세요 : ");
int b = scanner.nextInt();
if(a > b) { //a가 b보다 클 때
System.out.println("a는 b보다 크다.");
} else if (a < b) { //a가 b보다 작을 때
System.out.println("a는 b보다 작다.");
} else { //a와 b가 같을 때
System.out.println("a와 b는 같다.");
}
scanner.close();
}
}
중복되는 문장을 변수에 넣어버리면 더 편하고 누수가 없을 것 같다는 생각이 든다!
package class01;
import java.util.Scanner;
/*1. a와 b는 랜덤한 정수입니다
int a = 10;
int b = 20;
a와 b의 크기를 비교해서
- a가 크다면 a는 b보다 크다
- b가 크다면 a는 b보다 작다
- a와 b가 같다면 a와 b는 같다.
*/
public class Test03 {
public static void main(String[] args) {
//scanner 객체 생성
Scanner scanner = new Scanner(System.in);
// 첫 번째 정수 입력 받기
System.out.println("첫 번째 정수를 입력하세요 : ");
int a = scanner.nextInt();
// 두 번째 정수 입력 받기
System.out.println("두 번째 정수를 입력하세요 : ");
int b = scanner.nextInt();
String msg = "a는 b"; // 중복되는 문장 변수처리, memory leak 해결
if(a > b) { //a가 b보다 클 때
System.out.println(msg + "보다 크다.");
} else if (a < b) { //a가 b보다 작을 때
System.out.println(msg + "보다 작다.");
} else { //a와 b가 같을 때
System.out.println(msg + "는 같다.");
}
scanner.close();
}
}
메모리 양 차이 비교를 한 번 해보자


유의미할 정도로 많이 차이나는거는 아니지만 몇 줄 차이나지 않기 때문에 코드 양이 많을 때 중복되는 부분은 변수처리를 해버리자. memory leak를 해결하는 방법 중 하나!
1번 문제
티모가 버스에 승차한다.
티모의 나이가 1~8세 라면 무료
9~19세 라면 900원
20~64세 라면 1500원
65세 이상이라면 무료다.
티모의 나이가 랜덤일때 얼마를 지불해야하는지 출력하세요.
ex1) (티모가 20세) 1500원을 지불해야합니다.
ex2) (티모가 7세) 0원을 지불해야합니다.
Pseudo 코드 작성
scanner 객체 생성
sysout(나이 입력받기);
int a = scanner.nextInt();
int bus; //버스비
if(1~8세) //버스비 무료
bus = 0
else-if(9~19세) //버스비 900원
bus = 900
else-if(20~64세) //버스비 1500원
bus = 1500
else // 65세 이상 버스비 무료
bus = 0
sysout(티모는 몇살이고 몇원 지불해야 할지 출력)
package class02;
import java.util.Scanner;
public class Test0401 {
public static void main(String[] args) {
//scanner 객체 생성
Scanner scanner = new Scanner(System.in);
// 티모 나이 입력하기
System.out.println("나이를 입력해주세요 : ");
int a = scanner.nextInt();
// 버스비 객체 생성
int bus;
if(a>=0 && a<9){ // 1~8세 버스비 무료
bus = 0;
} else if (a>=9 && a<20) { // 9~19세 버스비 900원
bus = 900;
} else if (a>=20 && a<65) { // 20~65세 버스비 1500원
bus = 1500;
} else { // 65세 이상 버스비 무료
bus = 0;
}
System.out.println("(티모는 " + a + "세)" + bus +" 원을 지불해야 합니다.");
scanner.close(); //scanner 객체 닫기
}
}
2번 문제
a,b,c 라는 랜덤한 정수가 3개 존재한다.
이중에서 가장 큰 정수의 값을 출력해주세요.
Pseudo 코드 작성
scanner 객체 생성
scanner.nextInt()로 a,b,c 값 입력받기
int max = a; 를 통해 임의로 a를 max값으로 지정
if(b가 max보다 클 때)
b=max; 를 통해 max를 b값 으로 지정
if(c가 max보다 클 때)
c=max; 를 통해 max를 c값으로 지정
sysout(max값 출력);
package class02;
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
//scanner 객체 생성
Scanner scanner = new Scanner(System.in);
// a값 입력하기
System.out.println("a값을 입력해주세요 : ");
int a = scanner.nextInt();
// b값 입력하기
System.out.println("b값을 입력해주세요 : ");
int b = scanner.nextInt();
// c값 입력하기
System.out.println("c값을 입력해주세요 : ");
int c = scanner.nextInt();
int max = a; //최대값 임의로 a로 설정
if (b > max) { //b가 a보다 클 때
max = b;
}
if (c > max){ //c가 a보다 클 때
max = c;
}
System.out.println("최대값 : " + max); //최대값 출력
scanner.close();
}
}
3번 문제
사과는 1300원이다. 사과를 랜덤하게 구매한다.
사과는 한명당 최대 3개까지 구매할수있다.
손님은 50000원으로 사과를 구매하려고 시도한다.
이때 손님이 지불해야할 사과의 금액과 거스름돈을 출력하세요.
pseudo 코드
int apple = 1300; // 사과 가격
int money = 50000; // 손님이 가진 돈
int max = 3; // 최대 구매 가능 개수
random 객체 생성
int count = random.nextInt(max) + 1; // +1을 해줘야 1,2,3이 나왐
int total = apple * count;
if(money가 total보다 같거나 클 때) //전체 값보다 돈이 많으면 출력 가능
사과 개수, 지불할 금액 출력
else(유효성 검사) //돈이 없으면 구매를 못하기 때문
돈이 부족합니다 에러 메세지 출력
package class02;
import java.util.Random;
public class Test04 {
public static void main(String[] args) {
int apple = 1300; // 사과 가격
int money = 50000; // 손님이 가진 돈
int max = 3; // 최대 구매 가능 개수
Random random = new Random(); // random 객체 생성
int count = random.nextInt(max) + 1; //nextInt는 n-1까지 나오기 때문에 +1을 통해 1,2,3을 나오게끔 함
int total = apple * count; //전체 가격
if (money >= total) { //전체 값보다 돈이 많으면 출력 가능
int change = money - total; // 거스름돈 = 가진돈 - 사과값
System.out.println("구매한 사과 개수: " + count + "개");
System.out.println("지불해야 할 금액: " + total + "원");
System.out.println("거스름돈: " + change + "원");
} else { //유효성 검사(돈이 없으면 못 사기 때문에 넣었음)
System.out.println("돈이 부족합니다.");
System.out.println("필요한 금액: " + total + "원");
System.out.println("보유 금액: " + money + "원");
}
}
}
Random, Scanner등 import 하고 진행하면 쉽게 랜덤으로 나오게 하거나 내가 입력하고 싶은 값을 입력할 수 있음
인간은 도구를 써야 편리하다는데 이때 도구가 Random, Scanner 객체이다.
코드 마지막 부분에 return;을 추가하면 void가 반응하고 main 함수가 끝나는 걸 확인할 수 있다.
반복문에는 while과 for 이렇게 두 종류가 있다.
while과 for을 사용하기 전 조건
- while : 반복횟수가 불분명할 때, 영원하게 무한하게 계속, 특정조건이 될때까지
- for : 반복횟수가 분명할때 N번 N회 a부터 b까지 (범위)

4번째에서 i의 값이 4보다 커져서 while문은 종료되고 i++로 인해서 최종 i는 4가 된 것이다.


contiune를 사용하면 반복문의 처음으로 이동하게 된다. while문을 잘못 설정하면 무한 루프에 빠질 수 있어 메모리가 적은 하드웨어는 재부팅 해야 할 수 있다. 그러니까 코드를 잘 짜야한다.

break를 사용하면 조건이 맞아 떨어졌을 때 해당 반복문이 종료된다. while(true) 한 이유는 무한루프를 만들기 위해서 '참'으로 지정해 계속 반복문을 돌게 설정했다. 옆에 디버깅표는 반복문이 진행되는 과정을 간단하게 보여준다.
1번 문제) 1부터 10까지 출력
package day002.class05;
public class Test01 {
public static void main(String[] args) {
int i= 1;
while(true){ //무한루프
if(i == 11){
break;
// 11이 되면 종료
}
System.out.println(i);
i++;
}
}
}
1-1번 문제) 10부터 1까지 출력
package day002.class05;
public class Test01Plus {
public static void main(String[] args) {
int i = 10;
while(true){ //무한루프
if(i==0){
break; //i가 0이 되면 종료
}
System.out.println(i);
i--;
}
}
}
2번 문제) 5부터 10까지 정수중에서 짝수를 출력
package day002.class05;
public class Test02 {
public static void main(String[] args) {
int i = 5;
while(i<=10){ // i가 10과 같거나 작을 때까지 반복
if(i%2==0){ // i를 2로 나누었을 때 나머지가 0이면 출력
System.out.println(i);
}
i++;
}
}
}
2-1번 문제) 5부터 10까지 정수를 모두 출력. 홀수는 X
package day002.class05;
public class Test02Plus {
public static void main(String[] args) {
int i = 5;
while(i <=10 ){ // i가 10까지 반복
if(i % 2 != 0){ // i를 2로 나누었을 때 몫이 0이 아닐 때
i++; // i를 1 상승
continue; // 계속 반복
}
System.out.println(i);
i++;
}
}
}
3번 문제) 1에서 8까지의 정수들중에서 8의 약수인 정수들만 출력
package day002.class05;
public class Test03 {
public static void main(String[] args) {
int i = 1;
while(i<=8){ // i를 8까지 반복
if(8 % i == 0){ //8을 i로 나눴을 때 나머지가 0인 것
System.out.println(i);
}
i++;
}
}
}
4번 문제) 1부터 10까지의 총합
package day002.class05;
public class Test04 {
public static void main(String[] args) {
int i = 1;
int sum = 0;
while(i <= 10){ // i를 10까지 반복
sum += i; // sum = sum + i, 총합에 계속 증가하는 i를 더하는 방식
i++;
}
System.out.println(sum);
}
}
4-1번 문제) 1부터 100까지의 정수들을 모두 더해가면서 그 총합을 출력 단, 총합이 50을 초과하면 총합을 그만 출력
package day002.class05;
public class Test04Plus {
public static void main(String[] args) {
int i = 1;
int sum = 0;
while (i <= 100) { // 1부터 100까지 반복
sum += i; // 현재 숫자를 총합에 더함
if (sum > 50) { // 총합이 50을 초과하면
break; // 반복문 종료
}
System.out.println("현재 숫자: " + i + ", 현재까지의 총합: " + sum);
i++;
}
}
}
별찍기
1.
package day002.class07;
public class Test01 {
public static void main(String[] args) {
int i = 0;
while (i < 5) { // 5줄을 만들기 위한 외부 while문
int j = 0; // 열을 카운트하는 변수
while (j < 5) { // 각 줄에 5개의 별을 찍기 위한 내부 while문
System.out.print("*"); //println 말고 print 해서 이어서 * 쓰게 함
j++;
}
System.out.println(); // 한 줄이 끝나면 줄바꿈
i++;
}
}
}

디버깅표
i = 0 j = 0 *
i = 0 j = 1 **
i = 0 j = 2 ***
i = 0 j = 3 ****
i = 0 j = 4 ***** -> 이게 출력
---- 까지 반복 ----
i = 1 j = 0 *
i = 1 j = 1 **
i = 1 j = 2 ***
i = 1 j = 3 ****
i = 1 j = 4 ***** -> 이게 출력
-------------------
이런식으로 i=0,1,2,3,4에서 마지막꺼가 출력돼서 결과값이 나옴
2.
package day002.class07;
public class Test02 {
public static void main(String[] args) {
int i = 1;
while (i <= 5) { // 5줄을 만들기 위한 외부 while문
int j = 1; // 별을 찍기 위한 변수
while (j <= i) { // 현재 행 번호만큼 별을 찍는 내부 while문
System.out.print("*"); //println 말고 print 해서 이어서 * 쓰게 함
j++;
}
System.out.println(); // 줄바꿈
i++;
}
}
}

디버깅표
i = 1 j = 1 1<=1 * -> 출력
i = 1 j = 2 2<=1 False
-----------------------
i = 2 j = 1 1<=2 *
i = 2 j = 2 2<=2 ** -> 출력
i = 2 j = 3 3<=2 False
-----------------------
이런식으로 증가하면서 마지막이 모여서 다 출력
3.
package day002.class07;
public class Test03 {
public static void main(String[] args) {
int a = 5;
int i = 0; // 현재 행을 추적
while (i < a) {
int j = 0; // 각 행에서 별을 찍기 위한 변수
// 각 행에서 (5-i)개의 별을 찍는다
while (j < a - i) {
System.out.print("*"); //println 말고 print 해서 이어서 * 쓰게 함
j++;
}
// 한 행이 끝나면 줄바꿈을 합니다
System.out.println();
i++;
}
}
}

디버깅표
i < a j<a-i
----------------------
0 < 5 T 0 < 5 T j=0 *
0 < 5 T 1 < 5 T j=1 **
0 < 5 T 2 < 5 T j=2 ***
0 < 5 T 3 < 5 T j=3 ****
0 < 5 T 4 < 5 T j=4 ***** ->출력
0 < 5 T 5 < 5 False
----------------------
1 < 5 T 0 < 4 T j=0 *
1 < 5 T 1 < 4 T j=1 **
1 < 5 T 2 < 4 T j=2 ***
1 < 5 T 3 < 4 T j=3 **** ->출력
1 < 5 T 4 < 4 False
이렇게 반복되면서 a가 4까지 반복해서 총 다섯줄 완성
4.
package day002.class07;
public class Test04 {
public static void main(String[] args) {
int i = 1; // 현재 행
int max = 5; // 총 행의 수
while (i <= max) {
int a = max - i; // 공백의 개수
int star = 1; // 별의 개수
// 공백 출력
while (a > 0) {
System.out.print(" ");
a--;
}
// 별 출력
while (star <= i) {
System.out.print("*");
star++;
}
System.out.println();
i++;
}
}
}

디버깅표
1 <= 5 T a = 4 공백공백공백공백*
2 <= 5 T a = 3 공백공백공백**
3 <= 5 T a = 2 공백공백***
4 <= 5 T a = 1 공백****
5 <= 5 T a = 0 *****
5.
package day002.class07;
public class Test05 {
public static void main(String[] args) {
int i = 0; //현재 행
int max = 5; //총 행
while(i < max){
int a = 0; //공백 출력
while(a < i){
System.out.print(" ");
a++; //공백이 아래로 내려갈수록 많아지니까
}
int star = max - i; //별표 출력
while(star > 0){
System.out.print("*");
star--; //별이 아래로 내려갈수록 적어지니까
}
System.out.println();
i++;
}
}
}

디버깅표
i<max a<i
0 < 5 0 < 0 F *****
-------------------------
1 < 5 0 < 1 T
1 < 5 1 < 1 F 공백****
-------------------------
2 < 5 0 < 2 T
2 < 5 1 < 2 T
2 < 5 2 < 2 F 공백공백***
-------------------------
이런식으로 진행되고 마지막거가 합쳐져서 한꺼번에 나옴'Back-End' 카테고리의 다른 글
| [JAVA] 기초 공부 5(배열, 정렬) (0) | 2025.01.02 |
|---|---|
| [JAVA] 문제 풀기(기초) (0) | 2025.01.01 |
| [JAVA] 기초 공부 4(문제풀기) (1) | 2024.12.31 |
| [JAVA] 기초 공부 3(for문, 입력, 랜덤) (1) | 2024.12.30 |
| [JAVA] 기초 공부(연산자, if) (1) | 2024.12.26 |