코드 중복도                 - 상속(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 몇개 들었나 확인
	}
}

 

ArrayList는 다형성을 가진다. String도 숫자도 다 들어감

 

ArrayList는 Object형

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;
	}

}

+ Recent posts