5일차 2023-03-14 Java

2023. 3. 14. 19:29java

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

레이블이 있는 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