6일차 2023-03-15 Java

2023. 3. 15. 19:57java

1. 배열

 

1-1) 2차원 배열

int  [][] arrNum;

heap영역에 메모리 할당

앞의 []는 행, 뒤의 []는 열

 

1-2) 1차원 배열과 차이점

 

		arrNum=new int[2][3];//2는 행의 수,3은 열의 수
		System.out.println(arrNum);//2행3열짜리 전체의 시작주소
		System.out.println(arrNum[0]);//0행 전체의 시작주소
		System.out.println(arrNum[1]);//1행 전체의 시작주소
		System.out.println(arrNum[0][0]);//0행 0열의 데이타
		System.out.println(arrNum[1][2]);//1행 2열의 데이타

sol)

[[ :2차원 배열이라는 것을 알려줌

[ :1차원 배열이라는 것을 알려줌

I(대문자): 정수형이라는 것을 알려줌 

나머지는 16진수로 이루어진 주소값 ex) 5ca881b5, 24d46ca6...

 

2차원 배열도 1차원과 같이 처음에 값을 안 넣어도 0이 들어가져 있다.

1-3) 열의 수를 행마다 다르게 할당

 

		int dynamic[][]=new int [2][];//열을 동적으로 항당하기 위해 열의 수 미지정
		System.out.println(dynamic);
		System.out.println(dynamic[0]);//0행 전체의 시작 주소:null
		dynamic[0]=new int[3];
		System.out.println(dynamic[0]);
		dynamic[1]=new int[1];
		System.out.printf("0행의 시작주소:%s,0행의 열의 주소:%d%n",dynamic[0],dynamic[0].length);
		System.out.printf("1행의 시작주소:%s,1행의 열의 주소:%d%n",dynamic[1],dynamic[1].length);
		for(int i=0;i<dynamic.length;i++) {//i를 행 인덱스로
			for(int j=0;j<dynamic[i].length;j++) {//j를 열 인덱스로
				System.out.printf("(%d행,%d열):%-3d",i,j,dynamic[i][j]);
			}
			System.out.println();
		}

행을 정했지만 열이 정하지 않으면 메모리에 할당이 안됨=> null값

 

열을 정하는 순간 할당이 됨=> dynamic[0] = new dynamic[3];

해석=>0행에 int 3열을 만들겠다.

아래 sol)에서 null=>  [I@448139f0 주소값이 생김

sol)

1-4) 2차원 배열 선언과 동시에 초기화

		/*
		 * 7]2차원 배열 선언과 동시에 초기화
		 * 바깥{}는 초기화를 위한 쭝괄호(초기화자)
		 * 바깥 {}안의 값의 수가 행의 수를 의미
		 * 안쪽 {}안의 값의 수가 열의 수를 의미
		 */
		System.out.println();
		int[][] arInit= {{1,2},{3,4,7},{6}};
		for(int i=0;i<arInit.length;i++) {//i를 행 인덱스로
			for(int j=0;j<arInit[i].length;j++) {//j를 열 인덱스로
				System.out.printf("(%d행,%d열):%-3d",i,j,arInit[i][j]);
				//arInit[i][j]은 {1,2},{3,4,7},{6}를 하나씩 
			}
			System.out.println();
		}

sol)

문) 아래와 같이 출력해 보자

/*

* 1 9 9 9 9

* 9 1 9 9 9

* 9 9 1 9 9

* 9 9 9 1 9

*/

		//문1]2차원 배열을 선언하는데, 선언과 동시에 메모리를 할당해라.
		int [][]Num=new int[4][5];
        
		//문2]위의 값을 문1]번에서 선언한 배열에 저장해라.
		for(int i=0;i<Num.length;i++) {
			for(int j=0;j<Num[i].length;j++) {
				if(i==j) Num[i][j]=1;
				else Num[i][j]=9;
			}
		}
        
		//문3]2차원 배열에 저장된 값을 위 모양대로 출력하여라.
		for(int i=0;i<Num.length;i++) {
			for(int j=0;j<Num[i].length;j++) {
				if(i==j) {
					System.out.printf("%-3c",'1');
				}else {
					System.out.printf("%-3c",'9');
				}
			}
			System.out.println();
		}

문제)

/*

*1] 학생수를 사용자로부터 입력받자

* -Scanner클래스 사용

*2] 입력받은 학생 수만큼 국영수 점수 및 총점을 저장할 수 있는

* int형 배열을 선언하고 메모리를 할당해라

*3] 학생 수만큼 각 학생의 국영수 점수를 입력받아

* 2]에서 생성한 배열에 저장해라.*

* -Scanner클래스 사용

*4] 각 학생의 국영수 점수 및 총점 그리고 평균을 출력하여라.

*/

		Scanner sc=new Scanner(System.in);
		
		String [] subjects= {"국어","영어","수학"};//사용자한테 입력시 메세지를 뿌려주기 위한 배열 데이터//1차원 배열 String형 subjects 선언
		
		//1] 학생수를 사용자로부터 입력받자
		System.out.println("학생 수를 입력하세요?");
		int numberOfStudents=sc.nextInt();//몇명 입력?
		//2] 입력받은 학생 수만큼 국영수 점수 및 총점를 저장할수 있는
		//   int형 배열을 선언하고  메모리를 할당해라
        //이제 int선언
		int[][] students=new int [numberOfStudents][4];//학생 수에 맞는 (1차),국영수 점수와 총점(2차)배열//[인원수][과목3개와 총점]
		//3] 학생 수만큼 각 학생의 국영수 점수를 입력받아
		//   2]에서 생성한 배열에 저장해라.*
        //일단 배열에 값 저장
		for(int i=0;i<numberOfStudents;i++) {
			//i번쨰 학생의 국영수 점수 입력받기
			System.out.println(i+1+"번째 학생의 점수를 입력하세요?");
			for(int j=0;j<subjects.length;j++) {//subjects.length=3
				System.out.println(subjects[j]+"점수를 입력하세요?");
				//각 과목 점수 입력받기
				students[i][j]=sc.nextInt();//2차배열구성에 각각 자리에 값 넣어주기
                /이제 총합을 구해보자
				//구하긴 위해서 1행의 값 다 더해야됨
				//sum+=i;
				//이걸 이차배열에 적용
				//각 과목의 점수를 마지막방에 누적
				students[i][students[i].length-1]+=students[i][j];//student[].length는 열의 길이(크기)
				//length-1해주는 이유=>배열은 0부터 시작하기 때문에 length가 아닌 length-1을 해준다
			}
		}
		//4] 각 학생의 국영수 점수 및 총점 그리고 평균을 출력하여라. 	
		for(int i=0;i<numberOfStudents;i++) {//몇 회 출력할것인가? 0~numberOfStudents까지
			System.out.println("=========================");
			System.out.println(i+1+"번쨰 학생 성적");//i는 0부터 시작이라서 i+1=1시작
			System.out.println("=========================");
			//국영수 점수/총점 그리고 /평균 출력
			System.out.printf("국어:%d,영어:%d,수학:%d,총점:%d,평균:%.2f%n",students[i][0],
																		students[i][1],
																		students[i][2],
																		students[i][3],
																		(double)students[i][3]/subjects.length);
		}

sol)

2. 메소드

 

2-1)메소드란

/*[메소드 형식1]

* :매개변수도 없고 반환값도 없는 경우

* 결과값을 반환하지 않을 때 반환 타입은 void

* ※주로 [출력하는 기능]을 담당한다.

*

* 접근지정자 [modifier] void 메소드명(){

* 처리할 일;

*

* }

*/

같은 (하나의) 클래스 안에서 메소드 명은 중복불가

void란  반환타입.

반환값이 없음 return을 쓰면 안 된다.

	public class MethodShape01 {
	//1]메소드 정의
	static void noParamNOReturn() {
		System.out.println("======메인메뉴=====");
		System.out.println("1.New 2.Continue 3.Exit");
		System.out.println("=================");
	}
	//[x]같은 (하나의) 클래스 안에서 메소드 명은 중복불가
	//static noParamNOReturn() {}[x]
	static void noParamNORetur2() {}//[o]//일만 안할 뿐메서드이다.
	static void noParamNORetur3() {
		int returnValue=100;
		//반환타입을 void로 정의했기 때문에 컴파일 에러 즉 값을 반환할 수 없다.
		//return returnValue;//[x]
		System.out.println("return문 이전");
		//return;//[o]값을 반환한다는 의미가 아니라 메소드를 바로 빠져 나가겠다는 의미
		//아래는 절대 실행이 안되므로 Unreachable Code에러
		//System.out.println("return문 이후");
		//※반환타입이 void 인 메소드에서 return;문은 주로 어떤 특정 조건하에서
		//메소드를 빠져 나갈떄 주로 사용한다.
		if(returnValue %2==0) {
			System.out.println(returnValue+"는 짝수");
			return;
		}
		//아래는 절대 실행이 안되는 명령문이 아니라
		//if조건이 거짓일때는 실행
		//고로 Unreachable code에러가 발생하지 않는다
		System.out.println(returnValue+"는 홀수");
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		noParamNOReturn();
		//System.out.println(noParamNOReturn(););//[x]가능하게 할려면 noParamNOReturn()이 반환값이 있어야된다.
		noParamNORetur3();
	}

}

sol)

2-2) 매개변수는 없으나 반환값이 있음 (return)

/*

메소드 형식 2:매개변수는 없고 반환 값이 있는 경우

※ 메소드 형식 2 은 주로 메소드 안에서 데이터를 생성(예:사용자로부터 값을 입력받기)하여

그 값으로 처리한 후 그 결과값을 반환하고자 할 때

주로 사용

접근지정자 [modifier] 반환자료형(반환타입) 메소드명(){

 

          처리할 일;

           return 결과값;

 

}

결과값을 메소드를 호출한 쪽에 반환할 때는

return이라는

키워드 사용

*/

결국, void를 쓰면 return이 없어야 되고 ,

반환자료형(반환타입) int, String, char double... 등

메소드의 변환타입에 따라 return에 맞는 반환을 해줘야 한다.

문제)

/*사용자로부터 국영수 점수를 입력받아 평균을 구해서 학점을 반환하는 메소드 정의

* 예]"A학점", "B학점"...

*/

		static String getGrade() {
		Scanner sc=new Scanner(System.in);
		//과목 타이틀 출력용
		String[] subjects= {"국어","영어","수학"};
		//점수 저장용
		int []jumsu=new int[subjects.length];
		//총합 저장용
		int total=0;
		//사용자 입력받기
		for(int i=0;i<jumsu.length;i++) {
			//타이틀 출력
			System.out.println(subjects[i]+"점수 입력?");
			//점수저장
			jumsu[i]=sc.nextInt();
			//total에 누적
			total+=jumsu[i];
		}
        switch(total/30){
		case 10:
		case 9:return "A학점";
		case 8:return "B학점";
		case 7:return  "C학점";
		case 6:return  "D학점";
		default:return "F학점";//(중요!! 없으면 에러)컴파일러상태에서 아닌경우를 체크하는데 여기서 default 경우를 체크한다.
		}
        public static void main(String[] args) throws IOException {
		System.out.println("당신의 학점은"+getGrade());
	}

sol)

문제)

/*문]

* 메소드 안에서 사용자로부터 숫자 두 개(Scanner)와

* 산술 연산자 (System.in.read()사용)를 입력받는 (+,-,*,/)

* 메소드로

* 산술 결과는 메소드 안에서 바로 출력하고

* 산술 연산자 기호를 반환하는 메소드를 정의해라

* 그리고 main메소드에서 호출하여

* 사용자가 입력한 연산자를 출력하여라.

*/

	static char getOperator() throws IOException {
		Scanner sc=new Scanner(System.in);

		System.out.println("첫번쨰 숫자 입력?");
		int fnum= sc.nextInt();
		System.out.println("연산자 기호 입력(+,-,*,/) 입력");
		char op=(char)System.in.read();
		System.out.println("두번쨰 숫자 입력?");
		int snum= sc.nextInt();
		switch(op) {
		case '+': System.out.printf("%d + %d =%d\n",fnum,snum,fnum+snum); break;
		case '-': System.out.printf("%d - %d =%d\n",fnum,snum,fnum-snum); break;
		case '*': System.out.printf("%d * %d =%d\n",fnum,snum,fnum*snum); break;
		case '/': System.out.printf("%d / %d =%d\n",fnum,snum,fnum/snum); break;
		default: System.out.println("잘못된 연산자 기호입니다.");
		}
		return op;
	}
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		System.out.println("입력한 연산자는"+getOperator());
				
	}

sol)

2-3) 매개변수 있고 반환값이 없는 경우

//메소드 형식 3: 매개변수는 있고 반환값은 없는 경우

/*

접근지정자 [modifier] void 메소드명(매개변수들){

처리할 일;

}

메소드에서 필요한 값을 매개변수를 통해서 받고

그 값으로 일을 처리한 후 결과값을

바로 출력하고자 할 때 주로 사용

*/

public class MethodShape03 {
	//1]메소드 정의:start부터 end까지 누적합 구하는 메소드
	static void printTotal(int start,int end) {
	int sum=0;//누적합을 저장할 변수 선언
	for(int i=start;i<=end;i++) sum+=i;
	System.out.printf("%d부터 %d까지 누적합:%d%n",start,end,sum);
	}
	/*문]국/영/수 세과목의 점수를 매개변수로 전달받아
	 * 평균을 구하고 학점을 출력하는 메소드를 정의하라
	 * 그리고 main에서 호출하여 결과를 확인하라
	 * 
	 */
	static void printGrade(int kor,int eng,int math) {
		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학점");
		}
		
	}
	static void gugudan(int a,int b) {
		for(int i=1; i<=b; i++) {
			for(int j=a; j<=b; j++) {
				System.out.printf("%d * %d = %d\t",j,i,j*i);
			}
			System.out.println();
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int start=1,end=10;
		printTotal(start,end);
		printTotal(1, 100);
	
		printGrade(90, 90, 90);
		printGrade(98, 77, 59);
		int[][] score= {
				{97,99,67},
				{88,99,78},
				{100,67,90},
				{77,56,100},
				{50,60,90}};
		
		//문2]위에 정의한 printGrade()메소드를 호출하여
	    //2차원 배열 score에 저장된 5명의 학생의
	    //학점을 출력하여라.
		System.out.println();
		for(int i=0; i<score.length;i++) {
			printGrade(score[i][0],score[i][1],score[i][2]);
		}
		/*
		 * 문3] 숫자 두개를 매개변수로 입력 받아서 즉 시작단과 끝단을
		 * 매개변수에 입력받아 해당 구구단을 출력하는메소드를 정의하고 main메소드에서 호출하여.
		 */
		System.out.println("[구구단]");
		gugudan(2, 9);
		System.out.println("[3단에서 16단까지]");
		gugudan(3, 16);
		System.out.println("[5단에서 12단까지]");
		gugudan(5, 12);
	}
	
}

sol)

//문 2] 위에 정의한 printGrade()메소드를 호출하여

//2차원 배열 score에 저장된 5명의 학생의

//학점을 출력하여라.

int [][]score= {

{97,99,67},

{88,99,78},

{100,67,90},

{77,56,100},

{50,60,90}};

을 어떻게 넣어야 할지가 문제였는데...

main메소드에

System.out.println();

for(int i=0; i <score.length;i++) {

        printGrade(score [i][0], score [i][1], score [i][2]);

}

이렇게 해결

2-4) 매개변수도 있고 반환값도 있는 경우

//메소드 형식 4:매개변수도 있고 반환값도 있는 경우

/*

접근지정자 [modifier] 반환타입 메소드명(매개변수들){

처리할 일;

return 결과값;

}

가장 활용빈도가 높은 메소드 타입]

*/

/*

인원수를 매개변수로 전달받아

인원수만큼 나이를 사용자로부터 입력받고

그 나이의 평균을 반환하는 메소드 정의하라

*/

	//1]메소드 정의
	static double getAverageOfAge(int personCount) {
		Scanner sc = new Scanner(System.in);
		int totalOfAge=0;
		//인원수 만큼 반복하면서 나이 입력받기 그리고 totalOfAge에 누적
		for(int i=0;i< personCount;i++) {
			System.out.println(i+1+"번째 나이 입력?");
			totalOfAge+=sc.nextInt();
		}
		//평균 구해서 반환
		return (double)totalOfAge/personCount;
	}
    public static void main(String[] args) {
		//2]메소드 호출
		System.out.printf("나이 평균:%.1f%n",getAverageOfAge(3));
		
		int returnValue = getCalc(10, 10, '@');
		if(returnValue == -2147483648) System.out.println("잘못된 연산자입니다");
		else System.out.println("연산 결과는 "+returnValue);
		
		System.out.println("최대값:"+getMaxValue(3));
	}/////////////main

문제)

/*

문] 여러 개의 숫자를 입력받아서 그중에

최대값을 구하는 메소드를 정의하자

단, 숫자의 개수는 매개변수로 전달받고

숫자의 개수만큼 사용자로부터 숫자를

입력(Scanner)받아 최대값을 구해

그 최대값을 반환하는 메소드이다.

그리고 main에서 호출하여 최대값을

출력하여라.

*/

	static int getMaxValue(int numberCount) {
		Scanner sc = new Scanner(System.in);
        //[배열 미 사용]
		int max=0;
		for(int i=0; i < numberCount;i++) {
			System.out.println(i+1+"번째 숫자 입력?");
			if(i==0) max=sc.nextInt();//첫번째 입력값을 max에 저장
			else {//첫번째 입력이 아니라면
				int temp = sc.nextInt();
				if(max < temp) max= temp;
			}
		}		
		return max;
	}
    public static void main(String[] args) {
		//2]메소드 호출
		System.out.printf("나이 평균:%.1f%n",getAverageOfAge(3));
		
		int returnValue = getCalc(10, 10, '@');
		if(returnValue == -2147483648) System.out.println("잘못된 연산자입니다");
		else System.out.println("연산 결과는 "+returnValue);
		
		System.out.println("최대값:"+getMaxValue(3));
	}

다른 방법)

		int [] numbers = new int[numberCount];
		for(int i=0; i < numberCount;i++) {
			System.out.println(i+1+"번째 숫자 입력?");
			numbers[i]=sc.nextInt();			
		}
		int max = numbers[0];
		for(int i=0; i < numberCount;i++) {
			if(max < numbers[i]) max = numbers[i];
		}*/
		//[배열 사용]
		/*
		int max=0;
		int [] numbers = new int[numberCount];
		for(int i=0; i < numberCount;i++) {
			System.out.println(i+1+"번째 숫자 입력?");
			numbers[i]=sc.nextInt();
			if(i==0) max = numbers[0];//첫번째 입력값을 max에 저장
			else {//첫번째 입력이 아니라면
				if(max < numbers[i]) max = numbers[i];
			}
		}*/

'java' 카테고리의 다른 글

8일차 2023-03-17 Java  (0) 2023.03.17
7일차 2023-03-16 Java  (0) 2023.03.16
5일차 2023-03-14 Java  (2) 2023.03.14
4일차 2023-03-13 Java  (0) 2023.03.13
3일차 2023-03-10 Java  (1) 2023.03.10