1. yum 초기화

※ yum repository를 초기화 진행합니다. ( yum이 정상적으로 진행된다면 스킵해도 됩니다. )

> 참고 포스팅 : https://momentoo.tistory.com/12

 

[Yum Repository 초기화]

Q. Yum Repository 초기화 필요성 - Centos 초기 설정 시에 Repository를 잘못 설정하여 초기화가 필요할 때가 있다. 물론 반드시 초기화가 정답은 아니다. 1. Repository 지우기 # cd /etc/yum.repos.d/ > reposi..

momentoo.tistory.com

 

2. apache 설치

#yum -y install httpd httpd-devel

> devel은 tomcat-connectors를 진행하기 위해 install

※ 설치 버전 확인

1
2
3
[root@ ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Apr 24 2019 13:45:48
cs

> 정상 설치 시 위와 같이 노출

 

3. Apache 서버 재시작 자동 등록

> 리눅스 재시작 시 자동으로 재시작 하도록 등록하는 부분입니다.

1
2
[root@ ~]# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
cs

 

4. Apache 서버 정상 동작 확인

1
2
3
4
5
6
7
8
[root@ ~]# ps -ef | grep httpd
root     23686     1  0 10:15 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   23687 23686  0 10:15 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   23688 23686  0 10:15 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   23689 23686  0 10:15 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   23690 23686  0 10:15 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   23691 23686  0 10:15 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root     25527 23477  0 10:49 pts/0    00:00:00 grep --color=auto httpd
cs

 

5. 방화벽 default-zone 체크

> 방화벽 설정 정보 파일을 확인할 수 있다.

1
2
[root@ ~]# firewall-cmd --get-default-zone
public
cs

 

6. Apache 포트 개방 (기본포트 80)

1
2
3
4
5
[root@ ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
Warning: ALREADY_ENABLED: 80:tcp
success
[root@ ~]# firewall-cmd --reload
success
cs

※ 기존에 80포트가 open되어 있지 않았다면 ('Warning: ALREADY_ENABLED: 80:tcp') 해당 부분이 나타나지 않습니다.

> firewalld(방화벽) 설정 파일 위치

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@ ~]# vi /etc/firewalld/zones/public.xml
 
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <service name="ntp"/>
#  <service name="http"/>
#  <port protocol="tcp" port="8080"/>
#  <port protocol="tcp" port="80"/>
#  <port protocol="tcp" port="3306"/>
</zone>
cs

 

7. 서버 ip주소 확인

> eth0의 inet 부분을 확인

※ 만약 ifconfig 명령어가 동작을 하지않는다면 'yum -y install net-tools'을 설치하시길 바랍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@ ~]# ifconfig
 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 000.000.000.000  netmask 255.255.255.0  broadcast 000.000.000.000
        inet6 0000::000:0000:0000:0000  prefixlen 64  scopeid 0x20<link>
        ether 00:00:00:00:00:eb  txqueuelen 1000  (Ethernet)
        RX packets 109068058  bytes 18167317568 (16.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 19533605  bytes 2404711975 (2.2 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1506769  bytes 212891507 (203.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1506769  bytes 212891507 (203.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
cs

 

8. 브라우저 확인

> 서버 ip주소로 접속. 아래와 같은 화면을 확인하면 정상적으로 Apache 설치 완료.

Apache 기본 화면

 

'Development > CentOS' 카테고리의 다른 글

[Yum Repository 초기화]  (0) 2019.07.17

Q. Yum Repository 초기화 필요성

 

- Centos 초기 설정 시에 Repository를 잘못 설정하여 초기화가 필요할 때가 있다. 물론 반드시 초기화가 정답은 아니다.

 

1. Repository 지우기

# cd /etc/yum.repos.d/

> repository 저장 디렉터리로 이동 

repository 확인

 

# rm -f 삭제할 repository

※ 참고 : 아래 Repository는 삭제하지 마세요.

CentOS-Base.repo
CentOS-CR.repo
CentOS-Debuginfo.repo
CentOS-fasttrack.repo
CentOS-Media.repo
CentOS-Sources.repo
CentOS-Vault.repo
epel.repo
epel-testing.repo

 

2. 캐쉬디렉토리 삭제

# cd /var/cache/yum/

> 캐쉬 디렉터리로 이동

# rm -rf x86_64

> 캐쉬 삭제

 

3. headers, packages, metadata 삭제

# yum clean headers

# yum clean packages

# yum clean metadata

'Development > CentOS' 카테고리의 다른 글

[Apache 설치]  (0) 2019.07.18

[ Java I/O에 대한 정리 ]


Q. Java I/O란?

 - 데이터 교환을 위한 입출력(Input/Output) 클래스를 일컬음니다. 여기서 말하는 스트림은 데이터의 흐름으로 데이터를 운반하는 연결 통로라 할 수 있습니다. 모든 I/O클래스들은 java.io 패키지를 import하여 사용되어 집니다.


Q. I/O클래스의 종류?


 - Stream

 - 바이트 단위의 데이터를 읽고 쓰기를 가능하게 해주는 클래스입니다.

 1. [Input/Output]Stream: 바이트 단위의 데이터를 읽거나 쓰게 해주는 추상클래스로써 Stream이 붙는 클래스들은 해당 클래스를 상속하게 됩니다.

 2. File[Input/Output]Stream: 파일을 바이트 스트림으로 바꿔주는 클래스로써 하드디스크에 저장된 내용을 읽고 쓰게 해주는 클래스 입니다.

 3. Buffered[Input/Output]Stream: File Stream과 같이 파일을 읽거나 출력을 할 때 사용되는 클래스로써 파일이 대용량일 때 이점이 있는 클래스 입니다.


- Reader/Writer

 - 바이트 단위가 아닌 Char단위로 읽거나 쓰기를 가능하게 해주는 클래스입니다.

 1. Reader/Writer: Char 단위의 문자를 읽거나 쓰게 해주는 추상클래스로써 Reader가 붙는 클래스들은 해당 클래스를 상속하게 됩니다.

 2. File[Reader/Writer]: 파일을 문자 스트림으로 바꿔주는 클래스로써 하드디스크에 저장된 내용을 읽고 쓰게 해주는 클래스 입니다.

 3. Buffered[Reader/Writer]: BufferedReader에는 문자를 읽을 때 readLine()로 한줄씩 해석할 수 있는 기능이 있으며 BufferedWriter에는 문자를 출력할 때 줄을 바꿀 수 있게 해주는 기능들이 있는 클래스입니다.


- 그 외의 클래스

 1. console: 명령 창에서 쉽게 읽고 쓸 수 있게 도와주는 클래스입니다.

 2. File: 단순히 파일 객체를 생성할 때 사용되어 지는 클래스입니다.


 - 이 외에 I/O클래스에 대한 자세한 내용은 아래 참고 사이트에서 참고하시길 바랍니다.

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


[ Java I/O 예제 ]


 = > 파일 읽고 복사하기


  - Stream을 사용하여 이미지 파일을 읽어보고 복사하여 출력하는 것에 대한 예제입니다.


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
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class FileIOCopy {
    
    public static void main(String[] args) {
        
        String filePath = "...\\"// 파일 경로를 지정
        FileInputStream fis = null// 파일 읽기 스트림 클래스
        FileOutputStream fos = null// 파일 출력 스트림 클래스
        
        try {
            
            // 읽을 경로 지정
            fis = new FileInputStream(filePath + "a.jpg"); 
            // 읽은 내용을 복사하여 출력할 경로 지정
            fos = new FileOutputStream(filePath + "a_copy.jpg"); 
            
            byte[] byteRead = new byte[1024]; // 바이트 크기를 지정
            
            // 읽어들인 파일의 바이트 길이를 저장 출력 시 .write()의 메소드에 길이를 지정할 때 사용
            int len = 0;
            
            while((len  = fis.read(byteRead)) >= 0) {
                fos.write(byteRead, 0, len); // 바이트 크기, Offset위치, 길이 지정
            }
            
        }catch(IOException ioe) {
            ioe.printStackTrace();
        }finally { // 파일 입출력 닫기
            try {
                fos.close();
                fis.close();
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}
cs



 = > 문자를 읽어 콘솔 창에 보여주기


  - char단위로 읽어들이기 위해 reader 클래스로 파일을 읽고 콘솔 창에 읽어 들인 결과를 출력하는 내용입니다.


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
import java.io.FileReader;
import java.io.IOException;
 
public class FileIOReader {
 
    public static void main(String[] args) {
        
        String filePath = "...\\"// 파일 경로를 지정
        FileReader fr = null// 파일을 문자로 읽을 클래스
        
        try {
            
            fr = new FileReader(filePath + "test.txt"); // 읽을 경로 지정
            int read; // char값을 int값으로 저장
            String str = ""// 읽은 char값을 담아둘 String 생성
            
            while(((read = fr.read()) != -1)) {
                str += (char)read; // 읽은 char값을 String에 저장
            }
            
            System.out.println(str);
            
        } catch(IOException ioe) {
            ioe.printStackTrace();
        } finally { // reader클래스 닫기
            try {
                fr.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
cs


  - Text파일을 정상적으로 읽어오고 출력이 되는 것을 확인 할 수 있습니다.


Text Read...
Read Complete!!
cs



  - 그 외에 I/O예제 소스 참고 사이트 : http://programmingsummaries.tistory.com/64

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


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

[ 게시판 만들기 - 2 (배열 복사) ]


 => 기존 게시판 예제 내용

 - 게시판 만들기 - 1 : http://momentoo.tistory.com/6



[ 게시판 소스 ]

 - 기존의 소스에 등록 시 문제점이었던 크기가 고정적인 부분을 배열 복사 로직으로 구현해 봤습니다.

 - 등록 이외에 소스들은 기존 소스와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
if(boardArrCnt >= boardArr.length) { // 배열의 크기가 최대일     
    
    int arrPlus = 5// 배열의 크기를 늘려줄 임의의 값 설정
                    
    String[][] boardArrCop = new String[boardArr.length + arrPlus][]; // 기존 배열의 내용을 복사해 둘 새 배열 생성. [크기는 기존 배열 크기+임의의 값]
    for(int k = 0; k < boardArr.length; k++) {
        boardArrCop[k] = boardArr[k]; // 배열 내용 복사 로직
    }    
    boardArr = new String[boardArrCop.length][]; // 기존 배열 크기를 늘려 생성.
    boardArr = boardArrCop; // 복사해 둔 배열 값을 크기를 늘려준 배열에 복사
}
cs


'Development > JAVA' 카테고리의 다른 글

[JAVA] 게시판 예제 - 3 (ArrayList, 기능 분리)  (0) 2016.09.02
[JAVA] Collection,Map 정리  (0) 2016.09.02
[JAVA] 게시판 예제 - 1 (배열, Scanner)  (0) 2016.08.24
[JAVA] Scanner 문자열 입력  (0) 2016.08.24
[JAVA] 배열  (0) 2016.08.24

[ 게시판 만들기 - 1 (배열, Scanner) ]


 => 배열, Scanner 내용

 - 배열 : http://momentoo.tistory.com/4

 - Scanner : http://momentoo.tistory.com/5



[ 게시판 소스 ]

 - 배열과 Scanner만을 사용되어진 게시판입니다.

 - 게시물을 CRUD(Create, Read, Update, Delete)기능을 통해 사용해 볼 수 있습니다.

 - 게시물을 저장 수 있는 크기가 제한적인 소스입니다.

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
import java.util.Scanner;
 
public class BoardFirst {
    
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in); // 문자열 입력을 위한 Scanner 생성
        
        String[][] boardArr = new String[5][]; // 게시판 내용을 저장하기 위한 배열 (5개 게시물 내용만 저장할 수 있음.)
        
        int boardArrCnt = 0// 게시물 카운트
        int seq = 1// 게시물 번호
        
        while(true) {
            
            System.out.println("1. 등록 2. 전체조회 3. 선택조회 4. 수정 5. 삭제 0. 종료");
            String choice = sc.next(); // 모드 선택
            
            if(choice.equals("1")) {
                System.out.println("등록란입니다.");
                
                if(boardArrCnt >= boardArr.length) { // 배열 크기가 최대 일 때
                    System.out.println("더 이상 등록할 수 없습니다.");
                }else {
                    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(); // 등록할 추가정보 입력
                    
                    boardArr[boardArrCnt] = boardArrVar; // 등록 값 배열에 저장
                    
                    System.out.println("등록완료되었습니다.");
                    
                    seq++;
                    boardArrCnt++;
                }
            }else if(choice.equals("2")) {
                System.out.println("전체조회입니다.");
                if (boardArrCnt == 0) { // 등록된 값이 없을 때
                    System.out.println("등록된 값이 없습니다.");
                }else {
                    for(int i=0; i < boardArrCnt; i++) {
                        System.out.println(boardArr[i][0+ "번에 등록된 내용은 다음과 같습니다.");
                        System.out.println("이름 = > [" + boardArr[i][1+ "] 내용 = > [" + boardArr[i][2+ "] 추가정보 = > [" + boardArr[i][3+ "]"); 
                    }
                    System.out.println("조회가 끝났습니다.");
                }
            }else if(choice.equals("3")) {
                System.out.println("선택조회입니다.");
                if (boardArrCnt == 0) { // 등록된 값이 없을 때
                    System.out.println("등록된 값이 없습니다.");
                }else {
                    System.out.println("선택조회할 번호를 입력하세요.");
                    String searchVal = sc.next(); // 조회할 번호 입력
                    boolean searchBoo = false// 조회 여부
                    for(int i=0; i < boardArrCnt; i++) {
                        if(boardArr[i][0].equals(searchVal)) { // 배열에 저장되어 있는 게시물 번호와 조회 값이 같을 때
                            System.out.println(boardArr[i][0+ "번의 값은 다음과 같습니다.");
                            System.out.println("이름 = > [" + boardArr[i][1+ "] 내용 = > [" + boardArr[i][2+ "] 추가정보 = > [" + boardArr[i][3+ "]");
                            searchBoo = true// 조회 성공
                            break;
                        }
                    }
                    if(searchBoo==false) { // 조회 실패일 때
                        System.out.println("선택한 값은 없습니다.");
                    }
                }
            }else if(choice.equals("4")) {
                System.out.println("수정란입니다.");
                if (boardArrCnt == 0) { // 등록된 값이 없을 때
                    System.out.println("등록된 값이 없습니다.");
                }else {
                    System.out.println("선택조회할 번호를 입력하세요.");
                    String searchVal = sc.next(); // 조회할 번호 입력
                    boolean searchBoo = false// 조회 여부
                    for(int i=0; i < boardArrCnt; i++) {
                        if(boardArr[i][0].equals(searchVal)) { // 배열에 저장되어 있는 게시물 번호와 조회 값이 같을 때
                            System.out.println(boardArr[i][0+ "번의 값은 다음과 같습니다.");
                            System.out.println("이름 = > [" + boardArr[i][1+ "] 내용 = > [" + boardArr[i][2+ "] 추가정보 = > [" + boardArr[i][3+ "]");
                            
                            System.out.println("수정이 시작됩니다.");
                            String[] boardArrVar = new String[4];
                            
                            boardArrVar[0= boardArr[i][0];
                            
                            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();
                            
                            boardArr[i] = boardArrVar; // 수정 값 배열에 저장
                            
                            System.out.println("수정이 완료되었습니다.");
                            
                            searchBoo = true// 수정 성공
                            break;
                        }
                    }
                    if(searchBoo==false) { // 조회 실패일 때
                        System.out.println("선택한 값은 없습니다.");
                    }
                }
            }else if(choice.equals("5")) {
                System.out.println("삭제란입니다.");
                if (boardArrCnt == 0) { // 등록된 값이 없을 때
                    System.out.println("등록된 값이 없습니다.");
                }else {
                    System.out.println("선택조회할 번호를 입력하세요.");
                    String searchVal = sc.next(); // 조회할 번호 입력
                    boolean searchBoo = false// 조회 여부
                    for(int i=0; i < boardArrCnt; i++) {
                        if(boardArr[i][0].equals(searchVal)) { // 배열에 저장되어 있는 게시물 번호와 조회 값이 같을 때
                            System.out.println(boardArr[i][0+ "번의 값은 다음과 같습니다.");
                            System.out.println("이름 = > [" + boardArr[i][1+ "] 내용 = > [" + boardArr[i][2+ "] 추가정보 = > [" + boardArr[i][3+ "]");
                            
                            System.out.println("해당 값을 삭제하시겠습니까? Y[예] // N[아니오]");
                            String deleteChoice = sc.next(); // 삭제 여부 입력
                            
                            if(deleteChoice.equals("Y")) { // 삭제 선택일 때
 
                                boardArr[i] = null// 해당 선택값 null
                                boardArrCnt--// 배열에 추가하기 위해 인덱스 번호 감소
                                
                                for(int j=i; j < boardArrCnt; j++) { // 배열에서 삭제 선택 값 부터 저장되어진 최대값까지 반복
                                    if(boardArrCnt == 0) { // 삭제 후 저장되어진 값이 없을 때
                                        break;
                                    }
                                    boardArr[j] = boardArr[j+1]; // 삭제 후 로직 실행
                                    boardArr[j+1= null;
                                }
                                System.out.println("삭제완료되었습니다.");
                            }else { // 삭제 취소일 때
                                System.out.println("삭제가 취소되었습니다.");
                            }
                            searchBoo = true// 조회 성공
                            break;
                        }
                    }
                    if(searchBoo==false) { // 조회 실패일 때
                        System.out.println("선택한 값은 없습니다.");
                    }
                }
            }else if(choice.equals("0")) {
                System.out.println("종료되었습니다.");
                break;
            }else { // 모드 선택값이 없을 때
                System.out.println("잘못선택하셨습니다.");
                continue;
            }
        }
    }
}
 
cs



[ 게시판 소스 결과 - 등록 ]

 - 게시물이 등록되는 것을 보여줍니다.

1. 등록 2. 전체조회 3. 선택조회 4. 수정 5. 삭제 0. 종료
1
등록란입니다.
1번의 등록할 제목을 입력하세요.
TitleFirst
1번의 등록할 내용을 입력하세요.
Content
1번의 등록할 추가정보를 입력하세요.
PlusValue
1. 등록 2. 전체조회 3. 선택조회 4. 수정 5. 삭제 0. 종료
1
등록란입니다.
등록완료되었습니다.
2번의 등록할 제목을 입력하세요.
Second
2번의 등록할 내용을 입력하세요.
Cc
2번의 등록할 추가정보를 입력하세요.
없음.
등록완료되었습니다.
cs


 - 게시물이 최대치가 되었을 때 내용입니다.

1. 등록 2. 전체조회 3. 선택조회 4. 수정 5. 삭제 0. 종료
1
등록란입니다.
더 이상 등록할 수 없습니다.
cs


[ 게시판 소스 결과 - 전체조회 ]

 - 게시물들이 저장된 내용들을 보여줍니다.

1. 등록 2. 전체조회 3. 선택조회 4. 수정 5. 삭제 0. 종료
2
전체조회입니다.
1번에 등록된 내용은 다음과 같습니다.
이름 = > [TitleFirst] 내용 = > [Content] 추가정보 = > [PlusValue]
2번에 등록된 내용은 다음과 같습니다.
이름 = > [Second] 내용 = > [Cc] 추가정보 = > [없음.]
3번에 등록된 내용은 다음과 같습니다.
이름 = > [Main] 내용 = > [내용] 추가정보 = > [추가할]
4번에 등록된 내용은 다음과 같습니다.
이름 = > [4번제목] 내용 = > [내용은] 추가정보 = > [없음.]
5번에 등록된 내용은 다음과 같습니다.
이름 = > [5번제목] 내용 = > [내용입니다.] 추가정보 = > [010-2222-XXXX]
조회가 끝났습니다.
cs


[ 게시판 소스 결과 - 선택조회 ]

 - 선택하여 조회한 내용을 보여줍니다.

1. 등록 2. 전체조회 3. 선택조회 4. 수정 5. 삭제 0. 종료
3
선택조회입니다.
선택조회할 번호를 입력하세요.
1
1번의 값은 다음과 같습니다.
이름 = > [TitleFirst] 내용 = > [Content] 추가정보 = > [PlusValue]
cs


[ 게시판 소스 결과 - 수정 ]

 - 선택하여 수정한 내용을 보여줍니다.

1. 등록 2. 전체조회 3. 선택조회 4. 수정 5. 삭제 0. 종료
4
수정란입니다.
선택조회할 번호를 입력하세요.
1
1번의 값은 다음과 같습니다.
이름 = > [TitleFirst] 내용 = > [Content] 추가정보 = > [PlusValue]
수정이 시작됩니다.
1번의 수정할 제목을 입력하세요.
First수정
1번의 수정할 내용을 입력하세요.
내용없음
1번의 수정할 추가정보를 입력하세요.
추가정보없음
수정이 완료되었습니다.
cs


 - 수정 된 내용입니다.

1번의 값은 다음과 같습니다.
이름 = > [First수정] 내용 = > [내용없음] 추가정보 = > [추가정보없음]
cs


[ 게시판 소스 결과 - 삭제 ]

 - 선택하여 삭제한 내용을 보여줍니다. (편의를 위해 첫번째와 마지막 값만을 삭제하였습니다.)

1. 등록 2. 전체조회 3. 선택조회 4. 수정 5. 삭제 0. 종료
5
삭제란입니다.
선택조회할 번호를 입력하세요.
1
1번의 값은 다음과 같습니다.
이름 = > [First수정] 내용 = > [내용없음] 추가정보 = > [추가정보없음]
해당 값을 삭제하시겠습니까? Y[예] // N[아니오]
Y
삭제완료되었습니다.
cs


1. 등록 2. 전체조회 3. 선택조회 4. 수정 5. 삭제 0. 종료
5
삭제란입니다.
선택조회할 번호를 입력하세요.
5
5번의 값은 다음과 같습니다.
이름 = > [5번제목] 내용 = > [내용입니다.] 추가정보 = > [010-2222-XXXX]
해당 값을 삭제하시겠습니까? Y[예] // N[아니오]
Y
삭제완료되었습니다.
cs


 - 삭제 후 내용을 보여줍니다.

전체조회입니다.
2번에 등록된 내용은 다음과 같습니다.
이름 = > [Second] 내용 = > [Cc] 추가정보 = > [없음.]
3번에 등록된 내용은 다음과 같습니다.
이름 = > [Main] 내용 = > [내용] 추가정보 = > [추가할]
4번에 등록된 내용은 다음과 같습니다.
이름 = > [4번제목] 내용 = > [내용은] 추가정보 = > [없음.]
조회가 끝났습니다.
cs


 - 삭제 후 정상적으로 등록되어지는 내용입니다.

등록란입니다.
6번의 등록할 제목을 입력하세요.
삭제후추가
6번의 등록할 내용을 입력하세요.
내용없음
6번의 등록할 추가정보를 입력하세요.
010-5555-XXXX
등록완료되었습니다.
 
전체조회입니다.
2번에 등록된 내용은 다음과 같습니다.
이름 = > [Second] 내용 = > [Cc] 추가정보 = > [없음.]
3번에 등록된 내용은 다음과 같습니다.
이름 = > [Main] 내용 = > [내용] 추가정보 = > [추가할]
4번에 등록된 내용은 다음과 같습니다.
이름 = > [4번제목] 내용 = > [내용은] 추가정보 = > [없음.]
6번에 등록된 내용은 다음과 같습니다.
이름 = > [삭제후추가] 내용 = > [내용없음] 추가정보 = > [010-5555-XXXX]
조회가 끝났습니다.
cs


[ 게시판 소스 결과 - 예외 화면 ]

 - 등록된 값이 없을 때와 선택 시 존재하지 않을 때의 결과 화면입니다.

전체조회입니다.
등록된 값이 없습니다.
 
선택조회입니다.
선택조회할 번호를 입력하세요.
10
선택한 값은 없습니다.
cs


'Development > JAVA' 카테고리의 다른 글

[JAVA] Collection,Map 정리  (0) 2016.09.02
[JAVA] 게시판 예제 - 2 (배열 복사)  (0) 2016.08.29
[JAVA] Scanner 문자열 입력  (0) 2016.08.24
[JAVA] 배열  (0) 2016.08.24
[JAVA] 데이터 타입  (0) 2016.08.18

+ Recent posts