회원 관리 프로젝트

현재 사용하는 DB 가 없으므로 DAO 를 생성하여 ArrayList 객체를 생성하여 DataBase 를 구현

회원관리 기능은 구현 완료, 로그인 기능은 미구현

 

DAO - 데이터베이스에서 가져온 데이터를 객체로 변환하여 비즈니스 로직에서 사용할 수 있도록 함

DTO - Service와 DB를 연결하는 역할

 

package collection.main;

import java.util.Scanner;

import collection.service.MemberService;
import collection.service.MemberServiceImpl;

public class MainClass {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num;
		MemberService ms = new MemberServiceImpl();
		while(true) {
			System.out.println("1. 회원관리");
			System.out.println("2. 로그인기능");
			System.out.print(">>> : ");
			num = sc.nextInt();
			switch(num) {
			case 1 : 
				ms.display();
				break;
			case 2 : 
				// 미구현
				break;
			}
		}
	}
}

MainClass 클래스

 

package collection.service;

public interface MemberService {
	// 중간자 역할
	public void register();
	public void memberViews();
	public void display();
	public void search();
}

MemberService 인터페이스 ( 구현해야 하는 메소드를 정의 )

 

package collection.dto;

public class MemberDTO {
	private String name, addr;
	
	// getter/setter
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
}

MemberDTO 클래스 ( 데이터베이스에서 가져온 데이터를 객체로 변환하여 비즈니스 로직에서 사용할 수 있도록 함 )

 

package collection.dao;

import java.util.ArrayList;

import collection.dto.MemberDTO;

public class MemberDAO {
	// DAO = Data Access Object
	// DAO 는 특정 저장소에 연결하는 역할을 함
	
	// 현재 DB 가 존재하지 않기 때문에 데이터를 유지하기 위해
	// static 으로 생성
	public static ArrayList<MemberDTO> arr;
	
	// arr 초기화 - 	다음과 같이 static 으로 초기화 하는 이유는 초기화 하면서 코드를
	//				추가할 수 있기 때문
	static {
		arr = new ArrayList<>();
	}
	
	// 데이터를 ArrayList 에 저장하는 역할
	public void register(MemberDTO dto) {
		System.out.println("dao register 연동");
		// System.out.println( dto.getName() );
		// System.out.println( dto.getAddr() );
		arr.add(dto);
	}
	
	// 데이터를 반환하는 역할
	public ArrayList<MemberDTO> getData() {
		return arr;
	}
	
	public MemberDTO search(String name) {
		for(MemberDTO a : arr) {
			if(a.getName().equals(name)) {
				return a;
			}
		}
		return null;
	}
	
	public MemberDAO() {
		
	}	
}

MemberDAO 클래스 ( Service와 DB를 연결하는 역할 )

 

package collection.service;

import java.util.ArrayList;
import java.util.Scanner;

import collection.dao.MemberDAO;
import collection.dto.MemberDTO;

public class MemberServiceImpl implements MemberService {
	// MemberService 를 상속 받아서 실제 기능을 구현
	MemberDAO dao;
	public MemberServiceImpl() {
		dao = new MemberDAO();
	}

	@Override
	public void register() {
		System.out.println("회원 가입 기능입니다!!!!");
		String name, addr;
		MemberDTO dto = new MemberDTO();
		Scanner sc = new Scanner(System.in);
		
		System.out.print("이름 입력 : ");
		name = sc.next();
		System.out.print("주소 입력 : ");
		dto.setAddr(sc.next());
		dto.setName(name);
		dao.register(dto);
	}

	@Override
	public void memberViews() {
		System.out.println("멤버 보기 기능입니다!!!!");
		ArrayList<MemberDTO> arr = dao.getData();
		for(MemberDTO a : arr) {
			System.out.println("이름 : " + a.getName());
			System.out.println("주소 : " + a.getAddr());
			System.out.println("-----------------");
		}
	}
	
	public void display() {
		Scanner sc = new Scanner(System.in);
		int num;
		
		while(true) {
			System.out.println("1. 저장");
			System.out.println("2. 목록확인");
			System.out.println("3. 종료");
			System.out.println("4. 검색");
			System.out.print(">>> : ");
			num = sc.nextInt();
			switch(num) {
			case 1 : 
				register();
				break;
			case 2 : 
				memberViews();
				break;
			case 3 : return;
			case 4 : 
				search();
				break;
			}
		}
	}
	
	public void search() {
		Scanner sc = new Scanner(System.in);
		String name;
		System.out.print("검색할 이름 입력 : ");
		name = sc.next();
		MemberDTO m = dao.search( name );
		if( m == null ) {
			System.out.println(name + " 사용자는 존재하지 않습니다.");
		}else {
			System.out.println("사용자 이름 : " + m.getName());
			System.out.println("사용자 주소 : " + m.getAddr());
		}
	}
}

MemberServiceImpl 클래스 ( 실제 기능 구현부 )

728x90

 

 

 

 

 

추상 클래스 ( Abstract )

추상 클래스 ( Abstract )

 

package abstract_;

// 추상 메소드를 가진 추상 클래스임을 선언
abstract class Test01{
	// 추상 메소드임을 선언
	public abstract void speed();
	public void myBreak() {
		System.out.println("멈춤 기능");
	}
}

class TestClass01 extends Test01{
	// 상속한 Test01 클래스에 추상 메소드가 존재하므로
	// 무조건 오버라이딩을 진행해줘야 한다 ( 하지 않으면 컴파일 오류 발생 )
	public void speed() {
		System.out.println("2025년식 최고속도 : 250km");
	}
	public void autoSysem() {
		System.out.println("자동 운전 모드");
	}
}

class TestClass02 extends Test01{
	// 상속한 Test01 클래스에 추상 메소드가 존재하므로
	// 무조건 오버라이딩을 진행해줘야 한다 ( 하지 않으면 컴파일 오류 발생 )
	public void speed() {
		System.out.println("2026년식 최고속도 : 300km");
	}
	public void autoSysem() {
		System.out.println("자동 운전 모드");
	}
}

public class Ex01 {
	public static void main(String[] args) {
		TestClass01 t = new TestClass01();
		t.speed();
		t.myBreak();
		t.autoSysem();
	}
}

※ 추상화를 사용하면 무조건 오버라이딩을 진행해야 한다 ※

추상화 클래스를 이용하는 경우 상속받았을때 무조건 오버라이딩을 상속 받는 클래스에 작성해야하기 때문에 다형성이 생긴다

 

 

 

 

 

 

 

 

 

 

인터페이스 ( interface )

인터페이스 ( interface ) - 변수에 static final 을 적지 않으면 default 로 적용된다

 

package interface_;

// 인터페이스 생성
interface A01{
	// 인터페이스의 메소드는는 {} 를 가지지 않는다
	public void test1();
}

// 인터페이스 생성
interface B01{
	// 인터페이스의 메소드는는 {} 를 가지지 않는다
	public void test1();
}

// 클래스 2개 생성
class Class01{}
class Class02{}

public class Ex01 extends Class01 implements A01, B01{
	// 인터페이스를 상속받을 경우 implements 를 사용
	// 인터페이스는 다중 상속이 가능하다!!!!
	
	@Override
	public void test1() {
		// 인터페이스에 test1() 추상 메소드가 존재한다
		// test1() 메소드를 선언하지 않으면 컴파일 오류가 발생한다
	}
}

인터페이스 코드 작성

 

인터페이스를 파일로 생성하여 상속

 

 

- 인터페이스를 사용하면 좋은 점 -

1. 메소드 이름을 단일화 할 수 있다 ( A 와 B 가 각자 개발해도 동일한 이름으로 기능을 다르게 개발 )

2. 인터페이스를 자료형으로 객체를 생성하여 내부에 담긴 인터페이스 메소드만 사용하거나 확인할 수 있다.

인터페이스 자료형으로 객체를 생성한 모습

728x90

+ Recent posts