평범한 연구소

[JAVA] 메소드 본문

JAVA/기본 개념

[JAVA] 메소드

soyeonisgood 2022. 7. 19. 14:33

메소드의 인수 전달

  • 형식 매개변수: 메소드가 호출되는쪽에 호출한 메소드에서 넘겨받는 값 기억, (호출되는 메소드 매개변수)
  • 실 매개변수: 메소드를 호출할 때 호출 받는함수에게 넘겨주는 값 의미

 

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()로 저장.

ScoreVO vo = new ScpreVO(); 의 위치

 

 

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;
	}
	
	

}