Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- ajax
- Bean LifecCycle
- 백준
- map()
- InterruptException
- 구간합구하기
- 합배열
- 생성자
- 2차원배열 구간합
- SQL
- this와 this() 차이
- 백준 1235번
- 상속과 참조
- Java
- pseudo-code
- json
- 마리아DB 쿼리 로그
- 슈더코드
- 자바 람다식
- function test
- jquery
- select
- @NoArgsConstructor
- 구간합
- @AllArgsConstructor
- MariaDB Query Log
- 백준 11659번
- interrupted()
- this
- 백준 11660번
Archives
- Today
- Total
평범한 연구소
[JAVA] 메소드 본문
메소드의 인수 전달
- 형식 매개변수: 메소드가 호출되는쪽에 호출한 메소드에서 넘겨받는 값 기억, (호출되는 메소드 매개변수)
- 실 매개변수: 메소드를 호출할 때 호출 받는함수에게 넘겨주는 값 의미
Call By Value (값에 의한 호출)
- 기본 자료형으로 인수 전달
- 값(value)을 호출된 메소드 인수에 복사하며 복사된 값은 메소드 내에서 local value 특징 갖음.
- 호출메소드와 호출된메소드 각각 매개변수에 대한 기억 공간 따로 확보하여 독립적으로 사용
- 형식 매개변수 값 변경되어도 호출된 메소드의 실 매개변수 값 변경X
Call By Reference(참조에 의한 호출)
- 레퍼런스 형으로인수 전달 (배열, 클래스, 인스턴스 참조형)
- 호출된 메소드로 값이 아닌 참조 위치 전달
package ch06.unit3;
public class Ex05 {
//파라미터 전달 방법
public static void main(String[] args) {
Test5 t = new Test5();
int a = 5;
// call by value: 형식매개변수와 실매개변수가 기억공간을 따로 확보
// 기본자료형은 파라미터 전달방법이 call by value 이다.
t.sub(a);
System.out.println("sub1() 호출 후 a: "+a); // 5
System.out.println("sub2() 호출 전 x: "+ t.x); // 10
//call by reference: 참조(주소)값 전달
// 객체를 파라미터로 전달하는 경우, 파라미터를 call by reference 로 처리한다
t.sub2(t);
System.out.println("sub2() 호출 후 x: "+ t.x); // 20
int[] nn = {1, 3, 5, 7, 9};
System.out.println("sub3() 호출 전 nn[1] :"+nn[1]); // 3
t.sub3(nn);
System.out.println("sub3() 호출 후 nn[1] :"+nn[1]); // 13
}
}
class Test5 {
int x = 10;
// call by value
public void sub(int a) {
a += 10;
}
// call by reference
public void sub2(Test5 obj) {
obj.x += 10;
}
// call by reference
public void sub3(int[] n) {
n[1] += 10;
}
}
학생 정보 관리 프로그램
- 인스턴스 변수는 99.9% private으로 선언. 맘대로 접근 못하게 막기 위함.
- 접근 위한 메소드를 만듬. -> 게터세터 사용.(단축키: shitf+alt+s+r+a ) (우클릭>source>Generate getter/setter)
- VO = 한 학생의 정보 (DB 적용하면 DTO)
- 입력값 오류 없다는 전제 하에 코딩. 유효성 검증은 나중에 추가.
App.java
package ch06.score;
public class App {
public static void main(String[] args) {
new ScoreUI().menu();
/*
ScoreUI ui = new ScoreUI();
ui.menu();
*/
}
}
ScoreUI.java
package ch06.score;
import java.util.Scanner;
public class ScoreUI { // User Interface
private Scanner sc = new Scanner(System.in);
private Score score = new Score();
public void menu() {
int ch;
while(true) {
do {
System.out.println("1.등록 2.학번검색 3.리스트 4.평점 5.수정 6.삭제 7.종료 => ");
ch = sc.nextInt();
}while(ch<1 || ch>7);
if(ch==7) {
return; // menu()를 빠져 나감
}
switch(ch) {
case 1: input(); break;
case 2: findByHak(); break;
case 3: printAll(); break;
case 4: printGrade(); break;
case 5: update(); break;
case 6: delete(); break;
}
}
}
private void input() {
System.out.println("\n데이터 입력... ");
ScoreVO vo = new ScoreVO();
System.out.print("학번 ? ");
vo.setHak(sc.next());
System.out.print("이름 ? ");
vo.setName(sc.next());
System.out.print("국어 ? ");
vo.setKor(sc.nextInt());
System.out.print("영어 ? ");
vo.setEng(sc.nextInt());
System.out.print("수학 ? ");
vo.setMat(sc.nextInt());
int n = score.append(vo);
if(n>0) {
System.out.println("자료가 등록 되었습니다.[전체인원: "+n+"명]\n");
} else if (n==0){
System.out.println("등록된 학번입니다. \n");
} else {
System.out.println("자료 등록이 실패했습니다. \n");
}
}
private void findByHak() {
System.out.println("\n학번 검색... ");
String s;
System.out.print("검색할 학번 ? ");
s = sc.next();
ScoreVO vo = score.readScore(s);
if(vo==null) {
System.out.println(s+"학번은 등록된 학번이 아닙니다. \n");
return;
}
System.out.print(vo.getHak()+"\t");
System.out.print(vo.getName()+"\t");
System.out.print(vo.getKor()+"\t");
System.out.print(vo.getEng()+"\t");
System.out.print(vo.getMat()+"\t");
System.out.print(vo.getTot()+"\t");
System.out.println(vo.getAve());
System.out.println();
}
private void printAll() {
System.out.println("\n학생 리스트...");
ScoreVO[] list = score.listScore();
int cnt = score.getCount();
for(int i=0; i<cnt; i++) {
ScoreVO vo = list[i];
System.out.print(vo.getHak()+"\t");
System.out.print(vo.getName()+"\t");
System.out.print(vo.getKor()+"\t");
System.out.print(vo.getEng()+"\t");
System.out.print(vo.getMat()+"\t");
System.out.print(vo.getTot()+"\t");
System.out.println(vo.getAve());
}
System.out.println();
}
private void printGrade() {
System.out.println("\n평점 환산 리스트...");
ScoreVO[] list = score.listScore();
int cnt = score.getCount();
double s, t;
for(int i=0; i<cnt; i++) {
ScoreVO vo = list[i];
t=0;
System.out.print(vo.getHak()+"\t");
System.out.print(vo.getName()+"\t");
s = score.grade(vo.getKor());
t+=s;
System.out.print(s+"\t");
s = score.grade(vo.getEng());
t+=s;
System.out.print(s+"\t");
s = score.grade(vo.getMat());
t+=s;
System.out.print(s+"\t");
System.out.print(t+"\t");
System.out.printf("%.1f\n", (t/3));
}
System.out.println();
}
private void update() {
System.out.println("\n학생 정보 수정...");
String hak;
System.out.print("수정할 학번 ? ");
hak = sc.next();
ScoreVO vo = score.readScore(hak);
if(vo==null) {
System.out.println(hak+" 학번은 등록된 학번이 아닙니다. \n");
}
System.out.print("이름 ? ");
vo.setName(sc.next());
System.out.print("국어 ? ");
vo.setKor(sc.nextInt());
System.out.print("영어 ? ");
vo.setEng(sc.nextInt());
System.out.print("수학 ? ");
vo.setMat(sc.nextInt());
System.out.println("학생 정보가 수정되었습니다. \n");
}
private void delete() {
System.out.println("\n학생 자료 삭제...");
String hak;
System.out.print("삭제할 학번 ? ");
hak = sc.next();
ScoreVO vo = score.readScore(hak);
if(vo==null) {
System.out.println(hak+" 학번은 등록된 학번이 아닙니다. \n");
return;
}
score.deleteScore(vo);
System.out.println(hak+" 학번 자료를 삭제했습니다. \n");
}
}
ScoreVO.java
package ch06.score;
public class ScoreVO { // Value Object
private String hak;
private String name;
private int kor;
private int eng;
private int mat;
// getter/setter: shift+alt+s+r+a
public String getHak() {
return hak;
}
public void setHak(String hak) {
this.hak = hak;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMat() {
return mat;
}
public void setMat(int mat) {
this.mat = mat;
}
public int getTot() {
return kor+eng+mat;
}
public int getAve() {
return getTot()/3;
}
}
Score.java
package ch06.score;
public class Score {
// ScoreVO 객체를 저장할 수 있는 배열의 요소를 10개 선언
private ScoreVO[] list = new ScoreVO[10];
private int count; // 학생 인원수
// list 배열에 ScoreVO 객체를 저장하며, 성공하면 인원수를 반환하고 실패하면 -1을 반환
public int append(ScoreVO vo) {
//int count=0; // 지역변수
if(count >= list.length) {
return -1; // 데이터 없을 시
}
// 학번이 존재하면
if(readScore(vo.getHak())!=null) {
return 0;
}
list[count++] = vo;
return count;
}
public int getCount() {
return count;
}
public ScoreVO[] listScore() {
return list;
}
// 학번 검색
public ScoreVO readScore(String hak) {
ScoreVO vo = null;
// 문자열을 절대로 == 으로 비교할 수 없다.
// 문자열은 String 클래스의 equals()를 이용하여 비교함.
for(int i=0; i<count; i++) {
if(hak.equals(list[i].getHak())) {
vo = list[i];
break;
}
}
return vo;
}
public boolean deleteScore(ScoreVO vo) {
if(vo==null || count==0) {
return false;
}
for(int i=0; i<count; i++) {
if(list[i] == vo) {
deleteScore(i);
return true;
}
}
return false;
}
// index 위치의 데이터 삭제
public void deleteScore(int index) {
if(index<0 || index>=count) {
return;
}
for(int i=index+1; i<count; i++) {
list[i-1] = list[i];
}
count--;
list[count] = null;
}
public double grade(int score) {
double result = 0;
if(score>=95) result = 4.5;
else if(score>=90) result = 4.0;
else if(score>=85) result = 3.5;
else if(score>=80) result = 3.0;
else if(score>=75) result = 2.5;
else if(score>=70) result = 2.0;
else if(score>=65) result = 1.5;
else if(score>=60) result = 1.0;
else result = 0.0;
return result;
}
}
ScoreVo vo 를 지역변수가 아닌 , 전역변수로 선언하면 안되는 이유
- 마지막 데이터들로만 출력됨
- new 1번 -> 1명 저장, new 2번 -> 2명 저장.
- vo는 input메소드가 끝나면 소멸되기떄문에(지역변수) append()로 저장.
Score.java 수정 - 생성자 추가
package ch06.score;
public class Score {
private ScoreVO[] list; // 학생의 정보 저장
private int count; // 학생 인원수
public Score() { // 생성자
count=0;
allocation(5);
}
private void allocation(int capacity) {
ScoreVO[] temp = new ScoreVO[capacity];
if(list!=null && count>0) {
System.arraycopy(list, 0, temp, 0, count); // 배열의 내용을 다른 배열에 복사
}
list = temp;
}
// list 배열에 ScoreVO 객체를 저장.
public int append(ScoreVO vo) {
if(count >= list.length) { // list배열 꽉 차면 list배열을 5개씩 늘리기
allocation(list.length+5);
}
// 학번이 존재하면
if(readScore(vo.getHak())!=null) {
return 0;
}
list[count++] = vo;
return count;
}
public int getCount() {
return count;
}
public ScoreVO[] listScore() {
return list;
}
// 학번 검색
public ScoreVO readScore(String hak) {
ScoreVO vo = null;
// 문자열을 절대로 == 으로 비교할 수 없다.
// 문자열은 String 클래스의 equals()를 이용하여 비교함.
for(int i=0; i<count; i++) {
if(hak.equals(list[i].getHak())) {
vo = list[i];
break;
}
}
return vo;
}
public boolean deleteScore(ScoreVO vo) {
if(vo==null || count==0) {
return false;
}
for(int i=0; i<count; i++) {
if(list[i] == vo) {
deleteScore(i);
return true;
}
}
return false;
}
// index 위치의 데이터 삭제
public void deleteScore(int index) {
if(index<0 || index>=count) {
return;
}
for(int i=index+1; i<count; i++) {
list[i-1] = list[i];
}
count--;
list[count] = null;
}
public double grade(int score) {
double result = 0;
if(score>=95) result = 4.5;
else if(score>=90) result = 4.0;
else if(score>=85) result = 3.5;
else if(score>=80) result = 3.0;
else if(score>=75) result = 2.5;
else if(score>=70) result = 2.0;
else if(score>=65) result = 1.5;
else if(score>=60) result = 1.0;
else result = 0.0;
return result;
}
}
'JAVA > 기본 개념' 카테고리의 다른 글
[JAVA] 기본 API | Object, Wrapper class 관련 함수 (0) | 2022.07.20 |
---|---|
[JAVA] 생성자, 접근제어자 (0) | 2022.07.20 |
[JAVA] 클래스와 객체 (0) | 2022.07.18 |
[JAVA] 객체지향 프로그래밍, 변수,메소드,클래스 개념 (0) | 2022.07.18 |
[JAVA] 알고리즘 (0) | 2022.07.16 |