JavaSE

20일차_메소드 오버로딩, 메소드 오버라이딩, 메인메뉴 액션

알 수 없는 사용자 2015. 6. 21. 07:16

-------------------------------
메소드 오버로딩(Overloading)

1. 한 클래스 내에서 같은 이름을 가진 메소드를 추가로 정의하는 경우 메소드 시그니처(메소드 매개변수 구성 정보)가 다르면 동일한 이름의 메소드를 여러개 정의할 수 있다. 이를 메소드 오버로딩이라고 한다.

2. 메소드 오버로딩의 조건
- 메소드 이름이 같다
- 매개변수 구성(개수, 자료형)이 다르다
- 반환 자료형은 관계 없다.

3. 메소드 오버로딩 형식
접근지정자 반환자료형 메소드이름(자료형1 매개변수1) {
}
접근지정자 반환자료형 메소드이름(자료형2 매개변수2) {
}
접근지정자 반환자료형 메소드이름(자료형1 매개변수1, 자료형2 매개변수2) {
}


//Sample36.java
package com.test;

//패키지명 중에서 ... 가 생략된 상태
//import java.lang.*:

//Object 클래스에 대한 상속 표기 생략된 상태
public class Sample36 {
 
 //기본 생성자 표기 생략된 상태
 
 //메소드 오버로딩
 public void print() {
  System.out.println("Hello, World!");
 }
 public void print(String msg) {
  System.out.printf("Hello, %s World! %n", msg);
 }
 //문제) 오버로딩 메소드 추가할 것.
 public void print(int a) {
  
 }
 public void print(String msg1, String msg2) {
  
 }
}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Sample36 s36 = new Sample36();
  //오버로딩 메소드 호출 테스트
  s36.print(); //"Hello, World!"
  s36.print("Java"); //"Hello, Java World!"
  //문제) 추가된 오버로딩 메소드 호출하는 문장 작성할 것.
  
  
 }

}

 


------------------------------
문제) 아래 조건을 만족하는 오버로딩 메소드 작성.
1. 매개변수 없는 경우 1부터 10까지의 합을 반환.
public int add();
2. 매개변수가 1개 있는 경우 1부터 n까지의 합을 반환.
public int add(int n);
3. 매개변수가 2개 있는 경우 n부터 m까지의 합을 반환.
public int add(int n, int m);
4. 매개변수가 3개 있는 경우 n부터 m까지의 수 중에서 x의 배수만의 합을 반환.
public int add(int n, int m, int x);
5. 임의의 양의 정수를 여러개 입력 받아서 합을 반환.
public int add(int... args);


실행 예)
-----메소드 오버로딩 테스트------
1. 매개변수 없는 경우 1부터 10까지의 합을 반환.
2. 매개변수가 1개 있는 경우 1부터 n까지의 합을 반환.
3. 매개변수가 2개 있는 경우 n부터 m까지의 합을 반환.
4. 매개변수가 3개 있는 경우 n부터 m까지의 수 중에서 x의 배수만의 합을 반환.
5. 임의의 양의 정수를 여러개 입력 받아서 합을 반환.
선택(1~5, 0-종료)?3

입력(n m)?1 10
n부터 m까지의 합 : 55

-----메소드 오버로딩 테스트------
1. 매개변수 없는 경우 1부터 10까지의 합을 반환.
2. 매개변수가 1개 있는 경우 1부터 n까지의 합을 반환.
3. 매개변수가 2개 있는 경우 n부터 m까지의 합을 반환.
4. 매개변수가 3개 있는 경우 n부터 m까지의 수 중에서 x의 배수만의 합을 반환.
5. 임의의 양의 정수를 여러개 입력 받아서 합을 반환.
선택(1~5, 0-종료)?0


//AddMethod.java -> 합 계산 클래스
//MenuAction.java -> 메뉴 액션 클래스 (외부 입력 및 결과 출력)
//Main.java -> 메뉴 클래스 (메뉴 무한 실행)


//AddMethod.java
package com.test;

//add() 메소드 오버로딩
//-> 동일한 이름을 가진 메소드 여러개 작성
//-> 화면 인터페이스 관련 코드를 작성하지 않는다.
//-> 액션 코드만 작성.
public class AddMethod {

 //1. 매개변수 없는 경우 1부터 10까지의 합을 반환.
 public int add() {
  int result = 0;
  
  for (int i=1; i<=10; ++i) {
   result += i;
  }
  
  return result;
 }
 
 //2. 매개변수가 1개 있는 경우 1부터 n까지의 합을 반환.
 public int add(int n) {
  int result = 0;

  for (int i=1; i<=n; ++i) {
   result += i;
  }
  
  return result;
 }
 
 //3. 매개변수가 2개 있는 경우 n부터 m까지의 합을 반환.
 public int add(int n, int m) {
  int result = 0;

  for (int i=n; i<=m; ++i) {
   result += i;
  }

  return result;
 }
 
 //4. 매개변수가 3개 있는 경우 n부터 m까지의 수 중에서 x의 배수만의 합을 반환.
 public int add(int n, int m, int x) {
  int result = 0;
  
  for (int i=n; i<=m; ++i) {
   if (i%x == 0) {
    result += i;
   }
  }
  
  return result;
 }
 
 //5. 임의의 양의 정수를 여러개 입력 받아서 합을 반환.
 public int add(int... args) {
  int result = 0;
  
  for (int a : args) {
   result += a;
  }
  
  return result;
 }
 
}

 

 

//MenuAction.java
package com.test;

import java.util.Scanner;

//메뉴별 액션 메소드 추가하는 클래스
//->화면 인터페이스(콘솔) 관련 코드 작성.
public class MenuAction {
 
 private AddMethod obj; //참조형 변수는 null 값으로 자동 초기화
 
 public MenuAction() {
  obj = new AddMethod();
 }

 //1. 매개변수 없는 경우 1부터 10까지의 합을 반환.
 public void menu1() {
  //처리
  int result = obj.add();
  //결과 출력
  System.out.printf("1부터 10까지의 합:%d %n%n", result);
 }

 //2. 매개변수가 1개 있는 경우 1부터 n까지의 합을 반환.
 public void menu2(Scanner sc) {
  //외부 입력(n)
  System.out.print("정수(n)?");
  int n = sc.nextInt();
  //처리
  int result = obj.add(n);
  //결과 출력
  System.out.printf("1부터 n까지의 합:%d %n%n", result);
 }
 
 //3. 매개변수가 2개 있는 경우 n부터 m까지의 합을 반환.
 public void menu3(Scanner sc) {
  //외부 입력(n, m)
  System.out.printf("정수(n m)?");
  int n = sc.nextInt();
  int m = sc.nextInt();
  //처리
  int result = obj.add(n, m);
  //결과 출력
  System.out.printf("n부터 m까지의 합:%d %n%n", result);
 }
 
 //4. 매개변수가 3개 있는 경우 n부터 m까지의 수 중에서 x의 배수만의 합을 반환.
 public void menu4(Scanner sc) {
  //외부 입력(n, m, x)
  System.out.printf("정수(n m x)?");
  int n = sc.nextInt();
  int m = sc.nextInt();
  int x = sc.nextInt();
  //처리
  int result = obj.add(n, m, x);
  //결과 출력
  System.out.printf("n부터 m까지의 수 중에서 x의 배수만의 합:%d %n%n", result);
 }
 
 //5. 임의의 양의 정수를 여러개 입력 받아서 합을 반환.
 public void menu5(Scanner sc) {
  //외부 입력(여러개-최소 4개 이상인 경우만 실행 가능)
  System.out.printf("정수(n1,n2,n3,...)?");
  String n = sc.next(); //"n1,n2,n3,..."
  String[] arr = n.split(","); //{"n1", "n2", "n3", ...}
  int[] array = new int[arr.length];
  for (int i=0; i<arr.length; ++i) {
   array[i] = Integer.parseInt(arr[i]); //String->int
  } //{n1, n2, n3, ...}
  //처리
  int result = obj.add(array);
  //결과 출력
  System.out.printf("정수 n1,n2,n3, ...의 합:%d %n%n", result);
 }
 
 
}

 

 


//Main.java
package com.test;

import java.util.*;

//메인 메뉴 출력 액션 클래스
public class Main {

 public static void main(String[] args) {
  
  //메인 메뉴 출력
  //외부 입력
  //메뉴 선택시 특정 메소드 호출
  Scanner sc = new Scanner(System.in);
  MenuAction menu = new MenuAction();

  do {
   System.out.println("-----메소드 오버로딩 테스트------");
   System.out.println("1. 매개변수 없는 경우 1부터 10까지의 합을 반환.");
   System.out.println("2. 매개변수가 1개 있는 경우 1부터 n까지의 합을 반환.");
   System.out.println("3. 매개변수가 2개 있는 경우 n부터 m까지의 합을 반환.");
   System.out.println("4. 매개변수가 3개 있는 경우 n부터 m까지의 수 중에서 x의 배수만의 합을 반환.");
   System.out.println("5. 임의의 양의 정수를 여러개 입력 받아서 합을 반환.");
   System.out.print("선택(1~5, 0-exit)?");
   int m = sc.nextInt();
   if (m==0) {
    break;
   }
   switch (m) {
   case 1: menu.menu1(); break;
   case 2: menu.menu2(sc); break;
   case 3: menu.menu3(sc); break;
   case 4: menu.menu4(sc); break;
   case 5: menu.menu5(sc); break;
   }
  }while(true);
  
  sc.close();

 }

}

 

 

4. 생성자도 메소드의 한 형태이므로 오버로딩(Overloading)을 지원한다. 기본 생성자 외에 매개변수가 있는 생성자를 추가하는 경우 생성자 오버로딩 상태가 된다. 한 클래스 내에서 다른 생성자를 호출하는 경우 this() 를 사용할 수 있다.

 


---------------------------------------
메소드 오버라이딩(Overriding)

1. 상위 클래스의 멤버와 같은 이름을 가진 멤버를 하위 클래스에 재구성해서 사용할 수 있다. 오버라이딩(Overriding).


2. 오버라이딩 기본 조건
- 상위 클래스의 멤버와 동일한 이름, 메소드 시그니처, 리턴타입을 가진 메소드
- 접근지정자는 상위 클래스와 다르게 지정할 수 있다. 단, 상위 클래스보다 좁은 범위로의 지정은 안된다.
- 더 적은 예외를 지정할 수 없다.
- static, instance 상태를 변경할 수 없다.

3. 메소드 오버라이딩은 상위 클래스의 멤버를 하위 클래스가 사용할 때 기존의 메소드가 가진 구현 내용을 다르게 구현하고자 할 때 사용한다. 단, 상위 클래스의 생성자를 하위 클래스가 오버라이딩 할 수 없다.

4. 상위 클래스의 멤버 모두를 오버라이딩 할 수 있는 것은 아니다.
- private 멤버
- final 키워드 지정한 멤버
- final 클래스인 경우


문제) 여러명의 학생(Student 자료형-name, tel)이 저장된 배열에서
특정 학생 정보 검색(name 기준으로 검색)하는 과정

//Student.java -> 학생 정보 자료형 클래스. name, tel
//MenuAction.java -> 검색 메소드 구현. 학생 정보 저장된 배열 준비.
//Main.java -> 검색 메뉴


//Student.java
package com.sist;

public class Student {
 
 private String name, tel;

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getTel() {
  return tel;
 }

 public void setTel(String tel) {
  this.tel = tel;
 }


 //toString() 메소드 오버라이딩 구현
 //멤버변수의 데이터를 출력하는 용도로 변경
 @Override
 public String toString() {
  
  return String.format("%s %s"
    , this.getName()
    , this.getTel());
  
 }

 //문제) equals() 메소드 오버라이딩
 //equals()는 Object 클래스의 메소드
 //equals()는 원래 객체의 참조주소를 비교하는 기능이지만
 //객체의 멤버(name)을 비교하도록 변경
 @Override
 public boolean equals(Object obj) {

  //원본 -> this.name
  //비교 대상 -> obj.getName(); //X
  //비교 대상 -> ((Student)obj).getName(); //O
  //비교 방법 -> 같은지, 다른지 ? -> true or false -> 비교 대상의 자료형 -> String -> equals() 메소드 -> 문자열 비교
  return this.name.equals(((Student)obj).getName());
   
 }
 
 

}

 

//MenuAction.java
package com.sist;

import java.util.Scanner;

public class MenuAction {
 
 //학생 정보 저장용 배열 준비->데이터 저장소
 private Student[] students;
 
 public MenuAction() {
  //배열 생성 및 초기화
  students = new Student[5];
  this.init();
 }
 
 private void init() {
  
  Student student0 = new Student();
  student0.setName("hong");
  student0.setTel("010-123-1234");
  students[0] = student0;
  
  Student student1 = new Student();
  student1.setName("kim");
  student1.setTel("010-432-4321");
  students[1] = student1;

  Student student2 = new Student();
  student2.setName("park");
  student2.setTel("010-987-9876");
  students[2] = student2;
 
  Student student3 = new Student();
  student3.setName("choi");
  student3.setTel("010-567-5678");
  students[3] = student3;
 
  Student student4 = new Student();
  student4.setName("hwang");
  student4.setTel("010-876-8765");
  students[4] = student4;

 }
 
 public void menuSearch(Scanner sc) {
  //외부 입력(name)
  System.out.print("name?");
  String name = sc.next();
  
  Student value = new Student();
  value.setName(name);
  
  //처리 -> 검색 액션
  //-> 배열 저장소 내에서 name이 일치하는 자료 검색
  //-> Student 자료형을 가진 객체 한 개
  Student result = null;
  for (int i=0; i<students.length; ++i) {
   Student temp = students[i];
   /*
   if (temp.getName().equals(name)) {
    result = temp;
    break;
   }
   */

   if (value.equals(temp)) {
    result = temp;
    break;
   }
   
  }
  
  //결과 출력
  if (result == null) {
   System.out.printf("검색 결과가 없습니다.%n%n");
  } else {
   /*
   System.out.printf("%s %s %n%n"
     , result.getName()
     , result.getTel());
   */
   
   /*
   System.out.println(result); //객체 정보
   System.out.println(result.toString()); //객체 정보
   */
   
   //toString() 메소드 호출시 객체 정보가 아니라
   //멤버변수의 데이터를 출력하는 용도로 변경
   //->오버라이딩
   System.out.println(result);
   System.out.println();
   
  }
 }

}

 

 

//Main.java
package com.sist;

import java.util.*;

public class Main {

 public static void main(String[] args) {
  
  Scanner sc = new Scanner(System.in);
  MenuAction menu = new MenuAction();
  
  do {
   System.out.println("--- 회원 정보 관리 ---");
   System.out.println("1. 회원 검색");
   System.out.print("선택(1, 0-exit)?");
   int m = sc.nextInt();
   if (m==0) {
    break;
   }
   switch (m) {
   case 1: menu.menuSearch(sc); break;
   }
   
  }while(true);
  
  sc.close();

 }

}

 

 

 

 

 

 

 


----------------------------------------------------------
요약

1. 메소드 오버로딩(Overloading)
- 한 개의 클래스 내에서 여러개의 메소드 정의
- 메소드 시그니처(매개변수 구성 정보)가 다른 경우만 가능

2. 메소드 오버라이딩(Overriding)
- 상위, 하위 클래스 내에서 동일한 메소드에 대한 재정의.
- 메소드 시그니처는 동일하되, 구현 내용이 다른 경우.


--------------------------------------------------