//DateTest.java
package com.test;

import java.text.*;

public class DateTest {

 public static void main(String[] args) {

  //날짜 형식 검사
  String ibsadate = "2015-01-32";
  
  System.out.print("DATE: ");
  if (dateCheck(ibsadate)) {
   System.out.println("일치합니다.");
  } else {
   System.out.println("일치하지 않습니다.");
  } 
  
 }
 
 private static boolean dateCheck(String date) {
  boolean result = false;
  try {
   //"yyyy-MM-dd" 형식에서 대소문자 구분
   SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
   df.setLenient(false);
   df.parse(date);
   result = true;
  }catch(Exception e){
  }
  return result;
 }
 

}

블로그 이미지

알 수 없는 사용자

,

-----------------------------------
ArrayList 클래스를 이용한 회원 관리

실행예)
--- 회원 관리(컬렉션 자료구조 사용) ---
1. 회원 가입 (ID, PW, NAME, TEL, EMAIL)
2. 회원 명단 출력 (ID, NAME, TEL, EMAIL)
3. 회원 검색 (ID, NAME, TEL)
4. 관리자 모드 (admin 로그인 필요)
선택(1~4, 0 종료)?1


-------------------------
요구 분석

1. 회원 정보 저장소 -> ArrayList 컬렉션 사용 (크기 자동 관리, null 데이터 제외, size() 메소드)
2. 입력, 출력, 검색, 삭제 기능. 로그인 과정 필요. 예외 처리.
3. 검색은 서브 메뉴 운영. ID, NAME, TEL 기준 제시.
4. 관리자 모드는 로그인 과정을 통해서 회원 삭제 기능 운영.

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

//Member.java -> 자료형 정의 클래스. ID, PW, NAME, TEL, EMAIL 멤버로 구성.
//MemberDAO.java -> 자료 저장용 객체로서 ArrayList<Member> 클래스 사용. 자료 입출력 액션 메소드. 로그인 메소드.
//MenuAction.java -> 서브 메뉴, 메뉴 액션 클래스.
//Main.java -> 메인 메뉴 구성용 클래스.

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


//Member.java
package com.test;

//자료형 클래스
public class Member {
 
 //멤버변수, getter, setter
 
 //멤버변수
 //-> 입력, 출력에 관련된 모든 데이터 항목
 //-> ID, PW, NAME, TEL, EMAIL
 private String id, pw, name, tel, email;
 
 //번호(컬렉션 내부의 인덱스) 저장을 위한 멤버 변수 추가
 private int num;
 public int getNum() {
  return num;
 }
 public void setNum(int num) {
  this.num = num;
 }
 
 //등급 저장용 멤버 변수 추가
 //grade -> 관리자 0, 일반 회원 1
 private int grade;
 public int getGrade() {
  return grade;
 }
 public void setGrade(int grade) {
  this.grade = grade;
 }

 //getter, setter
 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getPw() {
  return pw;
 }

 public void setPw(String pw) {
  this.pw = pw;
 }

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

 public String getEmail() {
  return email;
 }

 public void setEmail(String email) {
  this.email = email;
 }
 
 
 //문제)
 //toString() 메소드 오버라이딩 처리
 //ID, NAME, TEL, EMAIL 출력 전용 -> String.format()
 //반환자료형 String
 

}

 

 

//MemberDAO.java
package com.test;

import java.util.*;

public class MemberDAO {
 
 //회원 저장용 저장소 준비
 //-> ArrayList 컬렉션 클래스
 //-> Generic 표현 사용
 private ArrayList<Member> members;
 
 //생성자 준비
 //-> 컬렉션 객체 생성 및 초기화
 public MemberDAO() {
  this.members = new ArrayList<Member>();
  this.init();
 }
 
 private void init() {
  //문제)
  //관리자(admin) 정보 사전 등록->필수
  //샘플 사용자 정보 사전 등록->선택
  //등급(grade) 지정
  //->관리자 0, 일반회원 1
  
  
 }
 
 
 //회원 정보 입력용 메소드 추가
 //->외부에서 전달된 회원 정보(Member 자료형)를 가지고 저장소에 저장하는 액션
 public int add(Member member) {
  int result = 0;

  //문제)
  //저장소(컬렉션)에 저장하는 액션 추가
  //-> 저장된 후에는 결과값 1 반환
  
  return result;
 }
 
 
 //회원 정보 출력용 메소드 추가
 //반환자료형은 회원 정보 전체를 저장(컬렉션 권장)할 수 있는 자료형을 지정한다.
 //회원 정보 전체를 반환하는 경우
 //특정한 항목(ID)을 기준으로 정렬시킨 후 반환하도록 추가
 //->Collections.sort(컬렉션, 정렬기준)
 public ArrayList<Member> list() {
  ArrayList<Member> result;
  
  result = this.members;
  
  //문제) 정렬 액션 추가

  
  
  return result;
 }
 
 //회원 정보 검색 결과용 메소드 추가
 public ArrayList<Member> searchList(String key, String value) {
  ArrayList<Member> result = new ArrayList<Member>();
  
  //문제)
  //key는 검색 기준. 예를 들어 "ID"
  //value는 검색 단어. 예를 들어 "hong"
  //원본 컬렉션인 members 에서 검색 진행
  //검색 결과(Member 객체)만 result 컬렉션에 저장하는 액션
  
  return result;
 }
 
 
 
 //관리자 로그인 액션 메소드
 public boolean adminLogin(String id, String pw) {
  boolean result = false;
  
  //저장소(컬렉션)에 들어있는 id(중복없음), pw, grade(0) 검사
  //관리자가 맞는 경우->true
  //관리자가 아닌 경우->false
  
  return result;
 }
 
 
 
 //회원 정보 삭제용 메소드 추가
 public int remove(int num) {
  int result = 0;
  
  //외부에서 전달받은 번호(컬렉션 내부의 인덱스)를
  //기준으로 삭제 진행
  //->컬렉션에서 특정 요소 삭제
  
  return result;
 }

}

 

 


//MenuAction.java
package com.test;

import java.util.Scanner;

public class MenuAction {
 
 //MemberDAO 클래스의 객체를 멤버변수로 등록
 private MemberDAO dao;
 
 public MenuAction() {
  //멤버변수 dao에 대한 초기화
  this.dao = new MemberDAO();
 }
 
 //1. 회원 가입 (ID, PW, NAME, TEL, EMAIL)
 public void menuInsert(Scanner sc) {
  
  //문제)
  //콘솔 환경에서 외부 데이터 입력.
  //입력 항목->ID, PW, NAME, TEL, EMAIL
  //신규 Member 객체에 입력 데이터를 저장
  //MemberDAO 객체의 add() 메소드 호출
  //"회원정보가 추가되었습니다." 메시지 출력
  
 }
 
 //2. 회원 명단 출력
 public void menuSelect() {
  //문제)
  //저장소로부터 회원 정보 전체를 반환하는 메소드 호출
  //->list()->ArrayList<Member>
  //->컬렉션에 들어있는 회원 정보(Member 자료형-ID, NAME, TEL, EMAIL)를 순차적으로 출력
  //->향상된 for문 이용
  
  
  
 }

 //3. 회원 검색
 public void menuSearch(Scanner sc) {
  //서브메뉴 운영
  do {
   System.out.println("--- 회원 검색 서브 메뉴 ---");
   System.out.println("1. ID");
   System.out.println("2. NAME");
   System.out.println("3. TEL");
   System.out.print("선택(1~3, 0 종료)?");
   int m = sc.nextInt();
   if (m == 0) {
    break;
   }
   
   //문제)
   //1-> ID 기준 검색 액션 -> private 메소드 처리 -> key
   //2-> NAME 기준 검색 액션 -> private 메소드 처리 -> key
   //3-> TEL 기준 검색 액션 -> private 메소드 처리 -> key
   
   
  }while(true);
 }

 //검색 액션 전용 private 메소드
 private void searchList(Scanner sc, String key) {

  //문제)
  //검색 단어(value) 외부 입력
  //검색 액션 메소드 호출 -> MemberDAO 클래스의 검색 메소드 호출 ->key, value

  //결과값은 ArrayList<Member> 자료형
  //->컬렉션에 들어있는 회원 정보(Member 자료형-ID, NAME, TEL, EMAIL)를 순차적으로 출력
  //->향상된 for문 이용
  
  //결과가 없는 경우 "검색 결과가 없습니다." 메시지 출력
  
 }
 
 
 
 //4. 관리자 모드
 public void menuAdmin(Scanner sc) {
  
  //문제)
  //로그인 액션
  //ID(admin), PW 외부 입력
  //->MemberDAO 클래스의 login() 메소드 호출
  //->id, pw 매개변수에 전달
  //->결과가 true인 경우 로그인 성공->삭제 액션 진행->private 메소드
  //->결과가 false인 경우 로그인 실패->예외 발생
  
 }
 
 private void adminDelete(Scanner sc) {
  
  //문제)
  //삭제 액션
  //삭제 대상 검색 진행 -> ID, NAME 기준 -> 서브 메뉴 운영
  //->private 메소드 추가
  
  
  //검색 결과 출력후 삭제 대상 확인 및 삭제 여부 확인
  //->(NAME 기준인 경우) 동명이인 처리
  //->번호(컬렉션 내부의 인덱스) 출력 및 번호 선택 과정 추가
  
  //->삭제는 번호(컬렉션 내부의 인덱스)를 기준으로 삭제 액션 진행.
  //->MemberDAO 클래스에서 remove() 메소드 호출
  //->번호(컬렉션 내부의 인덱스)를 매개변수에 전달
  
  
 }
 
 
}

 

 

 

//Main.java
package com.test;

import java.util.Scanner;

public class Main {

 public static void main(String[] args) {

  //MenuAction 클래스의 객체 생성 과정 추가
  MenuAction menu = new MenuAction();
  Scanner sc = new Scanner(System.in);
  
  do {
   System.out.println("--- 회원 관리(컬렉션 자료구조 사용) ---");
   System.out.println("1. 회원 가입");
   System.out.println("2. 회원 명단 출력");
   System.out.println("3. 회원 검색");
   System.out.println("4. 관리자 모드");
   System.out.print("선택(1~4, 0 종료)?");
   int m = sc.nextInt();
   //문제)
   //0->프로그램 종료
   //1->회원 가입 액션->menuInsert() 메소드 호출
   //2->회원 명단 출력->menuSelect() 메소드 호출
   //3->회원 검색->menuSearch() 메소드 호출
   //4->관리자 모드->menuAdmin() 메소드 호출
   if (m==0) {
    break;
   }
   
   //예외 처리 -> try~catch
   
   
   
  }while(true);
  
  sc.close();
  
  
 }

}

 

 

---------------------------------------
회원관리 관리자 로그인, 회원 삭제 액션 기능 구현

 

 


 

 

블로그 이미지

알 수 없는 사용자

,

-----------------------------------
ArrayList 클래스를 이용한 회원 관리

실행예)
--- 회원 관리(컬렉션 자료구조 사용) ---
1. 회원 가입 (ID, PW, NAME, TEL, EMAIL)
2. 회원 명단 출력 (ID, NAME, TEL, EMAIL)
3. 회원 검색 (ID, NAME, TEL)
4. 관리자 모드 (admin 로그인 필요)
선택(1~4, 0 종료)?1


-------------------------
요구 분석

1. 회원 정보 저장소 -> ArrayList 컬렉션 사용 (크기 자동 관리, null 데이터 제외, size() 메소드)
2. 입력, 출력, 검색, 삭제 기능. 로그인 과정 필요. 예외 처리.
3. 검색은 서브 메뉴 운영. ID, NAME, TEL 기준 제시.
4. 관리자 모드는 로그인 과정을 통해서 회원 삭제 기능 운영.

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

//Member.java -> 자료형 정의 클래스. ID, PW, NAME, TEL, EMAIL 멤버로 구성.
//MemberDAO.java -> 자료 저장용 객체로서 ArrayList<Member> 클래스 사용. 자료 입출력 액션 메소드. 로그인 메소드.
//MenuAction.java -> 서브 메뉴, 메뉴 액션 클래스.
//Main.java -> 메인 메뉴 구성용 클래스.

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

 

//Member.java
package com.test;

//자료형 클래스
public class Member {
 
 //멤버변수, getter, setter
 
 //멤버변수
 //-> 입력, 출력에 관련된 모든 데이터 항목
 //-> ID, PW, NAME, TEL, EMAIL
 private String id, pw, name, tel, email;

 //getter, setter
 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getPw() {
  return pw;
 }

 public void setPw(String pw) {
  this.pw = pw;
 }

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

 public String getEmail() {
  return email;
 }

 public void setEmail(String email) {
  this.email = email;
 }
 
 
 //문제)
 //toString() 메소드 오버라이딩 처리
 //ID, NAME, TEL, EMAIL 출력 전용 -> String.format()
 //반환자료형 String
 
 

}

 


//MemberDAO.java
package com.test;

import java.util.*;

public class MemberDAO {
 
 //회원 저장용 저장소 준비
 //-> ArrayList 컬렉션 클래스
 //-> Generic 표현 사용
 private ArrayList<Member> members;
 
 //생성자 준비
 //-> 컬렉션 객체 생성 및 초기화
 public MemberDAO() {
  this.members = new ArrayList<Member>();
  this.init();
 }
 
 private void init() {
  //문제)
  //관리자(admin) 정보 사전 등록->필수
  //샘플 사용자 정보 사전 등록->선택
  
 }
 
 
 //회원 정보 입력용 메소드 추가
 //->외부에서 전달된 회원 정보(Member 자료형)를 가지고 저장소에 저장하는 액션
 public int add(Member member) {
  int result = 0;

  //문제)
  //저장소(컬렉션)에 저장하는 액션 추가
  //-> 저장된 후에는 결과값 1 반환
  
  return result;
 }
 
 
 //회원 정보 출력용 메소드 추가
 //반환자료형은 회원 정보 전체를 저장(컬렉션 권장)할 수 있는 자료형을 지정한다.
 //회원 정보 전체를 반환하는 경우
 //특정한 항목(ID)을 기준으로 정렬시킨 후 반환하도록 추가
 //->Collections.sort(컬렉션, 정렬기준)
 public ArrayList<Member> list() {
  ArrayList<Member> result;
  
  result = this.members;
  
  //문제) 정렬 액션 추가

  
  
  return result;
 }
 
 //회원 정보 검색 결과용 메소드 추가
 public ArrayList<Member> searchList(String key, String value) {
  ArrayList<Member> result = new ArrayList<Member>();
  
  //문제)
  //key는 검색 기준. 예를 들어 "ID"
  //value는 검색 단어. 예를 들어 "hong"
  //원본 컬렉션인 members 에서 검색 진행
  //검색 결과(Member 객체)만 result 컬렉션에 저장하는 액션
  
  return result;
 }
 
 

}

 

 

 

//MenuAction.java
package com.test;

import java.util.Scanner;

public class MenuAction {
 
 //MemberDAO 클래스의 객체를 멤버변수로 등록
 private MemberDAO dao;
 
 public MenuAction() {
  //멤버변수 dao에 대한 초기화
  this.dao = new MemberDAO();
 }
 
 //1. 회원 가입 (ID, PW, NAME, TEL, EMAIL)
 public void menuInsert(Scanner sc) {
  
  //문제)
  //콘솔 환경에서 외부 데이터 입력.
  //입력 항목->ID, PW, NAME, TEL, EMAIL
  //신규 Member 객체에 입력 데이터를 저장
  //MemberDAO 객체의 add() 메소드 호출
  //"회원정보가 추가되었습니다." 메시지 출력
  
 }
 
 //2. 회원 명단 출력
 public void menuSelect() {
  //문제)
  //저장소로부터 회원 정보 전체를 반환하는 메소드 호출
  //->list()->ArrayList<Member>
  //->컬렉션에 들어있는 회원 정보(Member 자료형-ID, NAME, TEL, EMAIL)를 순차적으로 출력
  //->향상된 for문 이용
  
  
  
 }

 //3. 회원 검색
 public void menuSearch(Scanner sc) {
  //서브메뉴 운영
  do {
   System.out.println("--- 회원 검색 서브 메뉴 ---");
   System.out.println("1. ID");
   System.out.println("2. NAME");
   System.out.println("3. TEL");
   System.out.print("선택(1~3, 0 종료)?");
   int m = sc.nextInt();
   if (m == 0) {
    break;
   }
   
   //문제)
   //1-> ID 기준 검색 액션 -> private 메소드 처리 -> key
   //2-> NAME 기준 검색 액션 -> private 메소드 처리 -> key
   //3-> TEL 기준 검색 액션 -> private 메소드 처리 -> key
   
   
  }while(true);
 }

 //검색 액션 전용 private 메소드
 private void searchList(Scanner sc, String key) {

  //문제)
  //검색 단어(value) 외부 입력
  //검색 액션 메소드 호출 -> MemberDAO 클래스의 검색 메소드 호출 ->key, value

  //결과값은 ArrayList<Member> 자료형
  //->컬렉션에 들어있는 회원 정보(Member 자료형-ID, NAME, TEL, EMAIL)를 순차적으로 출력
  //->향상된 for문 이용
  
  //결과가 없는 경우 "검색 결과가 없습니다." 메시지 출력
  
 }
 
 
 
}

 

 


//Main.java
package com.test;

import java.util.Scanner;

public class Main {

 public static void main(String[] args) {

  //MenuAction 클래스의 객체 생성 과정 추가
  MenuAction menu = new MenuAction();
  Scanner sc = new Scanner(System.in);
  
  do {
   System.out.println("--- 회원 관리(컬렉션 자료구조 사용) ---");
   System.out.println("1. 회원 가입");
   System.out.println("2. 회원 명단 출력");
   System.out.println("3. 회원 검색");
   System.out.println("4. 관리자 모드");
   System.out.print("선택(1~4, 0 종료)?");
   int m = sc.nextInt();
   //문제)
   //0->프로그램 종료
   //1->회원 가입 액션->menuInsert() 메소드 호출
   //2->회원 명단 출력->menuSelect() 메소드 호출
   //3->회원 검색->menuSearch() 메소드 호출
   //4->
   if (m==0) {
    break;
   }
   
   
  }while(true);
  
  sc.close();
  
  
 }

}

 


------------------------------------------------------
회원관리 검색 기능 추가


컬렉션 삭제 구현시 컬렉션.remove(인덱스) 사용.

 


 

블로그 이미지

알 수 없는 사용자

,

-----------------------------------
ArrayList 클래스를 이용한 회원 관리

실행예)
--- 회원 관리(컬렉션 자료구조 사용) ---
1. 회원 가입 (ID, PW, NAME, TEL, EMAIL)
2. 회원 명단 출력 (ID, NAME, TEL, EMAIL)
3. 회원 검색 (ID, NAME, TEL)
4. 관리자 모드 (admin 로그인 필요)
선택(1~4, 0 종료)?1


-------------------------
요구 분석

1. 회원 정보 저장소 -> ArrayList 컬렉션 사용 (크기 자동 관리, null 데이터 제외, size() 메소드)
2. 입력, 출력, 검색, 삭제 기능. 로그인 과정 필요. 예외 처리.
3. 검색은 서브 메뉴 운영. ID, NAME, TEL 기준 제시.
4. 관리자 모드는 로그인 과정을 통해서 회원 삭제 기능 운영.

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

//Member.java -> 자료형 정의 클래스. ID, PW, NAME, TEL, EMAIL 멤버로 구성.
//MemberDAO.java -> 자료 저장용 객체로서 ArrayList<Member> 클래스 사용. 자료 입출력 액션 메소드. 로그인 메소드.
//MenuAction.java -> 서브 메뉴, 메뉴 액션 클래스.
//Main.java -> 메인 메뉴 구성용 클래스.

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

//Member.java
package com.test;

//자료형 클래스
public class Member {
 
 //멤버변수, getter, setter
 
 //멤버변수
 //-> 입력, 출력에 관련된 모든 데이터 항목
 //-> ID, PW, NAME, TEL, EMAIL
 private String id, pw, name, tel, email;

 //getter, setter
 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getPw() {
  return pw;
 }

 public void setPw(String pw) {
  this.pw = pw;
 }

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

 public String getEmail() {
  return email;
 }

 public void setEmail(String email) {
  this.email = email;
 }
 
 
 //문제)
 //toString() 메소드 오버라이딩 처리
 //ID, NAME, TEL, EMAIL 출력 전용 -> String.format()
 //반환자료형 String
 


}

 

 

 

//MemberDAO.java
package com.test;

import java.util.*;

public class MemberDAO {
 
 //회원 저장용 저장소 준비
 //-> ArrayList 컬렉션 클래스
 //-> Generic 표현 사용
 private ArrayList<Member> members;
 
 //생성자 준비
 //-> 컬렉션 객체 생성 및 초기화
 public MemberDAO() {
  this.members = new ArrayList<Member>();
  this.init();
 }
 
 private void init() {
  //문제)
  //관리자(admin) 정보 사전 등록->필수
  //샘플 사용자 정보 사전 등록->선택
  
 }
 
 
 //회원 정보 입력용 메소드 추가
 //->외부에서 전달된 회원 정보(Member 자료형)를 가지고 저장소에 저장하는 액션
 public int add(Member member) {
  int result = 0;

  //문제)
  //저장소(컬렉션)에 저장하는 액션 추가
  //-> 저장된 후에는 결과값 1 반환
  
  return result;
 }
 
 
 //회원 정보 출력용 메소드 추가
 //반환자료형은 회원 정보 전체를 저장(컬렉션 권장)할 수 있는 자료형을 지정한다.
 //회원 정보 전체를 반환하는 경우
 //특정한 항목(ID)을 기준으로 정렬시킨 후 반환하도록 추가
 //->Collections.sort(컬렉션, 정렬기준)
 public ArrayList<Member> list() {
  ArrayList<Member> result;
  
  result = this.members;
  
  //문제) 정렬 액션 추가
  
  
  return result;
 }
 

}

 

 

 

//MenuAction.java
package com.test;

import java.util.Scanner;

public class MenuAction {
 
 //MemberDAO 클래스의 객체를 멤버변수로 등록
 private MemberDAO dao;
 
 public MenuAction() {
  //멤버변수 dao에 대한 초기화
  this.dao = new MemberDAO();
 }
 
 //1. 회원 가입 (ID, PW, NAME, TEL, EMAIL)
 public void menuInsert(Scanner sc) {
  
  //문제)
  //콘솔 환경에서 외부 데이터 입력.
  //입력 항목->ID, PW, NAME, TEL, EMAIL
  //신규 Member 객체에 입력 데이터를 저장
  //MemberDAO 객체의 add() 메소드 호출
  //"회원정보가 추가되었습니다." 메시지 출력
  
 }
 
 //2. 회원 명단 출력
 public void menuSelect() {
  //문제)
  //저장소로부터 회원 정보 전체를 반환하는 메소드 호출
  //->list()->ArrayList<Member>
  //->컬렉션에 들어있는 회원 정보(Member 자료형-ID, NAME, TEL, EMAIL)를 순차적으로 출력
  //->향상된 for문 이용
  
  
  
 }

 
 
}

 

 

 

//Main.java
package com.test;

import java.util.Scanner;

public class Main {

 public static void main(String[] args) {

  //MenuAction 클래스의 객체 생성 과정 추가
  MenuAction menu = new MenuAction();
  Scanner sc = new Scanner(System.in);
  
  do {
   System.out.println("--- 회원 관리(컬렉션 자료구조 사용) ---");
   System.out.println("1. 회원 가입");
   System.out.println("2. 회원 명단 출력");
   System.out.println("3. 회원 검색");
   System.out.println("4. 관리자 모드");
   System.out.print("선택(1~4, 0 종료)?");
   int m = sc.nextInt();
   //문제)
   //0->프로그램 종료
   //1->회원 가입 액션->menuInsert() 메소드 호출
   //2->회원 명단 출력->menuSelect() 메소드 호출
   //3->
   //4->
   if (m==0) {
    break;
   }
   
   
  }while(true);
  
  sc.close();
  
  
 }

}


-------------------------------------------
컬렉션 자료 정렬 Collections.sort() 메소드


//Member.java
package com.one;

//자료형 클래스
public class Member {
 
 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;
 }

 @Override
 public String toString() {
  return String.format("%s %s "
    , this.name, this.tel);
 }

}

 

 

//Main.java
package com.one;

import java.util.*;

public class Main {

 public static void main(String[] args) {
  
  ArrayList<Integer> list1 = new ArrayList<Integer>();
  list1.add(30);
  list1.add(10);
  list1.add(20);
  Collections.sort(list1);
  System.out.println(list1);
  
  ArrayList<String> list2 = new ArrayList<String>();
  list2.add("HELLO");
  list2.add("TEST");
  list2.add("ABCD");
  Collections.sort(list2);
  System.out.println(list2);
  
  ArrayList<Member> list3 = new ArrayList<Member>();
  Member member1 = new Member();
  member1.setName("hong");
  member1.setTel("1234");
  list3.add(member1);
  Member member2 = new Member();
  member2.setName("choi");
  member2.setTel("4321");
  list3.add(member2);
  Member member3 = new Member();
  member3.setName("park");
  member3.setTel("5432");
  list3.add(member3);
  Collections.sort(list3, new Comparator<Member>() {
   @Override
   public int compare(Member o1, Member o2) {
    //숫자인 경우
     //return o1.getXXX() - o2.getXXX();
    //문자열인 경우
    return o1.getName().compareTo(o2.getName());
   }
  });
  System.out.println(list3);

 }

}

----------------------------------------------
회원관리 입력, 출력 기능 구현

 

 


 

블로그 이미지

알 수 없는 사용자

,

----------------------------------------
컬렉션 프레임워크(Collection Framework)

1. 데이터 집합을 저장하는 전용 클래스. 배열과 같이 다량의 데이터를 저장할 수 있는 자료 구조 표현인데, 배열 처럼 크기를 정하고 쓰는 것이 아니라, 크기는 자동 관리 되기 때문에 객체만 생성하고 다량의 데이터를 저장할 수 있다.

2. List, Set, Map 인터페이스 구현 클래스

3. List 인터페이스
- (저장)순서 있는 데이터 집합, 중복 허용
- 키는 없고, 값만 있는 상태. 인덱스를 이용해서 값 검색.
- Collection 인터페이스 하위 인터페이스
- ArrayList, LinkedList, Stack, Vector 등

4. Set 인터페이스
- (저장)순서 없는 데이터 집합, 중복 불가.
- 키는 없고, 값만 있는 상태. 인덱스를 이용해서 값 검색.
- Collection 인터페이스 하위 인터페이스
- HashSet, TreeSet 등.

5. Map 인터페이스
- 키와 값의 쌍으로 이루어진 데이터 집합.
- (저장)순서 없는 데이터 집합, 키는 중복 불가, 값은 중복 허용.
- 값 검색을 하는 경우 키를 이용.
- HashMap, TreeMap, HashTable 등


6. Collection 인터페이스 메소드
add()
clear()
contains()
isEmpty()
remove()
size()
toArray()
iterator()

7. List 인터페이스 메소드
get()
subList()
set()

8. Set 인터페이스 메소드

9. Map 인터페이스 메소드
containsKey()
containsValue()
get()
put()


---------------------------
ArrayList 클래스를 이용한 자료 저장

 

//Sample111.java
package com.test;

import java.util.*;

public class Sample111 {

 public static void main(String[] args) {

  //컬렉션 클래스 객체 준비
  //->다량의 데이터 저장 및 운영
  //->Generic 사용 X
  ArrayList array1 = new ArrayList();
  //내부적으로 ArrayList는
  //Object 자료형의 배열을 이용하고 있으므로
  //어떤 자료형의 데이터도 저장할 수 있다.
  //-> 서로 다른 자료형을 저장하는 것은 타입 안정성을 해치게 된다.
  array1.add("문자열"); //String
  array1.add(10); //int
  array1.add(12.1234); //double
  
  //특정 번째 데이터를 출력하는 경우 인덱스 지정
  System.out.println(array1.get(0));
  
  //순차적으로 데이터를 출력하는 경우
  //향상된 for문 이용
  for (Object obj : array1) {
   //System.out.println(obj);
   System.out.println(obj.toString());
  }
  
  //타입 안성정 테스트
  for (Object obj : array1) {
   //컬렉션에 들어있는 데이터가
   //Integer 자료형으로 형변환할 수 있는 경우라면 가능
   //->컬렉션에 들어있는 데이터에 대한 자료형 검사 과정 필요
   //->자료형이 맞지 않는 경우 처리 불가
   if (obj instanceof Integer) {
    Integer i = (Integer)obj;
    int j = i.intValue();
    System.out.println(j+10);
   }
  }

  
  //Generic 표현 O
  //컬렉션에서 취급할 자료형을 클래스명<자료형> 형태로 표기
  //Generic에서 자료형은 참조형만 지원.
  //기본형과 참조형(Wrapper 클래스)간의 형변환->암시적
  //int->Integer, Integer->int
  
  ArrayList<Integer> array2 = new ArrayList<Integer>();
  array2.add(10); //int -> Integer (암시적)
  array2.add(new Integer(10)); //Integer
  //array2.add("문자열"); //X
  //array2.add(12.234); //X
  
  //컬렉션은 Integer 자료형이지만
  //int 변수에 직접 저장할 수 있다.
  //Integer -> int 암시적 형변환 지원
  for (int j : array2) {
   System.out.println(j+10);
  }
  
  
 }

}

 

 

 


//Sample112.java
package com.test;

import java.util.ArrayList;

public class Sample112 {

 public static void main(String[] args) {
  
  //배열과 ArrayList 클래스 비교
  
  //배열
  int[] array1 = new int[5];
  array1[0] = 10;
  array1[1] = 20;
  array1[2] = 30;
  array1[3] = 40;
  array1[4] = 50;

  for (int i=0; i<array1.length; ++i) {
   System.out.printf("%d ", array1[i]);
  }
  System.out.println();
  
  for (int i : array1) {
   System.out.printf("%d ", i);
  }
  System.out.println();

  System.out.println(array1.toString()); //객체 정보
  
  //ArrayList 클래스
  ArrayList<Integer> array2 = new ArrayList<Integer>();
  array2.add(10);
  array2.add(20);
  array2.add(30);
  array2.add(40);
  array2.add(50);
  
  for (int i=0; i<array2.size(); ++i) {
   System.out.printf("%d ", array2.get(i));
  }
  System.out.println();
  
  for (int i : array2) {
   System.out.printf("%d ", i);
  }
  System.out.println();
  
  System.out.println(array2.toString()); //컬렉션 요소 출력. [10, 20, 30, 40, 50]
  

 }
 
 
}

 

 

 


Vector 클래스의 경우
//Main.java
package com.test;

import java.util.Vector;

public class Main {

 public static void main(String[] args) {

  //Vector 클래스 선언
  //<Integer> 표현을 사용했기 때문에
  //Integer 자료형의 값만 저장 가능.
  //Integer 클래스는 Wrapper 클래스이므로
  //Integer 자료형에는 int 자료형도 포함된다.
  //(20)은 초기 용량을 지정한 부분이다.
  Vector<Integer> array = new Vector<Integer>(20);

  //초기 용량(Vector 클래스만 지원)
  System.out.printf("array.capacity : %d %n",array.capacity());

  //Vector 객체에 일련의 숫자 데이터 저장
  //Vector 객체 전체가 아니라 일부에만 데이터를 저장한다.
  for (int i=0; i<30; i++) {
   array.add(new Integer(i+1));
   //array.add(i+1);

   //자료를 저장할 공간이 부족하다고 판단되면 용량 증가가 실행된다.
   //변환된 용량(Vector 클래스만 지원)
   System.out.printf("capacity : %d %n",array.capacity());
  
  }

  //Vector 객체 전체 출력
  //size() 메소드는 실제 데이터가 들어있는 갯수를 반환한다.
  for (int i=0; i<array.size(); i++) {
   System.out.printf("%d ", array.get(i));
  }  

  //Vector 객체 전체 출력
  System.out.println(array.toString());
  
  //ArrayIndexOutOfBoundsException
  /*
  for (int i=0; i<array.capacity(); i++) {
   System.out.printf("%d ", array.get(i));
  }  
  */  

 
 }

}

 

-----------------------------------
ArrayList 클래스를 이용한 회원 관리


실행예)
---- 회원관리 ----
1. 회원 전체 출력
2. 회원 입력
선택(1~2, 0 종료)?

 

//Student.java -> 회원 한 명분의 정보 저장용 클래스. 이름, 전화번호 항목으로 구성.
//MenuAction.java -> 메뉴 액션 클래스. ArrayList의 자료형은 Student 클래스로 지정.
//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;
 }

 @Override
 public String toString() {
  return String.format("%s %s"
    , this.getName()
    , this.getTel());
 }

 @Override
 public boolean equals(Object obj) {
  return this.name.equals(((Student)obj).getName());
 }
 
}

 

 


//MenuAction.java
package com.sist;

import java.util.*;

public class MenuAction {

 //학생 정보 저장용 컬렉션 객체 준비->데이터 저장소
 private ArrayList<Student> students;
 
 public MenuAction() {
  //객체 생성 및 초기화
  //배열은 초기 크기 지정이 필요하지만
  //ArrayList는 초기 크기 지정이 필요없다.
  //->크기는 자동 관리
  students = new ArrayList<Student>();
  this.init();
 }
 
 private void init() {
  
  Student student0 = new Student();
  student0.setName("hong");
  student0.setTel("010-123-1234");
  //참조변수.add(Student 객체);
  students.add(student0);
  
  Student student1 = new Student();
  student1.setName("kim");
  student1.setTel("010-432-4321");
  students.add(student1);

  Student student2 = new Student();
  student2.setName("park");
  student2.setTel("010-987-9876");
  students.add(student2);
 
  Student student3 = new Student();
  student3.setName("choi");
  student3.setTel("010-567-5678");
  students.add(student3);
 
  Student student4 = new Student();
  student4.setName("hwang");
  student4.setTel("010-876-8765");
  students.add(student4);
  
 }
 
 //1. 회원 입력
 public void menuInsert(Scanner sc) {
  
  //입력-> 새로운 name, tel
  //처리-> 저장소(ArrayList)에 신규 저장
  //출력-> "신규 데이터 입력!" 메시지 출력
  //->크기는 자동 관리
  System.out.print("이름 입력 : ");
  String name = sc.next();
  System.out.print("전화번호 입력 : ");
  String tel = sc.next();
  
  Student stu = new Student();
  stu.setName(name);
  stu.setTel(tel);
  
  students.add(stu);
  
  System.out.printf("신규 데이터 입력 완료! %n%n");

 } 
 
 //2. 회원 전체 출력
 public void menuSelect() {

  //출력 -> 저장소(ArrayList)에 있는 모든 데이터
  //인원수 출력시 size() 메소드 호출
  //출력시 null 데이터는 자동 제외된다.
  System.out.printf("인원수:%d %n", students.size());
  System.out.println("---------------");
  System.out.println("이름 전화번호");
  System.out.println("---------------");
  for (Student student : students) {
   //System.out.println(student);
   System.out.println(student.toString());
  }
  System.out.println("---------------");
  System.out.println();
  
 }
 
}

 


//Main.java
package com.sist;

import java.util.Scanner;

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.println("2. 회원 입력");
   System.out.print("선택(1~2, 0-exit)?");
   int m = sc.nextInt();
   if (m==0) {
    break;
   }
   switch (m) {
   case 1: menu.menuSelect(); break;
   case 2: menu.menuInsert(sc); break;
   }
   
  }while(true);
  
  sc.close();  
  
 }

}

 

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

 

 

 

 

 

블로그 이미지

알 수 없는 사용자

,

------------------------------------
내부 클래스(inner class)

1. 클래스 내부에 클래스가 포함된 상태.

2. 내부 클래스 종류
- 인스턴스, static, 지역, 익명

3. 인스턴스 내부 클래스
- 클래스 내부에서 인스턴스 멤버(클래스)가 있는 것과 같은 상태.
- 메인 클래스가 객체 생성될 때 같이 생성된다.

 

//Sample110.java
package com.test;

//물리적 .java 파일 안에 class 정의를 두 개 이상 할 수 있다.

//public 접근 제어자 사용 불가
//논리적으로는 두 개의 클래스는 서로 독립된 상태이다.
class Sample111 {
 
}

//물리적 파일이름과 일치하는 클래스만
//public 접근 제어자 사용 가능
//논리적으로는 두 개의 클래스는 서로 독립된 상태이다.
public class Sample110 {

 
}

 


//Outer.java
package com.test;

public class Outer {

 //내부 클래스 선언
 //->바깥쪽 클래스의 멤버로서 클래스를 추가한다.
 //public 지정하는 경우보다는 private 접근 제어자 사용
 //public 내부 클래스는 바깥쪽에 독립적으로 선언하는 것이 더 효과적이다.
 public class Inner01 {
  public void method() {
   
  }
 }

 //클래스 내부에서 임시로 사용하는 클래스 자료형을
 //필요로 하는 경우 내부 클래스 선언.
 private class Inner02 {
  public void method() {
   
  }
 }
 
 public void method() {
  //내부 클래스 사용시
  //메소드 내부에서 객체 생성후 사용.
  Inner02 inner = new Inner02();
  inner.toString();
  inner.method();
 }
  
}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Outer outer = new Outer();
  //Outer 클래스의 public 멤버 접근
  outer.method();
  
  //내부 클래스가 포함된 클래스에서
  //내부 클래스의 멤버 접근
  Outer.Inner01 inner = new Outer().new Inner01();
  //Inner01 클래스의 public 멤버 접근
  inner.method();
  

 }

}

 

 


4. static 내부 클래스
- 클래스 내부에서 static 멤버(클래스)가 있는 것과 같은 상태.
- 메인 클래스가 객체 생성되는 것과 무관하게 메모리에 적재된다.
- static 키워드 추가


//Main.java
package com.test;

class Outer {
 
 public void outerMethod() {
  //static 내부 클래스의 멤버 접근은
  //클래스명.멤버명 형태로 접근 가능
  //객체 생성 과정 필요 없다.
  Inner.innerMethod();
  //객체 생성이 필요한 멤버
  new Inner().innerMethod2();
 }
 
 //멤버 중에 static 멤버가 있으면 static 클래스로 선언해야 한다.
 private static class Inner {
  public void innerMethod2() {
   //static 멤버가 아닌 일반 메소드 선언 가능
  }
  public static void innerMethod() {
   System.out.println("innerMethod() 메소드 호출!");
  }
 }
   
}

public class Main {

 public static void main(String[] args) {
  
  Outer obj = new Outer();
  obj.outerMethod();

 }

}

 

 

 

5. 지역 내부 클래스
- 메소드 내부에서 선언된 클래스
- 지역 변수와 같은 멤버가 된다.
- 메소드 내부에 메소드 선언은 안되지만, 지역 클래스를 이용해서 메소드를 선언할 수 있다.

//Main.java
package com.test;

class Outer {
 
 public void outerMethod() {
  int a = 0;

  //지역 클래스 선언
  class Inner {
   public void innerMethod() {
    System.out.println("innerMethod() 메소드 호출!");
   }
  }
  
  //지역 클래스의 멤버 호출
  new Inner().innerMethod();
  
 }
 
 public void outerMethod2() {
  //이 위치에서 Inner 클래스 멤버 접근 불가.
 }
   
}

public class Main {

 public static void main(String[] args) {
  
  Outer obj = new Outer();
  obj.outerMethod();

 }

}

 

 


6. 익명 클래스
- 클래스 선언에서 이름을 가지지 못한 클래스.
- 생성과 동시에 사용되고, 소멸되는 클래스 (1회용)
- 클래스 선언시 이름은 반드시 필요한데, 이름 없는 클래스인 익명 클래스는 이름을 사용하지 않는다.

일반 클래스 선언 형태
public class 클래스명 {
}

- 익명 클래스는 선언 과정이 없다. 생성 구문과 함께 바로 사용된다.
new 조상클래스() {
 //메소드 오버라이딩
}
또는
new 인터페이스() {
 //메소드 오버라이딩
}


Arrays.sort(members, new Comparator<User>() {

 @Override
 public int compare(User o1, User o2) {
  return o1.getName().compareTo(o2.getName());
 }
   
});

 

 

//Main.java -> AWT
package com.test;

import java.awt.*;
import java.awt.event.*;

public class Main {

 public static void main(String[] args) {
  
  Frame f = new Frame();
  f.setSize(300, 200);
  f.setLayout(null);
  
  Button btn = new Button("버튼");
  btn.setSize(150, 80);
  btn.setLocation(70, 50);
  
  f.add(btn);
  

  //실행후 윈도우의 x 버튼 클릭하면 프로그램 종료된다.
  f.addWindowListener(new WindowAdapter() {
   @Override
   public void windowClosing(WindowEvent e) {
    e.getWindow().setVisible(false);
    e.getWindow().dispose();
    System.exit(0);
   }
  });
  
  
  f.setVisible(true);
  
 }

}

 

 

--------------------------------------
로그인 절차가 필요한 회원 관리

실행예)
--- 회원 관리 ---
1. 회원 가입 (ID, PW, NAME, TEL)
2. 회원 명단 출력(로그인 필요)
3. 관리자 모드 (admin 로그인 필요)
선택(1~3, 0 종료)?1

ID: XXXX
PW: 1111
NAME: SSSS
TEL: 010-123-3211
회원 가입이 완료되었습니다.

--- 회원 관리 ---
1. 회원 가입 (ID, PW, NAME, TEL)
2. 회원 명단 출력(로그인 필요)
3. 관리자 모드 (admin 로그인 필요)
선택(1~3, 0 종료)?2

ID PW? XXXX 2222
아이디 또는 패스워드가 틀렸습니다.

--- 회원 관리 ---
1. 회원 가입 (ID, PW, NAME, TEL)
2. 회원 명단 출력(로그인 필요)
3. 관리자 모드 (admin 로그인 필요)
선택(1~3, 0 종료)?2

ID PW? XXXX 1111
ID   NAME   TEL
------------------
....

총 4명

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

//Member.java
package com.test;

//자료형 클래스
public class Member {
 
 //멤버변수, getter, setter
 //멤버변수 -> id, pw, name, tel -> String
 private String id, pw, name, tel;

 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getPw() {
  return pw;
 }

 public void setPw(String pw) {
  this.pw = pw;
 }

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

 //회원 정보 출력 전용 메소드 추가
 @Override
 public String toString() {
  return String.format("%s %s %s"
    , this.getId()
    , this.getName()
    , this.getTel());
 }
 
 
 

}

 

 


//MenuAction.java
package com.test;

import java.util.*;

//메뉴별 액션 처리 클래스
public class MenuAction {
 
 //저장소(배열) 준비
 private Member[] members;
 
 public MenuAction() {
  //저장소(배열) 생성 및 초기화
  members = new Member[5];
  this.init();
 }
 
 private void init() {

  //관리자 계정 추가
  //-> 아이디 중복 검사에서 사전 선점을 위한 조치.
  Member m = new Member();
  m.setId("admin");
  m.setPw("1234");
  m.setName("Administrator");
  m.setTel("010-123-1234");
  members[0] = m;
  
 }
 

 //1. 회원 가입 (ID, PW, NAME, TEL)
 public void memberInsert(Scanner sc) {
  
  //외부 데이터 입력 액션
  //->id, pw, name, tel
  //->저장소(배열)에 저장하는 액션
  //->저장소가 모자란 경우 자동 확장 -> private 메소드
  
  //저장소(배열) 여분 확인
  if (this.members.length == this.count()) {
   //저장소(배열) 확장 액션 진행
   this.expand();
  }
  
  //-----------------------------
  System.out.print("ID : ");
  String id = sc.next();
  //문제)
  //아이디 중복 검사 과정 추가->private 메소드
  //->true or false
  //-> 아이디 입력 액션 무한 실행
  //-------------------------------

  System.out.print("PW : ");
  String pw = sc.next();
  System.out.print("NAME : ");
  String name = sc.next();
  System.out.print("TEL : ");
  String tel = sc.next();
  
  Member member = new Member();
  member.setId(id);
  member.setPw(pw);
  member.setName(name);
  member.setTel(tel);
  
  this.members[this.count()] = member;
  
  System.out.println("신규 회원이 추가되었습니다.");
  
 }
 
 //2. 회원 명단 출력(로그인 필요)
 public void memberList(Scanner sc) throws Exception {
  
  //외부 데이터 입력 액션
  //->id, pw
  //->id, pw 검사 과정 -> 로그인 메소드
  //회원 명단 출력 액션
  //->인원수 출력 -> private 메소드

  this.login(sc);
  this.list();
  
 }
 
 private void list() {
  System.out.println("ID NAME TEL");
  for(Member a : members) {
   //ID, NAME, TEL 출력 (pw 제외)
   //-> null 제외
   if (a != null) {
    System.out.println(a);
    //System.out.println(a.toString());
   }
  }
 }
 
 //인원수 확인용 메소드->private 메소드
 private int count() {
  int result = 0;
  for(Member a : members) {
   if(a != null) {
    ++result;
   }
  }
  return result;
 }
 
 //저장소(배열) 확장 메소드
 private void expand() {
  //신규 배열 생성
  //기존 데이터 복사 -> for문 -> 배열 복사 명령 이용
  //신규 배열의 참조 주소를 기존 변수에 대입.
  Member[] temp = new Member[this.members.length + 5];
  System.arraycopy(this.members, 0, temp, 0, this.count());
  this.members = temp;
 }
 
 
 //로그인 액션 메소드
 private void login(Scanner sc) throws Exception {
  //ID, PW 외부 입력
  //저장소(배열) 확인
  //성공 여부 확인->성공 or 실패
  System.out.print("ID: ");
  String id = sc.next();
  System.out.print("PW: ");
  String pw = sc.next();
  if (!this.idCheck(id, pw)) {
   //로그인 실패->예외 발생->실행 중단
   //System.out.println("아이디 또는 패스워드가 틀렸습니다.");
   throw new Exception("아이디 또는 패스워드가 틀렸습니다.");  
  }
 }
 
 private boolean idCheck(String id, String pw) {
  boolean result = false;
  
  for (Member a : this.members) {
   if (a != null) {
    //ID는 대소문자 구분없이 철자만 검사
    //PW는 대소문자 구분하고 검사
    if (a.getId().equalsIgnoreCase(id)
      && a.getPw().equals(pw)) {
     result = true;
     break;
    }
   }
  }
  
  return result;
 }
 
 //3. 관리자 모드
 //-> 관리자 로그인 시도
 //-> 회원 전체 명단 출력
 //-> 회원 삭제 액션
 //-> 반복 실행 구문
 public void adminAction(Scanner sc) throws Exception {
  
  this.login(sc);
  
  do {
   this.list();
   System.out.print("특정 회원 정보를 삭제할까요(y/n)?");
   String response = sc.next();
   if (response.equalsIgnoreCase("n")) {
    break;
   }
   //삭제 액션 추가
   try {
    this.memberDelete(sc);
   }catch(Exception e) {
    System.out.println(e.toString());
   }
  }while(true);
 }
 
 //회원 삭제 메소드(관리자 전용)
 private void memberDelete(Scanner sc) throws Exception{
  System.out.print("ID: ");
  String id = sc.next();
  int idx = -1;
  for (int i=0; i<this.members.length; ++i) {
   Member member = this.members[i];
   if (member != null) {
    if (member.getId().equalsIgnoreCase(id)) {
     idx = i;
     break;
    }
   }
  }
  if (idx == -1) {
   //검색 결과 없습니다.->예외 발생->실행 중단
   throw new Exception("검색 결과 없습니다.");
  }

  //삭제 액션 진행
  this.members[idx] = null;
  Member[] temp = new Member[this.members.length];
  for (int i=0, j=0; i<this.members.length; ++i) {
   Member member = this.members[i];
   if (member != null) {
    temp[j++] = this.members[i];
   }
  }
  this.members = temp;
  System.out.println("회원 정보가 삭제되었습니다.");

 }
 
}

 

 

 

//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("--- 회원 관리 ---");
   System.out.println("1. 회원 가입(ID, PW, NAME, TEL)");
   System.out.println("2. 회원 전체 출력");
   System.out.println("3. 관리자 모드");
   System.out.print("선택(1~3,0-exit)?");
   
   int m = sc.nextInt();
   if (m==0) {
    break;
   }
   switch (m) {
   case 1: menu.memberInsert(sc); break;
   case 2: menu.memberList(sc); break;
   case 3: menu.adminAction(sc); break;
   }
   
  }while(true);
  
  sc.close();
  
 }

}

 

 

 

과제) 회원 가입시 아래 조건을 만족하도록 프로그램 수정.
1. ID 중복된 경우 가입 불가.
2. PW 입력시 영문자가 기본인 상태에서 최소 한 글자 이상의 영문자, 숫자, 특수문자 포함해서 5글자~10글자 허용.

ID: XXXX
-->중복된 아이디입니다.
ID: XXX12
PW: 1111
-->PW는 5~10글자, 최소 한 글자 이상 영문자, 숫자, 특수문자 포함
PW: abcd123$
NAME: SSSS
TEL: 010-123-3211
회원 가입이 완료되었습니다.


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  String str1 = "HELLO123";
  
  if (pwCheck(str1)) {
   System.out.println("A~Z 범위 내");
  } else {
   System.out.println("A~Z 범위 외");
  }
  
 }
 
 public static boolean pwCheck(String pw) {
  boolean check = true;
  for (int i=0; i<pw.length(); i++) {
   //System.out.println((int)str1.charAt(i));
   if (!(pw.charAt(i)>'A' && pw.charAt(i)<'Z')) {
    check = false;
   }
  }
  return check;
 }
 

}

 

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

1. 내부 클래스
- 인스턴스, static, 지역, 익명

익명 클래스 사용 예
new 조상클래스() {
}
또는
new 인터페이스() {
}

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

블로그 이미지

알 수 없는 사용자

,

------------------------------------------
예외처리

1. 프로그램 실행은 다음과 같은 절차에 의해 진행된다.
소스코드 작성 및 .java 파일 생성->컴파일->.class 파일 생성->실행

2. 소스코드 작성시 올바른 문법과 키워드를 사용했는지에 대한 검사는 컴파일 과정에서 검사되고, 오류가 있는 경우 컴파일이 완료되지 않는다.->컴파일 오류

3. 컴파일 과정이 정상적으로 진행되고 .class 파일이 생성되면 실행할 수 있다. 이때 실행시 논리적인 오류로 인해 실행이 안되는 경우가 있다->실행 오류

4. 실행 오류에는 비정상적인 종료를 막을 수 없는 오류(error)와 비정상적인 종료를 막을 수 있는 예외(exception)로 구분된다.
예외의 예는, 탐색기 프로그램을 실행하는 과정에서 CD를 필요로 하는 CD 드라이브 접근시 CD를 넣지 않은 상태에서 접근을 시도하면 'CD를 필요로 합니다'라는 메시지를 보여주고 접근 시도를 종료하는 것이다. 탐색기 프로그램의 비정상적인 종료는 되지 않는다.

5. 예외처리는 비정상적인 종료를 막을 수 있는 경우를 사전에 확인해서 처리하는 방법이다.

6. 예외처리 기본형식
try {
 //예외가 발생할 수 있는 구문
} catch (예외형식) {
 //예외 처리 구문
}

 

try {
 //예외가 발생할 수 있는 구문
} catch (하위예외형식) {
 //예외 처리 구문
} catch (상위예외형식) {
 //예외 처리 구문
} catch (최상위예외형식) {
 //예외 처리 구문
}

 


try {
 //예외가 발생할 수 있는 구문
} catch (예외형식) {
 //예외 처리 구문
} finally {
 //예외 발생과 관계없이 항상 실행해야 하는 구문
}

 

//Sample101.java
package com.test;

import java.util.*;

public class Sample101 {

 public static void main(String[] args) {
  
  Scanner sc = new Scanner(System.in);
  
  do {
   System.out.print("양의 정수(a, -1 exit)?");
   int a = sc.nextInt();
   if (a == -1) {
    break;
   }
   System.out.print("양의 정수(b)?");
   int b = sc.nextInt();
   
   /*
   //(정수1/정수2) 에서 정수2가 0이면 예외 발생
   //-> 비정상적인 종료
   System.out.printf("%d / %d = %d %n%n"
     , a, b, (a/b));
   */
   
   //예외처리
   //->비정상적인 종료를 막는다.
   try {
    //(정수1/정수2) 에서 정수2가 0이면 예외 발생
    System.out.printf("%d / %d = %d %n%n"
      , a, b, (a/b));
   } catch(Exception e) {
    System.out.printf("0으로 나눌 수 없습니다.%n%n");
    //System.out.println(e.getMessage());
    //System.out.println(e.toString());
   }
   
   
  }while(true);
  
  sc.close();

 }

}

 

 

6. 메소드 내부에서 직접 예외를 처리하는 것이 아니라 자기를 호출한 위치에서 예외를 처리하도록 예외를 밖으로 보낼 수 있다. throws 구문이 있는 메소드를 호출하는 곳에서는 반드시 예외를 처리해야 한다. 단, 자기 자신도 또다른 메소드인 경우는 throws 를 이용해서 예외를 밖으로 보낼 수 있다. 마지막 실행 메소드인 main() 메소드에서도 throws로 예외를 처리하는 경우는 JVM이 예외를 처리하게 된다.
-> throws 예외형식

접근지정자 반환자료형 메소드이름(매개변수) throws 예외형식 {
 //예외가 발생할 수 있는 구문
}

 

//Sample102.java
package com.test;

import java.util.*;

public class Sample102 {

 public static void main(String[] args) {

  Scanner sc = new Scanner(System.in);
  System.out.print("정수(a)?");
  //정수 입력 받는 과정이지만 자료형을 String으로 처리.
  String a = sc.next();
  System.out.print("정수(b)?");
  String b = sc.next();
  
  //java.lang.NumberFormatException 예외 발생 가능 -> 비정상적인 종료 가능
  int ia = Integer.parseInt(a); //String->int
  int ib = Integer.parseInt(b); //String->int
  
  //java.util.IllegalFormatConversionException 발생 가능 -> 비정상적인 종료 가능
  System.out.printf("%s + %s = %d %n"
    , a, b, (ia + ib));
  
  sc.close();
  
 }

}

 

 

7. 사용자가 예외를 발생시키려면 throw new 예외객체("메시지"); 구문을 사용한다.

 


//ExceptionTest.java
package com.test;

public class ExceptionTest {
 
 //산술식 분석 및 결과 반환 전용 메소드
 public static int operator(String a, String op, String b) throws Exception {
  int result = 0;
  
  if (op.equals("+")
    || op.equals("-")
    || op.equals("*")) {
   //정상 실행
   
   //+, -, * 연산 액션 추가
   
  } else {
   //예외 발생
   //-> return 구문에 관계없이 메소드 실행 중지
   //-> throw 구문 사용
   //-> throws 구문 추가
   throw new Exception("연산자 +, -, * 만 가능.");
  }
  
  return result;
 }

}

 


//Sample103.java
package com.test;

import java.util.*;

public class Sample103 {

 public static void main(String[] args) {
  
  Scanner sc = new Scanner(System.in);
  
  //외부에서 입력된 산술식 분석 및 결과 출력
  // a + b 또는 a - b, a * b
  // 산술식에서 산술연산자는 +, -, * 만 인정
  // 그 외에는 예외 발생.
  System.out.print("산술식(a 연산자 b)?");
  String a = sc.next();
  String op = sc.next();
  String b = sc.next();
  
  try {
   //산술식 분석 및 결과 반환 전용 메소드 호출
   //->예외 발생 가능
   //->예외 처리 구문 추가
   int result = ExceptionTest.operator(a, op, b);
   System.out.printf("%s %s %s = %d %n"
     , a, op, b, result);
  } catch(Exception e){
   System.out.println(e.toString());
  }
  
  sc.close();

 }

}

 

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

1. 프로그램에서 발생하는 예외(Exception)를 사용자가 처리함으로써 비정상적 종료를 막을 수 있다.

2.  try ~ catch, try ~ catch ~ catch ...,  try ~ catch ~ finally 구문 사용.

3. try 블럭에는 예외 발생 가능한 구문, catch는 예외를 처리하는 예외형식 및 예외 처리 구문 지정.

4. 예외 발생 가능한 구문을 포함하고 있는 메소드에서 예외를 자체적으로 처리하지 않고 밖으로 내보낼 수 있다.
-> throws 예외형식

5. 예외 상황을 만들어서 예외를 발생시킬 수 있다.
-> throw new 예외형식();

 

 


-----------------------------------------------
java.lang 패키지

 

String 클래스
- String 클래스에는 문자열을 저장하기 위해서 문자형 배열 변수릉 인스턴스 변수로 정의해놓고 있다.
- 한 번 생성된 문자열은 수정 불가능 상태가 된다(final 변수)

String a = "a";
String b = "b";
String a = a + b;
//"a", "b", "ab"가 독립적으로 존재하게 된다.
//더 이상 "a"는 참조주소를 저장하는 변수가 없기 때문에 가비지 컬렉터의 대상이 된다.
//-> StringBuffer, StringBuilder 클래스를 이용하게 되면 가비지가 발생하지 않는다. 문자열 객체를 내부적으로 수정할 수 있기 때문이다.

 

- String 클래스의 메소드
charAt()
concat()
contains()
endsWith()
equals()
equalsIgnoreCase()
indexOf()
lastIndexOf()
length()
replace()
replaceAll()
split()
startsWith()
substring()
toLowerCase()
toString()
toUpperCase()
trim()
valueOf()

//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  String str1 = "TEST";
  String str2 = new String("HELLO");
  
  //문자열의 특정 번째 문자 반환
  System.out.println(str1.charAt(0)); //char, 'T'
  System.out.println(str1.charAt(1)); //char, 'E'

  //문자열 결합
  System.out.println(str1.concat(str2)); //"TESTHELLO"
  System.out.println(str1 + str2); //"TESTHELLO"
  
  //문자열 검색(포함)
  System.out.println(str1.contains("LLO")); //false
  System.out.println(str2.contains("LLO")); //true
  
  //문자열 검색(시작, 끝 글자)
  System.out.println(str1.startsWith("T")); //true
  System.out.println(str1.endsWith("T")); //true
  
  //문자열 비교(대소문자 구분 하는 경우)
  System.out.println(str1.equals("test")); //false
  //문자열 비교(대소문자 구분 없는 경우)
  System.out.println(str1.equalsIgnoreCase("test")); //true
  
  //문자열 대소문자 변환
  System.out.println(str1.toLowerCase()); //"test"
  System.out.println(str1.toUpperCase()); //"TEST"
  
  //문자열 검색(위치)
  System.out.println(str1.indexOf("TE")); //0
  System.out.println(str1.indexOf("HE")); //-1
  
  //D:\Berryz_WebShare\webshare.exe
  //->D:\Berryz_WebShare
  //->webshare.exe
  String str3 = "D:\\Berryz_WebShare\\webshare.exe";
  System.out.println(str3.indexOf("\\")); //2
  System.out.println(str3.lastIndexOf("\\")); //18
  
  //문자열 분리
  System.out.println(str3.substring(str3.lastIndexOf("\\")+1)); //"webshare.exe"
  System.out.println(str3.substring(0, str3.lastIndexOf("\\"))); //"D:\Berryz_WebShare"
  
  //문자열 치환
  System.out.println(str3.replace('_', '-')); //"D:\Berryz-WebShare\webshare.exe"
  System.out.println(str3.replaceAll(".exe", ".zip")); //"D:\Berryz_WebShare\webshare.zip"
  
 }

}

 


--------------------------------------
과제) 로그인 절차가 필요한 회원 관리

실행예)
--- 회원 관리 ---
1. 회원 가입 (ID, PW, NAME, TEL)
2. 회원 명단 출력(로그인 필요)
선택(1~2, 0 종료)?1

ID: XXXX
PW: 1111
NAME: SSSS
TEL: 010-123-3211

(저장소가 모자란 경우 자동으로 확장(+5)하는 액션 진행)

회원 가입이 완료되었습니다.

--- 회원 관리 ---
1. 회원 가입 (ID, PW, NAME, TEL)
2. 회원 명단 출력(로그인 필요)
선택(1~2, 0 종료)?2

ID PW? XXXX 2222
아이디 또는 패스워드가 틀렸습니다.

--- 회원 관리 ---
1. 회원 가입 (ID, PW, NAME, TEL)
2. 회원 명단 출력(로그인 필요)
선택(1~2, 0 종료)?2

ID PW? XXXX 1111
ID   NAME   TEL
------------------
....

총 4명

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

 

//Member.java
package com.test;

//자료형 클래스
public class Member {
 
 //멤버변수, getter, setter
 //멤버변수 -> id, pw, name, tel -> String
 

}

 

 


//MenuAction.java
package com.test;

import java.util.*;

//메뉴별 액션 처리 클래스
public class MenuAction {
 
 //저장소(배열) 준비
 

 //1. 회원 가입 (ID, PW, NAME, TEL)
 public void memberInsert(Scanner sc) {
  
  //외부 데이터 입력 액션
  //->id, pw, name, tel
  //->저장소(배열)에 저장하는 액션
  //->저장소가 모자란 경우 자동 확장 -> private 메소드
  
 }
 
 //2. 회원 명단 출력(로그인 필요)
 public void memberList(Scanner sc) {
  
  //외부 데이터 입력 액션
  //->id, pw
  //->id, pw 검사 과정 -> private 메소드
  //회원 명단 출력 액션
  //->인원수 출력 -> private 메소드
  
 }
 
 //private 메소드
 
}

 


//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 {
   //메뉴 출력
   
   //메뉴 입력
   break;

   //메뉴 선택
   
   
  }while(true);
  
  sc.close();
  
 }

}

 

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


 

블로그 이미지

알 수 없는 사용자

,

------------------------------------
추상 클래스

추상의 사전적 의미 :
여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용.


1. 추상 클래스는 추상 메소드를 포함하고 있는 클래스이다. 단, 추상 메소드가 없어도 추상 클래스로 선언할 수 있다. 추상 클래스로 지정되면 객체 생성을 할 수 없다.

2. 추상 메소드는 메소드 정의만 있고, 구현이 없는 메소드이다. 메소드 구현을 하위 클래스에서 의무적으로 하도록 하기 위함이다. 추상 메소드는 현재 클래스를 상속받는 클래스가 공통적으로 사용하게 될 메소드를 정의만 하고, 실제 구현은 하위 클래스에서 하도록 만든 것이다.

3. 추상 메소드 기본 형식
접근지정자 abstract 반환자료형 메소드이름(매개변수리스트);

4. 추상 클래스 기본 형식
public abstract class 클래스이름 {
 //추상 메소드 멤버
}

 

예를 들어, 프린터 클래스가 있다면, 인쇄 기능은 모든 프린터의 공통 기능이지만 프린터마다의 방식이 다르므로 하위 클래스에서 구현하도록 하는 것이다.

public abstract class 프린터 {
 public abstract void 인쇄();
}

public class 잉크젯프린터 extends 프린터 {
 @Override
 public void 인쇄() {
  //잉크젯 방식 인쇄 실행
 }
}

public class 레이져프린터 extends 프린터 {
 @Override
 public void 인쇄() {
  //레이저 방식 인쇄 실행
 }
}

 

 


//Printer.java
package com.test;

//프린터 클래스들에 대한 공통적 요소를 모은 클래스
//-> 추상 클래스 정의
//-> 자기 자신은 객체 생성 불가
public abstract class Printer {
 
 //일반 메소드 형식
 /*
 public void print() {
  //기능 구현 X
 }
 */
 
 //추상 메소드 형식
 //-> 기능 구현은 없고, 메소드 이름만 존재하는 상태
 //-> 모든 프린터 클래스가 가져야될 공통 기능.
 //-> 추상 메소드 추가
 //-> 추상 메소드가 있는 클래스는 추상 클래스로 지정.
 public abstract void print();
 
 //일반 메소드 추가
 //추상 클래스는 객체 생성이 안되므로 직접 호출 불가
 //->하위 클래스의 객체를 통해서 호출 가능
 public int count() {
  int result = 0;
  //출력 매수를 계산하는 과정
  return result;
 }

}

 

 

 

 


//InkJetPrinter.java
package com.test;

//상위 클래스가 추상 클래스인 경우는
//추상 클래스의 추상 메소드를 반드시 오버라이딩 구현.
public class InkjetPrinter extends Printer {

 //의무적 오버라이딩
 @Override
 public void print() {
  //잉크젯 프린터의 인쇄 기능 구현
 }

 //선택적 오버라이딩
 @Override
 public String toString() {
  return "InkjetPrinter 클래스의 toString() 메소드";
 } 
 

}

 

 


//LaserPrinter.java
package com.test;

public class LaserPrinter extends Printer {

 //추상 클래스를 상속 받은 하위 클래스는
 //상위 클래스의 추상 메소드 멤버를 의무적으로 오버라이딩해야 한다.
 //메소드 내부에서 구체적인 구현 내용을 채워야 합니다.
 @Override
 public void print() {
  System.out.println("레이저 방식으로 인쇄 실행!");
 }
 
}

 

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  //추상 클래스는 객체 생성 불가
  //Printer printer = new Printer(); //X
  //printer.count(); //X
  //printer.print(); //X
  
  //하위 클래스는 객체 생성 가능
  InkjetPrinter printer = new InkjetPrinter();
  //Printer 클래스의 count() 메소드를
  //하위 클래스인 InkjetPrinter 클래스의
  //멤버로 인식.
  System.out.println(printer.count());
  printer.print();
  

 }

}

 

 

Wrapper 클래스의 상위 클래스인 Number 클래스(추상 클래스) 테스트
//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {

  //Number 클래스는 Wrapper 클래스의 상위 클래스입니다.
  //Number 클래스는 추상 클래스입니다.
  //-> 추상 메소드 포함된 상태
  //-> 객체 생성 불가
  //-> 상속한 하위 클래스를 통해서 멤버 접근 가능
  
  //추상 클래스이므로 객체 생성이 불가합니다.
  //Number number1 = new Number();
  
  //Integer 클래스는 기본생성자가 없기 때문에
  //매개변수 있는 생성자를 통해서 객체 생성 해야 합니다.
  //Number number1 = new Integer();
  Number number1 = new Integer(10);
  System.out.println(number1.intValue()); //10
  System.out.println(number1.doubleValue()); //10.0
  
  //Number 클래스에서의 doubleValue() 메소드
  /*
  public abstract double doubleValue();
  */
  
  //Integer 클래스에서의 doubleValue() 메소드
  /*
  public double doubleValue() {
   return (double)value;
  }
  */
  
 }

}

 

 

--------------------------------------
인터페이스(Interface)

1. 추상 메소드와 상수만을 멤버로 가질 수 있는 추상 클래스. 모든 멤버가 추상이므로 abstract 키워드를 사용하지 않는다. 추상 클래스이므로 객체 생성이 안된다. 인터페이스 이름은 일반적으로 ~able 형태로 작성한다.

2. 인터페이스 기본 형식

public interface 인터페이스명 {
 //상수 멤버
 //추상 메소드 멤버
}

3. 모든 멤버 변수는 public static final 인 상태이다. 생략 가능.

4. 모든 메소드 멤버는  public abstract 인 상태이다. 생략 가능.

5. 인터페이스는 인터페이스만 상속 받을 수 있고, 다중 상속 받을 수 있다.

public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2, ... {
}


6. 클래스는 상위 클래스를 한 개만 상속 받을 수 있지만, 인터페이스는 다중 상속 받을 수 있다.

public class 하위클래스 extends 상위클래스 implements 상위인터페이스1, 상위인터페이스2,... {
}

7. 인터페이스를 상속 받은 클래스는 인터페이스가 가진 멤버를 의무적으로 구현(implement)해야 한다.


8. 인터페이스는 클래스의 추상화에 필수적인 조건이다. 서로 관계 없는 클래스들끼리도 관계를 맺어줄 수 있다.

예를 들어,

A -> 커피숍 주인. 원두 커피 사용. B에게서 공급 받고 있다.
B -> 원두 커피 공급업자

=> A 와 B은 강한 결합 관계가 된다.
=> 강한 결합이기 때문에 B의 상황과 능력이 A에게 영향을 준다.
=> 약한 결과 관계를 만들기 위해서 중간 역할자를 부여한다.

A -> 커피숍 주인. 원두 커피 사용. C에게서 공급 받고 있다.
C -> 중간 역할자(도매상)
B1, B2,... -> 원두 커피 공급업자
=> 약한 결합이기 때문에 B1의 상황과 능력이 A에게 직접적으로 영향을 주지 않는다.
 B1을 대체할 수 있는 방법이 많이 존재하기 때문이다.

 

A 객체-> B1 객체를 사용해야 하는 상황. -> B1 객체를 직접 사용하지 않고, ( 인터페이스 ) 를 통해서 사용하도록 조정. -> B1 객체 대신 B2, B3 객체로 바꿔서 사용할 수 있다.

인터페이스 -> 중간 역할. B1, B2, B3 객체의 추상 클래스.

B1 객체 -> 대체 객체로서 B2, B3, ... 등이 존재.

 

--------------------------------------------
추상화

- 클래스간의 결합에서 A와 B가 직접적인 연결을 하는 것이 아니라, 인터페이스를 통해서 연결함으로써 A와 B의 연결을 간접적으로 연결하고, B의 상태가 변화(C로 바뀌는 경우) 하더라도 A에는 영향을 최소화 할 수 있는 상태를 만드는 것.


추상화 전 상태
//Sample35.java
package com.test;

public class Sample35 {
 
 private Sample36 sample;
 //Sample36에서 Sample37로 대체하려면
 //-> private Sample37 sample;
 
 //Sample35 객체의 생성자에서
 //Sample36 클래스의 객체 생성 과정이 포함되어 있다.
 //Sample35와 Sample36은 강한 결합 상태이다.
 public Sample35() {
  sample = new Sample36();
  //Sample36에서 Sample37로 대체하려면
  //-> sample = new Sample37();
 }
 
 public String method() {
  return sample.toString();
 }

}

 


//Sample36.java
package com.test;

public class Sample36 {

 @Override
 public String toString() {
  return String.format("Sample36 클래스의 toString() 메소드");
 }

}

 


//Sample37.java
package com.test;

//Sample36 클래스의 대체 클래스 예정
public class Sample37 {

 @Override
 public String toString() {
  return String.format("Sample37 클래스의 toString() 메소드");
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  //사용자는 Sample35 객체만 생성했지만
  //내부적으로는 Sample36 객체도 생성된다.
  Sample35 sample = new Sample35();
  System.out.println(sample.method()); //"Sample36 클래스의 toString() 메소드"

 }

}

 


추상화 후 상태 (인터페이스 추가)
//Sample.java
package com.test;

public interface Sample {
 
 void method();

}

 


//Sample35.java
package com.test;

public class Sample35 {
 
 private Sample sample;
 //Sample36에서 Sample37로 대체하려면
 //->수정 사항 없음
 
 //Sample35 객체의 생성자에서
 //외부에서 Sample36, Sample37 클래스의 객체를 얻어오는 과정이 포함되어 있다.
 //Sample35와 Sample36, Sample37은 약한 결합 상태이다.
 public Sample35(Sample sample) {
  this.sample = sample;
  //Sample36에서 Sample37로 대체하려면
  //-> 수정 사항 없음
 }
 
 public String method() {
  return sample.toString();
 }

}

 

 

//Sample36.java
package com.test;

public class Sample36 implements Sample {

 @Override
 public String toString() {
  return String.format("Sample36 클래스의 toString() 메소드");
 }

 @Override
 public void method() {
 }

}

 

 

//Sample37.java
package com.test;

//Sample36 클래스의 대체 클래스 예정
public class Sample37 implements Sample {

 @Override
 public String toString() {
  return String.format("Sample37 클래스의 toString() 메소드");
 }

 @Override
 public void method() {
 }

}

 

 

//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {

  //Sample36 객체는 별도 생성합니다.
  Sample36 sample36 = new Sample36();
  //Sample37 객체는 별도 생성합니다.
  Sample37 sample37 = new Sample37();
  
  //사용자는 Sample35 객체를 생성하는 과정에서
  //Sample36 객체를 주입하는 과정이 실행 된다.
  //Sample36에서 Sample37로 대체하려면
  //생성자 매개변수 값으로 sample36 -> sample37로 수정하면 된다.
  Sample35 sample = new Sample35(sample37);
  System.out.println(sample.method()); //"Sample36 클래스의 toString() 메소드"

 }

}

 

-------------------------------------------------
과제)외부에서 데이터(이름, 전화번호)를 입력 받아서 메모리에 저장하고 출력, 검색할 수 있는 회원 입력, 출력 프로그램 작성.
회원 입력시 배열 저장소의 공간이 모자란 경우 배열 저장소의 크기를 확장(2배)하는 기능 추가.

실행 예)
---- 회원관리 ----
1. 회원 전체 출력
2. 회원 입력
3. 회원 검색
선택(1~3, 0 종료)?

//Student.java -> 회원 한 명분의 정보 저장용 클래스. 이름, 전화번호 항목으로 구성.
//MenuAction.java -> 메뉴 액션 클래스. 최초 입력시 회원 n명까지 저장할 수 있는 배열 생성. 배열의 자료형은 Student 클래스로 지정.
//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;

 }
 
 
 //1. 회원 입력
 public void menuInsert(Scanner sc) {
  //문제) 신규 정보 등록 과정 추가
  
  //배열 크기 및 여분 확인 -> 입력 가능 여부 결정
  //입력-> 새로운 name, tel
  //처리-> 저장소(배열)에 신규 저장
  //출력-> "신규 데이터 입력!" or "저장소 full!" 메시지 출력
  if (students.length > this.count()) {
   System.out.print("이름 입력 : ");
   String name = sc.next();
   System.out.print("전화번호 입력 : ");
   String tel = sc.next();
   Student stu = new Student();
   stu.setName(name);
   stu.setTel(tel);
   students[this.count()] = stu;
   System.out.printf("신규 데이터 입력 완료! %n%n");
  } else {
   System.out.printf("저장소 Full! %n");
   
   //확장 여부 확인
   System.out.print("저장소를 확장하시겠습니까(y/n)?");
   String response = sc.next();
   if (response.equalsIgnoreCase("Y")) {

    //문제) 확장 액션 진행
    //-> private 메소드
    this.expand();
    
    System.out.printf("저장소가 확장되었습니다.%n%n");
   }
   
  }  
  
  
 }
 
 //저장소 확장 액션 메소드
 private void expand() {

  //신규 임시 배열 준비
  //-> 크기는 기존 배열의 2배 또는 5칸 증가
  //기존 배열의 데이터를 임시 배열로 복사 -> 반복문
  //신규 임시 배열의 참조주소를
  //기존 배열 참조주소를 저장한 변수(students)에 덮어쓰기.
  
 
 }
 
 //2. 회원 전체 출력
 public void menuSelect() {
  
  //출력 -> 저장소(배열)에 있는 모든 데이터
  /*
  for (int i=0; i<students.length; ++i) {
   Student student = students[i];
   if (student != null) {
    //System.out.println(student.toString());
    System.out.println(student);
   }
  }
  */

  System.out.printf("인원수:%d %n", this.count());
  System.out.println("---------------");
  System.out.println("이름 전화번호");
  System.out.println("---------------");
  for (Student student : students) {
   if (student != null) {
    System.out.println(student);
   }
  }
  System.out.println("---------------");
  System.out.println();
 }
 
 
 //인원수 메소드 -> private
 private int count() {
  int result = 0;
  
  //문제) 저장소(배열)에 들어있는 데이터의 갯수 확인
  for (int i=0; i<students.length; ++i) {
   Student student = students[i];
   if (student != null) {
    ++result;
   }
  }  
  
  return result;
 }
 
 
 //3. 회원 검색
 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.println("2. 회원 입력");
   System.out.println("3. 회원 검색");
   System.out.print("선택(1, 0-exit)?");
   int m = sc.nextInt();
   if (m==0) {
    break;
   }
   switch (m) {
   case 1: menu.menuSelect(); break;
   case 2: menu.menuInsert(sc); break;
   case 3: menu.menuSearch(sc); break;
   }
   
  }while(true);
  
  sc.close();

 }

}

 

 


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

1. 추상 클래스의 특징
- 추상 메소드가 포함된 클래스
- 추상 메소드 : 메소드 정의만 있고, 구현 내용이 없는 메소드.
- abstract 키워드 사용
- 추상 클래스는 객체 생성 안된다.
- 추상 클래스에 일반 멤버(생성자, 멤버변수, 메소드) 포함할 수 있다.
- 추상 클래스를 상속 받은 하위 클래스는 반드시 추상 메소드에 대한 오버라이딩을 구현해야 한다.


2. 인터페이스
- 클래스의 추상화
- 인터페이스를 이용하면 클래스간의 관계를 약한 결합으로 만들 수 있다.
- 인터페이스는 모든 멤버가 추상이므로, abstract 키워드를 생략한다.
public interface 인터페이스명 {
 //추상 멤버
}

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

 

 

 

 

 

 

 

 

 

블로그 이미지

알 수 없는 사용자

,

-----------------------------------------
제어자(Modifier)


1. 제어자는 외부에서 멤버의 접근을 제한하는 접근 제어자와 멤버의 상태를 제한하는 제어자가 있다.

2. 접근 제어자 종류
- private : 같은 클래스 내부에서만 접근 가능
- (default) : 접근지정자 표기하지 않은 경우. 같은 패키지 내부에서만 접근 가능
- protected : 상위 클래스에서 protected 접근 지정자를 지정한 멤버는 하위 클래스에서만 접근 가능. 단, 같은 패키지에서도 접근 가능.
- public : 모든 경우에서 접근 가능


private 생성자 테스트
//Sample39.java
package com.test;

//private 생성자를 가진 클래스는
//상속하는 과정에서 super() 생성자 호출이 안되므로
//상속 불가 클래스로 만드는 것이 좋다.
//-> final 키워드
public final class Sample39 {
 
 //private 접근 제어자를 가진 생성자 지정
 private Sample39() {
  System.out.println("Sample39 클래스의 생성자 호출!");
 }
 
 //생성자가 private이므로 인스턴스 멤버는 접근 불가.
 //-> 모든 멤버는 static 상태가 되어야 한다.
 public static void method() {
  System.out.println("Sample39 클래스의 메소드 호출");
 }

}

 

 


//SubSample39.java
package com.test;

//private 생성자를 가진 클래스는 상속이 불가능하므로
//상속이 불가능한 클래스임을 알려주는 것이 좋다.
//-> final 키워드
public class SubSample39 extends Sample39 {
 
 //SubSample39의 기본생성자는 Sample39의 생성자(super 생성자)를 필요로 한다.
 
 //생략된 멤버? -> 기본 생성자
 public SubSample39() {
  //생략된 구문? -> super();
  super(); //->private 생성자는 접근 불가
 }

}

 

 

 

//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  //객체 생성 -> 생성자 호출 -> 생성자의 접근제어자가 private 상태임.
  //객체 생성이 되지 않으면 인스턴스 멤버 접근도 할 수 없다.
  //인스턴스 멤버 사용할 수 없다는 의미.
  //인스턴스 멤버가 전혀 없는 상태라는 의미.
  //-> 객체 생성 과정 불필요.
  //-> 생성자 호출 차단
  //-> private 접근 제어자 지정
  
  //Sample39 s39 = new Sample39();
  //s39.method();
  
  Sample39.method();

 }

}

 

 


//PrivateFinalTest.java
package com.test;


//private 생성자가 포함된 클래스를 상속 받는 경우
//상속 받은 클래스가 객체 생성하는 과정에서
//super() 생성자 호출 부분이 실행되지 않는다.
//-> final 클래스 지정 필요
public final class PrivateFinalTest {
 
 //추가 객체가 만들어지지 않도록 하기 위한 멤버 변수 추가
 private static PrivateFinalTest obj;

 //private 생성자 추가
 private PrivateFinalTest() {
  
 }
 
 //객체 생성을 위한 전용 메소드 추가
 //싱글톤 디자인패턴
 public static PrivateFinalTest getInstance() {
  if (obj == null) {
   obj = new PrivateFinalTest();
  }
  return obj;
 }
 
 //현재 클래스 내부에 모든 메소드가 static 상태인 경우
 //현재 클래스에 대한 객체 생성 과정이 필요 없는 경우가 있다.
 //-> private 생성자
 //-> 객체 생성 불가
 public static void method() {
  
 }

}

 

 

//SubClass.java
package com.test;

public class SubClass extends PrivateFinalTest {

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  //private 생성자이므로 객체 생성 불가
  //PrivateFinalTest test = new PrivateFinalTest();
  
  //static 멤버는 접근 가능
  PrivateFinalTest.method();
  
  //getInstance() 메소드를 이용한 객체 획득
  //객체가 추가로 만들어지지 않도록 하는 것이 목적
  PrivateFinalTest test2 = PrivateFinalTest.getInstance();
  System.out.println(test2.toString());
  PrivateFinalTest test3 = PrivateFinalTest.getInstance();
  System.out.println(test3.toString());

 }

}

 

---------------------------------------------
싱글톤 기법

//Singleton01.java
package com.test;

public class Singleton01 {
 
 //일반적으로 클래스의 객체 생성을 위해서
 //생성자를 추가한다.
 //기본생성자->자동 추가
 //생성자 역할 -> 멤버변수 초기화
 //생성자 호출 -> new 연산자를 이용한 객체 생성시
 public Singleton01() {
  
 }

}

 


//Singleton02.java
package com.test;

public final class Singleton02 {
 
 //객체 생성 과정을 위한 전용 메소드 추가
 //한 개의 객체만 생성되도록 제한
 //-> Singleton
 //-> private 생성자 준비
 //-> 객체 제공 전용 메소드 준비
 
 //private 생성자
 //-> 사용자가 클래스의 객체를 직접 생성 불가능
 private Singleton02() {
  
 }
 
 //객체 제공 전용 (인스턴스)메소드
 /*
 public Singleton02 getInstance() {
  return new Singleton02();
 }
 */
 
 //객체 제공 전용 (스태틱)메소드
 //-> new 연산자 제한이 없는 상태라서 객체가 여러개 생성될 수 있다.
 /*
 public static Singleton02 getInstance() {
  return new Singleton02();
 }
 */
 
 //객체 제공 전용 (스태틱)메소드
 //-> new 연산자 제한
 //-> 한 개의 객체만 제공
 //-> Singleton 기법
 private static Singleton02 obj; //null
 public static Singleton02 getInstance() {
  //현재 메소드를 최초 호출시
  //if문을 만족하고 객체 생성 과정 실행
  //객체의 참조 주소를 obj 변수에 저장
  //다음에 호출되는 경우는
  //obj 변수에 이미 객체의 참조 주소가 저장된 상태이므로
  //if문 실행 없이 기존의 값 반환
  if (obj == null) {
   obj = new Singleton02();
  }
  return obj;
 }
 

}

 


//Main.java
package com.test;

import java.util.Calendar;

public class Main {

 public static void main(String[] args) {

  //일반적인 객체 생성 과정
  Singleton01 singleton01 = new Singleton01();
  //toString() -> Object 클래스
  //객체 정보(패키지이름.클래스이름@해쉬코드) 출력
  System.out.println(singleton01.toString());

  //같은 자료형을 가진 다른 객체 생성 -> new 연산자
  Singleton01 singleton02 = new Singleton01();
  //해쉬코드가 다른 경우 다른 객체이다.
  System.out.println(singleton02.toString());
  
  //클래스의 객체를 한 개만 생성되도록 하려면?
  //-> new 연산자 사용 제한
  //-> private 생성자 준비
  //-> 객체 제공 전용 메소드 호출
  //-> ?
  
  //Singleton02 singleton03 = new Singleton02(); //X
  
  //-> 객체 제공 전용 메소드 호출 -> 인스턴스 -> 호출 불가능
  //singleton03.getInstance(); //X
  
  //-> 객체 제공 전용 메소드 호출 -> 스태틱 -> 호출 가능
  /*
  Singleton02 singleton03 = Singleton02.getInstance(); //O
  System.out.println(singleton03.toString());
  */
  
  //같은 자료형을 가진 다른 객체 생성 -> new 연산자
  /*
  Singleton02 singleton04 = Singleton02.getInstance(); //O
  System.out.println(singleton04.toString());
  */
  
  //Singleton 기법이 적용된 메소드 호출
  Singleton02 singleton05 = Singleton02.getInstance(); //O
  System.out.println(singleton05.toString());
  //같은 자료형을 가진 같은 객체
  Singleton02 singleton06 = Singleton02.getInstance(); //O
  System.out.println(singleton06.toString());
  
  //new 연산자 제한
  //Calendar cal0 = new Calendar(); //X
  
  //객체 제공 메소드 호출
  Calendar cal1 = Calendar.getInstance();
  System.out.println(cal1.toString());
  Calendar cal2 = Calendar.getInstance();
  System.out.println(cal2.toString());
  
 }

}

 

 

 

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

 

 

 

//GetSet.java
package com.test;

public class GetSet {
 
 //default 접근제어자를 지정한 멤버변수
 //외부에서 멤버변수를 직접 접근 가능한 상태
 //멤버변수에 저장될 데이터에 대한 검증과정 추가 불가능
 //내부적으로 kor, eng, mat는 0~100 사이의 점수만 취급 예정.
 //int kor, eng, mat;
 
 //내부적인 기준을 검사하는 과정을 추가하기 위해서
 //외부에서 직접 접근 불가능하도록 설정
 private int kor, eng, mat;

 //내부적인 기준을 검사하는 과정을 추가하기 위해서
 //멤버변수만을 위한 getter, setter 메소드 추가
 public void setKor(int kor) {
  if (kor>=0 && kor<=100) {
   this.kor = kor;
  } else {
   System.out.println("범위(0~100)를 벗어나는 데이터입니다.");
  }
 }
 public void setEng(int eng) {
  if (eng>=0 && eng<=100) {
   this.eng = eng;
  } else {
   System.out.println("범위(0~100)를 벗어나는 데이터입니다.");
  }
 }
 public void setMat(int mat) {
  if (mat>=0 && mat<=100) {
   this.mat = mat;
  } else {
   System.out.println("범위(0~100)를 벗어나는 데이터입니다.");
  }
 }
 
 public int total() {
  return kor + eng + mat;
 }
 
}

 

 

//GetSetTest.java
package com.test;

public class GetSetTest {

 public static void main(String[] args) {
  
  GetSet test = new GetSet();
  
  //외부에서 직접 멤버변수에 접근해서 데이터 저장 가능
  //외부에서 내부적인 기준을 알 수 없기 때문에
  //무작위의 데이터 입력 가능
  /*
  test.kor = 200;
  test.eng = 100;
  test.mat = 100;
  */
  
  //getter, setter 등록을 하면
  //setter() 메소드를 이용해서
  //데이터 입력 처리
  //내부적인 기준을 만족하는 데이터만 입력 가능
  test.setKor(200);
  test.setEng(100);
  test.setMat(100);
  
  System.out.println(test.total());
  

 }

}

 

 

 


3. 멤버의 상태를 제한하는 제어자
- static : 멤버의 상태를 static 상태로 지정
- final : 멤버의 상태를 최종 상태로 지정. 변형 불가.
- abstract : 멤버의 상태를 추상으로 지정. 구현 불가.


//Sample40.java
package com.test;

//클래스에 final 키워드 사용시 상속 불가
public final class Sample40 {

}

 

//SubSample40.java
package com.test;

//클래스에 final 키워드 사용시 상속 불가
public class SubSample40 extends Sample40 {

}

 

//Sample41.java
package com.test;

public class Sample41 {
 
 //멤버에 final 키워드 사용시 오버라이딩 금지
 public final void method1() {
  System.out.println("final 키워드가 있는 메소드!");
 }

 public void method2() {
  System.out.println("final 키워드가 있는 메소드!");
 }

}

 


//SubSample41.java
package com.test;

public class SubSample41 extends Sample41 {

 //멤버에 final 키워드 사용시 오버라이딩 금지
 @Override
 public void method1() {
 }

 @Override
 public void method2() {
 }
  
}

 

 

//Sample42.java
package com.test;

public class Sample42 {
 
 //멤버변수(field)에 final 키워드 사용한 경우는
 //변수의 값(초기값)에 대한 변형 불가
 //초기값 지정 방법 -> 초기화 구문, 초기화 블럭, 생성자
 private final int a = 10;
 private final int b;
 
 public Sample42() {
  this.b = 20;
 }

 public Sample42(int b) {
  this.b = b;
 }

 public int getA() {
  return a;
 }

 public int getB() {
  return b;
 }
 
 //final 키워드가 지정된 멤버변수에
 //초기화 과정 이후의 대입문 사용은 불가
 public void setA(int a) {
  this.a = a;
 }
 
 public void setB(int b) {
  this.b = b;
 }

}

 

----------------------------------------------
상수
- 정해진 값을 변경하지 않고 그대로 사용하는 수.
- static final
- 상수명은 대문자로 표기

public static final int   MAX_VALUE = 0x7fffffff;


public class 클래스 {
 public static final 자료형 상수명 = 값;
}

 

 


-------------------------------------------------
과제)외부에서 데이터(이름, 전화번호)를 입력 받아서 메모리에 저장하고 출력, 검색할 수 있는 회원 입력, 출력 프로그램 작성.
회원 저장용 저장소(배열) 생성시 회원의 수는 사용자가 결정.

실행 예)
---- 회원관리 ----
1. 회원 입력
2. 회원 전체 출력
3. 회원 검색(이름 기준)
선택(1~3, 0 종료)?

//Student.java -> 회원 한 명분의 정보 저장용 클래스. 이름, 전화번호 항목으로 구성.
//MenuAction.java -> 메뉴 액션 클래스. 최초 입력시 회원 n명까지 저장할 수 있는 배열 생성. 배열의 자료형은 Student 클래스로 지정.
//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;
  */

 }
 
 
 //1. 회원 입력
 public void menuInsert(Scanner sc) {
  //문제) 신규 정보 등록 과정 추가
  
  //배열 크기 및 여분 확인 -> 입력 가능 여부 결정
  //입력-> 새로운 name, tel
  //처리-> 저장소(배열)에 신규 저장
  //출력-> "신규 데이터 입력!" or "저장소 full!" 메시지 출력
  if (students.length > this.count()) {
   System.out.print("이름 입력 : ");
   String name = sc.next();
   System.out.print("전화번호 입력 : ");
   String tel = sc.next();
   Student stu = new Student();
   stu.setName(name);
   stu.setTel(tel);
   students[this.count()] = stu;
   System.out.printf("신규 데이터 입력 완료! %n%n");
  } else {
   System.out.printf("저장소 Full! %n%n");
  }  
  
  
 }
 
 //2. 회원 전체 출력
 public void menuSelect() {
  
  //출력 -> 저장소(배열)에 있는 모든 데이터
  /*
  for (int i=0; i<students.length; ++i) {
   Student student = students[i];
   if (student != null) {
    //System.out.println(student.toString());
    System.out.println(student);
   }
  }
  */

  System.out.printf("인원수:%d %n", this.count());
  System.out.println("---------------");
  System.out.println("이름 전화번호");
  System.out.println("---------------");
  for (Student student : students) {
   if (student != null) {
    System.out.println(student);
   }
  }
  System.out.println("---------------");
  System.out.println();
 }
 
 
 //인원수 메소드 -> private
 private int count() {
  int result = 0;
  
  //문제) 저장소(배열)에 들어있는 데이터의 갯수 확인
  for (int i=0; i<students.length; ++i) {
   Student student = students[i];
   if (student != null) {
    ++result;
   }
  }  
  
  return result;
 }
 
 
 //3. 회원 검색
 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.println("2. 회원 입력");
   System.out.println("3. 회원 검색");
   System.out.print("선택(1, 0-exit)?");
   int m = sc.nextInt();
   if (m==0) {
    break;
   }
   switch (m) {
   case 1: menu.menuSelect(); break;
   case 2: menu.menuInsert(sc); break;
   case 3: menu.menuSearch(sc); break;
   }
   
  }while(true);
  
  sc.close();

 }

}

 

 


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

1. 멤버의 접근을 제한하는 제어자
- private
- (default)
- protected
- public

2. 멤버의 상태를 제한하는 제어자
- static
- final

3. private 생성자의 특징

4. final 키워드를 붙인 클래스, 멤버, 지역 변수의 특징

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

 

 

 


 

블로그 이미지

알 수 없는 사용자

,

-------------------------------
메소드 오버로딩(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)
- 상위, 하위 클래스 내에서 동일한 메소드에 대한 재정의.
- 메소드 시그니처는 동일하되, 구현 내용이 다른 경우.


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

 

 

'JavaSE' 카테고리의 다른 글

22일차_추상클래스,인터페이스, 회원관리_배열  (1) 2015.06.21
21일차_제어자, 싱글톤, 회원관리_배열  (0) 2015.06.21
19일차_상속  (0) 2015.06.21
18일차_상속  (0) 2015.06.21
17일차_멤버변수  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,