728x90
객체추상화
-
VO 클래스는 실제 프로젝트에서 주로 다루게 될 Data를 추상화한 클래스
-
주요 항목 : 필드변수가 매우 중요한 클래스
-
method 역할보다는 필드변수 역할이 주로 사용되는 클래스
-
domain, model, VO, command > 데이터를 추상화한 클래스 모음
>>>>> domain > Student 🙂
Service
-
Business Login
-
실제로 어떤 일들을 수행하는 주요 method를 모아두는 package
-
프로젝트에서 주요 연산을 수행하는 코드를 구현할 때
-
Service 클래스에 구현을 한다.
-
Service 클래스는 특별한 경우가 아니면 먼저 interface를 만들어서
-
어떤 method를 만들것인가 디자인하는 것이 좋다.
>>>>> service > StudentService 🙂
필드 변수
-
class Scope의 변수를 선언하기
-
여기(필드변수 영역)에 선언된 변수는
-
현재 클래스의 모든 method들이 공유하고, 참조(쓰기, 읽기)가 가능하다.
변수의 scope
-
변수를 선언할 때 어디에 선언하느냐에 따라
-
변수를 참조할 수 있느냐 없느냐가 결정된다.
-
필드변수를 선언할 때 접근제한자를 public, private, protected 중에 한가지로 설정할 수 있다.
-
필드변수를 선언할 때 가급적 public으로 선언하는 것은 지양해야한다.
-
필드변수를 public으로 선언해놓으면 외부에서 필드변수에 직접 접근하여 값을 변형 시킬 수 있다.
-
그러하면 예기치 못한 결과를 얻을 수 있다.
-
필드변수를 private으로 선언하는 것은
-
객체의 정보은닉, 캡슐화 패턴에 적합한 방식
-
외부에서 접근하지 못하도록 차단하고 현재 클래스에서 선언된 method에서만 접근을 허용하는 것이다.
-
혹시 필드변수를 외부에서 접근할 필요가 있는 경우는 getter, setter를 만든다.
필드변수를 protected로 선언하기
-
protected는 private 접근 제한자와 거의 유사한 형태이다.
-
만약 현재 클래스를 다른 클래스를 만들 때 상속(extends)하여 사용하려고 할 때
-
상속받은 클래스에서 현재 클래스의 필드변수를 같이 상속받아서 사용하고자 할 때는 변수를 protected로 선언한다.
-
현재 클래스에서는 private처럼 작동하고
-
상속받은 클래스에서도 마치 자신이 변수를 선언한 것 처럼 사용할 수 있게 된다.
-
현재 클래스를 상속할 수 있도록 생각을 하고 구현을 한다면
-
필드 변수를 protected로 선언을 한다.
-
만약 private으로 선언을 하면 상속받은 클래스에서
-
이 변수들을 다시 선언해주어야한다.
protected List<Student> studentList; // studentList 필드변수 선언
// 클래스 생성자
// 클래스를 객체(인스턴스)로 만들 때 호출되는 method
// 클래스를 객체로 생성할 때 1번 호출되는 method로 반드시 생성(초기화)가 필요한
// 필드변수들을 여기에 생성하는 코드를 작성해준다.
public StudentServiceImplV1() {
studentList = new ArrayList<Student>(); // 기본 생성자 안에 List 초기화해주는 코드
}
유효성 검사
-
현재 입력된 정보가 정상 범위(Validate)에 있는지 검사하여
-
데이터를 사용할지 말지를 결정하고
-
입력하는 사용자에게 통보하고 다른 행동을 취할 수 있도록 하는 것
-
유효성 검사는 개발자 입장에서 매우 귀찮은 단순노동일 경우가 많지만
-
사용자입장에서는 유효성검사가 많으면 그만큼 잘못된 데이터를 입력하는 경우를 방지할 수 있다.
-
유효성검사를 어느정도까지만 할 것인가 잘 고민을 해야함
-
trade off 어느 적정을 찾는가를 고민하는 ...
// Student에서 grade를 int로 선언했기 때문에
// 문자열을 숫자형으로 변경해주는 try-catch문 작성
// (모르고 문자를 입력 했을때를 방지하기 위함)
// catch문을 타면 다시 처음부터 작성함
// true값을 보내서
int intGrade = 0 ;
try {
intGrade = Integer.valueOf(strGrade);
} catch (Exception e) {
System.out.println("학년은 숫자만 가능 :(");
System.out.println(student.getName() + "다시 입력 해주세요");
return true;
}
>>>>> service > StudentServiceImplV1 🙂
// StudentServiceImplV1에 정의된
// 필드변수, method를 상속받아서 작성하는 클래스
// 필드변수와 method는 public, protected로 되어있는경우만 상속된다.
public class StudentServiceImplV2 extends StudentServiceImplV1 {
}
exception Handling
-
파일을 작성하는 과정에 아무리 코드를 잘 작성해도
-
운영체제 차원에서 발생하는 exception은 코드에서 처리가 어렵다는 것을
-
컴파일러가 알고 있기 때문에 개발자에게 의무적으로 exception처리를 하도록 규정하고 있다.
-
FileNotFoundException
-
try-catch구문을 사용하지 않으면 컴파일 자체가 안됌.
try {
// (내가 저장할 파일)<괄호안 을 printStream이라는 친구에 보내고 outPut에 저장하면 고대로 저장
outPut = new PrintStream(studentFile);
} catch (FileNotFoundException e) {
System.out.println(studentFile + "파일을 만들 수 없음 :(");
return; // 더이상 진행하지 않도록 return 안해주면 그 아래 진짜 오류가 발생
}
Persistance
-
V1에서 구현된 studentList()를 다시 새롭게 구현하겠다.
-
List를 Console에 보여주는 방식이었는데
-
List결과를 file에 저장하여 프로젝트가 종료되어도 언제든지
-
결과를 확인할 수 있도록 구현해보자
-
>>> 데이터, 결과를 파일로 저장하는 것은 결과를 영구 보관하는 목적이 있다.
-
메모리 > Data : 영구적으로 보관하는 효과
-
이러한 것을 project에서는 persistance라고 한다!
>>>>> service > StudentServiceImplV2 🙂
파일을 저장하고 읽어보고 한줄씩 추출
// student.txt를 studentFile에 저장
String studentFile = "src/com/biz/student/exec/student.txt";
// "" 안에있는 주소는 생성할 곳의 패키지 속에 아무 클래스나 우클릭 후 위의 사진에 있는 Copy Qualified Name 클릭! 하면 주소가 복사가 되는데 뒤쪽에 student.txt만 변경해주는 부분이다아~~~
// FileReader 클래스로 fileReader 객체(인스턴스)를 선언하고 clear하기
// 문자열, 숫자 등이 아닌 정체를 알 수 없는 클래스로 객체를 선언할 때는
// 가급적 null로 clear를 시켜주는 것이 좋다.
FileReader fileReader = null;
// 로컬디스크에 저장된 파일을 읽을 때 FileReader만으로 읽을 수 있지만
// 파일을 읽어들이는 성능상의 이점을 주기위해서 중간에 BufferedReader를
// 연결하여 파일을 읽어들이는 것이 좋다.
BufferedReader buffer = null;
try {
// 읽어들일 파일을 열고, 파일에 관련된 정보를 fileReader 객체에 저장
fileReader = new FileReader(studentFile);
// fileReader객체에 저장된 정보를 buffer관리자에 전달하여 파일을 읽도록 지시
// buffer 관리자는 파일을 몽땅 읽어서 자신이 관리하는 buffer 장치에 임시 보관
buffer = new BufferedReader(fileReader);
// ↑ 어떤 장치와 똑같다고 보면 됌
// buffer 장치로부터 text 내용을 1줄씩 읽어 들이기
// buffer로부터 readLine() method를 호출하게되면 파일내용을
// 한줄씩 차근차근 읽어들인다는걸 알 수 있음
// System.out.println(buffer.readLine());
-
문자열 변수의 경우 for, while 반복문 내에서 계속해서 선언하는 것은 메모리 관리상 매우 좋지 않다.
-
따라서 문자열 변수는 반복문이 실행되기 전에
-
먼저 선언, clear를 하고 진행하는 것이 좋다.
String reader = "";
while(true) {
// buffer.readLine() method는 호출 될 때마다
// buffer로 부터 파일을 한줄씩 읽어서 reader변수에 담는다.
// buffer로 부터 파일을 읽어오다가 파일을 모두 읽었는데도 불구하고
// 또 readLine() method를 호출하면 null 값이 return되고
// reader 변수에는 null 값이 담기게 된다.
// 그러면 reader변수에 null 값이 담겨있는지 확인하여 << if문
// 반복문을 종료한다.
// null은 equals 사용하지않고 == 비교연산자 사용하면 됌!
reader = buffer.readLine();
if (reader == null) {
break;
}
System.out.println(reader);
}
>>>>> service > StudentServiceImplV3 🙂
읽어들인 파일에 있는 라인을 : 기준으로 분해하여 학생 정보로 변환
// 닫는 순서는 연 순서와 반대로!!
// 파일을 읽기, 쓰기로 열었으면 모두 닫아서 종료해주어야한다.
buffer.close();
fileReader.close();
>>>>> service > StudentServiceImplV4 🙂
전공이 컴퓨터 공학인 학생들만 리스트를 추출하려면?
String[] students = reader.split(":");
Student std = new Student();
std.setNum(students[0]);
std.setName(students[1]);
std.setGrade(Integer.valueOf(students[2]));
std.setDept(students[4]);
if(std.getDept().equals("컴퓨터공학")) {
studentList.add(std);
}
>>>>> service > StudentServiceImplV5 🙂
데이터를 엑셀에서 열어서 사용할 수 있도록 파일을 작성!
.CSV 파일
-
,(컴마)로 데이터들을 구분하는 문자열로 만들고
-
그 내용을 text 형식으로 저장하면 된다.
// System.out.printf()
// printf와 같지만 score라는 변수에 담은것!
String score = String.format("%d,%d,%d,%d,%d,%d", i+1,intKor,intEng,intMath,intSum,intAvg);
>>>>> exec > ScoreEx_01 🙂
PrintStream & PrintWriter
PrintStream outPut = System.out; // 파일 읽기?!
>>> exec > ScoreEx_02
PrintWriter outPut = null ; // = System.out; // 파일 저장
>>> exec > ScoreEx_03
PrintStream에서 PrintWriter로 변경해준 코드다
PrintStream과 더불어 많이 사용한다.
>>>>> exec > ScoreEx_02,03 🙂
String score = String.format("%05d:%d:%d:%d:%d:%06.2f",i+1,intKor,intEng,intMath,intSum,floatAvg);
%05d < 0을 5개짜리 넣어라! 문자열코드
%6.2f < 전체자리수 6개로 만들고 소수점이하 3자리
000000
↑ 4번째에 점(.)이 들어감
030 = 30
변환시킬때를 대비해 0을 넣어줘야함 << 이거 잘 이해안됐움 ㅠ 물어보자
>>>>> exec > ScoreEx_03 🙂
String형 변수
-
String형 변수는
-
primitive 변수처럼 사용을 하지만
-
근본적인 형(type)은 클래스이다.
-
따라서 String형 변수는 일반 변수라기 보다는 객체(인스턴스)이다.
일반 변수(primitive)와 객체의 차이
-
일반변수 : 그냥 데이터를 저장하는 메모리의 저장공간일 뿐이다.
-
객체 : 데이터를 저장하는 용도 외에 다양한 method를 통하여
-
데이터를 가공, 연산하는 일들을 수행할 수 있다.
String strNation = "Republic of Korea";
* strNation은 문자열 변수이면서 String 클래스를 사용하여 만든
* String type 객체이다.
* 따라서 점(.)연산자를 통하여 다양한 method를 사용할 수 있다.
-
strNation에 담긴 문자열을 모두 대문자로 바꾸어서 return하는 method
System.out.println(strNation.toUpperCase());
-
그와 반대로 소문자로 바꾸는
System.out.println(strNation.toLowerCase());
-
대소문자를 구별하면서 strNation에 담긴 문자열이 korea냐 ? 하고 물어보는 method
System.out.println(strNation.equals("korea")); // 문자열이 같은지 비교
-
그와 반대로 대소문자 관계없이 비교하기
strNation = "Korea";
System.out.println(strNation.equalsIgnoreCase("korea")); // true
-
strNation 문자열에 Korea라는 문자열이 들어있냐?
-
문자열에 일부가 들어있냐? 라고 물어보는 eq, contains많이 사용!
strNation = "Republic of Korea";
System.out.println(strNation.contains("Korea"));
문자열은 별도로 객체 변수에 담지않아도 된다!
-
문자열은 별도로 객체 변수에 담지 않아도
-
" " 로 묶인 문자열은 문자열 객체로 취급되어 점(.)연산자를 직접 사용할 수 있다.
-
java에서는! (다른 언어들도 있지만 거의 없다)
System.out.println("Korea".equals("Korea"));
// 문자열을 객체변수에 담지않고 바로 대문자로 바꾸고 싶을 때
System.out.println("Korea".toUpperCase());
// 문자열을 대문자로 모두 바꾸어 str1변수에 담아라
String str1 = "rePublic of koRea".toUpperCase();
>>>>> string > StringEx_01 🙂
문자열 분해하기, 잘라서 나타내기
String strNation = "Republic of Korea";
// 9번부터 11번되기 전까지 앞에까지!
// 9 <= x < 11
// strNation에 담긴 문자열에서 9 <= x < 11 범위의 문자열을 잘라서
// subNation에 담아라
String subNation = strNation.substring(9,11);
System.out.println(subNation); // of
-
문자열 개수가 몇개냐?
int strLength = strNation.length();
-
strNation 문자열을 1글자씩 잘라서 콘솔에 보이기
for (int i = 0 ; i < strLength ; i++) {
String s = strNation.substring(i, i+1);
System.out.println(s);
}
-
문자열을 한글자씩 분해하여 문자배열로 변환하여 charNations에 저장하라
char[] charNations = strNation.toCharArray();
for(int i = 0 ; i < charNations.length; i++) {
System.out.print(charNations[i] + "\t");
}
-
문자열을 한글자씩 분해하여 문자열 배열로 strNations에 저장하라
String[] strNations = strNation.split("");
for(int i = 0 ; i < strNations.length ; i++) {
System.out.print(strNations[i] + "\t");
}
>>>>> string > StringEx_02 🙂
문자열 나누기
-
문자열을 알파벳 단위로 나누기
// ("") < null 이라고 생각 아무것도 없는 문자
// 문자열을 알파벳 단위로 나누어라
strNations = strNation.split("");
-
글자를 한글자씩 나누어서 표현을 한다.
// 확장된 for문 사용
for(String s : strNations) {
System.out.print(s + "\t");
}
-
특정한 문자를 기준으로 데이터를 나누고 싶을 때 사용
// 얘는 단어별로 나누어져 있는데
// strNation이라는 빈칸을 기준으로 나누라는 이야기
// 문자열을 빈칸(Space) 단위로 나누어라
// 특정한 문자를 기준으로 **데이터를 나누고 싶을때 사용**하기 요긴한 친구~!
strNations = strNation.split(" ");
for(String s : strNations) {
System.out.print(s + "\t");
}
단위(모듈) test
-
score.csv 파일을 읽어서 코드를 검증하고
-
모든 결과가 일치로 나타나는지 판단을 하는 것
-
이때 사용된 score.csv파일의 데이터를 testCase라고 한다.
-
단위 test(코드검증) : 코드를 만들면 보장된 Data로 test를 해봐야함
-
보장된 Data를 : testCase
>>>>> string > StringEx_03 🙂
Text , BIN 파일 : README.md 참조
내 작은 노트도 참고!
728x90
'Java' 카테고리의 다른 글
20.07.01Java_addr domain, 필드변수, Scanner, Prompt, nextLine(), valueOf(), try-catch문, 생성자 초기화, equals() (0) | 2020.08.31 |
---|---|
20.07.03 Java_Book 객체추상화,input(),implements (0) | 2020.08.31 |
20.07.07 Java_Student, Java_Word 객체추상화 단계, 파일읽기, Static, Data 의 join, Collection (0) | 2020.08.31 |
20.07.08 Java_Bank 3항 연산자, Date, 숫자 회계방식 (0) | 2020.08.31 |
20.07.10 java_projects > Java_Grade_Solve (0) | 2020.08.31 |