2023. 3. 14. 19:29ㆍjava
1.for문
1.1) for문 무한반복
FORStatement.java
for(;;) {
System.out.println("무한반복");
break;
}
//System.out.println("프로그램 종료");//Unreachable code
//주석처리된 "프로그램 종료"는 위 "무한반복"이 무한적으로 찍혀서 아래코드는 실행할 수가 없다는 뜻.
2) while문
WHILEStatement.java
while문 형식)
//while문:반복문으로 반복횟수가 정해져 있지 않을때 주로 사용
//형식:
/*
[초기식;]
while(반복조건){
반복조건이 참일때 실행할 명령문들;
[증감식;]
}
무한루프 처리]
while(true){
실행할 명령문들;
}
*/
for문과 while문은 똑같으나 초기식, 조건식, 명령문, 증감식의 위치만 바뀌었을 뿐이다.
하나 while(true)으로 반복 횟수가 정해져 없다고 가정했을 때 편하게 쓸 수 있다.
2-1) 이중 while문
전에 했던 for문 코드를 while문으로 바꿨을 시
/*
* 0 0 0 1 (1,4)
* 0 0 1 0 (2.3)
* 0 1 0 0 (3,2)
* 1 0 0 0 (4,1)처럼 출력해 보자
*/
int k=1;
int j=4;
while(k<=4) {
//int j=4;
while(j>=1) {
if(k==j) System.out.printf("%-2d",1);
else System.out.printf("%-2d",0);
j--;
}
j=4;//다시 j=4로 변경.안쪽while의 초기식을 바깥쪽 while에 위치 시킬때 추가
System.out.println();
k++;
증감식이 명령문 뒤에 붙는 자리인걸 명심
2-2) 무한 루프 while문
while(true) {
System.out.println("무한반복");
break;
}
System.out.println("프로그램 종료");
2-2) do~while문
DoWhileStatement.java
do ~ while() 문:반복문이다
반드시 한번은 실행하고 나서 반복하고자 하는 경우 사용
형식:
[초기식]
do{
명령문들;
[증감식]
}while(반복조건); //끝에 반드시 ; 붙여라
/////////////////////////////////////////
무한루프]
do{
}while(true);
do 블락 안에 한 번은 실행하고 조건을 따져 더 할지 말지 사용하는 문법
하지만, while문 안에 if문으로 do~while문을 대체 가능하는 점.
while(true) {
//점수 입력받는 부분
System.out.println("국어점수 입력?");
kor=sc.nextInt();
System.out.println("영어점수 입력?");
eng=sc.nextInt();
System.out.println("수학점수 입력?");
math=sc.nextInt();
int avg = (kor + eng+ math)/30;
switch(avg) {
case 10:
case 9: System.out.println("A학점"); break;
case 8: System.out.println("B학점"); break;
case 7: System.out.println("C학점"); break;
case 6: System.out.println("D학점"); break;
default: System.out.println("F학점");
}
//추가입력 여부 확인하기
System.out.println("계속 입력하시려면 아무키나 \r\n종료하시려면 'x'나 'X'를 누르세요");
exitCode = System.in.read();
if(exitCode=='X'|| exitCode=='x') break;
}
System.out.println("성적처리하느라 고생하셨어요");
2-3) continue문
BreakContinue.java
/*
기타 제어문:continue문 이나 break문은
반복문(for/while/do~while)
이나 switch문에서 사용
continue:
continue문을 만나면 반복문 처음으로 이동
break:
break문을 만나면 switch문이나 반복문을 빠져 나간다.
또한 continue문이나 break문을 만나면 그 아래에 있는
명령문들은 실행이 안된다.
*/
continue나 break문으로 아래 명령문을 실행하고 싶지 않을 때 사용된다.
2-4) 레이블
레이블명:
ex)
System.out.println("레이블이 있는 Continue문(가장 가까운 루프탈출)");
A:
for(int a=0; a<5; a++) {
System.out.println("여기");
for (int b=0; b<5; b++) {
//추가
if(b==2) continue A;//위 A:레이블로 가서 외부 for문 진행하고
//break 문 하고는 다르게 외부 for문 진행,break는 그 해당 외부 for문
//나오는데 이건 안나오고 진행!!!! 이해 중요
System.out.println("a="+a+",b="+b);
}//inner for
System.out.println("===============");
}//outer for
3.consol
가위 바위 보 게임 만들기
Math.random() 함수 이용
/*
* Math클래스의 random()메소드:
* 0.0사이에서 1.0사이의 double형값을 무작위로 발생시켜주는 메소드(단,1.0은 미 포함)
*
* 특정 범위의 숫자를 랜덤하게 발생 시키려면
*
* (int)(Math.random()*차이값)+시작값
* 단,끝값은 포함 안됨
* 끝값을 포함 시키려면
* (int)(Math.random()*(차이값+1))+시작값
*
* 예] 5부터 15사이의 숫자를 랜덤하게 발생시키려면
* 차이값: 15-5 =10;
* 시작값: 5
* 끝값:15
*
* (int)(Math.random()*10)+5 : 단,15는 발생 안됨
*
* 끝값도 발생시키려면
* (int)(Math.random()*11)+5
*/
//상수 정의]
public static final int SCISSORS=1;
public static final int ROCK=2;
public static final int PAPER=3;
public static final int EXIT=9;
public static void main(String[] args) {
// TODO Auto-generated method stub
//System.out.println((int)(Math.random()*5)+4);
Scanner sc= new Scanner(System.in);
//만약 반복한다면
while(true) {
//1]메뉴 출력
System.out.println("=============[매뉴 번호]=============");
System.out.println(" 1.가위 2.바위 3.보 9.종료");
System.out.println("===================================");
//2]컴퓨터는 숫자를 랜덤하게 발생시킨다.
int computer= (int)(Math.random()*3)+1;
//System.out.println("컴퓨터:"+computer);
//3]사용자 숫자 입력 받기
System.out.println("메뉴 번호를 입력하세요?");
int user = sc.nextInt();
if(user==EXIT) {
System.out.println("다음에도 즐~");
break;
}
//4]게임 승리여부 판단
System.out.printf("[당신:%s,컴퓨터:%s]%n",user==SCISSORS?"가위":user==ROCK?"바위":"보",
computer==SCISSORS?"가위":computer==ROCK?"바위":"보");
if(user==SCISSORS && computer==PAPER ||
user==ROCK && computer==SCISSORS ||
user ==PAPER && computer==ROCK) {
System.out.println("당신이 이겼어요");
}else if(user ==computer) System.out.println("비겼어요");
else System.out.println("당신이 졌어요");
}
}
삼항연산자의 활용, final을 이용한 상수정의, random() 클래스가 0 이상~1 미만인 특성으로 난수발생에 활용된다라는 점
4. 배열
4-1) 배열의 구조
/*
배열:하나의 이름(배열명)으로 같은 자료형의 데이타를
여러개 저장할 수 있는 메모리 구조
(메모리가 연속적으로 생김).참조형이다.
*/
//1차원(선형) 배열]
//방법1]배열 선언
/*
arrNum이라는 배열명으로
int형의 배열을 선언하는것
arrNum이라는 이름으로 Stack영역에
주소를 저장할 수 있는 메모리가 생김
*/
4-2) new연산자
int [] arrNum;
//arrNum = 10;//[x]데이타 저장 불가.
//2]메모리 할당- 실제 값을 저장할 수 있는 메모리를
// heap영역에 생성하기 위해
// new연산자 사용.
/*
* int[5]에서 5는 배열 크기 즉 메모리의 갯수다
*
* new연산자:실제 데이타를 저장할 메모리를
heap영역에 할당하여라는 의미
*/
arrNum=new int[5];
System.out.println(arrNum);
//배열명[숫자]를 배열요소명이라 함
//숫자는 배열인덱스라고 한다.
//배열에서 인덱스는 항상 0부터 시작
//배열명[숫자] 즉 배열 요소명은 변수처럼 사용할 수 있다.
System.out.println(arrNum[0]);
System.out.println(arrNum[4]);
arrNum은 주소값을 출력한다(대문자 I는 int형을 나타냄, @는 엣이라 읽고, 16진수로 구성)
arrNum[0]은 0으로, 배열은 초기값이 0으로 맞춰져 있다.
arrNum[4]4번째도 배열은 0으로 초기값이 되어있다.(여기서 int형은 0으로 초기값)
4-3 배열의 초기화
//3]배열의 초기화
/*
* 배열은 초기화를 하지 않아도
* 해당 자료형의 기본값으로 설정된다.
* 예]int:0,double:0.0 boolean:false,char:' '(빈값),참조형:null등
*/
System.out.println("[배열의 초기화 전]");
for(int i=0; i<5; i++) {
System.out.printf("arrNum[%d] : %d%n",i,arrNum[i]);
}
/*
* -배열에 값 할당 할때
* 배열명[인덱스]= 값 혹은 변수;
* -배열에 있는 값 읽어 올떄
* 배열명[인덱스]
* 배열명[인덱스]:배열요소명
* 배열의 인덱스는 0부터 시작
*/
//배열초기화]-메모리 생성후 값 최초로 할당
arrNum[0]=10;
arrNum[1]=20;
arrNum[2]=30;
arrNum[3]=40;
arrNum[4]=50;
System.out.println("[배열 초기화후]");
for(int i=0; i<5;i++) {
System.out.printf("arrNum[%d] : %d%n",i,arrNum[i]);
}
//arrNum[5]=60;//[x]실행시 에러
sol)
4-4) .length 과 출력결과
//4]출력
//배열의 크기 얻기 :배열명.length
System.out.println("배열의 크기:"+arrNum.length);
for(int i=0; i<arrNum.length;i++) {
/*
if(i==arrNum.length-1)
System.out.printf("arrNum[%d] : %d",i,arrNum[i]);
else
System.out.printf("arrNum[%d] : %d,",i,arrNum[i]);
*/
//삼항연산자로
System.out.printf(i==arrNum.length-1 ? "arrNum[%d] : %d":"arrNum[%d] : %d,",i,arrNum[i]);
}
//방법2]배열선언과 동시에 메모리 할당
String strArray[] =new String[3];
System.out.printf("\r\n"+strArray);
System.out.println("[배열 초기화 전]");
for(int i=0; i< strArray.length;i++) {
System.out.printf("strArray[%d] : %s%n",i,strArray[i]);
}
//String형 배열 초기화]
strArray[1]="소프트웨어";
strArray[0]="한국";
strArray[2]="인재개발원";
System.out.println("[배열 초기화 후]");
for(int i=0; i<strArray.length;i++) {
System.out.printf("strArray[%d] :%s%n",i,strArray[i]);
}
//방법3]배열 선언과 동시에 초기화
//첫번쨰 방법]{}배열 초기화자만 사용
//double [] dbArr = {100,3.114,99.9};{}를 "배열 초기화자"라 한다
//두번쨰 방법] new 자료형[]{}
double [] dbArr =new double[]{100,3.114,99.9};
for(int i=0; i<dbArr.length;i++) {
System.out.printf("dbArr[%d] :%s%n",i,dbArr[i]);
}
//boolean [] blArr;//boolean형 배열 선언
//blArr = {true,3>2,3>2 && 5<3,false};//[x]배열 선언후 초기화자로 초기화 불가
boolean[] blArr ={true,3>2,3>2 && 5<3,false};
for(int i=0;i < blArr.length;i++) {
System.out.printf("blArr[%d] : %s%n",i,blArr[i]);
}
sol)
4-5) Scanner
/*
Scanner클래스의 메소드 정리]
예]사용자가 12(엔터)치면 버퍼에 1|2|'\r'|'\n'
저장됨
nextInt():버퍼에 있는 엔터값(\r\n)은 읽지 않는다
nextInt()는 숫자만 읽는다 즉 숫자 12반환
nextLine()는 엔터값도 읽는다 하지만 엔터값을 제외한
부분만 반환한다
즉 문자열 "12"반환 버퍼에는 엔터값이 존재하지 않는다
*/
Scanner sc=new Scanner(System.in);
System.out.println("이름을 입력하세요?");
String name =sc.nextLine();
System.out.println("입력한 이름:"+name);
System.out.println("나이를 입력하세요?");
int age =sc.nextInt();
System.out.println("입력한 나이:"+age);
문) 학생 수 만큼 이름 입력받기
//[학생 수 많큼 이름 입력받기]
System.out.println("학생 수 입력하세요?");
int numberOfStudents= sc.nextInt();
System.out.println("입력받은 학생 수:"+numberOfStudents);
sc.nextLine();//엔터값을 읽어서 사용안함
//학생 수 만큼 이름 입력 받기
//학생 수 만큼 메모리 생성
String[] names=new String[numberOfStudents];
for(int i=0; i<numberOfStudents;i++) {
System.out.printf("%d번째 학생의 이름을 입력하세요?",i+1);
names[i]=sc.nextLine();
}
출력)
//출력]
for(int i=0; i<numberOfStudents;i++) {
System.out.printf("%d번째 학생 이름:%s%n",i+1,names[i]);
}
sol)
문 1) 총합과 평균을 구하라
//문1]int형 배열 jumsu에 저장된 점수의 총합과 평균을 구해라 그리고 출력하여라.
int []jumsu= {98,99,180,34,1090,67,990,1004,19,5,189,55,66,78,890,990,2000};
int sum=0; double avg;
for(int i=0;i<jumsu.length;i++) {
sum+=jumsu[i];
}
System.out.println("총합:"+sum);
avg=(double)sum/jumsu.length;
System.out.println("평균:"+avg);
sol)
문 2) max값 구하기
//문2]
//상기 jumsu배열에 저장된 값 중 최대값을 구하여라
int max=jumsu[0];
for(int i=1;i<jumsu.length;i++) {
if(max<jumsu[i]) {
max=jumsu[i];
}
}
System.out.println("최대값:"+max);
sol)
문 3) temp임시변수 사용문제
//3문]
//일차원배열을 크기 순서대로 재 배치후 출력하라(내림차순)
//값 비교하고 그걸 어디가 저장하고 다시 배치하기
System.out.print("내림차순:");
for(int i=0;i<jumsu.length-1;i++) {//첫번째 인덱스 위치를 잡고
//for(int j=0;j<jumsu.length-i-1);j++)//다른표현 (아래 코드랑 같음)
for(int j=i+1;j<jumsu.length;j++) {//두번째 위치(첫번째 위치+1)를 말함
//이렇게 중첩된 for 문을 사용한 이유는 배열을 정렬하기 위한 준비 단계로 배열 안에 있는 글자의 포인터(위치)를 확인하기 위한 작업.
if(jumsu[i]<jumsu[j]) {
int temp=jumsu[i];//임시저장
jumsu[i]=jumsu[j];
jumsu[j]=temp;
}
}
}
for(int i=0;i<jumsu.length;i++) {
System.out.printf("%d ",jumsu[i]);
}
sol)
'java' 카테고리의 다른 글
7일차 2023-03-16 Java (0) | 2023.03.16 |
---|---|
6일차 2023-03-15 Java (0) | 2023.03.15 |
4일차 2023-03-13 Java (0) | 2023.03.13 |
3일차 2023-03-10 Java (1) | 2023.03.10 |
2일차 2023-03-09 Java (1) | 2023.03.09 |