본문 바로가기
개발일지

인터페이스 , 예외처리

by 태운콩즙 2023. 12. 29.
728x90
반응형

인터페이스(Interface)

  • 클래스를 작성할 때 기본적인 틀을 제공 할 수 있는 일종의 클래스
  • 추상 메서드를 선언함
    • 추상메서드: 구현 블록이 없는 메서드 선언 부분만 존제
  • 인터페이스 자체를 객체화 할수 없으며 인터페이스를 구현하는 클래스를 활용
  • 구현 클래스에서는 추상메서드의 실행블록을 정의 해야함
  1. 선언 문법
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)

  • 자바에서 발생하는 일종의 에러
  • 예외가 발생하면 실행은 그 즉시 중단됨
  • 일어날 수 있는 예외에 대해서 처리하는 실행 블록을 따로 만든다
  1. 문법
    1. 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