728x90
반응형
✔ Map 인터페이스 :
- 키와 값을 한 쌍으로 이루어지는 데이터의 집합으로 순서가 없고, 키는 중복으로 허용하지 않지만 값운 중복으로 허용
HashMap, TreeMap, HashTable
HashMap 클래스
- Map 인터페이스를 구현한 대표적인 클래스
- 키와 값으로 구성된 요소객체를 저장하는 구조를 가지고 있는 자료구조
- 키는 중복될 수 없고, 값은 중복될 수 있음
- 기존의 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체(키 값은 중복X)
- 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 뛰어난 성능
- 비동기식(여러개의 프로그램을 동시에 처리, 시간이 오래걸리면 다음 문장으로 이동 후 동작하는 방식)
TreeMap 클래스
- 이진트리를 기반으로 한 Map 컬렉션
- TreeSet과의 차이점은 TreeSet은 값만 저장하는 구조라면 TreeMap은 키와 값이 저장된 Key, value를 저장
- 키는 오름차순으로 정렬됨(숫자 : 값, 문자열 : 유니코드)
- HashMap보다 성능이 떨어짐(데잍터를 저장할 떄, 삭제할 때)
- 검색이 필요한 경우 효율성이 좋음
HashTable 클래스
- 키와 값을 1:1형태로 저장
- 키는 값을 식별하기 위한 고유한 키, 값은 키가 가진 값
- 동기화
- HashMap에서는 값을 null이 입력이 가능하지만 HashTable에서는 null입력이 불가능
import java.util.HashMap;// 많아 사용한다. 키랑 벨류를 동시에 사용한다는 이점이 크다.
import java.util.Iterator;
import java.util.Map;
public class HashMap1 {
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("✔apple", "김사과");
hashMap.put("🤷♀️apple", "김오과");
hashMap.put("😍apple", "김중과");
hashMap.put("😁apple", "김장과");
hashMap.put("🙌apple", "김종과");
hashMap.put("🍊apple", "김진과");
System.out.println(hashMap); // tostring , 눈으로 보기위해 그저 찍어본것
//{😁apple=김장과, 😍apple=김중과, 🍊apple=김진과, ✔apple=김사과, 🙌apple=김종과, 🤷♀️apple=김오과}
System.out.println(hashMap.get("✔apple"));// 키 값을 통해 내용을 찾아보자
//김사과
System.out.println(hashMap.keySet());// 키 값만 가저오기
//[😁apple, 😍apple, 🍊apple, ✔apple, 🙌apple, 🤷♀️apple]
for (String k : hashMap.keySet()) {
System.out.println("key : " + k + ", value : " + hashMap.get(k));// 값을 받아와 출력
}
System.out.println(hashMap.entrySet()); // 값을 받아서 반환한것이며 사용간에 entrySet을 이용하자.
//[😁apple=김장과, 😍apple=김중과, 🍊apple=김진과, ✔apple=김사과, 🙌apple=김종과, 🤷♀️apple=김오과]
for (Map.Entry<String, String> entry : hashMap.entrySet()){
System.out.println("key :"+entry.getKey()+", value : "+entry.getValue());
}
System.out.println();
Iterator<String>keys = hashMap.keySet().iterator();//키 값만 사용해서 keySet()
while(keys.hasNext()){// next() : 현제값을 반환해주고 그 다음으로 키를 넘긴다.
String key = keys.next();// 먼저 저장하고 유지하기 위해 사용 밑에서 key를 두번 사용하면 서로 다른 값에 저장된다.
System.out.println("key : "+key+", value : "+ hashMap.get(key));
}
}
1. 중첩 클래스
- 내부 클래스(Inner Class)
클래스 또는 메소드 안에 또 다른 클래스를 생성하는 것
내부 클래스는 외부 클래스의 모든 멤버를 자신의 멤버처럼 사용
static 내부 클래스를 제외한 내부 클래스는 항상 외부 클래스 객체를 통해서 생성
class OuterClass{
private int num1 = 10;
public void method1(){
System.out.println("num1:"+num1);
}
public void printInner(){//외부에서 객체를 생성해서 내부것으 사용할 수 있다.
InnerClass innerClass = new InnerClass();
innerClass.method2();
// innerClass.num2 = 10 // 외부 클래스에서 내부 클래스의 private 접근이 가능
}
public class InnerClass{// 내부에 있는 클래스로 클래스명 동일해도 상관없다.
private int num2 =20;
public void method2(){
System.out.println("OuterClass.num1 : "+ num1);
System.out.println("InnerClass.num1 : "+ num2);
}
}
}
public class InnerClass1 {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.method1(); //num1:10
outerClass.printInner(); //OuterClass.num1 : 10 InnerClass.num1 : 20
System.out.println();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
// 외부클래스를 통해서 내부클래스로 들어가면 내부클래스도 객체를 생성해서 사용이 가능하다.
innerClass.method2();//OuterClass.num1 : 10 InnerClass.num1 : 20
}
}
- 로컬 클래스(Local Class)
메소드 안에서 정의된 클래스(메소드 안에서만 사용할 수 있음)
외부 클래스의 모든 멤버에 접근이 가능(pricate 멤버도 접근 가능)
public class LocalClass {
private int num1 = 10;
public void method1() {
int num2 = 20;
class Local {
private int num3 = 30;
public final int num4 = 40;
public void method2() {
System.out.println("num1 : " + num1);
System.out.println("num2 : " + num2);
System.out.println("num3 : " + num3);
System.out.println("num4 : " + num4);
}
}
Local local = new Local();
local.method2();
}
public static void main(String[] args) {
LocalClass localClass = new LocalClass();
// 전체 메소드를 실행하면 method1이 실행되고 이 후 method2를 사용하여 출력이 된다.
localClass.method1();
}
}
- 정적 중첩 클래스(Static Class)
내부 클래스가 static으로 정의
외부 클래스에 관계없이 객체를 생성할 수 있음
public class StaticClass {
public static void print(){
System.out.println("Static 메소드!");
}
static class Static1{
int num =0;
public int add(){
num++;
return num;
}
}
public static void main(String[] args) {
print(); //Static 메소드! // static이 붙어있어 바로 사용 가능
StaticClass.print(); //Static 메소드!
StaticClass.Static1 static1 = new StaticClass.Static1();
System.out.println(static1.add());// 1
}
}
- 익명 클래스(Anonymous Class)
클래스를 정의하지 않고 객체를 정의할 때 사용
1회용 클래스이므로 재활용이 불가능
* 클래스를 한번 사용하고 없어지면 좋을거 같은 객체를 만들때 사용하며 많이 사용된다.
interface Inter1{ // 익명 클래스는 매우 중요하다.
// 이벤트를 만드는 프로그램이나 한번 사용하고 다음부터 필요없는 기능을 구현하기에 도움이 된다.
void method1();
}
class Class1 implements Inter1{
@Override
public void method1() { // 오버라이드를 해야 인터페이스 사용간 오류X
System.out.println("Inter1을 구현한 클래스");
}
}
interface Inter2 {
String method2();
}
class Class2 implements Inter2{// 클래스3에 메개변수 인터2가 있어 구현한 클래스2가 사용
@Override
public String method2() {
return "Inter2를 구현한 클래스(실명 클래스)";
}
}
class Class3 {
public void method3(Inter2 inter2){ // 인터페이스를 구현한 인터2의 객체타입은 클래스2이다.
System.out.println(inter2.method2());
}
}
public class Anonymous {
public static void main(String[] args) {
Class2 class2 = new Class2();
Class3 class3 = new Class3();
class3.method3(class2);
class3.method3(new Class2(){ // 참조변수 없이 인터페이스2구현
// 참조변수가 없기 떄문에 한번 사용하고 사라진다. 힙에는 저장이 되지않고 널로 있다.
@Override
public String method2() {
return "익명 클래스";
}
});
}
}
//Inter2를 구현한 클래스(실명 클래스)
//익명 클래스
반응형
'Java' 카테고리의 다른 글
Http Get 요청 - 인증된 사용자만 세션키 받아오기 (0) | 2023.09.09 |
---|