오늘의 코드
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; // 수정
}
여기까지