Java - 인스턴스 메소드
또다른 문제가 발생했다. : 함수의 사용에 있어서 불편함이 생김.
void main() { list = new ExamList(); ExamList.inputList(list); ExamList.printList(list); ExamList.saveList(list); }
구조화된 녀석의 실체를 가지고 객체(데이터의실체)화 한다. 그런 객체를 가지고 함수를 호출한다. 문제는 객체가 잘보이지 않는 점이다.
list를 이용한 처리를 해야한다. (함수이름이 많은 범위를 차지해서 주체가 눈에 안들어옴.)
↓ 편리하게 바꿔보자.
void main() { list = new ExamList(); list.inputList(); list를 이용한.입력() -> list(야).입력(해)() list.printList(); list를 이용한.출력() -> list(야).출력(해)() list.saveList(); list를 이용한.저장() -> list(야).저장(해)() }
-> 인스턴스를 통해서 호출되고 인스턴스를 기본으로 넘겨받는 방식 (인스턴스 함수)
이것이 객체지향이다.
- static 메서드 :고전적인 함수 (모든 값은 파라미터를 통해 받고 일반함수와 똑같이사용)
class ExamList { public static void inputList(ExamList list) { list.exams[list.current] = new Exam(); }
-> ExamList.inputList(list); 로 호출
- 인스턴스 메서드 : 객체를 통해서만 호출되는 함수
class ExamList { public void inputList() { this.exams[this.current] = new Exam(); }
-> list.inputList() ; 로 호출가능하다.
전게시글의 예제를 가져와서 인스턴스 메서드로 바꿔보자. 예제)
import java.util.Scanner;
public class Program {
public static void main(String[] args) {
ExamList list = new ExamList();
//두개가 하나로 묶인것
list.init();
int menu;
boolean keepLoop = true;
while(keepLoop)
{
menu =inputMenu();
switch(menu)
{
case 1:
//ExamList.inputList(list);
list.inputList();
break;
case 2:
//ExamList.printList(list);
list.printList();
break;
case 3:
System.out.println("Bye~~");
keepLoop = false;
break;
default:
System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
}
}
}
static int inputMenu() {
Scanner scan = 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.print("\t선택> ");
int menu = scan.nextInt();
return menu;
}
}
case 1: case 2: 의 출력을 바꿨다.
import java.util.Scanner;
public class ExamList {
Exam[] exams;
int current;
void printList() {
this.printList(this.current);
}
void printList(int size) {
System.out.println("┌──────────────────┐");
System.out.println("│ 성적 출력 │");
System.out.println("└──────────────────┘");
System.out.println();
//int size = list.current;
Exam[] exams = this.exams;
for(int i= 0; i<size; i++ ) {
Exam exam = exams[i];
int kor = exam.kor;
int eng = exam.eng;
int math = exam.math;
int total = kor+eng+math;
float avg= total/3.0f;
System.out.printf("국어 :%d\n", kor);
System.out.printf("영어 :%d\n", eng);
System.out.printf("수학 :%d\n", math);
System.out.printf("총점 : %3d\n", total);
System.out.printf("평균 : %6.2f\n", avg);
System.out.println("────────────────────────");
}
}
void inputList() {
Scanner scan = new Scanner(System.in);
System.out.println("┌──────────────────┐");
System.out.println("│ 성적 입력 │");
System.out.println("└──────────────────┘");
System.out.println();
int kor, eng, math;
do {
System.out.printf("국어 :");
kor = scan.nextInt();
if(kor < 0 || 100 < kor)
{
System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
}
}while(kor<0 || 100 < kor);
do {
System.out.printf("영어 :");
eng = scan.nextInt();
if(eng < 0 || 100 < eng)
{
System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
}
}while(eng<0 || 100 < eng);
do {
System.out.printf("수학 :");
math = scan.nextInt();
if(math < 0 || 100 < math)
{
System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
}
}while(math<0 || 100 < math);
Exam exam = new Exam();
exam.kor=kor;
exam.eng=eng;
exam.math=math;
Exam[] exams = this.exams;
int size = this.current;
if(exams.length == size) {
//1. 크기가 5개 정도 더큰 새 배열을 생성하시오
Exam [] temp = new Exam[exams.length +5];
//2. 값을 이주시키기
for(int i=0; i<size;i++)
temp[i] = exams[i];
//3. list.exams가 새로만든 temp 배열을 참조하도록 한다.
this.exams = temp;
}
this.exams[this.current] = exam; // 꼭해줘야하는 작업
this.current++;
System.out.println("────────────────────────");
}
public void init() {
this.exams = new Exam[3];
this.current=0;
}
}
매우깔끔해지고 보기 편안해졌다.
댓글남기기