개발자로 가는 길(국비지원과정)/1. Java

[210510월] Collection, ArrayList 복습, 코딩 연습

레아Leah 2021. 5. 10. 09:18
반응형

[1교시]

Collection : 데이터가 여러 개 들어가는 것, 데이터의 묶음(컴공 자료구조 Data Structure)

 

- 선형 : ArrayList(자바 용어, 일반적으로 List라고 부름), LinkedList, Stack, Queue.

- 비선형 : 데이터가 연속적으로 있지 않을 경우가 높다. Map(HashMap, 구조적으로 생각하기에 표 같이 생겼다), Tree

=> 운영체제 안에서 많이 사용 

 

자바에서는 Collection이라는 인터페이스가 있고, 하위 인터페이스 list(ArrayList, Set), Map(HashMap) 

ArrayList는 index, HashMap는 key를 사용

 

ArrayList는 삽입(추가)할 때는 좋지만 삭제가 빈번한 경우는 사용하지 않는 것이 좋다. index가 있기 때문에 조회, 수정하기 쉽다.   

 

회사에서는 배열을 사용하기 보단 ArrayList와 Map(HashMap)을 사용하는 일이 더 많다고.. ex) 알라딘

 

Map은 키와 밸류의 쌍, 데이터의 위치정보를 나타내는 인덱스가 없다. 순회가 까다롭다. 검색, 삽입, 수정, 삭제 보통, 데이터가 아무리 많아도 검색 속도가 빠르다. Key가 주소역할을 해 Key를 알고 있으면 바로 찾을 수 있다(Hash 알고리즘). 

 

 

 

[Map]의 CRUD

인터페이스는 객체 생성불가, 일종의 설계도 

+ 주의 : 인터페이스 접근지정자는 public이라는 것! 

DicServiceImpl에서 DicService를 구현

 

약결합 : 외부에서 만들어 던져주기

[DI : Dependency Injection ]

new DicServiceImpl(dic);를 작성하니 DicServiceImpl의 일반생성자를 만들라고 함.

public DicServiceImpl(Map<String, String> dic) {

this.dic = dic;

}

 

실제로 운영되는 것은 DicServiceImpl이지만 new 생성하지 않음 

강결합을 하게 되면 이후에 유지보수가 어렵다. 고칠게 많아짐. 

강결합의 예) Map<String, String> dic = new DicServiceImpl(dic);

 

밑에 왜 에러인지 모르겠다 ㅜㅜ 아무것도 안만졌는데 껐다키니 또 실행됨 

 

 

 

[2교시]

word, mean 어디에 선언?

객체를 선언하는 것은 컴퓨터에게 부담이 되는 일, 그렇기 때문에 어디에 선언할 것인가도 중요하다.

무한 반복인 while문을 끝내기 위해 switch 혹은 if(choice.equals("1") 사용

 

 

[regist]

 

 

[search]

next와 next를 사용하기 전에 무엇을 입력할 것인지 생각해보고 사용하기 

next(); : 단어 한개만 입력받음

.nextLine(); : 문장을 입력받음

.next()와 .nextLine()는 입력버퍼가 다르기 때문에 혼합해서 사용하면 안된다. 통일시켜야 한다. 

 

 

 

갑분 regist 수정 

수정 전 

수정 후 

값을 put을 이용해 넣고 난 후 tmp를 출력하면 System.out.println(tmp); null값이 나왔는데, 이것을 이용해 tmp가 null이라면 리턴 값을 1을 주기로 한다. 

 

 

[modify]

 

수정하기 전 입력했던 의미가 리턴되어 옴.

 

replace는 put과 동작(원래 있던 것을 없애고 데이터를 변경하는 것)이 동일함.

temp가 null로 나오면 이전에 등록되었던 수정할 값이 없다는 것 

수정하기 전에 입력했던 값이 tmp으로 출력되어야만 수정되어진 것! 

tmp가 null로 출력된다면 조회하여 수정할 것이 없었다는 것을 의미! 

위의 사진에서 잘못된 부분 수정! 

메소드 modify에서 ↓ 

더보기

public int modify(String word, String mean) {

String tmp = dic.replace(word, mean);

if(tmp == null) return 0; 

 

return 1;

}

: if(tmp == null) return 0; 는 수정 실패, 왜냐하면 이전에 입력된 단어가 없기때문에, if(tmp == null) tmp이 null이 아닌 경우 return 값 1로 수정 성공을 의미한다. 

 

 

내가 수정할 수 있는 상황인지, put, replace를 if문을 사용해 확인 후 사용해야 한다.  

replace할 수 있는지 get을 통해 그 단어가 존재하는지(수정할 수 있는지) 확인 후 사용 가능! 

 

 

[delete]

삭제할 데이터가 있을 때

String tmp = dic.remove(word);

System.out.println(tmp);

 

tmp의 값으로 등록되었던 mean의 값이 나왔다. 

삭제를 성공할 수 있는 경우는 이미 등록된 값이 있어서 그 값을 지워야 한다는 것이다. 

그렇기 때문에 tmp의 값이  null일 경우 삭제 성공을 의미하는 리턴 값으로 1

 

 

 

삭제할 데이터가 없을 때

삭제할 값이 있을 때는 tmp의 값으로 mean의 값이 출력되고, 삭제할 것이 없을 경우에는 null이 튀어나온다. 즉, tmp가 null이 아닌 경우가 삭제가 되었다는 것을 의미한다. 

 

 

[3교시]

중복되는 코드가 switch~case 안에 너무 많이 있다. 이것을 수정해보자! 

중복되는 코드가 있으면 좋지 않다. 수정 시 하나하나 다 바꿔줘야 하기 때문 

이래서 vo가 필요하구나 생각해야함

입력 전용 메소드 input();을 만들어주자!

→ 입력받은 단어를 리턴해줄 용도

return값으로 word,  mean 값을 한번에 리턴하고 싶지만 자바에서 이는 불가능하다. 

방법은 두 가지!  vo로 하거나, 배열로 리턴한다. 자신이 편한 방법으로 해주세요. 

자바에서는 2개의 값을 return할 수 없다.

 

그렇기에 우리는 vo를 만드는 방법으로 gogo!

DictionaryVO 만들기

멤버변수로 word, mean, 일반생성자,  setter, getter, toString을 생성해주세요. 

리턴값으로 DictionaryVO를 리턴할 input 메소드 완성! 

공통으로 쓰일 것 같은 DictionaryVO vo를 멤버단으로 올려주기 

DictionaryVO vo = null; 초기화됨

 

메소드 오버로드 

2, 4번

여기서 놓침 수업 다시 11:18분 쯤 

String word = null;는 지역변수인 word를 선언과 함께 초기화해준 것이다. 

 

 

Map의 단점 : replace와 put

put 기존의 데이터가 있던 없던 신경쓰지 않고 새로운 값을 가져와 처리를 해버린다. 

기존에 데이터가 없을 때만 처리되도록 ↓ 아래와 같이 메소드를 만들 수 있도록.

더보기

public int regist(String word, String mean) {

String tmp = dic.get(word);

if(tmp == null) return 1; //기존 데이터가 없을 경우 get()하면 null이 리턴된다. 

 

return 0;

}

 

temp의 여부에 따라,  null 값이 나오는지 아닌지에 따라 

regist에서 단어를 입력하기 전에 기존의 데이터가 존재하는지 먼저 찾고 기존 데이터가 없을 경우, 즉 get()의 값이 null인 경우에만 데이터를 등록, 삽입할 수 있게 만든다.  

 

 

 

[데이터가 없을 때(null일때만) 등록 가능한 로직]

int result =0; 선언 및 초기화 

case "1"에서 vo = input();  실행 후 리턴 값이 1로 돌아오면 등록 성공, 1이 아닌 값이 들어오면 등록 실패  

 

 

 

[modify]

 

 

[캡쳐 따라해보기]

반응형