패키지

메소드 오버라이딩(Overriding) 본문

Server-Side/Java

메소드 오버라이딩(Overriding)

업단업업 2015. 7. 29. 23:18

메소드 오버라이딩(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();

 }

}

 

 

'Server-Side > Java' 카테고리의 다른 글

객체 지향 프로그래밍_기초개념  (3) 2015.08.04
메소드 오버로딩(Overloading)  (0) 2015.08.03
생성자(Constructor)  (0) 2015.08.01
이클립스 한글깨짐 현상  (0) 2015.07.29
eclipse 설치  (0) 2015.07.13
Comments