728x90
반응형
인터페이스(Interface)
- 클래스를 작성할 때 기본적인 틀을 제공 할 수 있는 일종의 클래스
- 추상 메서드를 선언함
- 추상메서드: 구현 블록이 없는 메서드 선언 부분만 존제
- 인터페이스 자체를 객체화 할수 없으며 인터페이스를 구현하는 클래스를 활용
- 구현 클래스에서는 추상메서드의 실행블록을 정의 해야함
- 선언 문법
public interface Interface1{
public void method1();
public String method2(int n);
}
//구현 클래스
public class Impl1 implements Inteface1{
public void method1();
System.out.println("안녕하세요");
}
public String method2(int n){
int num = n + 10;
return "끝"
}
}
<예문>
package ch15_interface.ex01;
public class IntMain {
public static void main(String[] args) {
// 인터페이스 객체 선언 (X)
// Interface1 interface1 = new Interface1();
//구현클레스 자체를 객체로 사용할 수는 있지만
// 이렇게 사용하진 않음
Impl1 impl1 = new Impl1();
impl1.method1();
//인터페이스 구현 글래스 객체를 사용할때는
//좌변은 인터페이스 타입의 변수 선언
//우변은 구현 클래스의 생성자를 사용
Interface1 interface1 = new Impl1();
interface1.method1();
interface1 = new Impl2();
interface1.method1();
Impl1 impl11 = new Impl1();
impl11.method1();
Impl2 impl2 = new Impl2();
impl2.method1();
}
}
package ch15_interface.ex01;
// Interface1을 구현하는 클래수로 사용
public class Impl1 implements Interface1 {
@Override
public void method1() {
System.out.println("Impl.method1");
}
}
package ch15_interface.ex01;
public class Impl2 implements Interface1{
@Override
public void method1() {
System.out.println("Impl2.method1");
}
}
<인터페이스>
package ch15_interface.ex01;
public interface Interface1 {
public void method1();
}
<예제 1>
회원가입 예제를 인터페이스를 사용하여 List와 HashMap 두가지를 사용
<메인>
package ch15_interface.ex02;
import java.util.Scanner;
public class MemberMain {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
boolean run = true;
int selectNo = 0;
MemberService memberService = new MemberService();
while (run) {
System.out.println("-----------------------------------------------------------------------------------------");
System.out.println("1.회원가입 | 2.로그인 | 3.목록조회 | 4.정보수정 | 5.탈퇴 | 6.로그아웃 | 0.종료");
System.out.println("-----------------------------------------------------------------------------------------");
System.out.print("선택> ");
selectNo = scan.nextInt();
if (selectNo == 1) {
// 호출하는 문장 작성
memberService.save();
} else if (selectNo == 2) {
// 호출하는 문장 작성
memberService.login();
} else if (selectNo == 3) {
// 호출하는 문장 작성
memberService.findAll();
} else if (selectNo == 4) {
// 호출하는 문장 작성
memberService.update();
} else if (selectNo == 5) {
// 호출하는 문장 작성
memberService.delete();
} else if (selectNo == 6) {
// 호출하는 문장 작성
memberService.logout();
} else if (selectNo == 0) {
run = false;
}
}
}
}
<DTO>
package ch15_interface.ex02;
public class MemberDTO {
private Long id;
private String memberEmail;
private String memberPassword;
private String memberName;
private String memberMobile;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getMemberEmail() {
return memberEmail;
}
public void setMemberEmail(String memberEmail) {
this.memberEmail = memberEmail;
}
public String getMemberPassword() {
return memberPassword;
}
public void setMemberPassword(String memberPassword) {
this.memberPassword = memberPassword;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public String getMemberMobile() {
return memberMobile;
}
public void setMemberMobile(String memberMobile) {
this.memberMobile = memberMobile;
}
public MemberDTO() {
}
private static Long idValue = 1L;
public MemberDTO(String memberEmail, String memberPassword, String memberName, String memberMobile) {
this.id = idValue++;
this.memberEmail = memberEmail;
this.memberPassword = memberPassword;
this.memberName = memberName;
this.memberMobile = memberMobile;
}
@Override
public String toString() {
return "MemberDTO{" +
"id=" + id +
", memberEmail='" + memberEmail + '\'' +
", memberPassword='" + memberPassword + '\'' +
", memberName='" + memberName + '\'' +
", memberMobile='" + memberMobile + '\'' +
'}';
}
}
<리파지토리(인터페이스)>
package ch15_interface.ex02;
public interface MemberRepository {
boolean save(MemberDTO memberDTO);
MemberDTO login(String memberEmail, String memberPassword);
Object findAll();
boolean update(String loginEmail, String mobile);
boolean delete(String loginEmail);
boolean emailCheck(String memberEmail);
}
<리파지토리(List)>
package ch15_interface.ex02;
import java.util.ArrayList;
import java.util.List;
public class MemberRepositoryList implements MemberRepository {
private static List<MemberDTO> memberDTOList = new ArrayList<>();
@Override
public boolean save(MemberDTO memberDTO) {
return memberDTOList.add(memberDTO);
}
@Override
public MemberDTO login(String memberEmail, String memberPassword) {
MemberDTO memberDTO = null;
for (int i = 0; i < memberDTOList.size(); i++) {
if (memberEmail.equals(memberDTOList.get(i).getMemberEmail()) && memberPassword.equals(memberDTOList.get(i).getMemberPassword())) {
memberDTO = memberDTOList.get(i);
}
}
return memberDTO;
}
@Override
public List<MemberDTO> findAll() {
return memberDTOList;
}
@Override
public boolean update(String loginEmail, String mobile) {
boolean result = false;
for (int i = 0; i < memberDTOList.size(); i++) {
if (loginEmail.equals(memberDTOList.get(i).getMemberEmail())) {
memberDTOList.get(i).setMemberMobile(mobile);
result = true;
}
}
return result;
}
@Override
public boolean delete(String loginEmail) {
boolean result = false;
for (int i = 0; i < memberDTOList.size(); i++) {
if (loginEmail.equals(memberDTOList.get(i).getMemberEmail())) {
memberDTOList.remove(i);
result = true;
}
}
return result;
}
@Override
public boolean emailCheck(String memberEmail) {
boolean result = true;
for (int i = 0; i < memberDTOList.size(); i++) {
if (memberEmail.equals(memberDTOList.get(i).getMemberEmail())) {
// 중복되는 이메일이 있다 => 결과를 false로 주자
result = false;
}
}
return result;
}
}
<리파지토리(HashMap)>
package ch15_interface.ex02;
import java.util.HashMap;
import java.util.Map;
public class MemberRepositoryMap implements MemberRepository {
private static Map<Long, MemberDTO> memberDTOMap = new HashMap<>();
@Override
public boolean save(MemberDTO memberDTO) {
MemberDTO dto = memberDTOMap.put(memberDTO.getId(), memberDTO);
if (dto == null) {
return true;
} else {
return false;
}
}
@Override
public MemberDTO login(String memberEmail, String memberPassword) {
for (Long i : memberDTOMap.keySet()) {
if (memberEmail.equals(memberDTOMap.get(i).getMemberEmail()) &&
memberPassword.equals(memberDTOMap.get(i).getMemberPassword())) {
return memberDTOMap.get(i);
}
}
return null;
}
@Override
public Map<Long, MemberDTO> findAll() {
return memberDTOMap;
}
@Override
public boolean update(String loginEmail, String mobile) {
for (Long i : memberDTOMap.keySet()) {
if (loginEmail.equals(memberDTOMap.get(i).getMemberEmail())) {
memberDTOMap.get(i).setMemberMobile(mobile);
return true;
}
}
return false;
}
@Override
public boolean delete(String loginEmail) {
for (Long i : memberDTOMap.keySet()) {
if (loginEmail.equals(memberDTOMap.get(i).getMemberEmail())) {
memberDTOMap.remove(i);
return true;
}
}
return false;
}
@Override
public boolean emailCheck(String memberEmail) {
for (Long i : memberDTOMap.keySet()) {
if (memberEmail.equals(memberDTOMap.get(i).getMemberEmail())) {
return false;
}
}
return true;
}
}
<서비스>
private static String loginEmail = null;
public void save() {
// 중복체크 결과를 담을 변수
boolean checkResult = false;
String memberEmail = null;
do {
System.out.print("이메일: ");
memberEmail = scanner.next();
// checkResult가 true => 사용가능(반복문 종료), checkResult가 false => 사용불가(다시 이메일입력)
checkResult = memberRepository.emailCheck(memberEmail);
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(memberEmail, memberPassword, memberName, memberMobile);
boolean result = memberRepository.save(memberDTO);
if (result) {
System.out.println("회원가입 성공");
} else {
System.out.println("회원가입 실패");
}
}
public void login() {
System.out.print("이메일: ");
String memberEmail = scanner.next();
System.out.print("비밀번호: ");
String memberPassword = scanner.next();
MemberDTO loginResult = memberRepository.login(memberEmail, memberPassword);
if (loginResult != null) {
System.out.println("로그인 성공");
System.out.println(memberEmail + "님 환영합니다!");
loginEmail = memberEmail;
} else {
System.out.println("이메일 또는 비밀번호가 틀립니다!");
}
}
public void findAll() {
List<MemberDTO> memberDTOList = (List<MemberDTO>) memberRepository.findAll();
for (MemberDTO memberDTO: memberDTOList) {
System.out.println("memberDTO = " + memberDTO);
}
}
public void update() {
if (loginEmail != null) {
System.out.print("수정할 전화번호: ");
String mobile = scanner.next();
boolean result = memberRepository.update(loginEmail, mobile);
if (result) {
System.out.println("회원정보가 수정되었습니다.");
} else {
System.out.println("수정 실패!");
}
} else {
System.out.println("로그인 해주세요!");
}
}
public void delete() {
if (loginEmail != null) {
System.out.println("진짜 탈퇴하실 건가요?");
System.out.print("비밀번호: ");
String memberPassword = scanner.next();
MemberDTO memberDTO = memberRepository.login(loginEmail, memberPassword);
if (memberDTO != null) {
boolean result = memberRepository.delete(loginEmail);
if (result) {
System.out.println("회원탈퇴가 정상적으로 처리되었습니다! 그동안 감사했습니다!");
} else {
System.out.println("탈퇴가 처리되지 않았습니다! 다시 시도해 주시기 바랍니다!");
}
} else {
System.out.println("비밀번호가 일치하지 않습니다! 메인메뉴로 돌아갑니다!");
}
} else {
System.out.println("로그인 해주세요!");
}
}
public void logout() {
loginEmail = null;
System.out.println("로그아웃 되었습니다");
}
}
인터페이스는 코드의 재사용성을 향상 시키고 상속을 통해 기존에 정의된 클래스의 맴버를 그대로 사용할 수 있으므로 코드의 중복을 줄이고 유지보수의 효율성을 높일수있다
예외처리(Exception Hamdling)
- 자바에서 발생하는 일종의 에러
- 예외가 발생하면 실행은 그 즉시 중단됨
- 일어날 수 있는 예외에 대해서 처리하는 실행 블록을 따로 만든다
- 문법
- try catch : 발생가능성이 있는 예외 타입에 대해 별도로 실행 블록을 분리
try{
//실행 블록(예외가 발생할 수 있음)
} catch(예외타입 변수){
//예외 발생시 처리할 블록
} finally{
//생략 가능
//예외가 발생하든 발생하지 않든 실행하는 블록
}
b. throws: 예외가 발생하면 해당 예외를 호출한 부분으로 예외처리를 떠넘기는것
public void method1() throws 예외타입{
}
<예문1>
package ch16_exception;
import java.util.ArrayList;
import java.util.List;
public class Ex01_Exception {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
stringList.add("안녕");
stringList.add("오늘은 수요일");
try {
System.out.println(10/0);
for (int i = 0; i < stringList.size(); i++) {
System.out.println("stringList = " + stringList.get(i));
}
} catch (IndexOutOfBoundsException e){
System.out.println("인덱스 예외 발생!");
} catch (ArithmeticException e){
System.out.println("0으로 나눌수 없습니다");
} catch (Exception e){
System.out.println("예상치 못한 예외 발생");
}
System.out.println("프로그램 끝");
}
}
<예문 2>
package ch16_exception;
public class Ex02_Exception {
public static void main(String[] args) {
//아래 코드 실행시 발생하는 예외를 확인하고 예외 발생시 0으로 나눌수 없습니다가 출력되도록
try {
System.out.println(10/0);
}catch (ArithmeticException e){
System.out.println("0으로 나눌 수 없습니다!");
e.printStackTrace();
}
}
}
728x90
반응형
'개발일지' 카테고리의 다른 글
MySQL (1) | 2024.01.02 |
---|---|
개인 프로젝트 (0) | 2023.12.29 |
개발일지 -HashMap , 상속 클래스- (1) | 2023.12.26 |
회원제 게시판 프로젝트 (1) | 2023.12.25 |
개발일지 19일차 -은행 구현 프로젝트- (0) | 2023.12.20 |