<시험1-프로그래밍 언어 응용 문제 해결 시나리오>
에러가 나는 코드 라인
4번과 12번, 5번과 7번, 그리고 6번과 11번줄
에러가 나는 이유
자바에서 같은 이름의 메소드를 선언하려면 파라미터 타입이나 개수 또는 순서가 달라야 하는데,
4번과 12번, 5번과 7번, 그리고 6번과 11번은 각각 파라미터 타입과 개수가 똑같기에 에러가 발생한다.
0이 아니라 1 이상의 숫자부터 더하고, 0일 경우 else문으로 빠져야 하기 때문에 if문의 조건식을 num>0으로 변경해야 한다.
while에 i에 대한 증감식이 없어서 i가 언제나 1로 고정되기에 무한루프에 빠진다.
스캐너는 사용 후 닫아준다
package dev_java.week4;
import java.util.Scanner;
public class Test {
public void sum() {
Scanner sc = new Scanner(System.in);
System.out.println("1 이상의 숫자를 입력하세요");
int num = sc.nextInt();
int sum = 0;
if (num > 0) { // 0이 아니라 1이상의 숫자부터 더한다
int i = 1;
while (i <= num) {
sum += i;
i++; // 무한루프를 막기위해 루프를 돌 때마다 i를 증가시킨다
}
System.out.println("1부터 " + num + "까지의 합은 " + sum + "입니다.");
} else {
System.out.println("숫자가 1 이상이 아닙니다.");
}
sc.close(); // 스캐너는 사용 후 닫아준다
}
}
제시된 클래스 다이어그램에 int money가 -로 되어있으니, public이 아니라 private 바꿔줘야 한다.
Money 생성자 파라미터에 int를 넣어서 생성했고 그렇기에 디폴트 생성자가 생성되지 않았는데,
Run에서 인스턴스화를 하며 생성자를 호출할 때 파라미터에 아무것도 입력하지 않았다.
package dev_java.week4;
public class Run {
public static void main(String[] args) {
Money m = new Money(0); // 생성자 파라미터에 맞게 0을 넣어준다.
m.setMoney(10000);
m.print();
}
}
<시험2-프로그래밍 언어 응용서술형(신)>
String[] sArr = { "사과", "딸기", "오렌지" };
for (int i = 2; i < 10; i = i + 2) {
System.out.println(2 + " * " + i + " = " + (2 * i));
}
String[] sArr = { "빨강", "노랑", "파랑" };
// 오리지널 for문
for (int i = 0; i < sArr.length; i++) {
System.out.print(sArr[i] + " ");
}
System.out.println();
// 개선된 for문
for (String s : sArr) {
System.out.print(s + " ");
}
얕은 복사, 깊은 복사
얕은 복사는 주소값을 복사한다. 그렇기에 한쪽을 수정하면 다른 한 쪽의 값도 변경된다.
깊은 복사는 실제 값을 새로운 메모리 공간에 복사한다. 따라서 배열을 복사한 후 한 쪽 값을 수정해도 다른 배열에 영향을 끼치지 않는다.
필드에 들어갈 수 있는 접근제한자
public, protected, default, private
메소드 오버로딩
메소드 이름이 같아야 한다.
파라미터의 개수나 타입, 순서가 달라야 한다
반환타입과는 관계가 없기에, 반환타입만 다른 경우 오버로딩이 성립하지 않는다.
클래스 접근제한자 차이
public class는 접근제한자가 public으로, 모든 패키지에서 접근할 수 있다.
class는 접근제한자가 default로, 동일 패키지 내에서만 접근이 가능하다.
클래스에 들어갈 수 있는 접근제한자
public, default
package dev_java.week4;
import java.util.Arrays;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.JOptionPane;
// List -> 순서가 있다, 정렬한다(2차 가공), 느리다, 추가하면 맨 뒤에 채운다
// index가 다르면 중복값 저장이 가능하다
public class VectorCRUD2 { // 수업시간 코드-String[]
static Vector<String[]> vDept = new Vector<>(); // static이 있기에 복제x, 원본이 공유됨
// 부서 전체 조회
public void getDeptList() {
System.out.println("부서 정보 전체 조회 호출");
for (int i = 0; i < vDept.size(); i++) {
String[] oneRow = new String[3];
for (int j = 0; j < oneRow.length; j++) {
oneRow = vDept.get(i);
System.out.print(oneRow[j] + " ");
}
System.out.println();
}
System.out.println();
}
// 벡터에 부서정보 추가하기-없는 것을 새로 추가
// pass by value로 호출하는 경우 주소번지를 받아옴(원본을 받는 것)
public int deptInsert(String[] userDept) { // 파라미터는 지역변수(메소드 영역 안에서만 사용)
System.out.println("부서 정보 입력 호출");
int result = 0; // 1이면 성공, 0이면 실패
boolean isOk = vDept.add(userDept);
if (isOk)
result = 1; // 실행문 1개라서 {} 생략
return result;
}
/**********
* @param deptNo 수정하고자하는 부서번호
* @param user_dname 수정하고자하는 부서명
* @param user_loc 수정하고자하는 지 역
* @return 1이면 수정성공, 0이면 수정실패
**********/
// 벡터에 부서정보 수정하기-있는 것을 변경
public int deptUpdate(int deptNo, String user_dname, String user_loc) {
System.out.println("부서 정보 수정 호출" + user_dname + ", " + user_loc);
int result = 0; // 1이면 성공, 0이면 실패
here: for (int i = 0; i < vDept.size(); i++) {
String[] row = vDept.get(i); // i는 row의 인덱스
// if() 여기는 벡터에서 꺼낸 배열을 갖는다
// if() 여기는 화면에서 가져온 배열과 벡터에서 꺼낸 배열을 비교한다
int deptNo2 = Integer.parseInt(row[0]);
if (deptNo2 == deptNo) {
String[] updRow = { row[0], user_dname, user_loc };
// Vector를 사용하면 배열의 단점 보완(길이, 타입고정)
// Vector<Object>
vDept.remove(i); // i번째 자리를 삭제하고
vDept.add(i, updRow); // 삭제된 자리에 추가
result = 1;
// break문만 사용 시 가장 가까운 for문을 탈출
// 만약 라벨을 달아놓으면 그 for문 전체를 빠져나간다
break here; // 라벨을 단 here을 탈출함
}
}
getDeptList();
return result;
}
// 벡터에 부서정보 삭제하기-있는 것을 삭제
// 벡터에 있는 부서 정보 중에서 어떤 로우를 삭제할지 부서번호를 받아와야함
// 사용자로부터 받아와야하는 값
// 받아오는 건 int형, 부서번호는 String타입
// 형전환 필요 -> null이오면 NumberFormatException 발생 가능성
// 방어코드 작성 필요함(null에대한 이슈는 프로그래밍에서 중요 문제)
public int deptDelete(int deptNo) {
System.out.println("부서 정보 삭제 호출");
int result = 0; // 1이면 성공, 0이면 실패
for (int i = 0; i < vDept.size(); i++) {
String[] oneRow = vDept.get(i);
int deptNo2 = 0;
// 예외 발생에 대한 우려 방어코드 작성
if (oneRow[0] != null) { // null체크(이것까지도 프레임워크에서 처리해야함)
deptNo2 = Integer.parseInt(oneRow[0]);
}
// 사용자가 선택한 부서번호와 벡터에 있는 부서번호를 비교하여 같은 것 찾기
// System.out.println("입력받은 값, 가져온 값 => " + deptNo + ", " + deptNo2);
if (deptNo == deptNo2) {
// 삭제할 벡터의 로우값이 필요 -> 벡터의 size를 통해 찾아냄
// 변수 i가 인덱스 값에 해당
// remove 메소드의 파라미터가 int인 경우에 대해서만 삭제된 벡터의 제네릭
// 반환값을 가지고 처리 여부 확인 가능
String[] deleteRow = vDept.remove(i); // 삭제한 String[] 반환
System.out.println("삭제된 배열은 => " + Arrays.toString(deleteRow));
// boolean isOk = vDept.remove(oneRow); // 삭제여부 boolean 반환
if (deleteRow != null) {
System.out.println("삭제 처리 되었습니다.");
// 삭제처리가 성공한 경우(deleteRow에 값이 있을 경우) 반환값 1 리턴
result = 1;
}
}
}
return result;
}
// 벡터의 부서정보 상세보기-있는 것을 하나 꺼내보기
public String[] deptDetail(int deptNo) {
System.out.println("부서 정보 상세보기 호출");
String[] oneRow = new String[3];
for (int i = 0; i < vDept.size(); i++) {
oneRow = vDept.get(i);
if (deptNo == Integer.parseInt(oneRow[0])) {
oneRow = vDept.get(i);
}
}
return oneRow;
}
public static void main(String[] args) {
VectorCRUD2 vCrud = new VectorCRUD2();
// 입력 테스트
String[] oneRow = { "10", "개발부", "인천" }; // 제네릭 타입으로 쓸 예정
int result1 = vCrud.deptInsert(oneRow);
String[] oneRow2 = { "20", "총무부", "서울" };
result1 = vCrud.deptInsert(oneRow2);
if (result1 == 1) {
JOptionPane.showMessageDialog(null, "등록이 되었습니다.");
vCrud.getDeptList();
// return; // 조건문 안의 return문은 해당 메소드 블록을 빠져나간다
}
// 수정 테스트
Scanner s = new Scanner(System.in);
System.out.print("수정할 부서번호, 부서명, 지역을 입력하세요(|로 구분) ");
String user = s.nextLine();
int user_deptno = 0;
String user_dname = null;
String user_loc = null;
StringTokenizer st = new StringTokenizer(user, "|");
user_deptno = Integer.parseInt(st.nextToken()); // 사용자가 입력한 부서번호
user_dname = st.nextToken(); // 사용자가 입력한 부서명
user_loc = st.nextToken(); // 사용자가 입력한 지역
int result2 = vCrud.deptUpdate(user_deptno, user_dname, user_loc);
if (result2 == 1) {
JOptionPane.showMessageDialog(null, "수정 되었습니다.");
}
System.out.println();
// 삭제 테스트
System.out.print("삭제할 부서번호를 입력하세요 => ");
int userInput = s.nextInt();
int result3 = vCrud.deptDelete(userInput);
if (result3 == 1) {
JOptionPane.showMessageDialog(null, "삭제가 되었습니다.");
vCrud.getDeptList();
}
s.close();
// 상세보기 테스트
String[] result4 = vCrud.deptDetail(10);
for (int i = 0; i < result4.length; i++) {
System.out.print(result4[i] + " ");
}
}
}
package dev_java.week4;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.JOptionPane;
public class VectorCRUD3 { // 수업시간 코드-DeptVO
static Vector<DeptVO> vDept = new Vector<>();
// 부서 전체 조회
public void getDeptList() {
System.out.println("전체 조회 호출");
for (int i = 0; i < vDept.size(); i++) {
DeptVO temp = vDept.get(i);
System.out.print(temp.getDeptNo() + ", " + temp.getDeptName() + ", " + temp.getDeptLoc());
System.out.println();
}
System.out.println();
}
// 벡터에 부서정보 추가하기-없는 것을 새로 추가
public int deptInsert(DeptVO dvo) {
System.out.println("정보 입력 호출");
int result = 0;
boolean isOk = vDept.add(dvo);
if (isOk)
result = 1;
return result;
}
// 벡터에 부서정보 수정하기-있는 것을 변경
public int deptUpdate(DeptVO dvo) {
System.out.println(dvo.getDeptName() + "번 부서 정보 수정");
int result = 0;
for (int i = 0; i < vDept.size(); i++) {
DeptVO temp = vDept.get(i);
if (dvo.getDeptNo() == temp.getDeptNo()) {
vDept.set(i, dvo);
result = 1;
}
}
getDeptList();
return result;
}
// 부서 삭제
public int deptDelete(int deptNo) {
System.out.println("부서 정보 삭제 호출");
int result = 0; // 1이면 성공, 0이면 실패
for (int i = 0; i < vDept.size(); i++) {
DeptVO temp = vDept.get(i);
if (deptNo == temp.getDeptNo()) {
vDept.remove(i);
System.out.println("삭제된 배열은 => " + temp.getDeptNo() + " " + temp.getDeptName() + " " + temp.getDeptLoc());
result = 1;
}
}
return result;
}
// 벡터의 부서정보 상세보기-있는 것을 하나 꺼내보기
public DeptVO deptDetail(int deptNo) {
System.out.println("부서 정보 상세보기 호출");
DeptVO temp = null;
for (int i = 0; i < vDept.size(); i++) {
temp = vDept.get(i);
if (deptNo == temp.getDeptNo()) {
System.out.println(temp.getDeptNo() + "번 부서 상세보기");
}
}
return temp;
}
public static void main(String[] args) {
VectorCRUD3 vCrud = new VectorCRUD3();
// 입력 테스트
DeptVO dvo1 = DeptVO.builder().deptNo(10).deptName("개발부").deptLoc("인천").build();
System.out.println(dvo1.toString());
int result1 = vCrud.deptInsert(dvo1);
dvo1 = null; // 기존에 참조하는 객체와 연결을 끊는다
dvo1 = DeptVO.builder().deptNo(20).deptName("총무부").deptLoc("서울").build();
System.out.println(dvo1.toString());
result1 = vCrud.deptInsert(dvo1);
if (result1 == 1) {
JOptionPane.showMessageDialog(null, "등록이 되었습니다.");
vCrud.getDeptList();
}
// 수정 테스트
Scanner s = new Scanner(System.in);
System.out.print("수정할 부서번호, 부서명, 지역을 입력하세요(|로 구분) ");
String user = s.nextLine();
int user_deptno = 0;
String user_dname = null;
String user_loc = null;
StringTokenizer st = new StringTokenizer(user, "|");
user_deptno = Integer.parseInt(st.nextToken()); // 사용자가 입력한 부서번호
user_dname = st.nextToken(); // 사용자가 입력한 부서명
user_loc = st.nextToken(); // 사용자가 입력한 지역
dvo1 = DeptVO.builder().deptNo(user_deptno).deptName(user_dname).deptLoc(user_loc).build();
int result2 = vCrud.deptUpdate(dvo1);
if (result2 == 1) {
JOptionPane.showMessageDialog(null, "수정 되었습니다.");
}
System.out.println();
// 삭제 테스트
System.out.print("삭제할 부서번호를 입력하세요 => ");
int userInput = s.nextInt();
int result3 = vCrud.deptDelete(userInput);
if (result3 == 1) {
JOptionPane.showMessageDialog(null, "삭제가 되었습니다.");
vCrud.getDeptList();
}
// 상세보기 테스트
System.out.print("상세보기할 부서번호를 입력하세요 => ");
int userInput2 = s.nextInt();
DeptVO result4 = vCrud.deptDetail(userInput2);
System.out.print(result4.deptNo + " " + result4.deptName + " " + result4.deptLoc);
s.close();
}
}
package dev_java.week4;
import java.util.Vector;
public class A1 {
int ival = 1;
public static void main(String[] args) {
Vector<Integer> vTest = new Vector<>();
Vector<A1> va1 = new Vector<>();
A1 a1 = new A1();
System.out.println(a1);
a1.ival = 10;
vTest.add(a1.ival);
va1.add(a1);
a1 = null; // 객체가 초기화하면 다음 라인 넘어갈 때 캔디데이트 상태가 됨
a1 = new A1();
System.out.println(a1);
a1.ival = 20;
vTest.add(a1.ival);
va1.add(a1);
System.out.println(vTest.get(0));
System.out.println(vTest.get(1));
System.out.println(va1.get(0).ival);
System.out.println(va1.get(1).ival);
}
}
'국비학원 > 수업기록' 카테고리의 다른 글
국비 지원 개발자 과정_Day20 (0) | 2022.12.23 |
---|---|
국비 지원 개발자 과정_Day19 (0) | 2022.12.22 |
국비 지원 개발자 과정_Day17 (1) | 2022.12.20 |
국비 지원 개발자 과정_Day16 (0) | 2022.12.19 |
국비 지원 개발자 과정_Day15 (0) | 2022.12.16 |
댓글