클래스 예제1: MyRedPenV2
문제: day10 프로젝트 MyRedPen.java를 클래스로 작성해 봅시다.
처리조건
1. 클래스의 구성: 사칙연산 4가지를 문제로 출제한다. → 필드 구성
1) 사칙연산 4가지에 대해 적절한 난수(n1,n2)를 발생시키는 메소드를 작성한다.
덧셈은 n1, n2 범위 11~99
뺄셈에서는 n1>n2(n1 50~99, n2 11~49)
곱셈에서는 (n1은 11~77, n2는 11~29)
나눗셈(몫)에서는 n1>n2 (n1은 30~77, n2는 11~29)
2) 정답값을 구해주는 메소드
MathProblem 클래스
6~9라인 private 접근 제한을 갖는 필드를 선언한다.
11라인 isCorrect 필드의 setter 메소드를 선언한다.
14라인 isCorrect 필드의 getter 메소드를 선언한다.
18라인 Mathproblem 생성자를 선언한다.
29라인 난수를 생성하는 makeProb() 메소드를 선언한다.
32~45라인 switch문으로 연산별 n1, n2의 최대값, 최소값 범위를 선언한다.
46~47라인 연산별 최대값, 최소값을 이용하여 난수 n1, n2를 생성한다.
49라인 정답을 알려주는 showAnswer() 메소드를 선언한다.
51라인~66라인 switch문으로 연산별 정답 값을 반환한다.
70라인 계산식을 출력하는 print() 메소드를 선언한다.
77라인 계산식을 반환하는 toString 메소드를 재정의(오버라이드)한다. 출력시 toString() 메소드는 생략 가능하다.
MyRedPenV2
11라인 do-while문으로 문제를 반복한다.
13라인 입력할 때 한 문자(+,-,*,/)만 입력하면 오류가 발생하기 때문에 sc.nextLine().charAt(0)으로 입력한다.
→ charAt(0) : 메소드로 입력받은 문자열의 첫 번째 문자를 저장한다.
14라인 종료 조건을 먼저 검사한다.(아래 "잘못된 선택입니다. " 조건을 벗어나기 위해) 0을 입력하면 종료한다.
17~19라인 연산자가 아닌 문자를 입력 시 continue문으로 다시 연산 입력 부분으로 돌아간다.
20~21라인 연산자를 제대로 입력한 경우 MathProblem 객체를 생성한다.
22라인 makeProb() 메소드로 난수를 생성한다.
24라인 p1 뒤에 오버라이드한 .toString() 메소드가 생략되어 있으며 문제를 출력한다.
25라인 showAnswer() 메소드로 정답을 출력한다.
27라인 op에 0을 입력하면 do-while문을 종료한다.
결과
클래스 예제2: toString() 오버라이드
Member 클래스
4,5라인 필드 id, name을 선언한다.
7라인 기본 생성자 Member()를 선언한다.
10~12라인 커스텀 생성자를 선언한다.
20라인 toString() 메소드를 재정의(오버라이드)한다.
단축키 : Alt+Shift+S → S
ToStringTest 클래스
7라인 Member 객체를 생성한다.
8,9라인 필드 값을 입력한다.
12,16라인 member와 member.toString()의 값은 같다.
Member클래스에서 toString() 메소드를 재정의하기 전과 후의 값은 다르다.
재정의 하기 전에는 패키지명.클래스명@객체구별값(16진수)가 출력되고, 후에는 필드 값이 출력된다.
List 컬렉션 - ArrayList
배열과 ArrayList
공통점: 인덱스(index)로 위치를 표시한다.
차이점:
배열
1) 선언된 정해진 크기에 따라 사용해야 한다.
2) 기본형 타입으로 선언한다. ex) int
3) 새로운 데이터를 중간 위치에 추가/삭제할 때 for문으로 직접 코딩한다.
ArrayList
1) 크기는 데이터를 추가할 때마다 증가하고, 삭제할 때마다 감소한다.
2) 기본형 데이터는 래퍼 클래스로 선언한다. ex) Integer
3) add(), remove()로 지정된 인덱스에 데이터를 추가/삭제 할 수 있다.
11라인 ArrayList 변수 intlist 선언한다.<>는 제네릭 타입을 지정하는 기호이다. <> 안에는 래퍼 클래스를 사용한다.
13~17라인 add(data) 메소드로 마지막 위치에 데이터를 추가한다. 17라인에서 상태는 1, 5, 7, 9, 11이다.
18라인 ArrayList 변수 intlist 출력 시 toString 메소드가 재정의되어 있어 데이터가 출력된다.
19라인 배열 변수 data는 클래스 타입이 아니기 때문에 참조 주소와 관련된 값이 출력된다.
20라인 Arrays.toString() 메소드로 출력하면 데이터가 출력된다.
21라인 size() 메소드로 ArrayList의 길이를 구할 수 있다.
24라인 add(i,data) 메소드로 i번 인덱스에 데이터를 추가한다.
26라인 ArrayList의 길이도 1 증가한다.
39라인 remove(i) 메소드로 i번 인덱스의 데이터를 삭제한다.
41라인 ArrayList의 길이도 1 감소한다.
44라인 get(i) 메소드로 i번 인덱스의 데이터 값을 반환한다.
49라인 contain(data) 메소드로 ArrayList에 특정 데이터를 포함하는지 확인한다. 99가 있으므로 true를 반환한다.
50라인 100이 없으므로 false를 반환한다.
ArrayList 예제1: MemberArrayList
9라인 members 배열을 선언하고 10개 요소에 Member 객체를 참조하도록 한다.
12라인 ArrayList 클래스로 변수 mlist를 선언한다.
14라인 변수 momo를 선언하고 Member 객체의 주소를 저장한다.
15라인 그 주소를 변수 mlist에 추가한다.
16라인 momo에 필드 값을 저장한다.
17라인 toString() 메소드로 id와 name을 출력한다.
18라인 get() 메소드로 mlist의 0번 인덱스에 저장된 값을 출력한다.
20~22라인 add() 메소드로 mlist에 새로운 값을 저장한다.
26~28라인 for문과 get() 메소드로 mlist의 인덱스와 저장된 값들을 출력한다.
30라인 add() 메소드로 1번 인덱스에 새로운 값을 추가한다. //이모모, 나연, 사나, 미나, 쯔위
31라인 remove() 메소드로 3번 인덱스의 값을 삭제한다. //이모모, 나연, 사나, 쯔위
33라인 for문과 get() 메소드로 mlist의 인덱스와 저장된 값들을 출력한다.
36라인 remove() 메소드로 momo가 참조하는 값을 삭제한다.
38라인 향상된 for문으로 mlist의 모든 인덱스의 값을 출력한다.
향상된 for문
형식: for (타입 변수 : 배열) {...실행문...}
배열의 첫 번째 값부터 마지막 값까지 반복을 실행한다.
→ for문의 반복 횟수는 배열의 길이이다.
ArrayList 예제2: LottoArrayList
문제: ArrayList로 Lotto문제 다시 해봅니다.
8라인 뽑은 로또 번호를 저장할 ArrayList 변수 lotto를 선언한다.
9라인 1~45번 공을 저장할 ArrayList 변수 balls를 선언한다.
11~12라인 for문과 add() 메소드로 1~45의 값을 balls에 저장한다.
19~20라인 공을 뽑을 때마다 인덱스의 범위를 줄여나간다. (0~44 → 0~43 → ... →0~39)
22라인 뽑은 번호(balls.get(k))를 add() 메소드로 lotto에 저장한다.
24라인 뽑은 번호는 remove() 메소드로 balls에서 제거한다.
27라인 sort(null) 메소드로 오름차순 정렬한다. (ArrayList)
28라인 뽑은 번호 lotto를 출력한다.
ArrayList 예제3: MyRedPenV3
문제 : ArrayList 연습합니다.
MyRedPenV3.java
0) MathProblem.java 클래스 객체들을 ArrayList 를 이용하여 저장합니다.(참조값 저장.)
1) 덧셈 문제 10개 생성하여 addList 변수이름으로 참조합니다.
2) 맞은 문제(true),틀린 문제(false)를 boolean isCorrect; 필드를 추가하여 저장합니다.
(선택사항:사용자 답을 저장하는 필드도 추가 가능합니다.)
*for문 안의 if 조건은 사용자가 입력한 답이 정답과 같은면 isCorrect 필드를 true 하도록 작성합니다.*
3) 채점 후에 틀린문제를 정답과 함께 보여줍니다.
* 틀린문제 출력 for문은 addList의 개수만큼 실행하고 , isCorrect 필드 false 일 때 문제와 답을 보여주도록 합니다.*
4) 계속하시겠습니까?(종료조건은 알아서 해보세요.) 기능 추가하여 문제풀이 10개를 반복합니다.
*실행화면*
----------------------------------------------
빨간펜 수학 2자리 덧셈 문제 풀기
----------------------------------------------
시작합니다.
문제 1. 23 + 56 = 답 입력 ->
문제 2. 33 + 19 = 답 입력 ->
:
문제 10. 28 + 32 = 답 입력 ->
----------------------------------------------
채점 합니다. 맞은 갯수 ... ( .. 점)
::::: 틀린 문제 보기 :::::
33 + 19 = 정답 : 52
12라인 do-while문으로 문제를 반복하여 풀 수 있게 한다.
13라인 MathProblem 타입을 갖는 ArrayList 변수 addList를 선언한다.
19라인 맞은 개수를 저장할 변수 cnt를 선언하고 초기값을 0으로 한다.
20라인 10문제를 내기 위해 for문을 사용한다.
21라인 op 값이 +인 MathProblem 객체를 생성한다.
22라인 makeProb() 메소드로 난수를 생성한다.
23라인 문제를 출력한다.
25라인 입력 받은 답을 showAnswer() 메소드의 정답과 비교한다.
26라인 정답이라면 setter 메소드로 isCorrect를 true로 바꾼다.
27라인 정답이라면 cnt를 1 증가시킨다.
29라인 문제를 add() 메소드로 addList에 추가한다.
30라인 사용자가 입력한 답을 setter 메소드로 MyAnswer에 저장한다.
32라인 맞은 개수와 점수를 출력한다.
34라인 향상된 for문으로 틀린 문제를 출력한다.
35라인 ! prob.isCorrect()가 true, 즉 문제를 틀렸다면 문제와 정답과 사용자가 입력한 답을 출력한다.
41라인 0이 아닌 다른 숫자를 입력 받을 경우 do-while 반복을 종료한다.
결과
클래스 상속의 중요한 특징
자바의 모든 클래스들은 Object라고 하는 클래스를 상속 받는다. (Object: 최상위 클래스)
클래스의 필드 값을 출력할 때 Object 클래스의 toString() 메소드를 재정의해서 사용한다.
가비지 컬렉터(garbage collector)
객체가 사용되지 않는 등 메모리 낭비가 생길 때가 있다..
이 때 JVM이 메모리 정리를 위해 가비지 컬렉터 동작을 한다.
직접 명령으로 실행할 때는 System.gc(); 를 입력한다.
* 새로 배운 단축키
• getter setter 메소드 빠른 선언 : Alt+Shift+S → R
• toString( ) 메소드 빠른 선언 : Alt+Shift+S → S
'수업 일지 > JAVA' 카테고리의 다른 글
14일차 - [JAVA] 추상클래스 예제/ArrayList 예제/메소드 오버로딩 (0) | 2022.01.18 |
---|---|
13일차 - [JAVA] Map/증감 연산자/추상 클래스 (0) | 2022.01.17 |
11일차 - [JAVA] 클래스/객체/상속 (0) | 2022.01.13 |
10일차 - [JAVA] do-while문/생성자/접근제한자/getter setter (0) | 2022.01.12 |
9일차 - [JAVA] 메소드 오버로딩/참조 타입 (0) | 2022.01.11 |
댓글