2023.02.11 Java 복습
Java 연습
1. 자바 코드 연습 별찍기 #1
for if 제어문을 배우면 모든걸 할수잇다.
규모가 커지면 중첩이 커지고 난해해진다. 절차를 잘만드는게 가장 중요하다. 반복이 중요하다. 선택문도 중요하다.
프로그래밍에서 중요한것
1.구현능력
자바를 배우거나 뭘배우든 말로 들은것을 구현할수 있어야한다. 어떤구조를 이용해서 어떻게 구현할지 알아야한다.
2.오류해결능력
내가 구문을 틀리면 오류가난다. 오류 구문을 보고 오류를 어디서 낫는지 알아야하고 코딩 흐름을 알아야한다.
3.문제해결능력
정렬같은걸 하겟다. 어떻게 할지 해결방법을 찾아내야함. 어떤방법을 쓸건지 선택해야한다.
어떤방법을 하면 구현해야한다.
말한걸해야한다면 구현능력임.
1.1 10개 별찍기
for (int i = 0 ; i <10; i++) {
System.out.printf("%c", '☆');
}1.2 10번을 10번찍기
for (int i = 0 ; i <10; i++) {
for (int j = 0 ; j <10; j++) {
System.out.printf("%c", '☆');
}
System.out.println();
}종속이 되도록 코드블록으로 잘 묶어주기
1.3 격자형말고 삼각형쌓기
i0 j0/ i1 j0 j1 / i2 j0 j1 j2
for (int i = 0 ; i <10; i++) {
for (int j = 0 ; j <= i; j++) {
System.out.printf("%c", '☆');
}
System.out.println();
}1.4 거꾸로쌓기 10~1
i0 j0 ~ 10 / i1 j1 ~ 10
for (int i = 0 ; i <10; i++) {
for (int j = i ; j < 10; j++) {
System.out.printf("%c", '☆');
}
System.out.println();
}현장에서는 이중for문 안씀 수학으로 가능하다.
2. 반복문 #1
프로그래밍은 절차이다. 분기하는 선택문 반복 반복이 진행된다. 여러개가 중첩된다. 규모가 클수록 중첩된다.
이렇게 복잡한것을 한번에 만드는 건 불가능하고 단위별로 잘라서 만든다.
이 잘라서 만드는게 함수이다. 복잡도를 낮추기 위해 잘라서 만들어야함. 이 잘라서 만든거는 구현할 줄 알아야함.
똑같은 코드가 반복하면 한번만 놔두고 흐름제어로 해야한다.
이런 코드를 안보고 해야하는 것은 계속해서 반복해야한다. 이해하는 것으로 끝나는게 아니라 숙달되야한다.
2.1 x번반복
x라는 변수 integer 몇번을 반복? 일력한값을 x에 담고 x번반복
for (int i = 0; i < x; i++) {
System.out.printf("%c,", 65);
}2.2 반복문 사용 A, B, C, D, E, 출력
System.out.printf("%c,", 65);
System.out.printf("%c,", 66);
System.out.printf("%c,", 67);
System.out.printf("%c,", 68);
System.out.printf("%c,", 69);달라지는 값에 규칙이 있는가? 규칙이 있다면 규칙적으로 연산이 가능하다.
등차로 변한다 등차가 잇다면 반복문이다.
System.out.printf("%c,", 'A' + 0);
System.out.printf("%c,", 'A' + 1);
System.out.printf("%c,", 'A' + 2);
System.out.printf("%c,", 'A' + 3);
System.out.printf("%c,", 'A' + 4);'A'는 문자코드를 얻어내는 것임. 문자코드 + 1하면 다음 문자에 해당되는 코드임.
for (int i = 0; i < 5; i++) {
System.out.printf("%c,", 'A'+i);
}
System.out.printf("%d,", 1);
System.out.printf("%d,", 6);
System.out.printf("%d,", 11);
System.out.printf("%d,", 16);
System.out.printf("%d,", 21);5씩 커지는 등차수열이다. 등차수열 a1+(n-1)d / 초항 +(횟수-1)공차
for (int n = 1; n <= 5; n++) {
System.out.printf("%d,", 1+ (n-1)*5);
}for문사용할때 0부터 시작해야하는 방법 수학적내용을 가져와서 1부터 시작해야하는 방법이잇다.
n이란 수학적 기호를 적용해서 반복할 일이 있다면 이렇게 사용해야한다.
선택적으로 편의를 보고 뽑을 필요가 잇다.
그런데 왜 풀어서 안쓰고 공식으로 쓰나? 규칙을 등차수열을 나타내는것을 냅두기 위한것임.
코드식을 일반식으로 한다면 편하다.
프로그래머는 수정속도를 먼저 따져야한다. 1.해석하기 쉽게 2.수정하기 쉽게
for문을 한단어로서 생각을 해야한다. 반복이라는 것은 완전히 똑같은거 반복이 아닌 규칙을 반복하는 것도 잇다.
3. 반복문과 예외항목
반복을 하고싶은데 마지막이나 첫번째거만 달라졋으면 좋겟다.
문자출력하는데 A,B,C,D,E,에서 ,가 빠졋으면 좋겟다.
마지막에서는 다르게 뽑고싶다.
예외항목이 포함된 반복문
반복문안에 중첩되는 제어문이 들어가면된다. 중첩문에 조건문을 넣으면된다.
for (int i = 0; i < 5; i++) {
if(i==4) {
System.out.printf("%c", 'A'+i);
} else {
System.out.printf("%c,", 'A'+i);
}
}특수한경우를 조건처리하고 나머지는 그냥 하게 하기 특별대우가 여러개이면? if가 중첩될수잇다.
짝수항목을 빈공백으로 조건이 두가지 이상이 필요하다.
문제
홀수번째(1,3) 항목 모두 빈공백, 그리고 마지막 항목에서 쉼표를 빼기
어떤게 우선순위가 더 높은가??
for (int i = 0; i < 5; i++) {
if (i==4) {
System.out.printf("%c", 'A'+i);
} else if(i % 2 == 0) {
System.out.printf("%c", ' ');
} else {
System.out.printf("%c,", 'A'+i);
}
}밑으로 갈수록 범용적 위로갈수록 촘촘한 녀석을 둬야한다.
우선순위를 잘생각하고 문장을 만들 필요가 있다.
4. 반복문 중첩
조건절을 순서를 배타적으로 하는게 중요한다.
9번잇는데 이거를 소규모로 3개씩 반복
123
456
789
반복해서 찍자.
for문 중첩 or 조건문으로 개행하기방법이 잇다.
for (int i = 0; i < 9; i++) {
System.out.printf("%d", i + 1);
if(i%3 == 2 ) {
System.out.println();
}
}for (int y = 0; y < 3; y++) {
for (int x = 0; x < 3; x++) {
System.out.printf("%d", (y * 3) + x + 1);
}
System.out.println();
}3개씩 나눠서 3개씩 반복하면 격자형이라면 x로늘어나는거는 x축 y로늘어나는거면 y축으로 하고
격자형으로 사용하는게 때로는 편할 수 있다.
개념상에 맞게 격자형이거나 일자형일때 알아서 처리하는게 낫다.
0*3 + 1 2 3
1*3 + 1 2 3
2*3 + 1 2 3
나눠서 반복할때 어떠한 흐름이 맞는가를 생각하라.
흐름을 따라가면서 어떻게 되는지를 생각해라. 무슨흐름을 만들고 있는지를 생각하자.
프로그램을 한번에 만들지 말고 하나씩 추가하면서 응용해라.
5. 오목판 출력
for (int x = 1; x <= 10; x++) {
System.out.printf("%c", '+');
}x축의 증가로보고 1 부터 10으로 10개찍기 10*10찍기
for (int y = 1; y <= 10; y++) {
for (int x = 1; x <= 10; x++) {
System.out.printf("%c", '┼');
}
System.out.println();
}x축으로 10번 y축으로 10번
6. 오목판에 오목 출력하기
오목에 오목알이 잇어야한다.
(4,3)위치에 오목알 둬보자. 조건을 추가하면된다.
기본값이 +찍는거니 얘가 else에 들어가면됨.
for (int y = 1; y <= 10; y++) {
for (int x = 1; x <= 10; x++) {
if (x == 4 && y == 3) {
System.out.printf("%c", '●');
} else {
System.out.printf("%c", '┼');
}
}
System.out.println();
}반복문안에서 특정상황을 어떻게 배타적으로 만들지
7. 오목판의 외곽선 꾸미기 외각선에 선
System.out.printf("%c", '┐');
System.out.printf("%c", '●');
System.out.printf("%c", '┌');
System.out.printf("%c", '┼');
System.out.printf("%c", '┬');
System.out.printf("%c", '├');
System.out.printf("%c", '┤');
...
등등이 있는데 우선순위를 잘생각하자
특수한 상황일수록 위에적고 범용적일수록 아래에 해야한다.
for (int y = 1; y <= 10; y++) {
for (int x = 1; x <= 10; x++) {
if (x == 4 && y == 3) {
System.out.printf("%c", '●');
} else if( x==1 && y==1) {
System.out.printf("%c", '┌');
} else if( x==10 && y==1) {
System.out.printf("%c", '┐');
} else if(x == 1 && y ==10 ) {
System.out.printf("%c", '└');
} else if(x == 10 && y ==10 ) {
System.out.printf("%c", '┘');
} else if(y==1) {
System.out.printf("%c", '┬');
} else if(x == 1 ) {
System.out.printf("%c", '├');
} else if(x == 10 ) {
System.out.printf("%c", '┤');
} else if( y == 10 ) {
System.out.printf("%c", '┴');
} else {
System.out.printf("%c", '┼');
}
}
System.out.println();이런식으로 격자형이면? x좌표 y좌표로하는게 편하다! 잘생각하고 해보자.
8. 배열 참조변수 선언과 초기화 방법 정하기
지난시간 반복제어구조 선택적으로 if elseif등을 햇다.
그런데 반복할때 배열을 사용해야한다.
8.1 배열을 참조하는 변수를 선언하는 방법
정수를 1~7까지 저장한다. 참조변수를 어떻게 선언하나?
int nums[] =
int[] nums =
어느게 맞나? 자바는 특이하게도 두 가지 방식이 잇다. 처음에는 전자엿다. 그런데 배열이라는 형식명칭이 애매해졋다.
버전이 올라가면서 후자가 생김. 후자 쓰자.
8.2 배열 초기화하는 방법
int[] nums = new int[7];
배열에 값을 넣으려면 공간을 만들고 for문으로 하나씩 채워야함
int[] nums = new int[]{1,2,3,4,5,6,7}; 만들때 초기화해야한다.
int[] nums = {1,2,3,4,5,6,7};
초기화할때 과거버전에서는 위만 됨 요즘엔 초기화된배열을 쓰려면 아래를 사용하자.
9. 자바에서 다차원 배열은 모두 톱니형 배열이다.
1차원배열 int[] lotto = new int[6];
그런데 lotto 번호를 3개를 일괄처리하려면 다차원배열을 해야한다.
int[] lotto1 = new int[6];
int[] lotto2 = new int[6];
int[] lotto3 = new int[6];
->
int[][] lotto = new int[3][6];
커다란 공간이 마련된다. 이 공간에 필요한 것을 가져다 사용하면된다.
2차는 두번에 나눈 연산을 해야한다. 두번나눈 것에 대한결과가 한개의 공간임.
삼차원은 세번 나눠야한다.
큰 공간을 마련해서 정수형변수러첨쓰겟다.
lottos[0] = new int[9];
1차원 배열에 배열을 넣어서 참조시킨다. 에러안남.
참조변수 3개를 만듬 이 안에 1차배열 6짜리가 들어감.
이 1차원배열을 참조해서 2번째 배열이 만들어짐.
그래서 밑에잇는 2차원배열을 다른애를 참조하게 할 수잇음.
int[][] lottos = new int[3][]
하면 [0][1][2]가 먼저만들어지고
lottos[0] = new int[6]; 이런식으로 각자 다르게 심을 수잇음.
lottos[0]가 이름이 되는 것임.
지그재그형태로 만들어지는데 이런것을 톱니형 배열이 되는 것이다.
int[][] lotto = new int[3][6]; 도 균일하게 만들엇지만 결국 톱니형배열임.
lottos[0] = new int[2]; 이게 불가능해야하는데 이게 가능함.
lottos[0][2] = 3 --> 에러
이걸 막을 수있으면 좋을 거같은데 자바의 태생적문제라 안됨.
int[][] lotto = new int[3][6]; 하고 하나씩 넣는거는 잘못된거임.
다르게 만들고 싶으면 처음부터 int[][] lottos = new int[3][]로 만들어라.
10. 배열 값 이동하기
배열을 이용해서 반복문을 함께 연습할것임. 반복문에서 가장많이 사용하는게 배열이다.
10.1 배열 참조변수 1~7초기화된 배열을 생성하시오.
int[] nums = { 1, 2, 3, 4, 5, 6, 7 };
여기에 8을 추가하고 싶다.
nums[7] = 8하고싶은데? 이것은 불가능함. 배열은 확장할수없는 정적인 크기를 가지고 잇다.
이걸 넣고 싶다면 이주시켜야함.
int[] temp = new int[10]; 빈방을 만들고 temp로 만들고 복사
for (int i= 0; i < 7; i++) {
temp[i] = nums[i];
}
우리는 다시 nums를쓰고 싶다. nums라는 이름을 유지하고 싶은데 참조하는 주소를 바꾸면된다.
nums = temp; 참조하는 것을 바꾸면됨.
참조가 없어지면 수거해가서 쓰레기가 된다.
배열을 확장하려면 이게 사용된다. 큰 배열을 만들고 대체하는 것은 가능해야한다.
public class Program1 {
public static void main(String[] args) {
int[] nums = { 1, 2, 3, 4, 5, 6, 7 };
/*
for (int i= 0; i < 7; i++) {
System.out.printf("%d ", nums[i]);
}
*/
int[] temp = new int[10];
for (int i= 0; i < 7; i++) {
temp[i] = nums[i];
}
nums = temp;
nums[7] = 8;
for (int i= 0; i < 8; i++) {
System.out.printf("%d ", nums[i]);
}
}
}11. 배열 합치기
int[] nums1 = { 1, 2, 3 };
int[] nums2 = { 4, 5, 6 };
int[] nums = new int[6];
두개의 배열을 합쳐보자.
for (int i = 0; i < 3; i++) {
nums[i] = nums1[i];
nums[3+i]= nums2[i];
}num2는 0부터이고 nums는 3부터임.
12. 배열 항목 찾기
배열에 원하는게 잇는데 그걸 찾아보자 어느 위치에잇나?
int[] nums = { 5, 2, 7, 4, 6, 4, 1, 3 };
규칙적이지 않은 배열에서 내가 원하는 숫자가 잇나?
1의 위치를 찾아보자.
for (int i = 0; i < 7; i++) {
if (nums[i] == 1 ) {
index = i;
break;
}
}비교해나가면서 찾는거임. 그런데 7번을 무조건 돌게하면 비효율적임.
그래서 찾으면 break;해서 남은횟수를 안돌게 해주자. -> 효율적인 프로그래밍
13. 배열 값 교환하기
데이터 -> 변형 -> 출력
정렬하기, 위치바꾸기 등등 변형과정이 있음. 한번에 하는것은 불가능하니 절차를 짜야한다.
1.임시공간만들기 int temp;
2.임시공간에 넣기 temp = nums[1];
3.바꿀거를 넣기 nums[1] = nums[3];
4.남은공간에 임시공간에 잇는것을 넣기 nums[3] = temp;
4번의 과정을 거쳐야한다.
4개의 절차를 따지니 잘됫는지 궁금하다면 cross되는 모양이라면 잘된것임.
14. 배열에 랜덤 값 채우기
유용하게 랜덤값을 얻어서 넣자.
자바에서 랜덤값을 얻는 클래스가 있다.
Random rand = new Random();
rand.nextInt(45); // 0~44
랜덤 알고리즘으로 넣어줌. seed값
컴퓨터가 랜덤을 만들지 못해서 프로그램은 무작위인것 처럼만드는 규칙에 의한 랜덤임.
범위내애서 랜덤하게 만들어줌.
그런데 이러면 중복생김 중복안되게 넣어보자.
중복안되게 넣으려면 종자값을 넣어주면됨 일정알고리즘에 따라 번호가 생기는거임.
Random rand = new Random(5);
비교를해서 안에잇으면 i--로 전단계로 돌아가서 다시 하기!
int[] lottos = new int[6];
Random rand = new Random();
for (int i = 0; i < 6; i++) {
int num = rand.nextInt(45) + 1;
lottos[i] = num;
for (int j = 0; j < i; j++) {
if (lottos[i] == lottos[j]) {
i--;
break;
}
}
}Java 구조적인 프로그래밍
1. 학습안내
자바는 프로그래밍 -> 구조적 -> 객체지향으로 만들 수잇다.
바뀔때 사용자 입장에서는 전혀 도움이 안됨 그럼 누구를 위한건가? 우리를 위한거임.
결과적으로는 객체지향이지만 중간에서 구조적인게 중요하다.
구조적인게 뭘까?
프로그래밍은 절차이다. 프로그램은 원래 수만라인임. 그럼 이걸 한번에 다만드는게아니라 하나씩 잘라서 만든다.
단위별로 만드는게 중요하다.
이게 구조적인것임. 흐름에서 나눠진 조각 조각이 나눠진걸 또 보는 조각 등등이게 구조이다.
코드를 나눠서만드는게 중요한데 이 나눈걸 구조이다.
코드를 어떻게 나누나? 함수로 나눈다.
수학식에서 코드를 나눌 수가 잇다면 어떻게 만들가? 반복되는 부분을 하나로 만듬.
함수를 이용하면
1.코드의 직접사용을 차단할수잇다.
2.코드를 작게 나누어서 만들수있다.
3.코드를 집중화할수있다.
4.코드를 재사용할수있다.
자바에서도 함수를 정의하고 사용할 수 있다. 함수를 어떻게 정의할건지를 하는게 중요하다.
값을 반환해야한다. 함수가 반환하는게 어떤형식인지 적어줘야한다.
1.1 반환값이 잇을때
static int power(int x ) {
return x...
}함수를 배우는 동안은 static붙일거임
반환타입 함수이름([매개변수타입 매개변수]){
[return 반환값];
}
1.2 반환값이 없을때
void 함수이름([매개변수타입 매개변수]){}
타입을 void로 써주면됨.
2. 코드 구조화 Bottom Up 방식 연습 #1
구조적인것을 실제로 구현해보자.
구조적인것은? 절차로 이루어진거를 나눠서 만드는것
1.구조화안된 기존프로그램을 잘라서 나누는것 조각을 나눠서 구조를 만드는것 이게 Bottom Up방식이다.
2.아무것도 없는데서 하기 구조부터 만들고 안에 쓰기 Top-Down
일단 우리는 배우는 것이니 주어진걸 잘라서 보기.
성적입력부분을 먼저 나눠보자. 메인함수 밖에다가 만들어야함.
그런데 이렇게 무작정나누면 울타리가 다른녀석임. 지역화된걸 마음대로 사용못함.
1.kors배열을 함수 바깥에다가 두기 이것을 전역변수, 전역자원라고 한다.
static int[] kors = new int[3];
전역변수로 사용하려면 static을 붙여줘야함.
Scanner scan = new Scanner(System.in);도 에러가 나는데 스캐너는 굳이 같이 써야할 필요가 없으니
각각 만들어준다.
static void 성적입력() {
Scanner sc = new Scanner(System.in);
System.out.println("┌──────────────────────────┐");
System.out.println("│ 성적입력 │");
System.out.println("└──────────────────────────┘");
System.out.println();
for (int i = 0; i < 3; i++) {
do {
System.out.printf("국어%d : ", i + 1);
kors[i] = sc.nextInt();
if (kors[i] < 0 || 100 < kors[i]) {
System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
}
} while (kors[i] < 0 || 100 < kors[i]);
}
System.out.println("────────────────────────");
}3. 코드 구조화 Bottom Up 방식 연습 #2
성적입력만 뗏는데 다른것도 분리해보자.
3.1 성적출력부분
static void 성적출력() {
for (int i = 0; i < 3; i++) {
total += kors[i];
}
avg = total / 3.0f;
System.out.println("┌──────────────────────────┐");
System.out.println("│ 성적출력 │");
System.out.println("└──────────────────────────┘");
System.out.println();
for (int i = 0; i < 3; i++) {
System.out.printf("국어 %d : %3d\n", 3 - i, kors[i]);
}
System.out.printf("총점 : %3d\n", total);
System.out.printf("평균 : %6.2f\n", avg);
System.out.println("────────────────────────");
}3.2 메뉴입력
메뉴입력은 숫자를 뱉어내야하니 반환값을 만들어주기
private static int 메뉴입력() {
Scanner sc = new Scanner(System.in);
System.out.println("┌──────────────────────────┐");
System.out.println("│ 메인메뉴 │");
System.out.println("└──────────────────────────┘");
System.out.println("\t1. 성적입력 ");
System.out.println("\t2. 성적출력 ");
System.out.println("\t3. 종료 ");
System.out.println("\t선택> ");
int menu = sc.nextInt();
return menu;
}이렇게 구조적으로 나누면? 전과 전혀 차이가 없다. 사용자는 모름.
사용자는 관심없다. 이렇게 만드는 이유는?
1.거시적으로 볼수있고 또 코드를 나눠서 미시적으로도 볼수잇다.
2.제어구조의 중첩이 깊어지지 않는다. 2~3개만 중첩되면된다.
3.다시 함수를 불러와서 코드를 재사용할 수 있다.
import java.util.Scanner;
public class StructuredProgram {
static int[] kors = new int[3];
static int total = 0;
static float avg;
public static void main(String[] args) {
int menu;
boolean keepLoop = true;
while (keepLoop) {
menu = 메뉴입력();
switch (menu) {
case 1:
성적입력();
break;
case 2:
성적출력();
break;
case 3:
System.out.println("Bye~~");
keepLoop = false;
break;
default:
System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
}
}
}
private static int 메뉴입력() {
Scanner sc = new Scanner(System.in);
System.out.println("┌──────────────────────────┐");
System.out.println("│ 메인메뉴 │");
System.out.println("└──────────────────────────┘");
System.out.println("\t1. 성적입력 ");
System.out.println("\t2. 성적출력 ");
System.out.println("\t3. 종료 ");
System.out.println("\t선택> ");
int menu = sc.nextInt();
return menu;
}
static void 성적출력() {
for (int i = 0; i < 3; i++) {
total += kors[i];
}
avg = total / 3.0f;
System.out.println("┌──────────────────────────┐");
System.out.println("│ 성적출력 │");
System.out.println("└──────────────────────────┘");
System.out.println();
for (int i = 0; i < 3; i++) {
System.out.printf("국어 %d : %3d\n", 3 - i, kors[i]);
}
System.out.printf("총점 : %3d\n", total);
System.out.printf("평균 : %6.2f\n", avg);
System.out.println("────────────────────────");
}
static void 성적입력() {
Scanner sc = new Scanner(System.in);
System.out.println("┌──────────────────────────┐");
System.out.println("│ 성적입력 │");
System.out.println("└──────────────────────────┘");
System.out.println();
for (int i = 0; i < 3; i++) {
do {
System.out.printf("국어%d : ", i + 1);
kors[i] = sc.nextInt();
if (kors[i] < 0 || 100 < kors[i]) {
System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
}
} while (kors[i] < 0 || 100 < kors[i]);
}
System.out.println("────────────────────────");
} }매개값이 없다 전역화된걸 지역변수로 다시 바꾸기.
4.매개변수를 이용한 함수 고립화
매개변수를 만들지 않으면? 지역자체가 고립되지않고 외부에 영향을 받아서 자립도가 낮아진다.
함수 바깥을 누가 이름을 바꾸면 문제가 발생하는 것임.
korList의 주소를 함수에 넘겨줌 이 참조를 얻어서 사용하면된다.
이러면 해방감을 얻게 된다. 변수명에 따라 하게되는 것임.
또한 직접 배열에 매번 넣는 것보다 지역변수를 만들고 지역변수를 마지막에 배열에 넣는게 좋다.
import java.util.Scanner;
public class StructuredProgram2 {
public static void main(String[] args) {
int[] korList = new int[3];
int menu;
boolean keepLoop = true;
while (keepLoop) {
menu = inputMenu();
switch (menu) {
case 1:
inputKors(korList);
break;
case 2:
printKors(korList);
break;
case 3:
System.out.println("Bye~~");
keepLoop = false;
break;
default:
System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
}
}
}
private static int inputMenu() {
Scanner sc = new Scanner(System.in);
System.out.println("┌──────────────────────────┐");
System.out.println("│ 메인메뉴 │");
System.out.println("└──────────────────────────┘");
System.out.println("\t1. 성적입력 ");
System.out.println("\t2. 성적출력 ");
System.out.println("\t3. 종료 ");
System.out.println("\t선택> ");
int menu = sc.nextInt();
return menu;
}
static void printKors(int[] kors) {
int total = 0;
float avg;
for (int i = 0; i < 3; i++) {
total += kors[i];
}
avg = total / 3.0f;
System.out.println("┌──────────────────────────┐");
System.out.println("│ 성적출력 │");
System.out.println("└──────────────────────────┘");
System.out.println();
for (int i = 0; i < 3; i++) {
System.out.printf("국어 %d : %3d\n", 3 - i, kors[i]);
}
System.out.printf("총점 : %3d\n", total);
System.out.printf("평균 : %6.2f\n", avg);
System.out.println("────────────────────────");
}
static void inputKors(int[] kors) {
Scanner sc = new Scanner(System.in);
int kor;
System.out.println("┌──────────────────────────┐");
System.out.println("│ 성적입력 │");
System.out.println("└──────────────────────────┘");
System.out.println();
for (int i = 0; i < 3; i++) {
do {
System.out.printf("국어%d : ", i + 1);
kor = sc.nextInt();
if (kor < 0 || 100 < kor) {
System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
}
} while (kor < 0 || 100 < kor);
kors[i] = kor;
}
System.out.println("────────────────────────");
}}5. 함수 이름 짓기
이해를 돕고자 한글로 함수를 만들엇다. 그런데 한글은 호환성문제 다른사람이 쓰려면 한글이 못알아먹을 수잇으니 영문으로 하자.
함수는 행위를 가지고 있는 것임. 행위가 주인공이다.
로또번호생성 -> 생성로또번호 -> getLotto() 기능재료로 적어야한다.
메뉴입력() -> inputMenu()
성적입력() -> inputKors()
성적출력() -> printKors()
6. Top Down 방식으로 구현하는 간단 예제
그런데 실제로 바텀업을 하는 경우가잇나? 잇긴함. 분명히잇음. 이미만들어진 프로그램을 재정비해서 구조화안된걸 구조화하는 경우가 잇다.
정수배열 여러개 담기 + 인덱스
inputMenu(); createLottotsAuto(); createLottotsManual(); printLottos(lottos); 4가지 함수가 필요하다.
탑다운 방식때 좋으점음? 제어의 중첩이 깊어지지가 않는다. 구조 전혀없는 사람이 만들수잇나? 어렵다.
경험이 잇는사람이 만들수잇다. 경험이 없다면 통채로 만들고 나누는게 좋다.
import java.util.Scanner;
public class Program {
public static void main(String[] args) {
int[][] lottos = null;
int menu;
boolean running = true;
menu = inputMenu();
while (running) {
switch (menu) {
case 1:
lottos = createLottotsAuto();
break;
case 2:
lottos = createLottotsManual();
break;
case 3:
printLottos(lottos);
break;
case 4:
running = false;
break;
default:
break;
}
}
}
private static int inputMenu() {
return 0;
}
private static int[][] createLottotsAuto() {
return null;
}
private static int[][] createLottotsManual() {
return null;
}
private static void printLottos(int[][] lottos) {
}
}2023.02.12 후기
c언어로 기본 문법을 먼저 시작해서 2차원배열이라하면 무조건 ㅁㅁㅁㅁㅁㅁㅁㅁㅁ를 보기 쉽게 만든
ㅁㅁㅁ
ㅁㅁㅁ
ㅁㅁㅁ
의 모양일줄알앗다.
자바가 참조변수로 배열을 만든다는 것을 다시 생각해보면? 당연히 그밑에 참조하는 것을 다르게 할 수 있다는 것을 인지해야한다.
어찌보면 당연한 일이지만 잊고 잇엇다.
많이 한부분이라 다시 안보려햇엇는데 다시보길 잘햇다. 역시 안배운걸 새롭게 알아내는재미가잇다. 쓸데없는 진짜 기본도 가끔잇지만 유용하다.
또 함수명 짓기 생각해본적없고 맨날따라서 만들엇는데 생각해볼 기회가 되엇다.