코드 중복도 - 상속(IS-A) 문법으로 해결
클래스 간 결합도 문제 - 다형성 문법으로 해결
저장소 문제 - Collection Framework로 해결
//다형성 활용 예, 동적 배열
public class Manager {
private Member[] members = new Member[10];
private int index = 0 ;
public void addMember(Member m) {
try {
members[index++] = m; //인덱스가 10을 넘어가면 오류발생!
}catch(Exception e) {
Member[] tmp = new Member[members.length*2]; //오류 발생하면 2배크기 배열 만듦
for(int i = 0; i< members.length; i++) {
tmp[i] = members[i];//기존 배열을 새로만들어진 배열에 옮겨 담는다.
//*문제발생 : 데이터 1개를 넣었거나 제거할때 옮겨담으면 복사다 다 일어남 > 버벅임
//*비순차적 데이터 삭제에 비효율성
}
members = tmp; // 동적 배열
// Vector > ArrayList
}
}
public void printMember() {
System.out.println("=== 회원 목록 ===");
System.out.println("아이디\t이름\t포인트\t보너스");
for(int i=0; i< index ; i++) {
System.out.println(members[i].getId()+"\t"
+members[i].getName()+"\t"
+members[i].getPoint()+"\t"
+members[i].getBonus());
}
}
}
동적 배열 (Vector > ArrayList)
- 인덱스가 10을 넘어가면 오류발생!
- 오류 발생하면 2배크기 배열 만듦
- 기존 배열을 새로만들어진 배열에 옮겨 담는다.
- *문제발생 : 데이터 1개를 넣었거나 제거할때 옮겨담으면 복사다 다 일어남 > 버벅임
- = 비순차적 데이터 삭제에 비효율성
- 배열은 연산이라는 작업 없이 배열에 넣기만 하면 된다.
- 순차적 입력에 빠르다
- 비순차적 삭제가 없다면 ArrayList가 LinkedList보다 약간 좋다
Collection
- 변수가 하나이상 뭉쳐있는 구조
- 배열, 리스트...
Collection Framework
- 다양한 상황에서 사용할 수 있는 다양한 컨테이너를 제공하는데 이것을 컬렉션즈 프래임워크라고 부른다.
- ArrayList는 그중의 하나
링크드 리스트 Linked List
- 동적 배열에 비해 비순차적 데이터 삭제에 효율적
- 명시적 사이즈가 없다.
- 데이터 초과되는 경우가 생기지 않음
- 무조건 어레이리스트 보다 좋다고 할 수는 없다
- 인스턴스를 만들고 인스턴스의 주소를 링크하는 연산
- 순차적 데이터 입력에 관해서는 ArrayList에 비해 약간 불리
- 비순차적 삭제가 있다면 Linked List가 ArrayList에 비해 매우 좋다.
*입력과 삭제 뿐 아니라 검색은?
- 링크를 순차적으로 검색하는 경우 비효율적
- 2중 링크로 역행 리스트를 만들자 > 정중앙에 있는 데이터면 앞으로 세나 뒤로 세나 비효율
- 검색을 극대화 시켜보자 : 해쉬알고리즘, 트리알고리즘
트리 알고리즘
- 입력속도 포기, 검색속도 극대화
- 이런걸 만드는 분야 자료구조
public class Exam_01 {
public static void main(String[] args) {
String[] str = new String[10]; //스트링을 모아놓은 배열이다
str[0] = "Hello";
str[1] = 100";
str[2] = "Java";
//10칸이면 에러
System.out.println(str[1]); //world
str[1] = str[2];
str[2] = null;
System.out.println(str[1]); //Java
str[2] = str[1];
str[1] = "World";
System.out.println(str[1]); //world
System.out.println(str[2]); //Java
}
}
import java.util.ArrayList;
public class Exam_02 {
public static void main(String[] args) {
ArrayList str = new ArrayList(); //무슨형 배열인지? 다형성을 가진 배열 Object형
str.add("Hello"); //메서드
str.add(100); //ArrayList는 사이에 자료가 비어있는것을 용납하지 않음
str.add("Java");//앞을 비워놓고 자료를 넣어도 동적으로 자료를 땡겨오기 떄문에 번호를 명시할 이유가 없음
//자료를 많이 넣던 적게 넣던 알아서 늘어나기 때문에 신경 쓸 필요 없음
System.out.println(str.get(1)); //world
str.remove(1);
System.out.println(str.get(1)); //Java
str.add(1,"world");
System.out.println(str.get(1)); //world
System.out.println(str.get(2)); //Java
((String)str.get(1)).length();
//하나의 저장소에 서로 다른 타입을 묶는 경우 많지 않음
//다른 타입이 있어도 그걸 클래스에서 배열로 저장
//str.size() //ArrayList 몇개 들었나 확인
}
}
Object형이 무조건 좋지는 않다.
- Object에 넣을 경우. Object형 기능만 접근가능. 하위 기능(본래)을 쓸수 없다.
- 꺼내서 쓸때마다 매번 다운 캐스팅을 해야함
- 하나의 저장소에 서로 다른 타입을 묶는 경우 많지 않음
- 다른 타입이 있어도 클래스에서 별도 배열로 저장해서 사용
import java.util.ArrayList;
public class Manager {
private ArrayList members = new ArrayList();
public void addMember(Member m) {
members.add(m);
}
public void printMember() {
System.out.println("=== 회원 목록 ===");
System.out.println("아이디\t이름\t포인트\t보너스");
for(int i=0; i< members.size() ; i++) {
System.out.println(
((Member)members.get(i)).getId() +"\t"
+((Member)members.get(i)).getName()+"\t"
+((Member)members.get(i)).getPoint()+"\t"
+((Member)members.get(i)).getBonus()
);
}
}
}
Generic
- Java 1.5 부터 추가된 기능
- ArrayList<String>ArrayList str = new ArrayList();
import java.util.ArrayList;
//Generic
public class Exam_02 {
public static void main(String[] args) {
ArrayList<String> str = new ArrayList<String>();
str.add("Hello");
str.add("World");
str.add("Java");
}
}
import java.util.ArrayList;
public class Manager {
private ArrayList<Member> members = new ArrayList<Member>();
public void addMember(Member m) {
members.add(m);
}
public void printMember() {
System.out.println("=== 회원 목록 ===");
System.out.println("아이디\t이름\t포인트\t보너스");
for(int i=0; i< members.size() ; i++) {
System.out.println(
(members.get(i)).getId() +"\t"
+(members.get(i)).getName()+"\t"
+(members.get(i)).getPoint()+"\t"
+(members.get(i)).getBonus()
);
}
}
}
Foreach
- ( 담을 변수 : 컬렉션 )
- 자동으로 요소가 바닥나면 멈춘다.
- .get()을 입력하지 않아도 나옴
- 반복문 구동 뿐 아니라 활용과 통제에도 쓰이는 i값이 없다.
- 전체는 반복하는 경우 더 간결하므로 foreach문이 쓰인다
import java.util.ArrayList;
public class Exam_02 {
public static void main(String[] args) {
ArrayList<String> str = new ArrayList<String>(); //Generic
str.add("Hello");
str.add("World");
str.add("Java");
// for(int i = 0 ; i< str.size(); i++) {
// System.out.println(str.get(i));
// }
// foreach //오른쪽에 컬렉션
for(String tmp : str) {
System.out.println(tmp);
}
}
}
import java.util.ArrayList;
//Foreach문
public class Manager {
private ArrayList<Member> members = new ArrayList<Member>();
public void addMember(Member m) {
members.add(m);
}
public void printMember() {
System.out.println("=== 회원 목록 ===");
System.out.println("아이디\t이름\t포인트\t보너스");
for(Member tmp : members) {
System.out.println(tmp.getId() + "\t" + tmp.getName() + "\t" +
tmp.getPoint() + "\t" + tmp.getBonus());
}
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListMain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Student> std = new ArrayList<Student>();
int id = 1001;
while(true) {
try {
System.out.println(" ===== 학생 관리 시스템 ===== ");
System.out.println("1. 신규 정보 등록");
System.out.println("2. 학생 정보 조회");
System.out.println("3. 학생 정보 검색 (이름)");
System.out.println("4. 학생 정보 삭제 (학번)");
System.out.println("5. 종료하기");
System.out.print(">>>");
String menu = sc.nextLine();
if(menu.contentEquals("1")) {
System.out.print("학생 이름 : ");
String name = sc.nextLine();
System.out.print("국어 점수 : ");
int kor = Integer.parseInt(sc.nextLine());
System.out.print("영어 점수 : ");
int eng = Integer.parseInt(sc.nextLine());
System.out.print("수학 점수 : ");
int math = Integer.parseInt(sc.nextLine());
Student tmp = new Student(String.valueOf(id++),name,kor,eng,math);
std.add(tmp);
}else if(menu.contentEquals("2")) {
Manager.printStudent(std);
}else if(menu.contentEquals("3")) {
System.out.print("검색할 학생 이름 : ");
String search = sc.nextLine();
Manager.searchStudent(search,std);
}else if(menu.contentEquals("4")) {
System.out.print("삭제할 학생 학번 : ");
String delect = sc.nextLine();
Manager.removeStudent(delect,std);
}else if(menu.contentEquals("5")) {
System.out.println("시스템을 종료합니다.");
System.exit(0);
}else {
System.out.println("메뉴를 다시 확인하세요");
}
}catch(Exception e) {
}
}
}
}
import java.util.ArrayList;
public class Manager {
private ArrayList<Student> std = new ArrayList<Student>();
public void addStudent(Student s) {
std.add(s);
}
public static void printStudent(ArrayList<Student> std) {
System.out.println(" ===== 학생 정보 목록 ===== ");
System.out.println("이름\t국어\t영어\t수학\t합계\t평균");
for(Student tmp : std) {
System.out.println(tmp.getName()+"\t"+
tmp.getKor()+"\t"+
tmp.getEng()+"\t"+
tmp.getMath()+"\t"+
tmp.getSum()+"\t"+
tmp.getAvg());
}
}
public static void searchStudent(String search, ArrayList<Student> std){
boolean checkFlag = false;
for(Student tmp : std) {
if(tmp.getName().equals(search)) {
System.out.println("이름\t국어\t영어\t수학\t합계\t평균");
System.out.println(tmp.getName()+"\t"+
tmp.getKor()+"\t"+
tmp.getEng()+"\t"+
tmp.getMath()+"\t"+
tmp.getSum()+"\t"+
tmp.getAvg());
checkFlag = true;
}
}
if(!checkFlag) {System.out.println("등록된 정보가 없습니다.");}
}
public static void removeStudent(String delect, ArrayList<Student> std){
boolean checkFlag = false;
for(Student tmp : std) {
int i = 0;
if(tmp.getId().equals(delect)) {
std.remove(i);
checkFlag = true;
System.out.println(tmp.getName()+" 학생 정보가 삭제되었습니다.");
i++;
}
}
if(!checkFlag) {System.out.println("삭제할 정보가 없습니다.");}
}
}
//1)저장소 형태의 클래스 VO(밸류오브젝트 값개체) 또는 DTO(데이터 트랜스퍼 오브젝트)
//2)막강한 기능의 라이브러리
public class Student {
private String id;
private String name;
private int kor;
private int eng;
private int math;
public Student() {}
public Student(String id, String name, int kor, int eng, int math) {
super();
this.id = id;
this.name = name;
this.kor = kor;
this.eng = eng;
this.math = math;
}
public int getSum() {
return this.kor + this.eng + this.math;
}
public double getAvg() {
return getSum() / 3.0;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
}
'디지털 컨버전스 > JAVA' 카테고리의 다른 글
[ 프로그래밍 언어활용] 2020-02-21 시험 (0) | 2020.02.21 |
---|---|
[프로그래밍 언어 활용] 2020.02.21 시험대비 (0) | 2020.02.20 |
[Java] 객체 지향 중급 문법, 상속, override (0) | 2020.02.19 |
[Java] FTP (1) | 2020.02.18 |
[Java] member field , Constructor, 정적 변수, 라이브러리, FTP (0) | 2020.02.17 |