2023. 3. 15. 19:57ㆍjava
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 |