💻 수업정리 (2020)/자바

[6/1] 자료구조클래스와 awt패키지

주다람 2020. 6. 1. 16:16

1. 자료구조 클래스 : 다수의 데이터를 효율적으로 관리(저장, 삭제, 변경)하는 기능을 제공하는 클래스

set 저장순서가 없으며, 동일한 정보의 인스턴스 저장이 불가능함
(즉, 꺼내올때 내가 원하는 대로 꺼내오지 못함)
hashSet, LinkedHashSet, TreeSet
List

저장순서가 있으며, 첨자를 이용하여 처리한다. 중복 인스턴스 저장이 가능하다.
AraArrayList, Vector, LinkedList 등
Map

키(key)와 값을 하나의 쌍(Entry)으로 묶어서 관리하는 자료구조 클래스
-키를 이용하여 값을 빠르게 검색하기 위해 사용한다.
-키는 중복저장되지 않으며 저장순서가 없다.
HashMap, Hashtable

 

 

 

 

 

1) Set클래스

 

Set클래스에서 주로 사용하는 메소드

 

add() 해당 요소를 저장하는 메소드
remove() 해당 요소를 삭제하는 메소드
size() 저장된 요소의 갯수를 반환하는 메소드
★ Iterator() -일괄 반복처리를 하고 싶을때 사용함
-내부적으로 커서를 만들어놓고 요소를 하나하나 읽어낸다.
-set 인스턴스를 반복처리 하기 위한 Iterator인스턴스를 반환하는 메소드
변형된 for문이 내부적으로 iteratpr인스턴스를 이용하여 반복처리 하는 것이기 때문에 요즘에는 변형된 for문을 더 자주 사용한다.
★ toArray()
set 인스턴스를 배열로 변환하여 반환하는 메소드

 

public class SetApp {
    public static void main(String[] args) {

        //제네릭을 사용하지 않을경우, 기본적으로 오브젝트 타입으로 설정됨

        //=> 모든 인스턴스를 전달받아 Set 인스턴스에 저장가능
        HashSet set = new HashSet(); 이방법은 대부분 사용하지 않음

        //제네릭을 사용하여 인스턴스를 생성함
        //=>제네릭으로 전달된 클래스의 인스턴스만 저장이 가능함
               HashSet<String> set = new HashSet<String>();

        //참조변수는 인터페이스를 이용하여 만드는 것을 권장함 -> 유지보수가 좋아진다(결합도를 낮추므로)
        //=>인터페이스를 상속받은 모든 자식인스턴스 저장가능
        Set<String> set = new HashSet<String>();
               Set<String> set2 = new TreeSet<String>(); //둘다 가능해짐

                //Set.add(E element) : element를 추가하는 메소드
                //=> E : 제네릭인스턴스
        set.add("Happy Day");
    }
}

 

while (iterator.hasNext()) {
//=> 현재 위치의 요소를 반환하며, 다음위치의 요소로 이동하는 메소드
        System.out.print(iterator.next() + " ");

}


//변형된 for구문은 내부적으로 iterator인스턴스를 이용해서 반복처리한다. 그래서 주로 이것을 많이 이용
for(String name : set) {
        System.out.print(name + " ");
}

 

Integer[] lotto = lottoSet.toArray(new Integer[0]); //순서가 없기 때문에 배열로 바꿔주는거임

 

 

2) List클래스

 

List클래스에서 주로 사용하는 메소드

 

add() 해당 요소를 저장하는 메소드
add(int index, E element) 해당 요소를 삭제하는 메소드원하는 요소를 원하는 위치에 삽입하는 메소드
remove(Object) 전달된 요소의 동일한 요소를 제거하는 메소드
-동일한 요소가 여러개 저장된 경우, 앞에 위치한 요소만 제거된다.
remove(index) 해당 인덱스 위치에 존재하는 요소를 삭제하는 메소드
size()
저장된 요소의 갯수를 반환하는 메소드
get() 첨자위치의 요소를 반환하는 메소드
Collections.sort() 전달받은리스트 인스턴스 요소를 정렬하는 메소드
clear() list 인스턴스 모든 요소를 제거하는 메소드
isEmpty()  요소가 있는 경우 false, 없는 경우 true를 반환하는 메소드
Arrays.asList()  -일종의 초기화시켜주는 방법이다. 
-요소를 전달받아, 배열을 list인스턴스로 변환하여 반환하는 메소드
Iterator() 내부적으로 커서를 만들어놓고 요소를 하나하나 읽어낸다.
set() 원하는 위치의 요소를 변경하는 메소드

 

 

 

List를 이용한 Student정보를 관리프로그램 만들어보기

 

1. 학생정보(학번,이름)를 저장하기 위한 클래스 - VO(Value Object) 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package site.itwill.util;
 
//인스턴스 필드값을 비교하기 위해서는 Comparable<T> 인터페이스를 상속받아 사용하면 됨
//=> 제네릭에서 비교하고자 하는 인스턴스의 클래스를 전달하여 작성
//=> CompareTo(T o) 메소드를 오버라이드 선언해주어야한다.
 
//학생의 이름, 학번을 저장하기 위한 프로그램
public class Student implements Comparable<Student> {
    private int num;
    private String name ;
    
    public Student() {
        // TODO Auto-generated constructor stub
    }
 
    public Student(int num, String name) {
        super();
        this.num = num;
        this.name = name;
    }
 
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "[학번 = " + num + " , 이름 = " + name + "]";
                
    }
 
    //정렬하기 위한 비교 결과를 정수값으로 반환하는 메소드
    //=>this의 필드값과 매개변수의 필드값을 빼기 연산하여 결과값을 반환.
    //=> Collections.sort메소드를 사용하면 메소드 내부에서 호출되어 정렬의 기준값을 제공한다.
    //=> 반환값이 양수인 경우, List인스턴스의 요소를 서로 바꾸어 저장
    @Override
    public int compareTo(Student o) {
        //return this.num - o.num; // 학번 : 오름차순
        //return o.num - this.num; // 학번 : 내림차순
        return this.name.compareTo(o.name); //이름으로 오름차순(양수)
        //return -(this.name.compareTo(o.name)); 
    }
}
 
cs

 

2. 학생정보를 관리(저장, 변경, 삭제, 검색)하기 위한 기능을 제공하는 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package site.itwill.util;
 
import java.util.ArrayList;
import java.util.List;
 
//학생정보를 관리(저장, 변경, 삭제, 검색)하기 위한 기능을 제공하는 클래스
//=>BO(business object)클래스 or manager클래스 라고 한다.
public class StudentManager {
    
    //다수의 학생정보를 저장하기 위한 콜렉션 필드를 만든다.
    //=> 클래스 내부에서만 사용하기 위한 필드(시스템필드)
    private List<Student> _studentList; //시스템필드라는 말!(setter,getter x)
    
 
    public StudentManager() {
        _studentList = new ArrayList<Student>();
    }
    
    
    
    /******인덱스를 반환하는 메소드******/
    
    //학번을 전달받아 콜렉션 필드에 저장된 해당 학생정보의 첨자를 반환하는 메소드
    //=>해당학번의 학생정보가 존재하지 않는 경우, -1을 반환
    //=>클래스 내부에서만 접근 가능하도록 은닉화처리
    private int getStudentIndex(int num) {
        int index = -1;
        for(int i = 0; i < _studentList.size(); i++) {
            //전달받은 학번과 같은 학번의 학생정보가 존재할 경우 해당첨자를 저장한다.
            if(_studentList.get(i).getNum() == num) {
                index = i;
                break;
            }
        }
        return index;
    }
    
    
    /******데이터를 추가하는 메소드******/
    
    //학생정보를 전달받아 Collections필드에 저장(추가)하는 메소드
    //=>전달받은 학생정보가 콜렉션 필드에 저장되지 않을경우 false를 반환
    //=> 저장될 경우 true를 반환한다.
    //=> 전달받은 학생정보의 학번이 이미 컬렉션 필드에 저장된 경우, 미저장되지 않도록 처리
    public boolean insertStudent(Student student) {
        if(getStudentIndex(student.getNum()) != -1) {//존재하지 않는다면
            return false;//flase반환
        }
        _studentList.add(student);
        return true;
    }
    
    //학생정보를 전달받아 콜렉션 필드에 저장된 학생정보를 변경하는 메소드
    // => 전달받은 학생정보가 변경되지 않을 경우 false를 반환
    //-> 변경될 경우 true를 반환
    //=>전달받은 학생정보의 학번이 콜레션필드에 저자오디어 있지 않을 경우 미변경
    public boolean updateStudent(Student student) {
        int index = getStudentIndex(student.getNum());
        if(index == -1return false//학생이 없다.
        _studentList.set(index, student);
        return true;
    }
    
    
    //전달받은 학생정보를 전달받아 콜레션필드에 저장된 학생정보를 삭제하는 메소드
    //=>전달받은 학번의 학생저오가 삭제되지 않을경우 false반환
    //=>삭제될경우 true반환
    //=>전달받은 학생정보가 콜레션 필드에 저장되어 있지 않을 경우 삭제되지 않도록 삽입
    public boolean deleteStudent(int num) {
        int index = getStudentIndex(num);
        if(index == -1) {
            return false;
        }
        _studentList.remove(index);
        return true;
    }
    
    //학번을 전달받아 콜렉션필드에 저장된 학생정보를 검색하여 반환하는 메소드
    //=> 저장되어 있지 않은 경우 null반환
    //=> 저장되어 있는 경우 해당 학생 정보 반환
    public Student selectStudent(int num) {
        int index = getStudentIndex(num);
        if(index == -1) {
            return null;
        }
        return _studentList.get(index);
    }
    
    
    //콜렉션 필드에 저장된 모든 학생정보를 반환하는 메소드
    public List<Student> selectAllStudent(){
        return _studentList;
    }
}
 
cs

 

3. App 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package site.itwill.util;
 
import java.util.Collections;
import java.util.List;
 
//학생정보 관리 프로그램
public class StudentManagerApp {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
        
        //학생정보를 생성하여 저장매체(콜렉션 필드)에 저장
        manager.insertStudent(new Student(1000"홍길동"));
        manager.insertStudent(new Student(2000"임꺽정"));
        manager.insertStudent(new Student(3000"전우치"));
        manager.insertStudent(new Student(4000"장길산"));
        
        boolean result = manager.insertStudent(new Student(5000"홍경례"));
        
        if(result) {
            System.out.println("[메세지] 성공적으로 저장되었습니다.");
        }else {
            System.out.println("[메세지] 이미 사용중인 학번이므로, 저장되지 않았습니다.");
        }
        System.out.println("=========================================");
        
        
        //저장된 학생정보 중 학번이 2000인 학생정보를 검색하여 출력        
        Student findStudent = manager.selectStudent(2000);
        if(findStudent == null) {
            System.out.println("[메세지] 해당 학번의 학생정보를 찾을 수 없습니다.");
        }else {
            System.out.println(findStudent);
        }
        System.out.println("=========================================");
        
        
        //학번이 2000인 학생의 이름을 [임걱정]으로 변경 
        findStudent.setName("임걱정");
        if(manager.updateStudent(findStudent)) {
            System.out.println("학생정보를 성공적으로 변경하였습니다.");
            
        }else {
            System.out.println("[메세지] 변경하고자 하는 학번의 학생정보를 찾을 수 없습니다.");
        }
        System.out.println("=========================================");
        
        
        //학번이 4000인 학생정보를 삭제한다.
        if(manager.deleteStudent(4000)) {
            System.out.println("[메세지] 해당 학번의 학생정보를 삭제하였습니다.");
        }else {
            System.out.println("[메세지] 삭제하고자 하는 학번의 학생정보를 찾을 수 없습니다.");
        }
        
        System.out.println("=========================================");
        
        List<Student> studentList = manager.selectAllStudent();
        for(Student student : studentList) {
            System.out.println(student);
        }
        
        System.out.println("=========================================");
        
        //무엇을 가지고 비교를 해야하는지 모르기 때문에 아래와 같이 하면 안됨
        Collections.sort(studentList);
        
        
        for(Student student : studentList) {
            System.out.println(student);
        }
    }
}
 
cs

 

 

3) Map클래스 : 일괄처리가 중요하지않음. put과 get을 이용해 값을 제공하는것이 중요

  • 검색할것이 수백개 수천개이면 if문 사용x -> map으로 만들면 금방 찾을 수 있다(웹애플리케이션찾을때!!)

map에서 주로 사용하는 메소드

 

put(K key) 엔트리를 추가
key가 중복될 경우 값을 변경
get(K key) key에 대한 값을 반환하는 메소드
remove()  key에대한 엔트리를 제거하는 메소드
keySet() 모든 맵키(set 인스턴스)를 반환하는 메소드
values() 맵에 저장된 모든 값을 컬렉션 인스턴스를 반환
(즉, 키말고 값만 가져옴)

 

 

 

2. awt패키지(swing은 os마다 디자인이 똑같음 awt의 확장된 개념)

  • GUI 프로그램을 개발하기 위한 참조형이 선언된 패키지
  • GUI 프로그램 : 디자인(컴퍼넌트) + 이벤트처리(리스너) >> 이벤트 프로그램

 

컴포넌트 컨테이너
GUI프로그램의 디자인 구성요소를 표현하는 클래스
Button , Label,Canvas, CheckBox, Choice, List, Scrollbar, TextField, TextAre
컴포넌트를 담을 수 있는 컴퍼넌트
컨테이너에 컴포넌트를 올려 사용하는 개념이라고 생각하면됨
frame, Window. Dailog,  Panel, scrollPane

 

 

GUI프로그램 작성방법 >> 디자인

  1. Frame 클래스를 상속받는 자식클래스를 작성한다.
  2. main메소드에서 자식클래스로 인스턴스를 생성한다.
  3. 자식클래스의 생성자에서 프레임의 디자인을 구현한다.(컴퍼넌트와 컨테이너 클래스를 이용하여 프레임에 담아 디자인)
package site.itwill.awt;

import java.awt.Frame;

//GuI 프로그램은 Frame클래스를 상속받아 작성하는 것을 권장!
public class FrameTwoApp extends Frame {

	private static final long serialVersionUID = 1L;

	//생성자를 이용하여 프레임에 대한 디자인 작업
	public FrameTwoApp(String title) {
		//super키워드를 이용하여 frame클래스 생성자 호출 : 제목 전달
		super(title); //부모의 생성자에게 title을 전달한다.
		
		setBounds(500,100,300,400);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		//부모인스턴스 생성 후 자식 인스턴스 생성
		//=> 프레임 인스턴스 생성 - 프레임 생성
		new FrameTwoApp("프레임");
	}
}

 

-extends Frame하여 상속받아 사용

-생성자에 super()를 이용하여 매개변수 전달하여 사용

-이렇게 FrameTwoApp을 만들어 두면, 다른곳에서 이 클래스의 인스턴스만 만들어도 프레임이 하나 만들어지게 되는것이므로 GUI는 상속을 이용하는 것을 권장한다.

 

 

 

 

Frame클래스에서 주로 사용하는 메소드

 

setSize() 컴포넌트의 크기를 변경하는 메소드
-단위는 픽셀을 사용
setLocation() 컴포넌트 출력 위치를 변경시켜주는 메소드
setBounds(int x, int y, int width, int weight)  위치와, 사이즈를 한번에 셋팅해주는 메소드
setTitle() 타이틀을 변경시켜 주는 메소드
setVisible() 컴포넌트를 화면에 출력여부를 설정하는 메소드
setResizable(boolean b)
프레임의 크기 변경여부를 설정
-false : 변경 불가, true : 변경가능 (기본)
(프레임class에만 존재)
setTitle(String name)
프레임의 제목을 변경하는 메소드
(프레임class에만 존재)
-애초에 frame생성자를 만들때 전달해서 만들 수 있음