HashMap
- Key, Value의 쌍으로 구성된 데이터 구조
- Key 값을 이용하여 데이터에 접근할 수 있음
- Key 값은 정수, 문자 등 다양한 타입으로 지정 가능
- 선언 문법
Map<Key타입, Value타입> [map 객체이름] = new HashMap<>();
// Key 가 정수, Value가 String 이라면
Map<Integer , String> map1 = new HashMap<>();
//Key가 long Value 가 MemberDTO라면
Map<Long , MemberDTO> map2 = new HashMap<>();
- map에 데이터 저 저장
a. put(): 데이터 저장
put(key 이름 , 저장할 데이터);
b. get(): 데이터 꺼내기
map이름.get(key이름);
c. remove(): 삭제
map이름.remove(key이름);
- 반복문으로 map 데이터 접근
- key로 이루어진 Set 객체를 만들고 이를 반복문으로 접근한 뒤 반복문 안에서 get() 활용
// Key 가 정수, Value가 String 이라면
Map<Integer , String> map1 = new HashMap<>();
// map1에 반복문 적용
for(Integer i : map.keySet()){
System.out.println(map1.get(i));
}
<예문>
package ch13_map;
import java.util.HashMap;
import java.util.Map;
public class Ex01_MapBasic {
public static void main(String[] args) {
// key: 정수(int) , value: String
Map<Integer, String> map1 = new HashMap<>();
map1.put(1, "안녕");
map1.put(2, "hello");
// map1.put(3, 100); // value 타입 불일치
// map1.put("4","안녕하세요"); // key 타입 불일치
//key가 1인 데이터
System.out.println(map1.get(1));
String s1 = map1.get(2);
System.out.println("s1 = " + s1);
map1.put(100, "ㅎㅎㅎㅎㅎ");
// 동일한 키에 다른 데이터를 넣는다면
map1.put(1, "안녕하십니까");
System.out.println(map1.get(1));
// 반복문으로 접근
for (Integer i : map1.keySet()) {
System.out.println("i = " + i);
}
// key:String , value: Sting
Map<String, String> map2 = new HashMap<>();
map2.put("가", "안녕");
map2.put("나", "ㅎㅎㅎ");
map2.put("a", "ㅋㅋㅋ");
System.out.println(map2.get("a"));
//반복문
for (String s : map2.keySet()) {
System.out.println(map2.get(s));
}
Map<Long , String> map3 = new HashMap<>();
String ss1 = map3.put(1L , "안녕");
System.out.println("ss1 = " + ss1);
String ss2 = map3.put(2L , "hello");
System.out.println("ss2 = " + ss2);
String ss3 = map3.put(1L , "안녕하세요");
System.out.println("ss3 = " + ss3);
}
}
HashMap은 ArrayList와 비슷하지만 다른 점은 데이터 저장 방식이다
HashMap은 키 - 값 쌍으로 데이터를 저장하고 키는 데이터를 식별하는 데 사용하는 고유한 값이고 값은 키에 해당하는 데이터이고
arrayList는 순차적으로 데이터 값을 저장하게된다 각 데이터는 인덱스가 할당되어 있으며 인덱스를 사용하여 데이터에 접근할 수 있다
HashMap은 키를 사용하여 데이터에 바로 접근을 할 수 있지만 ArrayList는 인덱스를 사용하여 데이터에 접근해야 하므로 HashMap에 비해 검색 성능이 떨어지고 HashMap은 데이터를 추가하거나 삭제하면 테이블의 인덱스를 조정할 필요가 없기 때문에 arrayList 보다 성능이 더 좋다
arrayList는 순차적으로 데이터를 저장하고 검색하는데 적절하고
HashMap은 키와 값을 저장하고 검색하는데 적합하다
HashMap은
- 이름과 나이를 저장하는 경우
- 상품 코드와 상품 정보를 저장하는 경우
- URL과 페이지 내용을 저장하는 경우
에 적합하고
ArrayList는
- 숫자 목록을 저장하는 경우
- 문자열 목록을 저장하는 경우
- 물품 목록을 저장하는 경우
에 적합하다
<예제> 도서등록을 HashMap을 이용하여 구현
-DTO-
package ch13_map.ex02;
public class BookDTO {
private Long id;
private String bookTitle;
private String bookAuthor;
private int bookPrice;
private String bookPublisher;
public void setId(Long id) {
this.id = id;
}
public void setBookTitle(String bookTitle) {
this.bookTitle = bookTitle;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
public void setBookPrice(int bookPrice) {
this.bookPrice = bookPrice;
}
public void setBookPublisher(String bookPublisher) {
this.bookPublisher = bookPublisher;
}
public Long getId() {
return id;
}
public String getBookTitle() {
return bookTitle;
}
public String getBookAuthor() {
return bookAuthor;
}
public int getBookPrice() {
return bookPrice;
}
public String getBookPublisher() {
return bookPublisher;
}
public BookDTO(){
}
private static Long idValue=1L;
public BookDTO (String bookTitle , String bookAuthor , int bookPrice , String bookPublisher){
this.id =idValue++;
this.bookTitle = bookTitle;
this.bookAuthor = bookAuthor;
this.bookPrice = bookPrice;
this.bookPublisher = bookPublisher;
}
@Override
public String toString() {
return "BookDTO{" +
"id=" + id +
", bookTitle='" + bookTitle + '\'' +
", bookAuthor='" + bookAuthor + '\'' +
", bookPrice='" + bookPrice + '\'' +
", bookPublisher='" + bookPublisher + '\'' +
'}';
}
}
-Main-
package ch13_map.ex02;
import java.util.Scanner;
public class BookMain {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
boolean run = true;
int selectNo = 0;
// bookService 클래스 객체 선언
BookService bookService = new BookService();
while (run) {
System.out.println("-----------------------------------------------------------------------------------------");
System.out.println("1.도서등록 | 2.도서목록 | 3.도서조회(id) | 4.도서조회(제목) | 5.가격수정 | 6.도서삭제 | 7.도서검색 | 0.종료");
System.out.println("-----------------------------------------------------------------------------------------");
System.out.print("선택> ");
selectNo = scan.nextInt();
if (selectNo == 1) {
// 호출하는 문장 작성
System.out.println("도서를 등록하세요");
bookService.save();
} else if (selectNo == 2) {
// 호출하는 문장 작성
bookService.findAll();
} else if (selectNo == 3) {
// 호출하는 문장 작성
bookService.findById();
} else if (selectNo == 4) {
// 호출하는 문장 작성
// bookService.findByTitle();
} else if (selectNo == 5) {
// 호출하는 문장 작성
bookService.update();
} else if (selectNo == 6) {
// 호출하는 문장 작성
bookService.delete();
} else if (selectNo == 7) {
bookService.search();
} else if (selectNo == 0) {
run = false;
}
}
}
}
-Repository-
package ch13_map.ex02;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BookRepository {
private static Map<Long , BookDTO> bookDTOMap = new HashMap<>();
public boolean save(BookDTO bookDTO) {
System.out.println("bookDTO = " + bookDTO);
BookDTO dto = bookDTOMap.put(bookDTO.getId(), bookDTO);
System.out.println("dto = " + dto);
if (dto == null){
return true;
}else {
return false;
}
}
public Map<Long, BookDTO> findAll() {
return bookDTOMap;
}
public BookDTO findById(Long id) {
for (Long i:bookDTOMap.keySet()){
if (id.equals(bookDTOMap.get(i).getId())){
return bookDTOMap.get(i);
}
}
return null;
}
public boolean update(Long id, int bookPrice) {
for (Long i: bookDTOMap.keySet()){
if (id.equals(bookDTOMap.get(i).getId())){
bookDTOMap.get(i).setBookPrice(bookPrice);
return true;
}
}
return false;
}
public boolean delete(Long id) {
for (Long i: bookDTOMap.keySet()){
if (id.equals(bookDTOMap.get(i).getId())){
bookDTOMap.remove(i);
}
}
return false;
}
public List<BookDTO> sarch(String bookTitle) {
//검색 결과를 담을 list 선언
List<BookDTO> bookDTOList = new ArrayList<>();
for (Long i: bookDTOMap.keySet()){
if (bookDTOMap.get(i).getBookTitle().contains(bookTitle)){
bookDTOList.add(bookDTOMap.get(i));
}
}
return bookDTOList;
}
}
-Service-
package ch13_map.ex02;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class BookService {
BookRepository bookRepository = new BookRepository();
Scanner scanner = new Scanner(System.in);
public void save() {
System.out.print("제목: ");
String bookTitle = scanner.next();
System.out.print("저자: ");
String bookAuthor = scanner.next();
System.out.print("가격: ");
int bookPrice = scanner.nextInt();
System.out.print("출판사: ");
String bookPublisher = scanner.next();
BookDTO bookDTO = new BookDTO(bookTitle,bookAuthor,bookPrice,bookPublisher);
boolean result = bookRepository.save(bookDTO);
if (result){
System.out.println("등록 성공");
}else {
System.out.println("등록 실패");
}
}
public void findAll() {
Map<Long , BookDTO> bookDTOMap = bookRepository.findAll();
for(Long i: bookDTOMap.keySet()){
System.out.println(bookDTOMap.get(i));
//도서 제목만 본다면
System.out.println(bookDTOMap.get(i).getBookTitle());
}
}
public void findById() {
System.out.println("조회할 id: ");
Long id =scanner.nextLong();
BookDTO bookDTO = bookRepository.findById(id);
if (bookDTO != null){
System.out.println("bookDTO = " + bookDTO);
}else {
System.out.println("요청하신 정보를 찾을 수 없습니다");
}
}
public void update() {
System.out.println("수정할 id: ");
Long id =scanner.nextLong();
BookDTO bookDTO = bookRepository.findById(id);
if (bookDTO != null){
System.out.println("수정할 가격: ");
int bookPrice =scanner.nextInt();
boolean updateResult = bookRepository.update(id , bookPrice);
if (updateResult){
System.out.println("수정 성공");
}else {
System.out.println("수정 실패");
}
}else {
System.out.println("요청하신 정보를 찾을 수 없습니다");
}
}
public void delete() {
System.out.println("삭제할 id: ");
Long id =scanner.nextLong();
boolean result = bookRepository.delete(id);
if (result){
System.out.println("삭제 성공");
}else {
System.out.println("삭제 실패");
}
}
public void search() {
System.out.println("검색어: ");
String bookTitle = scanner.next();
List<BookDTO> bookDTOList = bookRepository.sarch(bookTitle);
if (bookDTOList.size()>0){
for (BookDTO bookDTO:bookDTOList){
System.out.println("bookDTO = " + bookDTO);
}
}else {
//bookDTOList.size() == 0 => 결과가 없다
System.out.println("검색 결과가 없습니다");
}
}
}
<예제 2> HashMap을 이용하여 회원관리 구현
-Main-
package ch13_map.ex03;
import java.util.Scanner;
public class MemberMain {
public static void main(String[] args) {
MemberService memberService = new MemberService();
Scanner scanner = new Scanner(System.in);
int selecNo = 0;
boolean run = true;
while (run){
System.out.println("1.회원가입 | 2.로그인 | 3.회원 목록 조회 | 4.회원 정보 수정 | 5.회원탈퇴 | 6.로그아웃 | 0.종료");
selecNo = scanner.nextInt();
if (selecNo == 1){
memberService.memberJoin();
} else if (selecNo == 2) {
memberService.memberLogin();
} else if (selecNo == 3) {
memberService.findAll();
} else if (selecNo == 4) {
memberService.memberUpdate();
} else if (selecNo == 5) {
memberService.memberDelete();
} else if (selecNo == 6) {
memberService.memberLogout();
} else if (selecNo == 0) {
System.out.println("종료합니다");
break;
}
}
}
}
-Service-
package ch13_map.ex03;
import java.util.Map;
import java.util.Scanner;
public class MemberService {
private static String loginEmail = null;
Scanner scanner = new Scanner(System.in);
MemberRepository memberRepository = new MemberRepository();
public void memberJoin() {
// 중복체크 결과를 담을 변수
boolean checkResult = false;
String memberEmali = null;
do {
System.out.print("이메일: ");
memberEmali = scanner.next();
// checkReslt 가 true 라면 사용가능(반복문 종료), checkResult 가 false 라면 사용불가(다시 이메일 입력)
checkResult = MemberRepository.emailChack(memberEmali);
if (checkResult) {
System.out.println("사용가능한 이메일 입니다");
} else {
System.out.println("이미 사용중인 이메일 입니다");
}
} while (!checkResult);//checkResult 값이 false 라면 계속 반복되도록
System.out.print("비밀 번호: ");
String memberPassword = scanner.next();
System.out.print("이름: ");
String memberName = scanner.next();
System.out.print("전화번호: ");
String memberMobile = scanner.next();
MemberDTO memberDTO = new MemberDTO(memberEmali, memberPassword, memberName, memberMobile);
boolean result = MemberRepository.memberJoin(memberDTO);
if (result) {
System.out.println("등록 성공");
} else {
System.out.println("등록 실패");
}
}
public void memberLogin() {
System.out.print("이메일: ");
String memberEmail = scanner.next();
System.out.print("비밀번호: ");
String memberPassword = scanner.next();
MemberDTO loginResult = memberRepository.memberLogin(memberEmail, memberPassword);
if (loginResult != null) {
System.out.println("로그인 성공");
loginEmail = memberEmail;
} else {
System.out.println("로그인 실패");
}
}
public void findAll() {
Map<Long, MemberDTO> memberDTOMap = memberRepository.findAll();
for (Long i : memberDTOMap.keySet()) {
System.out.println(memberDTOMap.get(i));
System.out.println(memberDTOMap.get(i).getMemberEamil());
}
}
public void memberUpdate() {
if (loginEmail != null){
System.out.print("수정할 전화번호: ");
String memberMobile = scanner.next();
boolean updateResult = memberRepository.memberUpdate(loginEmail , memberMobile);
if (updateResult){
System.out.println("수정 성공");
}else {
System.out.println("수정 실패");
}
}else {
System.out.println("로그인을 실행하세요");
}
}
public void memberDelete() {
if (loginEmail != null){
System.out.println("탈퇴하시겠습니까?");
System.out.print("비밀 번호: ");
String memberPassword = scanner.next();
MemberDTO memberDTO=memberRepository.memberLogin(loginEmail,memberPassword);
if (memberDTO != null){
boolean result = memberRepository.memberDelete(loginEmail);
if (result){
System.out.println("탈퇴 되었습니다");
}else {
System.out.println("탈퇴가 처리되지 않았습니다");
}
}
}else {
System.out.println("로그인 해주세요");
}
}
public void memberLogout() {
loginEmail = null;
System.out.println("로그아웃 되었습니다");
}
}
-Repository-
package ch13_map.ex03;
import java.util.HashMap;
import java.util.Map;
public class MemberRepository {
private static Map<Long , MemberDTO> memberDTOMap = new HashMap<>();
public static boolean emailChack(String memberEmali) {
boolean result = true;
for (Long i: memberDTOMap.keySet()){
if (memberEmali.equals(memberDTOMap.get(i).getMemberEamil())){
result = false;
}
}
return result;
}
public static boolean memberJoin(MemberDTO memberDTO) {
MemberDTO dto = memberDTOMap.put(memberDTO.getId() , memberDTO);
System.out.println("dto = " + dto);
if (dto == null){
return true;
}else {
return false;
}
}
public MemberDTO memberLogin(String memberEmail, String memberPassword) {
MemberDTO result = null;
for (Long i: memberDTOMap.keySet()){
if (memberEmail.equals(memberDTOMap.get(i).getMemberEamil()) && memberPassword.equals(memberDTOMap.get(i).getMemberPassword())){
result = memberDTOMap.get(i);
}
}
return result;
}
public Map<Long, MemberDTO> findAll() {
return memberDTOMap;
}
public boolean memberUpdate(String loginEmail, String memberMobile) {
boolean result = false;
for (Long i: memberDTOMap.keySet()){
if (loginEmail.equals(memberDTOMap.get(i).getMemberEamil())){
memberDTOMap.get(i).setMemberMobile(memberMobile);
result = true;
}
}
return result;
}
public boolean memberDelete(String loginEmail) {
boolean result = false;
for (Long i: memberDTOMap.keySet()){
if (loginEmail.equals(memberDTOMap.get(i).getMemberEamil())){
memberDTOMap.remove(i);
result = true;
}
}
return result;
}
}
-DTO-
package ch13_map.ex03;
public class MemberDTO {
private Long id;
private String memberEamil;
private String memberPassword;
private String memberName;
private String memberMobile;
public void setId(Long id) {
this.id = id;
}
public void setMemberEamil(String memberEamil) {
this.memberEamil = memberEamil;
}
public void setMemberPassword(String memberPassword) {
this.memberPassword = memberPassword;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public void setMemberMobile(String memberMobile) {
this.memberMobile = memberMobile;
}
public Long getId() {
return id;
}
public String getMemberEamil() {
return memberEamil;
}
public String getMemberPassword() {
return memberPassword;
}
public String getMemberName() {
return memberName;
}
public String getMemberMobile() {
return memberMobile;
}
public MemberDTO(){
}
private static Long idValue = 1L;
public MemberDTO(String memberEamil , String memberPassword , String memberName , String memberMobile){
this.id = idValue++;
this.memberEamil = memberEamil;
this.memberPassword = memberPassword;
this.memberName = memberName;
this.memberMobile = memberMobile;
}
@Override
public String toString() {
return "memberDTO{" +
"id=" + id +
", memberEamil='" + memberEamil + '\'' +
", memberPassword='" + memberPassword + '\'' +
", memberName='" + memberName + '\'' +
", memberMobile='" + memberMobile + '\'' +
'}';
}
}
상속(Inheritance)
- 부모 클래스의 자원(필드, 생성자, 메서드)을 자식 클래스에게 물려주는 것
- 물려준다고 해서 부모 자원이 사라지는 것은 아님
- 부모 클래스에서 private 으 로 지정한 자원은 상속 불가
-
- 동시에 두 개 이상의 클래스 상속 불가
- 메서드 재정의(method overriding)
- 부모가 가진 메서드의 실행블록을 수정하는 것
- 메서드 정의 부분(리턴타입, 이름, 매개변수)은 수정 불가
- 문법
- extends 키워드 사용
// 부모 클래스
public class ParentClass{
}
// 자식 클래스
public class ChilClass extends ParentClass {
}
<예문>
package ch14_inheritance;
public class inheritanceMain {
public static void main(String[] args) {
ParentClass parentClass = new ParentClass();
parentClass.setName("이름");
parentClass.setAge(10);
System.out.println("parentClass = " + parentClass);
parentClass.hello();
ChildClass childClass = new ChildClass();
childClass.setName("자식이름1");
childClass.setAge(100);
System.out.println("childClass = " + childClass);
childClass.hello();
// 좌변: 부모타입의 객체, 우변: 자식 클래스의 생성자
ParentClass parentClass1 = new ChildClass();
parentClass1.hello();
parentClass1 = new ParentClass();
parentClass1.hello();;
// 좌변: 자식 타입의 객체 , 우변: 부모클래스 생성자
// ChildClass childClass1 = new ParentClass();
}
}
package ch14_inheritance;
public class ParentClass {
public String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
ParentClass(){
System.out.println("부모 기본생성자");
}
public void hello(){
System.out.println("ParentClass.hello");
}
@Override
public String toString() {
return "ParentClass{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package ch14_inheritance;
public class ChildClass extends ParentClass{
public ChildClass(){
System.out.println("자식 기본생성자");
}
// 메서드의 재정의
@Override
public void hello(){
System.out.println("ChildClass.hello");
}
}
상속에서 가장 중요한 부분은 코드의 재사용성이다 상속을 통해 기존에 정의된 클래스의 멤버를 그대로 사용할 수 있음으로 코드의 중복을 줄이고 유지보수의 효율성을 높일 수 있다
'개발일지' 카테고리의 다른 글
개인 프로젝트 (0) | 2023.12.29 |
---|---|
인터페이스 , 예외처리 (0) | 2023.12.29 |
회원제 게시판 프로젝트 (1) | 2023.12.25 |
개발일지 19일차 -은행 구현 프로젝트- (0) | 2023.12.20 |
개발일지 18일차 - 게시판 만들기 - (0) | 2023.12.19 |