자바11일차

달달한스위츠·2024년 2월 16일

자바배우기

목록 보기
11/43

오늘의 코드

package edu.java.interface01;

public interface DataBaseQuery {
	// 인터페이스 멤버 변수 : public static final
	public static final int DATABASE_VERION = 1; // 인터페이스는 객체 생성 불가능 그렇기에 반드시 static이 필요함
//	int DATABASE_VERION = 1; //생략가능 하지만 이해를 위해선 전부 작성할 것

	// 인터페이스의 메소드 : public abstract
	public abstract int insert(String id, String pw); // 이것이 껍데기
	// 이걸 가져가서 너가 사용해~ 라는 것
	
} // end DataBaseQuery
package edu.java.interface01;

// 예) 테스트 팀에서 임시 테스트용으로 사용
public class DummyImple implements DataBaseQuery { 

	@Override
	public int insert(String id, String pw) { // 무조건 몸통을 만들어 주어야 하니 강제성을 띄운다.
		// TODO Auto-generated method stub
		return 0;
	}

}
package edu.java.interface01;

import java.util.Scanner;

//인터페이스(Interface) : 
//1. 인터페이스의 모든 메소드는 public abstract로 선언(Java 7버전까지)
//-> public abstract 수식어 생략 가능
//2. 인터페이스의 모든 멤버 변수는 public static final로 선언
//-> public static final 수식어 생략 가능
//3. 인터페이스를 선언할 때는 interface 키워드 사용
//4. 인터페이스를 구현(상속)하는 클래스는 implements 키워드 사용
//5. 클래스는 다중 상속이 불가능
//	  (예) class Child extends Parent1, Parent2 (x)
//6. 인터페이스를 구현하는 개수는 제한이 없음
//	  (예) class Child implements Inter1, Inter2 (o)

public class InterfaceMain01 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("아이디 입력>");
		String id = sc.next();
		System.out.println("비밀번호 입력>");
		String pw = sc.next();
		sc.close();
		
		//  인터페이스는 생성따윈 할 수 없다.
//		DataBaseQuery db = new DataBaseQuery();
		// 인터페이스는 인스턴스 생성이 불가능
		
		// 요녀석은 실체가 있다.
		DataBaseQuery db = new OracleDatabaseQuery(); // 다형성
		int result = db.insert(id, pw);
		if(result > 0) {
			System.out.println("insert 성공");
		} else {
			System.out.println("insert 실패");
		}
		
		

	} // end main()

} // end InterfaceMain01
package edu.java.interface01;

// 예) 개발팀이 작성할 코드
public class OracleDatabaseQuery implements DataBaseQuery{

	@Override
	public int insert(String id, String pw) {
		System.out.println("오라클 DB 연결");
		System.out.println("SQL 문장 작성/실행");
		System.out.println("SQL 실행 결과 처리");
		return 1;
	}

}
package edu.java.interface02;


// Java 8 버전부터 바뀐 인터페이스 :
// 인터페이스가 가질 수 있는 멤버들 :
// 1. public static final 멤버 변수 - Java 7 버전과 동일
// 2. public abstract 메소드 - Java 7 버전과 동일
// 3. default 메소드 :
// - 본체(body)가 구현되어 있는 메소드
// - default 키워드를 사용하여 선언
// - 인스턴스가 생성되어야만 사용할 수 있는 메소드
// 4. static 메소드
// - 본체(body)가 구현되어 있는 메소드
// - static 키워드 사용. 인스턴스 생성 없이 사용 가능한 메소드

public interface TestInterface {
	public static final int MAX = 100;
	
	public abstract int insert(String id, String pw);
	
	public default void connect() {
		System.out.println("DB 연결 성공");
	}
	
	public static void createDB() {
		System.out.println("DB 생성");
	}

}
package edu.java.interface03;

// 클래스는 다중 상속이 불가능하지만, 인터페이스는 여러 개를 구현(상속)하는 것이 가능
interface Test1{
	public abstract void test1();
} // end Test1

interface Test2{
	public abstract void test2();	
} // end Test2

class TestImple implements Test1, Test2 {
	@Override
	public void test2() {
		System.out.println("테스트2");
	}
	@Override
	public void test1() {
		System.out.println("테스트1");
	}
}


public class InterfaceMain03 {

	public static void main(String[] args) {
		TestImple imple1 = new TestImple();
		imple1.test1();
		imple1.test2();
		
		// 인터페이스의 다형성 :
		// - 구현된 클래스의 객체를 인터페이스 타입의 참조 변수에 저장 가능
		Test1 imple2 = new TestImple();
		imple2.test1();
		((Test2) imple2).test2();
		// 변수를 Test1로 선언했기 때문에 Test2의 메소드는 사용할 수 없음
		// Test2의 메소드를 사용하기 위해서는 강제 형 변환(casting)을 해야함

	} // end main()

} // end InterfaceMain03
package edu.java.interface04;

import java.util.Scanner;

public class InterfaceMain04 {
	private static Scanner sc = new Scanner(System.in);
	
	public static void main(String[] args) {
		boolean run = true;
		
		System.out.println(Integer.MAX_VALUE); // 함수군아 라고 인지할 수 있도록 만듬
		while(run) {
			System.out.println("------------------------");
			System.out.println("1. 입력 | 2. 검색 | 3. 종료");
			System.out.println("------------------------");			
			int choice = sc.nextInt();
			switch(choice) {
			case Menu.INSERT:
				System.out.println(Menu.STR_INSERT);
				break;
			case Menu.SELECT:
				System.out.println(Menu.STR_SELECT);
				break;
			case Menu.QUIT:
				System.out.println(Menu.STR_QUIT);
				run = false;
				break;
			default:
				System.out.println("다시 선택하세요.");
				break;
			}
		}
	} // end main()

} // end InterfaceMain04
package edu.java.interface04;

// 인터페이스의 활용 : 상수(public static final)들만 정의하는 타입
public interface Menu {
	public static final int INSERT = 1;
	public static final int SELECT = 2;
	public static final int QUIT = 3;

	// public static final은 생략 가능
	String STR_INSERT = "입력 메뉴";
	String STR_SELECT = "검색 메뉴";
	String STR_QUIT = "프로그램 종료";
}
package edu.java.interface05;

public class Audio implements RemoteController {

	@Override
	public void turnOn() {
		System.out.println("Audio 켜짐");
	}

	@Override
	public void turnOff() {
		System.out.println("Audio 꺼짐");

	}

}
package edu.java.interface05;

// 상속 : IS-A 관계가 성립할 때
// - 스마트 TV는 TV이다. (SmartTv is a TV)
// - class Smart Tv extends BasicTV {...}

// 구현(인터페이스) : HAS-A 관계가 성립할 때
// - TV는 리모콘을 가지고 있다. (TV has a remote controller)
// - class BasicTV implements RemoteController
public class InterfaceMain05 {

	public static void main(String[] args) {
		TV tv = new TV();
		tv.turnOn();
		tv.turnOff();

		Audio audio = new Audio();
		audio.turnOn();
		audio.turnOff();

		System.out.println();
		RemoteController rc1 = new TV();
		rc1.turnOn();

		RemoteController rc2 = new Audio();
		rc2.turnOn();
	}

}
package edu.java.interface05;

public interface RemoteController {
	public abstract void turnOn();
	public abstract void turnOff();
}
package edu.java.interface05;

public class TV implements RemoteController {

	@Override
	public void turnOn() {
		System.out.println("TV 켜짐");
	}

	@Override
	public void turnOff() {
		System.out.println("TV 꺼짐");
	}

}
package edu.java.interface06;

// * 인터페이스 DAO 메소드 설계 방식
// - 함수의 리턴타입 : 돌려주는 데이터 형태에 따라 선언
// - 함수의 매개변수 : 전송되는 데이터 형태에 따라 선언
// - 함수의 이름 : 역활에 따라 이름 선언

public interface MemberDAO {
	// 회원 정보 등록
	public abstract int insert(MemberVO vo); // 맴버의 정보 입력
	
	// 회원 정보 전체 검색
	public abstract MemberVO[] select(); // 리턴 타입이 중요함(회원 정보 여러개 저장)
	
	// 회원 정보 인덱스 검색
	public abstract MemberVO select(int index);
	

	// 회원 정보 인덱스 수정
	public abstract int update(int index, MemberVO vo);

}
package edu.java.interface06;

// DAO(Data Access Object) :
// - 데이터의 전송을 담당하는 역활
public class MemberDAOImple implements MemberDAO {

	// 싱글톤 디자인 패턴 적용

	// 1. private static 자기 자신 타입의 변수 선언
	private static MemberDAOImple instance = null;

	// 2. private 생성자
	private MemberDAOImple() {
	}

	// 3. public static 메소드 - 인스턴스를 리턴하는 메소드 구현
	public static MemberDAOImple getInstance() {
		if (instance == null) {
			instance = new MemberDAOImple();
		}
		return instance;
	}

	// 나중에 DB에서 사용 할 것이지만 지금은 이렇게 사용
	private final int MAX = 100; // 최대 회원수
	private MemberVO[] list = new MemberVO[MAX]; // 회원 정보를 저장할 배열
	private int count; // 배열에 저장될 데이터 개수

	public int getCount() {
		return count;
	}

	@Override
	public int insert(MemberVO vo) {
		System.out.println("insert()"); // 로그 찍기
		System.out.println("vo = " + vo);
		list[count] = vo;
		count++;
		return 1; // 0 : 실패, 1 : 성공
	}

	@Override
	public MemberVO[] select() {
		return list;
	} // end select()

	@Override
	public MemberVO select(int index) {
		return list[index];
	}

	@Override
	public int update(int index, MemberVO vo) {
		list[index].setPw(vo.getPw());
		list[index].setEmail(vo.getEmail());
		return 1;
	}

}
package edu.java.interface06;

import java.util.Scanner;

// MVC 디자인 패턴에서 View 클래스
// - UI를 담당하는 역활
// * 현재 시스템은 규모가 작으므로 Controller 역활도 수행
public class MemberMain {
	private static Scanner sc;
	private static MemberDAO dao; // MemeberDAOImple 인스턴스를 저장할 변수

	public static void main(String[] args) {

		System.out.println("회원 관리 프로그램");
		sc = new Scanner(System.in);

		dao = MemberDAOImple.getInstance(); // 다형성. 싱글톤 인스턴스 생성

		boolean run = true;
		while (run) {
			showMainMenu();
			int choice = sc.nextInt();
			switch (choice) {
			case Menu.INSERT:
				InsertMember();
				break;
			case Menu.SELECT_ALL:
				selectAll();
				break;
			case Menu.SELECT_BY_INDEX:
				selectByIndax();
				break;
			case Menu.UPDATE:
				updateMember();
				break;
			case Menu.QUIT:
				sc.close();
				run = false;
				break;
			default:
				System.out.println("다시 선택하세요.");
				break;
			}
		}

	} // end main()

	private static void updateMember() {
		System.out.println("인덱스 입력>");
		int index = sc.nextInt();

		int count = ((MemberDAOImple) dao).getCount();
		if (index >= 0 && index < count) {
			System.out.println("비밀번호 입력>");
			String pw = sc.next();
			System.out.println("이메일 입력>");
			String email = sc.next();

			MemberVO vo = new MemberVO("", pw, email);
			int result = dao.update(index, vo);
			if (result == 1) {
				System.out.println("회원 정보 수정 완료");
			}

		}
	} // end updateMember()

	private static void selectByIndax() {
		System.out.println("검색할 인덱스 입력>");
		int index = sc.nextInt();

		int count = ((MemberDAOImple) dao).getCount();
		if (index >= 0 && index < count) {
			MemberVO vo = dao.select(index);
			System.out.println(vo);
		} else {
			System.out.println("존재하지 않는 인덱스입니다.");
		}
	} // end selectByIndax()

	private static void selectAll() {
		MemberVO[] list = dao.select();

		int count = ((MemberDAOImple) dao).getCount();
		for (int i = 0; i < count; i++) {
			System.out.println("회원 정보 [" + i + "]");
			System.out.println(list[i]);
		}

	} // end selectAll()

	private static void InsertMember() {
		System.out.println("--- 회원 정보 등록 ---");
		System.out.println("아이디 입력>");
		String id = sc.next();
		System.out.println("비밀번호 입력>");
		String pw = sc.next();
		System.out.println("이메일 입력>");
		String email = sc.next();

		MemberVO vo = new MemberVO(id, pw, email);
		dao.insert(vo);

	} // end InsertMember()

	private static void showMainMenu() {
		System.out.println("------------------------------------------------");
		System.out.println("1. 등록 | 2. 전체 검색 | 3. 상세 검색 | 4. 수정 | 0. 종료");
		System.out.println("------------------------------------------------");
		System.out.println("선택>");

	} // end showMainMenu()
	
} // end MemberMain
package edu.java.interface06;

// VO(Value Object) : MVC 디자인 패턴에서 Model 클래스. 데이터 정보
// or DTO(Data Transfer Object)
public class MemberVO {
	// 멤버 변수(필드, 프로퍼티)
	private String id; // 회원 아이디
	private String pw; // 회원 비밀번호
	private String email; // 회원 이메일
	public MemberVO() {
		super();
		// TODO Auto-generated constructor stub
	}
	public MemberVO(String id, String pw, String email) {
		super();
		this.id = id;
		this.pw = pw;
		this.email = email;
	}
	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 getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	@Override
	public String toString() {
		return "MemberVO [id=" + id + ", pw=" + pw + ", email=" + email + "]";
	}
	
	

}
package edu.java.interface06;

public interface Menu {
	int QUIT = 0; // 종료
	int INSERT = 1; // 등록
	int SELECT_ALL = 2; // 전체 검색
	int SELECT_BY_INDEX = 3; // 상세 검색
	int UPDATE = 4; // 수정
}

오늘자 코드를 이용하여 연락처 정보만드는 프로그램을 업그래이드 시킴

package edu.java.contact02;

public interface ContactDAO {
	// 회원 정보 등록
	public abstract int insert(ContactDTO dto); // 맴버의 정보 입력

	// 회원 정보 전체 검색
	public abstract ContactDTO[] select(); // 리턴 타입이 중요함(회원 정보 여러개 저장)

	// 회원 정보 인덱스 검색
	public abstract ContactDTO select(int index);

	// 회원 정보 인덱스 수정
	public abstract int update(int index, ContactDTO dto);
} // end ContactDAO
package edu.java.contact02;

public class ContactDAOImple implements ContactDAO {
	// 1. private static 자기 자신 타입의 변수 선언
	private static ContactDAOImple instance = null;

	// 2. private 생성자
	private ContactDAOImple() {
	}

	// 3. public static 메소드 - 인스턴스를 리턴하는 메소드 구현
	public static ContactDAOImple getInstance() {
		if (instance == null) {
			instance = new ContactDAOImple();
		}
		return instance;
	}

	// 나중에 DB에서 사용 할 것이지만 지금은 이렇게 사용
	private final int MAX = 100; // 최대 회원수
	private ContactDTO[] list = new ContactDTO[MAX]; // 회원 정보를 저장할 배열
	private int count; // 배열에 저장될 데이터 개수

	public int getCount() {
		return count;
	}

	@Override
	public int insert(ContactDTO dto) {
		System.out.println("insert()"); // 로그 찍기
		System.out.println("dto = " + dto);
		list[count] = dto;
		count++;
		return 1; // 0 : 실패, 1 : 성공
	}

	@Override
	public ContactDTO[] select() {
		return list;
	} // end select()

	@Override
	public ContactDTO select(int index) {
		return list[index];
	}

	@Override
	public int update(int index, ContactDTO dto) {
		list[index].setPhone(dto.getPhone());
		list[index].setEmail(dto.getEmail());
		return 1;
	}

} // end ContactDAOImple
package edu.java.contact02;

public class ContactDTO {
	// 멤버 변수(필드, 프로퍼티)
	private String name; // 이름
	private String phone; // 연락처
	private String email; // 이메일

	public ContactDTO() {
		super();
		// TODO Auto-generated constructor stub
	}

	public ContactDTO(String name, String phone, String email) {
		super();
		this.name = name;
		this.phone = phone;
		this.email = email;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getPhone() {
		return phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public String toString() {
		return "MemberVO [name="+ name +"phone=" + phone + ", email=" + email + "]";
	}

}
package edu.java.contact02;

import java.util.InputMismatchException;
import java.util.Scanner;

// MVC 디자인 패턴에서 View 클래스
// - UI를 담당하는 역활
// * 현재 시스템은 규모가 작으므로 Controller 역활도 수행
public class ContactMain02 {
	private static Scanner sc;
	private static ContactDAO dao; // MemeberDAOImple 인스턴스를 저장할 변수

	public static void main(String[] args) {

		System.out.println("연락처 등록 메뉴");
		sc = new Scanner(System.in);

		dao = ContactDAOImple.getInstance(); // 다형성. 싱글톤 인스턴스 생성

		boolean run = true;
		while (run) {
		    showMainMenu();
		    try {
		        int choice = sc.nextInt();
		        switch (choice) {
		            case Menu.INSERT:
		                InsertMember();
		                break;
		            case Menu.SELECT_ALL:
		                selectAll();
		                break;
		            case Menu.SELECT_BY_INDEX:
		                selectByIndax(); // Assuming there was a typo in the original code
		                break;
		            case Menu.UPDATE:
		                updateMember();
		                break;
		            case Menu.QUIT:
		                sc.close();
		                run = false;
		                break;
		            default:
		                System.out.println("다시 선택하세요.");
		                break;
		        }
		    } catch (InputMismatchException e) {
		        System.out.println("올바른 선택이 아닙니다. 숫자를 입력하세요.");
		        sc.next(); // Clear the invalid input
		    } catch (Exception e) {
		        System.out.println("오류가 발생했습니다: " + e.getMessage());
		    }
		

		}

	} // end main()

	private static void updateMember() {
		System.out.println("인덱스 입력>");
		int index = sc.nextInt();

		int count = ((ContactDAOImple) dao).getCount();
		if (index >= 0 && index < count) {
			System.out.println("전화번호 입력>");
			String phone = sc.next();

			System.out.println("이메일 입력>");
			String email = sc.next();

			ContactDTO dto = new ContactDTO("", phone, email);
			int result = dao.update(index, dto);
			if (result == 1) {
				System.out.println("연락처 정보 수정 완료");
			}

		}
	} // end updateMember()

	private static void selectByIndax() {
		System.out.println("검색할 인덱스 입력>");
		int index = sc.nextInt();

		int count = ((ContactDAOImple) dao).getCount();
		if (index >= 0 && index < count) {
			ContactDTO dto = dao.select(index);
			System.out.println(dto);
		} else {
			System.out.println("존재하지 않는 인덱스입니다.");
		}
	} // end selectByIndax()

	private static void selectAll() {
		ContactDTO[] list = dao.select();

		int count = ((ContactDAOImple) dao).getCount();
		for (int i = 0; i < count; i++) {
			System.out.println("연락처 정보 [" + i + "]");
			System.out.println(list[i]);
		}

	} // end selectAll()

	private static void InsertMember() {
		System.out.println("--- 연락처 정보 등록 ---");
		System.out.println("이름 입력>");
		String name = sc.next();
		System.out.println("전화번호 입력>");
		String phone = sc.next();
		System.out.println("이메일 입력>");
		String email = sc.next();

		ContactDTO dto = new ContactDTO(name, phone, email);
		dao.insert(dto);

	} // end InsertMember()

	private static void showMainMenu() {
		System.out.println("------------------------------------------------");
		System.out.println("1. 등록 | 2. 전체 검색 | 3. 상세 검색 | 4. 수정 | 0. 종료");
		System.out.println("------------------------------------------------");
		System.out.println("선택>");

	} // end showMainMenu()

} // end MemberMain
package edu.java.contact02;

public interface Menu {
	int QUIT = 0; // 종료
	int INSERT = 1; // 등록
	int SELECT_ALL = 2; // 전체 검색
	int SELECT_BY_INDEX = 3; // 상세 검색
	int UPDATE = 4; // 수정
}

여기까지

0개의 댓글