이번주는 연휴로 왕창 쉬고 와서 너무 힘들었....다.... 하지만 다음주면 또 한글날덕분에 3일 쉬니까 열심히 해야지 😀
이번주의 시작을 열었던 것은 InterFace
였다. 언뜻 보면 구조 자체는 클래스와 같은 형태였지만, 차이점은 아래와 같았다.
- 기본적으로 필드에 정의되는 멤버들은 static final 키워드가 생략된
상수
멤버들이다.- 다중 상속이 불가능했던 클래스와는 다르게, 다중 상속(구현이 더 맞는말이다.)이 가능했다.
- 실행부가 없는 추상 메소드들을 정의하고, 이를 구현 클래스에서 Overriding함으로서 일종의 설계도? 와 같은 역할을 하는 듯 했다.
필드에 정의되는 멤버들이 모두 상수라는 것에 1차적으로 당황했고, 실행부 없이 추상 메소드만 주욱 늘어놓는 형태에 2차적으로 당황했다. 또한, 머리 속에 드는 생각은 딱 하나였다.
왜쓰는거임..?
아무리 클래스와 클래스 간에 연결을 담당하는 것이 인터페이스라지만 굳이 굳이 굳이 굳이 굳이..........
라는 생각을 하던 찰나 강사님께서 협업할 때 용이하게 사용할 수 있다고 말씀해주셨다. 예를 들면 아래와 같은 상황들일 것이다.
A회사에서 하나의 프로젝트를 시작했다. 행렬계산이 느린 사람들을 위해 각종 행렬관련 연산을 진행하는 프로그램을 만든다고 가정하자.
각 기능별로 한 사람씩 맡아서 분담한다고 가정할 때, A회사에서 제공하는 인터페이스는 아래와 같다고 가정하자.
public interface MatrixMachine {
void setMatrixFromUserInput();
void getMatrix();
...
}
B씨는 첫 번째 추상 메소드에 대한 구현 클래스를 구성하면 될 것이고, C씨는 두 번째 추상 메소드에 대한 구현 클래스를 구성하면 될 것이다.
이렇게 구현 클래스들이 모두 완성되면, 한 클래스 파일에 각 파일을 합쳐서 완성할 수 있을 것이다.
기존에 알고 있던 얕은 알고리즘 지식 정도 수준의 알고리즘만 진행했다. 간단한 문제 두 문제 정도 풀이하는 것과 간략하게 시간복잡도를 계산하면서 알고리즘을 평가하는 정도만 진행했다.
자료구조에서 했던 부분은 파일처리였다. 이 부분 또한 python에서 자주 다뤘던 터라 쉽게 이해할 수 있었다. 아래 프로그램은 정해진 인원수에 따라 파일에 사람의 정보를 입력하고 그 전체를 출력하거나, 검색하는 기능을 하는 프로그램이다.
package _1006;
import java.io.*;
import java.util.Scanner;
public class ReadPersonInfo {
public static void main(String[] args) {
Scanner intScanner = new Scanner(System.in);
Scanner strScanner = new Scanner(System.in);
boolean flag = true;
while(flag){
System.out.println("--------------실행화면--------------");
System.out.print("1. 입력\n2. 전체출력\n3. 검색\n4. 종료\n\n실행할 메뉴의 번호를 입력하세요 >> ");
int menu = intScanner.nextInt();
switch (menu){
case 1:
System.out.print("등록할 사람의 수를 입력하세요 : ");
int personCnt = intScanner.nextInt();
String info = "";
while(personCnt > 0){
System.out.println("--------------회원 등록을 시작합니다.--------------");
System.out.print("이름을 입력하세요 : ");
String name = strScanner.nextLine();
System.out.print("전화번호를 -를 포함하여 입력하세요 : ");
String phone = strScanner.nextLine();
System.out.print("주소를 입력하세요 : ");
String address = strScanner.nextLine();
info += name + "," + phone + "," + address + "\n";
personCnt--;
}
System.out.println("---------------입력을 완료했습니다.---------------");
try{
Writer os = new FileWriter("./_1006/person_info.txt", true);
os.write(info);
os.flush();
os.close();
}catch (IOException e){
e.printStackTrace();
}
break;
case 2:
try{
Reader r = new FileReader("./_1006/person_info.txt");
String infoData = "";
while(true){
int data = r.read();
if (data == -1) break;
infoData += (char)data;
}
r.close();
infoData = infoData.replace(",", " ");
int dataCnt = infoData.split("\n").length;
System.out.println("이름" + "\t " + "전화번호" + "\t\t" + "주소");
System.out.print(infoData);
System.out.println();
System.out.println(dataCnt + "개의 자료를 출력했습니다.");
}catch (FileNotFoundException f){
f.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
break;
case 3:
System.out.print("조회할 인원의 이름을 입력하세요 : ");
String name = strScanner.nextLine();
try{
Reader r1 = new FileReader("./_1006/person_info.txt");
String infoData2 = "";
while(true){
int data = r1.read();
if (data == -1) break;
infoData2 += (char)data;
}
r1.close();
String[] _1dArray = infoData2.replace("\n", ",").split(","); // 1차원 배열을 생성하고
String[][] _2dArray = new String[_1dArray.length/3][3]; // 각 회차별로 쪼개기 위해 2차원 배열 생성
int idx = 0; // 인덱스값을 위한 초기값
for (int i = 0; i < _2dArray.length; i++) { // 행의 길이만큼 순회하고
for (int j = 0; j < _2dArray[i].length; j++) { // 열의 길이만큼 순회하면서
_2dArray[i][j] = _1dArray[idx++]; // 각 행의 열에 값을 채워넣되, idx를 지속적으로 증가시킨다.
}
}
String result2 = ""; // 결과를 담을 초기값 생성
for (int i = 0; i < _2dArray.length; i++) { // 행의 길이만큼 순회하고
for (int j = 0; j < _2dArray[i].length; j++) { // 열의 길이만큼 순회하면서
if (_2dArray[i][0].equals(name)) { // 각 열의 첫 번째 값이 회차이므로, 그 회차가 사용자가 입력한 값과 같다면
for (int k = 0; k < _2dArray[i].length; k++) // 해당 행의 모든 열을 순회하면서
result2 += (k < _2dArray[i].length - 1) ? _2dArray[i][k] + " " : _2dArray[i][k]; // 초기값에 각 값을 더한다.
break; // 그리고 찾았다면 더이상 반복문을 돌 필요가 없기에 break
}
}
}
if (result2.equals(""))
System.out.println("❌ 존재하지 않는 회원입니다. ❌");
else {
System.out.println("----------------------------------");
System.out.println(result2);
System.out.println("----------------------------------");
}
}catch (FileNotFoundException f){
f.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
break;
case 4:
flag = false;
break;
}
}
}
}
이번주도 짧았다.. 연휴를 푹 쉬고와서 막 크게 한 것이 없는 것 같았는데 다음주부터는 쉬는날 없이 쭉 달리니까 더 열심히 해야겠다 😀