- 자바 기초2024년 12월 22일
- chantleman
- 작성자
- 2024.12.22.:59
1. 값 비교 (new, ==, equals())
String nameA = "췐틀맨"; String nameB = "췐틀맨"; String nameC = new String("췐틀맨"); String nameD = new String("췐틀맨"); System.out.println(nameA == nameB); //true System.out.println(nameA == nameC); //false System.out.println(nameC == nameD); //false System.out.println(nameC.equals(nameD)); //true
new
새로운 객체 생성
→ 주소값이 다름
==
주소값 비교
→ 값이 같아도 주소값이 다르면 다른거임
equals()
값비교
→ 주소값이 달라도 값이 같으면 같은거임
하지만 비교 대상이 문자열이 아닌 객체타입일 경우 주소값을 비교함!!
근데 만약 객체 자료형을 비교할 때 주소값이 안니 객체의 필드값을 기준으로 비교를 하고싶다면
equals 메소드를 오버라이딩해서 주소가 아닌 필드값을 비교하도록 재정의해준다
String도 사실은 객체 타입이기 때문에 주소값 비교를 하지만 문자열의 equals는 주소가 아닌 값 비교를 하는 이유는
String 클래스에 equals()메소드를 재정의했기 때문!
2. 파일 쓰기 (FileUtils.writeLines())
List<String> lines = new ArrayList<>(); for(int i=0;i<100;i++) { lines.add("샘플 데이터 생성 라인 " + (i+1)+"번째"); } try { File file = new File("D:/test/파일.txt"); FileUtils.writeLines(file, lines, true); //true: append. 그 파일에 계속 추가해서 작성 } catch (IOException e) { e.printStackTrace(); }
FileUtils.writeLines(파일 객체, 리스트 형태의 텍스트, append여부)
리스트 형태의 문자열을 각 줄로 분리하여 텍스트 파일에 작성됨
3. 파일 읽기 (FileUtils.readLines())
try { File file = new File("D:/test/파일.txt"); List<String> lines = FileUtils.readLines(file, "UTF-8"); System.out.println("lines.size(): "+lines.size()); for(String line:lines) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }
FileUtils.readlines(파일, 인코딩)
파일의 텍스트를 한줄씩 읽어와 리스트에 저장함
4. 파일 정보 불러오기 (FilenameUtils)
String fullFileName = "D:/test/20241221/test.txt"; System.out.println(FilenameUtils.getBaseName(fullFileName)); // 파일명 System.out.println(FilenameUtils.getExtension(fullFileName)); // 확장자 System.out.println(FilenameUtils.getName(fullFileName)); // 파일명 + 확장자 System.out.println(FilenameUtils.getPrefix(fullFileName)); // 드라이브, 네트워크경로, 루트경로 System.out.println(FilenameUtils.getPath(fullFileName)); // 디렉토리 경로 String name=FilenameUtils.getBaseName(fullFileName); String ext = FilenameUtils.getExtension(fullFileName); String uuid = UUID.randomUUID().toString(); String newFileName = uuid+"_"+name+"."+ext; System.out.println(newFileName);
People2, Student2, Teacher2, Manager2 클래스를 맹글어보장 !!
People2
public class People2 { private String name; private String age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
Student2
public class Student2 extends People2{ private String grade; //학년 private String classNo; //반 private String no; //번호 public String getGrade() { return grade; } public void setGrade(String grade) { this.grade = grade; } public String getClassNo() { return classNo; } public void setClassNo(String classNo) { this.classNo = classNo; } public String getNo() { return no; } public void setNo(String no) { this.no = no; } }
Teacher2
public class Teacher2 extends People2{ private String manageType; //정교사, 기간제교사 private String operateType; //담임교사, 일반교사 public String getManageType() { return manageType; } public void setManageType(String manageType) { this.manageType = manageType; } public String getOperateType() { return operateType; } public void setOperateType(String operateType) { this.operateType = operateType; } }
Student2와 Teacher2는 People2을 상속받기 위해 extends를 해줬당
Manager2
public class Manager2 { private List<People2> peopleList = new ArrayList<People2>(); public void create(People2 people) { peopleList.add(people); } public void printPeopleList() { System.out.println("==== 전체 ===="); for(People2 people:peopleList) { System.out.println(people); } } public static void main(String[] args) { Manager2 manager = new Manager2(); People2 people1 = new Student2(); people1.setName("김장철"); people1.setAge("40"); people1.setSex("남자"); //강제 형변환 ((Student2)people1).setGrade("3"); ((Student2)people1).setClassNo("1"); ((Student2)people1).setNo("11"); manager.create(people1); manager.printPeopleList(); } }
DB 연동하기 귀찮으니깐 그냥 List로 가볍게 해보장
김장철이라는 학생의 정보를 담아보려고 하는데...
name, age, sex는 잘 담기지만 grade, classNo, no는 에러가 난당
여기서 Student2객체를 People2 타입으로 참조했기때문에
People2 클래스는 Student2 클래스의 속성( grade, classNo, no)에 접근할 수가 없음!
그래서 강제 형변환을 해줘야한당
하지만 이렇게 일일이 set하기 귀찮으니까 Student2 클래스에 생성자를 만들어서 바로 파라미터값을 넣어주장
public Student2( String grade, String classNo, String no, String name, String age, String sex) { this.name=name; //super.name=name; this.grade=grade; this.no=no; this.classNo=classNo; this.age=age; this.sex=sex; }
이렇게 하면 Student2 클래스에 있는 속성들이 private으로 돼있기 때문에
this.name=name; ← 이렇게 쓸 수 없음!
아래처럼 this.setName(name)으로 해줘야함 (teacher 클래스도 해주장)
public Student2( String grade, String classNo, String no, String name, String age, String sex) { this.setName(name); this.setGrade(grade); this.setNo(no); this.setClassNo(classNo); this.setAge(age); this.setSex(sex); }
그럼 이제 manager2 클래스에서 이렇게 파라미터로 세팅해줄 수 있음!!
public static void main(String[] args) { Manager2 manager = new Manager2(); People2 people1 = new Student2("3","1","11","수지","25","여자"); manager.create(people1); manager.printPeopleList(); }
근데 결과가 요따구로 나온당
그 이유는 toString()을 안해줬기때문!
그래서 student2, people2, teacher2 클래스에서 toString()을 generate해주장
다시 실행하면 이렇게 잘 나온당
근데 나는 name, age, sex도 설정해줬는데 왜 grade, classNo, no만 나오는건지 의문이 들것이당
그것은 student2클래스에서 toString()할 때 super클래스에 있는 속성들도 같이 해줘야한당 (teacher 클래스도 해주장)
@Override public String toString() { return "Student2 [grade=" + grade + ", classNo=" + classNo + ", no=" + no + "]"+super.toString(); }
다시 실행해보면 이렇게 잘 나온당
이제 학생과 선생님의 정보를 설정하고 List에 넣고 출력해보장
public class Manager2 { private List<People2> peopleList = new ArrayList<People2>(); public Manager2() { People2 people1 = new Student2("3","1","11","수지","25","여자"); People2 people2 = new Student2("4","2","11","지영","30","여자"); People2 people3 = new Student2("5","2","2","철수","21","남자"); People2 people4 = new Teacher2("김승수", "50", "남자","정교사","담임교사"); People2 people5 = new Teacher2("최보라", "34", "여자","기간제교사","일반교사"); People2 people6 = new Teacher2("주우재", "45", "남자","기간제교사","일반교사"); this.create(people1); this.create(people2); this.create(people3); this.create(people4); this.create(people5); this.create(people6); } public void create(People2 people) { peopleList.add(people); } public void printPeopleList() { System.out.println("==== 전체 ===="); for(People2 people:peopleList) { System.out.println(people); } } public static void main(String[] args) { Manager2 manager = new Manager2(); manager.printPeopleList(); } }
이제 학생들 정보만 출력해보장
public void printStudentList() { System.out.println("==== 학생 ===="); for(People2 people:peopleList) { if(people instanceof Student2) { System.out.println(people); } } }
public static void main(String[] args) { Manager2 manager = new Manager2(); manager.printStudentList(); }
이번에는 선생님 정보만 출력해보장
public void printTeacherList() { System.out.println("==== 선생 ===="); for(People2 people:peopleList) { if(people instanceof Teacher2) { System.out.println(people); } } }
public static void main(String[] args) { Manager2 manager = new Manager2(); manager.printTeacherList(); }
이번에는 이름을 유일키로 가정하고, 해당 이름의 사람을 찾을 수 있게 해보장
public People2 retrieve(People2 people) { People2 findPeople=null; for(People2 fp:peopleList) { if(fp.getName().equals(people.getName())) { findPeople=fp; } } return findPeople; }
public static void main(String[] args) { Manager2 manager = new Manager2(); People2 people= new Student2(); people.setName("수지"); People2 findPeople = manager.retrieve(people); System.out.println("findPeople:"+findPeople); }
위처럼 for문으로 찾아도 되지만 아래처럼 indexOf() 사용해서 해도됨!
public People2 retrieve(People2 people) { People2 findPeople=null; int index = peopleList.indexOf(people); if(index>-1) { findPeople = peopleList.get(index); } return findPeople; }
하지만 실행하면
null이 뜬당!
people2 클래스에 generate hashcode and equals하면 됨!
이름이 같은 사람을 찾아야하니까 name만 선택한당
이렇게 나오는데 나는 class 비교는 빼줬다
다시 실행해보면
짜잔
잘 나오는 것 확인
이제 정보 수정하는 것을 해보장
public int update(People2 people) { int cnt=0; peopleList.remove(people); peopleList.add(people); return cnt; }
이렇게 기존의 것을 remove하고 다시 add해도 되고
아래처럼 set으로 변경해줘도 되지만
public int update(People2 people) { int cnt=0; People2 findPeople = this.retrieve(people); if(findPeople !=null) { findPeople.setSex(people.getSex()); } return cnt; }
근데 수정해야할 게 많으면 일일이 set해서 바꾸기 귀찮으니까
아래처럼 BeanUtils.copyProperties()를 사용해도 된당!
public int update(People2 people) { int cnt=0; People2 findPeople = this.retrieve(people); if(findPeople !=null) { BeanUtils.copyProperties(people, findPeople); } return cnt; }
copyProperties: 원본 객체를 복사 (원본 객체, 복사 대상 객체)
copyProperties의 특징
1. 속성 이름이 동일하고, 타입이 호환되는 필드들에 대해서만 복사가 이루어짐
2. 기본 생성자가 있어야함
3. 원본 객체는 getter 메소드가 있어야하고, 복사 대상 객체는 setter 메소드가 있어야함
여기서는 수지 학생의 정보를 수정하려고 하니까
findPeople : 원래 수지 학생의 정보가 담긴 객체
people : 바꿀 정보가 담긴 객체
즉, people 객체의 값을 findPeople 객체로 복사된당(덮어쓰게된당)
public static void main(String[] args) { Manager2 manager = new Manager2(); people = new Student2("3","1","11","수지","25","남자"); int cnt = manager.update(people); System.out.println("cnt : "+cnt); People2 findPeople = manager.retrieve(people); System.out.println("findPeople:"+findPeople); }
수지를 남자로 바꿔보장
이번에는 삭제해보장
public int delete(People2 people) { int cnt=0; if(peopleList.remove(people)) { cnt++; } return cnt; }
public static void main(String[] args) { Manager2 manager = new Manager2(); People2 people= new Student2(); people.setName("수지"); int cnt2=manager.delete(people); System.out.println("cnt2: "+cnt2); manager.printPeopleList(); }
수지가 사라진 것을 볼 수 있당
728x90'자바' 카테고리의 다른 글
MyBatis ResultMap - Collection, Association (0) 2024.11.20 iterator (1) 2024.11.09 selectkey (0) 2024.10.15 forward, sendredirect (0) 2024.10.15 전자정부프레임워크 개발환경구축 (0) 2024.10.11 다음글이전글이전 글이 없습니다.댓글