본문 바로가기
카테고리 없음

22-09-15 자바이야기(ft.ITwill 국비지원학원)

by Hunihu 2022. 9. 15.

연습문제 풀이

추석연휴 끝나고 오랜만에 탁구를 쳤더니 온몸이 쑤시는 몸뚱아리를 이끌고 학원에 도착하자마자!

예고되었던~~ 연습문제 풀이! 기분이 아주 좋네요 ㅎㅎ

 

List와 반복문을 이용한 간단한 예제들이라 아주 easy한 연습문제였지만 새로운 영역에대한 것이기때문에 또 재미졌습니다.

 

우선 우리는 list 두가지중에 하나인 LinkedList를 활용할 것인데.. 제가 잊어버려서 그러는것이 절대아닌!

까먹었을지 모를 다른분들을 위해! 두 List의 차이를 다시한번 상기해보자면,

ArrayList와 LinkedList의 차이점

두 개의 차이점이 더 궁금하다면 아래 링크의 블로그를 참고하면된다. 너무나도 잘 설명해주고 계신다.

 

자료구조: Linked List 대 ArrayList

2014년 모두들 어떤 목적과 계획을 갖고 살고 계신지요? 저는 올 한해 “Go to the Base”를 목표로 여러 계획을 세웠는데요. 그 중 하나가 과거 5년 동안 저를 되 돌아 보고 부족했던 기본 지식을 탄

www.nextree.co.kr

 

 

List 활용

아무튼 장점이 많은 LinkedList를 활용해서 객체 numbers를 선언해주고 numbers에 넣어줄 원소값을 생성할 우리의 난수장난감 random 객체를 소환해준다.

for문을 활용해서 index 0번부터 19번까지 쭉 난수를 넣어주고

List numbers 출력

number를 출력해주면 된다. 나는 for문을 사용해서 출력을 해야한다고 생각했는데, 이미 numbers는 list의 객체이고

List 클래스는 toString() 메소드를 재정의 해주었기때문에 객체만 프린트해줘도 배열의 모양으로 출력이된다.

List numbers

이번에는 이 list numbers의 원소들중에 홀수들만 따로 뽑아내어 다른 list를 만들어볼것이다.

그러므로 List 객체 odds를 생성해주고 이제 for문을 이용해서 인덱스를 하나씩 확인하며 넘겨주면 된다.

List numbers에서 홀수값들을 뺏어오자!

마찬가지로 출력해주면 아래와 같이 성공적으로 해당값들을 뺏어왔다 ㅎㅎ

List odds

 

List numbers에서 짝수들만 뺏어와서 제곱시켜버리자!

이번에는 짝수뺏어와서 제곱시켜서 다른 리스트에 저장을 해볼것이다.

 

우선 새로운 List 객체 생성해주고 for문으로 짝수들만 뽑아서 제곱시키고 새로운 리스트에 추가까지 해주고 

마지막에 출력까지! 아주아주 간단간단하다.

 

Iterator

아! 그리고 Iterator라는 클래스도 활용할 수 있는데 요놈은 저장된 배열을 String 타입으로 출력해주는 녀석이다.

우선 출력값을 보면 

evenSquares와 Iterator

이런식으로 evenSquares의 리스트값들을 String 타입으로 뽑아낸 것을 볼 수 있다.

 

그리고 Iterator를 사용할때 주의할 점이 있는데 바로 next() 메서드를 사용할 때이다.

 

next() 메서드는 Iterator할 위치를 다음원소로 이동시켜주는 역할을 하는데 변수로 정의하지않고 개별적으로 사용할 경우 컴파일 할때 잘못된 위치로 Iterator 될 우려가 있다.  

next() 메서드 유의사항

위의 그림과 같이 itr.next()를 String s 라는 변수에 담아서 사용할 경우에는 문제가 없지만, s에 직접

if( itr.next() >= 5) { 

    longword2.add(itr.next);

}

로 표기할경우 next() 메서드가 2번 호출되는것이므로 문제가 발생된다.

 

Arrays.asList() 메서드

Arrays.asList

예전에 우리가 배열을 배울때 int[] array = new array[3]; 이런식으로 배열을 만들기도 했지만

 

int[] array = { 1, 2 ,3 ,4 } 선언과 동시에 메모리에 값을 저장하는 즉 초기화하는 방법도 있었다.

그것과 유사한 느낌쓰라고 보면 되는데.

 

그 과정을 Array.asList() 메서드를 통해서 languages 라는 String 타입의 객체리스트에 원소값을 저장하는것이다.

 

List

우리가 상속개념을 봤을때 가장 상위클래스에 Collection -> List(interface) -> ArrayList, LinkedList 순인데 리스트가 인터페이스 클래스이므로 생성자는 자식클래서에서 호출해서 정의해주어야 한다.

 

removeAll() 메서드

예제풀이를 계속해서 하다가 list의 다른메서드는 없을까 하고 찾아보다가 강사님이 소개해주셨다.

removeAll 메서드

removeAll이란 녀석인데 Arrays.asList()메서드를 통해서 새로운 User 타입의 리스트를 생성해주고 이를 toDelete 객체에 저장하고 list와 toDelete를 비교해주면서 같은 문자열인것을 다 지워주는 메서드이다.

 

그런데 문제는 위에 new user()로 객체를 생성할때마다 주소값이 다 다르기떄문에 비교하는것이 의미가 없게된다.

 

toString이 기본적으로 주소값을 산출해주고있기때문이다. 그러므로 우리는 이를 해결하기 위해 메서드를 재정의할 필요가있다!

override equals(),hashCode()

 

equals와 hashcode 메서드를 오버라이드 해주었다. 보통 2개의 메서드는 같이 사용하는 경우가 많은데

우선 자바가 값을 비교할때 우선 그 주소값을 먼저 확인하기 때문이기도 하다.

 

우선 equals() 메서드에서 instanceof를 이용하여 파라미터값이 User 클래스의 객체인지부터 확인하고 True라면 파라미터값을 user객체에 저장하고 파라미터로 받은 유저아이디와 기존에 있던 유저아이디의 문자열을 비교한 결과를 리턴하도록 했다.

말로 풀어내려니까 더 어렵게 느껴진다 ;;

 

그리고 만약 equals 메서드가 True라면 hashCode()메서드도 호출되어 2개의 객체의 아이디는 동일한 hashCode 값을 갖게 된다.

 

Set 클래스

Set 클래스의 개념

 

Set 클래스도 Collection 클래스의 하위 클래스이다. Set은 배열보다는 집합에 가까운 성질을 가지고 있다.

TreeSet은 알아서 정렬하여 저장도 한다고 하니 기가막힌 Collection이다.