[ 상속, 추상클래스, 인터페이스에 대해서 알아보기 ]


Q. 상속(extends)이란?

 - 중복된 부분을 제거하기 위해 발전된 기능으로써 부모클래스와 이를 상속받는 자식클래스가 존재하여 이를 자식클래스에서 구현하는 기능을 말합니다.

 - 기본적인 상속 구조는 is-a의 관계로 이루어져야 합니다. [ex : 호랑이는 동물입니다.]

 - 상속의 제약을 주려면 final로 선언하여 다른 클래스에서 해당 클래스를 상속받지 못하게 제약을 줄 수 있습니다.


Q. 추상클래스(abstract class)란?

 - 추상이란 명확한 형태보단 이러이러한 모습을 뛸 것이다라는 약속처럼 실제로 구현체가 존재하지 않는 객체를 말합니다.

 - 부모클래스인 추상클래스는 형태가 없기에 이를 상속받는 클래스는 반드시 실제로 구현을 해주어야 합니다.


Q. 인터페이스(interface)란?

 - 다중상속을 지원하지 않는 자바에 다중상속과 유사한 기능을 가능케 해주는 기능입니다.

 - 멤버 변수는 모두 상수이며, 메소드는 무조건 추상 메소드로 선언되어야 합니다.


Q. 추상클래스, 인터페이스 차이점?

 - 인터페이스는 반드시 상수와 추상 메소드만 선언되어져야 하지만 추상 메소드가 하나이상은 존재해야 하는 추상클래스는 모든 변수와 메소드에 반드시 선언되어질 필요는 없습니다.


Q. 다형성이란?

 - 하나의 메소드나 클래스가 있을 대 다양한 방법으로 해석이 되어져 동작하는 것을 의미합니다. 가장 대표적인 예로는 오버로딩을 예로 들 수 있습니다.


Q. 오버라이딩(overriding), 오버로딩(overloading)?

 - 오버라이딩 : 부모클래스에서 상속 받은 메소드를 자식 클래스에서 재정의 하는 경우를 말합니다. 상위 클래스의 메소드의 이름과 매개변수 유형등을 동일하게 하면 재정의가 가능합니다.


 - 오버로딩 : 이름이 같은 메소드끼리 매개변수를 다르게 하여 서로 다르게 다양한 동작을 가능케 구현되어 지는 것을 말합니다.


 - 참고 사이트 : http://hyeonstorage.tistory.com/180

 - 참고 문헌 : Head First JAVA

[ 게시판 만들기 - 3 (ArrayList, 기능 분리) ]


 => 기존 게시판 예제 참고

 - 게시판 만들기 - 2 : http://momentoo.tistory.com/7

 - ArrayList : http://momentoo.tistory.com/9


[ 게시판 소스에 사용된 정보 알아보기 ]


Q. 생성자란?

 - 객체가 생성되고 나서 해야할 일을 클래스안에 넣어두고, 모든 객체들이 설정된 로직으로 초기화 작업을 가능케 하는 기능입니다.


Q. this,super, this(),super()?

 - this : 현재 클래스의 인스턴스, 필드의 명시적으로 나타낼 때 사용되어 집니다.

 - super : 부모 클래스의 인스턴스, 필드를 명시적으로 나타낼 때 사용되어 집니다.

 - this() : 해당 클래스의 생성자를 호출할 때 사용되어 지는 기능입니다.

 - super() : 부모 클래스의 생성자를 호출할 때 사용되어 지는 기능입니다.


Q. main메소드란?

 - 자바에서 프로그램을 실행했을 때 자바에서 가장 먼저 읽어들여서 명령들을 다 작동하고 끝나면 종료가 되는 공간입니다. 자세한 내용은 아래 링크를 참고하세요.

 - 참고 사이트 : http://alecture.blogspot.kr/2011/04/blog-post_20.html


[ 게시판 소스 ]

 - 기존 소스에서 배열에 값을 저장하던 부분을 Java API를 통해 ArrayList클래스로 구현하여 소스가 간소화 된 부분을 확인할 수 있습니다.

 - this를 사용해 클래스의 인스턴스와 필드를 명시하였습니다.

 - main메소드에 모두 구현한 부분을 기능별로 분리하여 작성하였습니다.

 - 결과 화면은 이전과 동일합니다.

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
 
public class BoardThird {
    
    private Scanner sc;
    private List<String[]> boardList;
    private int seq;
    
    public BoardThird() { // 생성자(각 값들의 초기화)
        this.sc = new Scanner(System.in); // 문자열 입력을 위한 Scanner 생성
        this.boardList = new ArrayList<>(); // ArrayList 사용을 위한 초기화
        this.seq = 1// 게시물 번호
    }
    
    public void startMessage() { // 시작 메세지
        System.out.println("1. 등록 2. 전체조회 3. 선택조회 4. 수정 5. 삭제 0. 종료");
    }
    
    public void searchBooMessage(boolean searchBoo) { // 조회 여부 메세지
        if(!searchBoo) { // 조회 실패일 때
            System.out.println("선택한 값은 없습니다.");
        }
    }
    
    public void exit() { // 종료
        System.out.println("종료되었습니다.");
    }
    
    public void choiceCancel() { // 선택 실패
        System.out.println("잘못선택하셨습니다.");
    }
    
    public boolean listEmptyBoo() { // 배열 값 존재 여부 판단
        if (this.boardList.isEmpty()) { // 값이 존재하지 않을 때
            System.out.println("등록된 값이 없습니다.");
            return false;
        }
        return true;
    }
    
    public String inputStr() { // 입력
        return this.sc.next();
    }
    
    public void create() { // 등록
        
        System.out.println("등록란입니다.");
        
        String[] boardArrVar = new String[4]; // 등록할 입력 값 배열 선언
        boardArrVar[0= String.valueOf(seq); // 등록할 게시물 번호 추가
        
        System.out.println(boardArrVar[0+ "번의 등록할 제목을 입력하세요.");
        boardArrVar[1= sc.next(); // 등록할 제목 입력
        
        System.out.println(boardArrVar[0+ "번의 등록할 내용을 입력하세요.");
        boardArrVar[2= sc.next(); // 등록할 내용 입력
        
        System.out.println(boardArrVar[0+ "번의 등록할 추가정보를 입력하세요.");
        boardArrVar[3= sc.next(); // 등록할 추가정보 입력
            
        this.boardList.add(boardArrVar); // ArrayList의 등록 로직 실행
            
        System.out.println("등록완료되었습니다.");
            
        seq++;
    }
    
    public void listSearch() { // 전체 조회
        System.out.println("전체조회입니다.");
        if (listEmptyBoo()) { // 배열에 저장된 값 존재 여부 판단
            for(String[] boardArrVar : this.boardList) {
                System.out.println(boardArrVar[0+ "번에 등록된 내용은 다음과 같습니다.");
                System.out.println("이름 = > [" + boardArrVar[1+ "] 내용 = > [" + boardArrVar[2+ "] 추가정보 = > [" + boardArrVar[3+ "]"); 
            }
            System.out.println("조회가 끝났습니다.");
        }
    }
    
    public void choiceSearch() { // 선택 조회
        System.out.println("선택조회입니다.");
        if (listEmptyBoo()) { // 배열에 저장된 값 존재 여부 판단
            
            System.out.println("선택조회할 번호를 입력하세요.");
            String searchVal = sc.next(); // 조회할 번호 입력
            boolean searchBoo = false// 조회 여부
            
            for(String[] boardArrVar : this.boardList) {
                if(boardArrVar[0].equals(searchVal)) {  // 배열에 저장되어 있는 게시물 번호와 조회 값이 같을 때
                    System.out.println(boardArrVar[0+ "번의 값은 다음과 같습니다.");
                    System.out.println("이름 = > [" + boardArrVar[1+ "] 내용 = > [" + boardArrVar[2+ "] 추가정보 = > [" + boardArrVar[3+ "]");
                    searchBoo = true// 조회 성공
                    break;
                }
            }
            searchBooMessage(searchBoo); // 조회 여부 전달
        }
    }
    
    public void modify() { // 수정
        System.out.println("수정란입니다.");
        if (listEmptyBoo()) { // 배열에 저장된 값 존재 여부 판단
            
            System.out.println("수정할 번호를 입력하세요.");
            String searchVal = sc.next(); // 조회할 번호 입력
            boolean searchBoo = false// 조회 여부
            
            for(String[] boardArrVar : this.boardList) {
                if(boardArrVar[0].equals(searchVal)) {
                    System.out.println(boardArrVar[0+ "번의 값은 다음과 같습니다.");
                    System.out.println("이름 = > [" + boardArrVar[1+ "] 내용 = > [" + boardArrVar[2+ "] 추가정보 = > [" + boardArrVar[3+ "]");
                    
                    System.out.println("수정이 시작됩니다.");
                
                    System.out.println(boardArrVar[0+ "수정할 제목을 입력하세요.");
                    boardArrVar[1= this.inputStr();
                    System.out.println(boardArrVar[0+ "수정할 내용을 입력하세요.");
                    boardArrVar[2= this.inputStr();
                    System.out.println(boardArrVar[0+ "수정할 내용을 입력하세요.");
                    boardArrVar[3= this.inputStr();
                    
                    System.out.println("수정이 완료되었습니다.");
                    
                    searchBoo = true// 조회 성공
                    break;
                    
                }
            }
            searchBooMessage(searchBoo); // 조회 여부 전달
        }
    }
    
    public void delete() { // 삭제
        System.out.println("삭제란입니다.");
        if (listEmptyBoo()) { // 배열에 저장된 값 존재 여부 판단
            
            System.out.println("삭제할 번호를 입력하세요.");
            String searchVal = sc.next(); // 조회할 번호 입력
            boolean searchBoo = false// 조회 여부
            
            for(String[] boardArrVar : this.boardList) {
                
                if(boardArrVar[0].equals(searchVal)) {
                    System.out.println(boardArrVar[0+ "번의 값은 다음과 같습니다.");
                    System.out.println("이름 = > [" + boardArrVar[1+ "] 내용 = > [" + boardArrVar[2+ "] 추가정보 = > [" + boardArrVar[3+ "]");
                    
                    System.out.println("해당 값을 삭제하시겠습니까? Y[예] // N[아니오]");
                    String deleteChoice = sc.next(); // 삭제 여부 입력
                    
                    if(deleteChoice.equals("Y")) {  // 삭제 선택일 때
                        
                        this.boardList.remove(boardArrVar); // ArrayList의 삭제 로직 실행
                        System.out.println("삭제완료되었습니다.");
                        break;
 
                    }else { // 삭제 취소일 때
                        System.out.println("삭제가 취소되었습니다.");
                    }
                    
                    searchBoo = true// 조회 성공
                    break;
                }
            }
            searchBooMessage(searchBoo); // 조회 여부 전달
        }
    }
    
    public static void main(String[] args) {
        
        BoardThird boardThird = new BoardThird();
        
        while(true) {
            
            boardThird.startMessage(); // 시작 메세지
            String choice = boardThird.inputStr(); // 모드 선택 입력
            
            if(choice.equals("1")) { // 등록
                boardThird.create();
            }else if(choice.equals("2")) { // 전체조회
                boardThird.listSearch();
            }else if(choice.equals("3")) { // 선택조회
                boardThird.choiceSearch();
            }else if(choice.equals("4")) { // 수정
                boardThird.modify();
            }else if(choice.equals("5")) { // 삭제
                boardThird.delete();
            }else if(choice.equals("0")) { // 종료
                boardThird.exit();
                break;
            }else { // 모드 선택 실패
                boardThird.choiceCancel();
                continue;
            }
        }
    }
}
cs


 - Java API 한글 번역 사이트 : http://changki.net/

 - 참고 문헌 : Head First JAVA

[ Collection 종류와 Map종류에 대해서 알아보기 ]


Q. Collection, Map이란?

 - Collection : 데이터 관리를 위한 집합을 나타내는 가장 상위 인터페이스입니다.

 - Map : 키와 값의 쌍으로 이루어진 객체를 처리하기 위한 인터페이스입니다. 이 객체는 중복된 키 값을 허용하지 않는 특징이 있습니다.


Q. Collection의 종류?

 - Set : 순서가 없는 값들끼리의 묶음이며 중복이 되어도 상관없는 데이터를 구할 때 유용하게 사용이 되어지는 인터페이스입니다.

 - List : 순서대로 값이 저장되어 지는 집합이며 각각 index가 존재하여 위치 값으로 접근이 가능한 이점이 있는 인터페이스입니다.

 (Queue라는 Collection또한 있지만 개인적으로 다뤄보질 않아서 이 포스팅 내용엔 정리하지는 않았습니다.)


 - Set

 1. HashSet : Set기능만을 이용할 때 사용되어지는 클래스로써 순서없이 저장되어 집니다.

 2. TreeSet : 올림차순으로 정렬시켜주며 데이터를 담을 때 정렬하면서 사용하기에 이점이 있는 클래스입니다. 하지만 HashSet보단 성능상 느린 단점이 있습니다.

 3. LinkedHashSet : 저장된 순서로 값이 담아지는데 삽입순서를 기억할 필요가 없을 때 사용되어 지는 클래스입니다.


 - List

 1. ArrayList : 각각의 데이터들을 index값으로 이루어져 있는 클래스입니다. Vector와 비슷하지만 동기화가 존재하지 않는 특징이 있습니다. 그리고 각 데이터 값들은 인덱스가 존재하기에 검색 시에는 유용하지만 삽입과 삭제등에는 느린 단점이 있습니다.

 2. LinkedList : 메모리와 메모리 사이 연결을 통해 포인터를 이용하여 위치를 참조하고 나열하는 구조의 클래스입니다. 삭제나 삽입 등에는 ArrayList의 비해 나은 편입니다.

 3. Vector : 동기화 처리가 내부적으로 일어나며 객체를 생성할 때 크기를 지정할 필요가 없는 클래스입니다. 위 두 클래스보단 속도면에서 나은 이점이 있습니다.



Q. Map의 종류?

 1. HashTable : HashMap과 비슷하게 Map기능만 필요할 때 사용되어지는 클래스인데 HashMap과의 차이점으로는 동기화가 가능하다는 점이 있습니다.

 2. HashMap : Map기능만 필요할 때 사용되어지는 클래스로써 동기화가 존재하지 않으며 값의 null을 포함시킬 수 있다는 특징이 있는 클래스입니다.

 3. TreeMap : 키값으로써 값이 오름차순으로 정렬이 되어진다는 특징이 있는 클래스입니다.

 4. LinkedHashMap : 키의 값과는 다르게 순서대로 값들끼리의 연결이 되어져 있는 클래스입니다.


 - 참고 사이트 : http://egloos.zum.com/dojeun/v/317868

 참고 사이트 : http://comxp.tistory.com/72

+ Recent posts