클래스 안에 선언된 클래스
// 외부 클래스
class Outer {
int outerNum = 10;
// 내부 클래스
class Inner {
int innerNum = 100;
void innerMethod() {
System.out.println("내부 클래스 메소드");
}
}
void outerMethod() {
System.out.println("외부 클래스 메소드");
}
}
public class InnerClassTest {
public static void main(String[] args) {
Outer outerClass = new Outer();
outerClass.outerMethod(); // 외부 클래스 메소드
// 내부 클래스
// Inner innerClass = new Inner(); // 불가능, 외부클래스를 통해 생성 해야함
Outer.Inner innerClass = outerClass.new Inner();
innerClass.innerMethod(); // 내부 클래스 메소드
}
}
class OuterClass {
Runnable getRunnable() {
// 지역 클래스
class MyRunnable implements Runnable{
@Override
public void run() {
}
}
return new MyRunnable();
}
Runnable runner = new Runnable() {
@Override
public void run() {
}
}; // 세미콜론으로 끝나므로 객체임, 익명클래스 = 객체
}
자바 프로젝트의 빌드(build)를 자동화 해주는 빌드 툴(build tool)
xml 파일을 이용하여 라이브러리를 자동으로 다운로드하거나 프로젝트를 빌드해줌
ex) POM.xml의 dependencies 태그 안에 lombok을 추가하여 사용함
처리 과정 : Start View - Controller - Service - Model - EndView
// package, import 생략
public class StartView {
public static void main(String[] args) {
BloodTransfusionController controller = BloodTransfusionController.getInstance();
Donor donor4 = new Donor("donor4", "헌혈4", 52, "M", "AB-", "실험");
Recipient recipient4 = new Recipient("recipient4", "수혈4", 83, "M", "AB-", "수술");
BloodTransfusionProject newProject = new BloodTransfusionProject("AB-", "bt4", donor4, recipient4, "응급 처치 프로젝트");
// 모든 프로젝트 검색
controller.projectListView();
// 새로운 프로젝트 저장, 그리고 모든 프로젝트 검색
controller.insertProject(newProject);
controller.projectListView();
// 존재하는 프로젝트 검색
controller.projectView("A-");
// 존재하지 않는 프로젝트 검색
controller.projectView("A+");
// 존재하는 프로젝트 수정
controller.updateProject("A-", new Recipient("recipient5", "수혈5", 2, "F", "A-", "응급수술"));
controller.projectView("A-");
// 존재하지 않는 프로젝트 수정 : 예외 발생
controller.updateProject("B+", new Recipient("recipient6", "수혈6", 22, "F", "B-", "질병"));
// 존재하는 프로젝트 삭제 및 삭제여부 확인
controller.deleteProject("B-");
controller.projectView("B-");
}
}
// package, import 생략
public class BloodTransfusionController {
private static BloodTransfusionController instance = new BloodTransfusionController();
private BloodTransFusionProjectService service = BloodTransFusionProjectService.getInstance();
private BloodTransfusionController() {}
public static BloodTransfusionController getInstance() {
return instance;
}
// 모든 프로젝트 검색
public void projectListView() {
ArrayList<BloodTransfusionProject> projectList = service.getAllProjects();
EndView.projectListView(projectList);
}
// 특정 프로젝트 검색_
public void projectView(String projectName) {
BloodTransfusionProject project = null;
// NotExistException 라는 사용자 정의 예외로 처리함
try {
project = service.getProject(projectName);
} catch (NotExistException e) {
FailView.failMessageView(e.getMessage());
}
EndView.projectView(project);
}
// 새로운 프로젝트 저장_
public void insertProject(BloodTransfusionProject newProject) {
service.projectInsert(newProject);
}
// 존재하는 프로젝트 수정_
public void updateProject(String projectName, People people) {
try {
service.projectUpdate(projectName, people);
} catch (NotExistException e) {
FailView.failMessageView(e.getMessage());
}
}
// 이름으로 검색한 프로젝트 삭제_
public void deleteProject(String projectName) {
try {
service.projectDelete(projectName);
} catch (NotExistException e) {
FailView.failMessageView(e.getMessage());
}
}
}
// package, import 생략
public class BloodTransFusionProjectService {
private static BloodTransFusionProjectService instance = new BloodTransFusionProjectService();
private BloodTransfusionVirtualDB projectVirtualData = BloodTransfusionVirtualDB.getInstance();
private BloodTransFusionProjectService(){}
public static BloodTransFusionProjectService getInstance(){
return instance;
}
// 모든 프로젝트 반환, 배열 객체를 ArrayList로
public ArrayList<BloodTransfusionProject> getAllProjects(){
return projectVirtualData.getProjectList();
}
// 프로젝트 검색_
public BloodTransfusionProject getProject(String projectName) throws NotExistException{
BloodTransfusionProject project = null;
ArrayList<BloodTransfusionProject> projectList = projectVirtualData.getProjectList();
for (int i = 0; i < projectList.size(); i++) {
if(projectList.get(i).getBtProjectName().equals(projectName)) {
project = projectList.get(i);
}
}
if(project == null) {
throw new NotExistException("검색 요청하신 프로젝트는 존재하지 않습니다");
}
return project;
}
// 새로운 프로젝트 추가_
public void projectInsert(BloodTransfusionProject newProject) {
projectVirtualData.insertProject(newProject);
}
// 프로젝트 수정 - 프로젝트 명으로 현혈자 혹은 수혈자 수정_ , People : 다형성을 사용함
public void projectUpdate(String projectName, People people) throws NotExistException{
// 이미 완성된 getProjectName(projectName) 사용
BloodTransfusionProject project = getProject(projectName);
// Recipient 로 형변환 해줘야 함
if(project == null) {
throw new NotExistException("수정하고자 하는 Project가 존재하지 않습니다");
} else if (people instanceof Recipient) {
project.setRecipient((Recipient)people);
} else if (people instanceof Donor) {
project.setDonor((Donor)people);
}
}
// 프로젝트 삭제_
public void projectDelete(String projectName) throws NotExistException{
BloodTransfusionProject project = getProject(projectName);
getAllProjects().remove(project);
}
}
// package, import 생략
public class BloodTransfusionVirtualDB {
private static BloodTransfusionVirtualDB instance = new BloodTransfusionVirtualDB();
private ArrayList<BloodTransfusionProject> projects = new ArrayList<>();
private BloodTransfusionVirtualDB() {
projects.add(new BloodTransfusionProject("A-", "bt1",
new Donor("donor1", "헌혈1", 12, "M", "A-", "봉사"),
new Recipient("recipient1", "수혈1", 23, "F", "A-", "사고"),
"A-형간의 수혈"));
public static BloodTransfusionVirtualDB getInstance() {
return instance;
}
// 모든 프로젝트 반환_
public ArrayList<BloodTransfusionProject> getProjectList(){
return projects;
}
// 프로젝트 추가_
public void insertProject(BloodTransfusionProject newProject) {
projects.add(newProject);
}
// 수정, 삭제를 Service가 처리함
}
타입이 일치 하지 않거나 해당 타입에 대한 속성이나 메소드 처리에서 많은 예외를 만남
커서에 나오는 안내문이나 구글링, 질문으로 해결함
MVC 패턴에서 구조 파악 잘하기
M V C (Service) 에서 데이터의 흐름 잘 이해하기
타입에 대한 일치 여부를 꾸준히 생각해야함, 아니면 형변환을 고려해야함
내가 어디에서 어떤 타입에 대해 작업해야하는지 인지하여야 함
Start View - Controller - Service - Model - EndView의 구조로 작업을 해보니 흐름에 대한 얼개는 파악되지만 어디서 작업하는지 어떻게 작업할 지를 고민해보게된다.
완벽하게 이해했다고는 어렵겠지만 어느 정도 흐름을 이해한 것 같다.
코드가 갑자기 길어져서 요약을 하면 중간 중간 끊기는 것 같고 파악하기 어려울 것 같아 원본 코드를 그대로 올렸다. 코드 전체를 흐름대로 이해하고 다시 타이핑해보는게 더 좋은 방법으로 판단된다.