복습

자바 14일차 - Map인터페이스, 내부 클래스, 람다식, 스트림 본문

자바

자바 14일차 - Map인터페이스, 내부 클래스, 람다식, 스트림

ykm1256 2020. 4. 6. 17:32

Map 인터페이스
: 자료를 으로 관리하는 데 필요한 메서드가 정의되어 있다. key-value 쌍으로 이루어진 객체의 key 값은 유일하며 value값은 중복될 수 있다.

 

HashMap 클래스

: Map 인터페이스를 구현한 클래스 중 가장 많이 사용하며 해시 방식으로 자료를 관리한다.

기본형식
: HashMap<key,value> 변수이름;
변수이름 = new HashMap<key,value>();

objTel이라는 HashMap 변수를 선언하고 값을 대입해 객체를 생성한다. 그리고 3개의 key-value 값을 대입한다.

get 메서드로 key 값이 홍길동인 value를 telResult 변수에 대입한다. 그 다음 telResult 변수를 출력하고, get메서드를 통해 바로 key 값이 홍길동인 value 값을 출력하여 같은 결과가 나왔다.

그리고 Iterator를 이용해 HashMap의 모든 값을 받아왔다. 먼저 keySet() 메서드를 이용해 모든 key 값을 반환하는데 iterator()메서드를 호출하여 key값을 순회할 수 있게 한다. 그리고 while 문에서 hasNext를 사용해 key값이 있으면 반복문이 계속 돌아가고, key라는 변수에 key값을 받아서 value값을 telResult2라는 변수에 대입하고 key 값과 value 값을 모두 출력한다. 그리고 contatinsKey 메서드로 HashMap에 입력한 Key 값이있는지를 확인한 후 참, 거짓 값을 반환한다.

마지막으로 remove 메서드로 Key 값이 김유신인 회원을 삭제한 후 iterator로 모든 회원을 출력하였을 때 김유신 회원의 정보가 빠진 것을 볼 수 있다.

 

TreeMap 클래스
: TreeSet과 마찬가지로 이진 검색 트리로 구현되어있다. key 값으로 정렬하기 때문에 Comparable이나 Coparator 인터페이스를 구현해 주어야 한다.

 

내부클래스

: 내부 클래스는 말 그대로 클래스 내부에 선언한 클래스이다. 외부클래스와 밀접한 관련이 있을 때나 그 밖의 다른 클래스와 협력할 일이 없는 경우 사용한다.

 

람다식

: 기존의 자바는 클래스를 만들고 클래스 안에 기능을 구현한 메서드를 만든 후 그 메서드를 호출해야 했지만, 함수의 구현과 호출만으로 프로그램을 만들 수 있는 방식이 있다. 이를 함수형 프로그래밍이라고 하는데 자바에서는 람다식이라고 한다.

기본형식
int add(int x, int y){

return x+y;                   -> (int x, int y) -> {return x + y;}

}

 

람다식 예제

MyNumber 타입의 변수 max를 선언하고 바로 람다식으로 메서드를 구현한다. 여기서 MyNumber 인터페이스의 추상메서드는 하나밖에 없으므로 따로 메서드 명을 써서 쓰지않고 람다식으로 바로 구현할 수 있다.

따라서 람다식을 사용할 때에는 오직 하나의 메서드만 선언한 인터페이스를 구현할 수 있다.

 

 

클래스와 람다식 비교

StringConcat이라는 인터페이스를 만들어 추상메서드 makeString을 선언했고, StringConCatImpl 클래스에서 StringConcat 인터페이스를 구현했다. 그리고 s1, s2 변수를 선언하고 concat1이라는 StringConCatImpl 클래스 타입의 변수를 선언하여 makeString메서드로 s1,s2 값을 대입하여 결과를 출력하였다.

그 다음은 인터페이스형 concat2 변수를 선언하여 람다식으로 메서드를 바로 구현한 후 makeString 메서드로 s1,s2값을 대입하여 concat1과 같은 결과를 만들어낸 것을 볼 수 있다.

그 다음 concat3은 생성자 안에서 메서드를 구현하여 위의 concat1, concat2와 같은 결과를 출력했다.

 

*concat3와 같은 경우를 익명 내부 클래스라고 하는데 이는 클래스 이름 없이 인터페이스 자료형 변수에 바로 메서드 구현부를 생성하여 대입할 수 있다. 즉 concat2 처럼 람다식으로 메서드를 구현해서 호출하면 실제로는 concat3와 같이 이름이 없는 익명 클래스가 생성되고 익명 객체가 생성되어 작동하게 된다.

 

인터페이스형 변수에 람다식 대입하기

10행에서 인터페이스형 변수를 선언하고 람다식으로 메서드를 구현하여 대입한다. 그리고 그 변수로 인터페이스의 메서드를 호출하여 hello lambda_1 메시지를 출력한다. 그 다음 showMyString메서드를 호출하여 hello lamda_2 문구를 출력한다. 그리고 다른 인터페이스형 변수를 선언하여 아래에서 구현한 returnString() 메서드를 대입하고 showString 메서드를 호출하여 hello 문구를 대입하면 returnString 메서드가 호출되어 hello와 world가 합쳐져서 hello world가 출력된다.

 

스트림(stream)

: 여러 자료의 처리에 대한 기능을 구현해 놓은 클래스. 이를 활용하면 배열, 컬렉션 등의 자료를 일관성 있게 처리할 수 있다.

배열을 선언한 후 Array.stream(arr)로 스트림을 생성한다. 그리고 sum()메서드를 이용해 배열의 요소의 총합을 구하고 sumVal 변수에 대입한다. 그리고 스트림을 다시 생성하여 count 메서드로 배열 요소의 개수를 더하여 count 변수에 대입한 후 둘의 결과를 출력한다. 여기서 스트림을 두번 생성하는 이유는 sum, count는 최종연산으로 자료를 소모하면서 연산을 수행하기 때문에 최종연산을 하고 나면 해당 스트림을 더이상 사용할 수 없다.