Map CollectionFrameWork

지환·2023년 10월 24일
0

JAVA

목록 보기
37/39

Map

Map & Set



package com.mapexam;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class KeyMain1 {

	public static void main(String[] args) {

		Map<String,Integer> map = new HashMap<>();
		map.put("나신입", Integer.parseInt("85"));
		map.put("나초보", 75);
		map.put("나일등", 65);
		
		//String names[] = {"나신입", "나초보", "나일동"};
		String[] names = null;
		Set<String> set = map.keySet();
		names = (String[])set.toArray();
		System.out.println(names.length);
		
		
				
				
	}
}






---------------------------------
Exception in thread "main" java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')
	at com.mapexam.KeyMain1.main(KeyMain1.java:19)
  • 몰랐던 부분
  1. 배열을 캐스팅연산자로 할 수 있었던 건 몰랐음.

  2. names = (String[])set.toArray(); 해당 부분 안 되는 이유 설명하기.

package com.mapexam;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class KeyMain1 {

	public static void main(String[] args) {

		Map<String,Integer> map = new HashMap<>();
		map.put("나신입", Integer.parseInt("85"));
		map.put("나초보", 75);
		map.put("나일등", 65);
		
		//String names[] = {"나신입", "나초보", "나일동"};
		Object[] names = null;
		Set<String> set = map.keySet();
		names = set.toArray();
		System.out.println(names.length);
		
		
		for(int i =0; i<names.length; i++)
		{
			String key = (String)names[i];
			System.out.println(key);
		}
		
		
				
				
	}
}
--------------------------------------------
3
나신입
나일등
나초보

섬세하게 코딩하자. Int형으로 변환해보자.

package com.mapexam;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class KeyMain1 {

	public static void main(String[] args) {

		Map<Integer,Integer> map = new HashMap<>();
		map.put(45, Integer.parseInt("85"));
		map.put(55, 75);
		map.put(95, 65);
		
		//String names[] = {"나신입", "나초보", "나일동"};
		Object[] names = null;
		Set<Integer> set = map.keySet();
		names = set.toArray();
		System.out.println(names.length);
		
		
		for(int i =0; i<names.length; i++)
		{
			int key = (Integer)names[i];
			System.out.println(key);
		}
		
		
				
				
	}
}
--------------------------------------------------
3
55
45
95

다른 형태로도 사용이 가능함

package com.mapexam;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class KeyMain1 {

	public static void main(String[] args) {

		Map<Integer,Integer> map = new HashMap<>();
		map.put(new Integer(20), Integer.parseInt("85"));
		map.put(new Integer(50), 75);
		map.put(new Integer(90), 65);
		
		//String names[] = {"나신입", "나초보", "나일동"};
		Object[] names = null;
		Set<Integer> set = map.keySet();
		names = set.toArray();
		System.out.println(names.length);
		
		
		for(int i =0; i<names.length; i++)
		{
			int key = (Integer)names[i];
			System.out.println(key);
		}
		
		
				
				
	}
}
----------------------------------------------------
3
50
20
90

한 문장으로 합쳐봐

		Set<Integer> set = map.keySet();
		names = set.toArray();
package com.mapexam;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class KeyMain1 {

	public static void main(String[] args) {

		Map<Integer,Integer> map = new HashMap<>();
		map.put(new Integer(20), Integer.parseInt("85"));
		map.put(new Integer(50), 75);
		map.put(new Integer(90), 65);
		
		//String names[] = {"나신입", "나초보", "나일동"};
		Object[] names = null;
		Set<Integer> set = map.keySet();
		names = set.toArray();
		
		Object[] its = map.keySet().toArray();
		for(Object obj : its)
		{
			System.out.println("obj====>"+obj);
		}
		
		
		System.out.println(names.length);
		
		
		for(int i =0; i<names.length; i++)
		{
			int key = (Integer)names[i];
			int value = map.get(names[i]);
			
			System.out.println("Key 값은 : "+key +"   " + "Value 값은 : "+value);
		
		}
		
				
	}
}
--------------------------------
obj====>50
obj====>20
obj====>90
3
Key 값은 : 50   Value 값은 : 75
Key 값은 : 20   Value 값은 : 85
Key 값은 : 90   Value 값은 : 65
  • 메소드의 리턴타입이 오브젝트 일 수 있다.
    변수명.메소드명().메소드명(); 가능하다.
package com.mapexam;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class KeyMain1 {

	public static void main(String[] args) {

		Map<Integer,Integer> map = new HashMap<>();
		map.put(new Integer(20), Integer.parseInt("85"));
		map.put(new Integer(50), 75);
		map.put(new Integer(90), 65);
		
		//String names[] = {"나신입", "나초보", "나일동"};
		Object[] names = null;
		Set<Integer> set = map.keySet();
		names = set.toArray();
		System.out.println(names.length);
		
		
		for(int i =0; i<names.length; i++)
		{
			int key = (Integer)names[i];
			int value = map.get(names[i]);
			
			System.out.println("Key 값은 : "+key +"   " + "Value 값은 : "+value);
		
		}
		
				
	}
}
----------------
3
Key 값은 : 50   Value 값은 : 75
Key 값은 : 20   Value 값은 : 85
Key 값은 : 90   Value 값은 : 65

심화(DeptList1) 초본

package com.mapexam;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 * 학습목표 : DeptList1 부서번호, 부서명, 지역 -> 2중 접근을 통해서 접근해보자.
 * @author GD
 *
 */

public class DeptList1 extends JFrame implements ActionListener {
	JPanel jp_north = new JPanel();
	JButton jbtn_sel = new JButton("조회");
	String header[] = {"부서번호","부서명","지역"};
	String data[][] = new String[0][3];
	DefaultTableModel dtm = new DefaultTableModel(data, header);
	JTable jt = new JTable(dtm);
	JScrollPane jsp = new JScrollPane(jt);
	void initDisplay() {
		jp_north.setLayout(new FlowLayout(FlowLayout.LEFT));
		jbtn_sel.addActionListener(this);
		jp_north.add(jbtn_sel);
		this.add("North", jp_north);
		this.add("Center", jsp);
		this.setTitle("부서목록");
		this.setSize(600, 400);
		this.setVisible(true);
	}
	public static void main(String[] args) {
		DeptList1 dt = new DeptList1();
		dt.initDisplay();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}

}

DeptList1 - List 메소드 추가해보기

package com.mapexam;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 * 학습목표 : DeptList1 부서번호, 부서명, 지역 -> 2중 접근을 통해서 접근해보자.
 * @author GD
 *
 */

public class DeptList1 extends JFrame implements ActionListener {
	JPanel jp_north = new JPanel();
	JButton jbtn_sel = new JButton("조회");
	String header[] = {"부서번호","부서명","지역"};
	String data[][] = new String[0][3];
	DefaultTableModel dtm = new DefaultTableModel(data, header);
	JTable jt = new JTable(dtm);
	JScrollPane jsp = new JScrollPane(jt);
	
	DeptVO[] getDeptList1()
	{
		return null;
	}
	
	List<DeptVO> getDeptList2()
	{
		return null;
	}
	
	List<Map<String, Object>> getDeptList3()
	{
		
	}

	
	public static void main(String[] args) {
		DeptList1 dt = new DeptList1();
		dt.initDisplay();
	}
	
	void initDisplay() {
		jp_north.setLayout(new FlowLayout(FlowLayout.LEFT));
		jbtn_sel.addActionListener(this);
		jp_north.add(jbtn_sel);
		this.add("North", jp_north);
		this.add("Center", jsp);
		this.setTitle("부서목록");
		this.setSize(600, 400);
		this.setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}

}
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import java.util.Iterator;
//myBatis DB연동하기 - 30% 이상 반복코드를 줄여줌
//html에서 폼 전송을 통해 회원가입, 및 주문 등록 할 때 반복되는 코드를 줄이기 위해
//사용될 수 있다. - Map
public class DeptList1 extends JFrame implements ActionListener {
	JPanel jp_north = new JPanel();
	JButton jbtn_sel = new JButton("조회");
	String header[] = {"부서번호","부서명","지역"};
	String data[][] = new String[0][3];
	DefaultTableModel dtm = new DefaultTableModel(data, header);
	JTable jt = new JTable(dtm);
	JScrollPane jsp = new JScrollPane(jt);
	DeptVO init1(int deptno, String dname, String loc) {
		DeptVO dvo = new DeptVO();
		dvo.setDeptno(deptno);
		dvo.setDname(dname);
		dvo.setLoc(loc);
		return dvo;
	}
	void arrayPrint() {
		DeptVO[] dvos = getDeptList1();
		for(int i=0;i<dvos.length;i++) {
			Vector<Object> v = new Vector<>();
			v.add(dvos[i].getDeptno());
			v.add(dvos[i].getDname());
			v.add(dvos[i].getLoc());
			dtm.addRow(v);
		}
	}
	void listVOPrint() {
		List<DeptVO> list = getDeptList2();
		System.out.println(list.size());
		for(int i=0;i<list.size();i++) {
			DeptVO dvo = list.get(i);
			Vector<Object> v = new Vector<>();
			v.add(dvo.getDeptno());
			v.add(dvo.getDname());
			v.add(dvo.getLoc());
			dtm.addRow(v);
		}
	}
	void listMapPrint() {
		List<Map<String,Object>> list = getDeptList3();
		Iterator<Map<String,Object>> iter = list.iterator();
		while(iter.hasNext()) {
			Vector<Object> v = new Vector<>();
			Map rmap = (Map)iter.next();
			v.add(rmap.get("deptno"));
			v.add(rmap.get("dname"));
			v.add(rmap.get("loc"));
			dtm.addRow(v);			
		}
	}
	DeptVO[] getDeptList1() {
		DeptVO[] dvos = new DeptVO[3];
		for(int i=0;i<dvos.length;i++) {
			dvos[i] = init1((i+1)*10,"개발"+(i+1)+"팀", "서울"+(i+1));
		}
		return dvos;
	}
	
	List<DeptVO> getDeptList2(){
		List<DeptVO> list = new ArrayList<>();
		DeptVO dVO = null;
		for(int i=0;i<3;i++) {
			dVO = new DeptVO((i+1)*20,"개발"+(i+1)+"팀", "서울"+(i+1));
			list.add(dVO);
		}		
		return list;
	}
	
	List<Map<String,Object>> getDeptList3(){
		List<Map<String,Object>> list = new ArrayList<>();
		//VO나  Map은 한 번에 한개 로우만 담을 수 있다.
		//여러번 담으면 맨 마지막 것만 기억하니까....
		Map<String,Object> map = null;
		for(int i=0;i<3;i++) {
			map = new HashMap<>();
			map.put("deptno", (i+1)*30);
			map.put("dname", "운영"+(i+1)+"팀");
			map.put("loc", "서울"+(i+1));
			list.add(map);
		}		
		return list;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		if(obj == jbtn_sel) {//너 조회 버튼 누른거야?
			//arrayPrint();
			//listVOPrint();
			listMapPrint();
		}
		
	}
	void initDisplay() {
		jp_north.setLayout(new FlowLayout(FlowLayout.LEFT));
		jbtn_sel.addActionListener(this);
		jp_north.add(jbtn_sel);
		this.add("North", jp_north);
		this.add("Center", jsp);
		this.setTitle("부서목록");
		this.setSize(600, 400);
		this.setVisible(true);
	}
	public static void main(String[] args) {
		DeptList1 dt = new DeptList1();
		dt.initDisplay();
	}
}
List<DeptVO> getDeptList2() {
   List<DeptVO> list = new ArrayList<>();
   DeptVO dVO = null; // dVO 변수를 메소드 내에서 선언하고 초기화
   for (int i = 0; i < 3; i++) {
       dVO = new DeptVO((i + 1) * 20, "개발" + (i + 1) + "팀", "서울" + (i + 1));
       list.add(dVO);
   }		
   return list;
}

dVO는 메소드의 전체 범위에서 선언되고 초기화됩니다. 따라서 for 루프 내에서 dVO를 초기화하고 사용하고, 이 값을 리스트에 추가한 다음 메소드가 종료될 때까지 dVO를 계속 사용할 수 있습니다. 이것은 dVO의 범위가 메소드 내에서 전역적으로 유지된다는 것을 의미합니다.

  • DeptVO dVO = null; 문장은 메소드 내에서 선언되어 메소드의 전체 범위에서 변수 dVO가 사용 가능합니다. 이것은 dVO 변수가 초기화되고 나면 메소드 전체에서 동일한 변수를 재사용함을 의미합니다. 따라서 for 루프 내에서 생성된 DeptVO 객체는 모두 같은 변수 dVO를 참조합니다. 이로 인해 list에 추가되는 모든 객체가 동일한 변수 dVO를 참조합니다.

  • 첫 번째 메소드: 모든 DeptVO 객체가 동일한 변수 dVO를 참조하기 때문에, list에 추가된 모든 객체는 마지막 반복에서 생성된 DeptVO 객체의 상태를 반영합니다. 다시 말해, 모든 객체가 동일한 값을 가지는데, 이 값은 마지막 반복에서 생성된 DeptVO 객체의 값입니다.

    List<DeptVO> getDeptList2() {
       List<DeptVO> list = new ArrayList<>();
       for (int i = 0; i < 3; i++) {
           DeptVO dVO = null; // dVO 변수를 반복문 내에서 선언하고 초기화
           dVO = new DeptVO((i + 1) * 20, "개발" + (i + 1) + "팀", "서울" + (i + 1));
           list.add(dVO);
       }		
       return list;
    }
  • dVO는 for 루프 내에서 선언되고 초기화됩니다. 이것은 dVO의 범위가 반복문 내로 제한된다는 것을 의미합니다. dVO는 각 반복에서 새로운 인스턴스로 초기화되며, 한 번의 반복이 끝날 때마다 이전 값은 사라집니다. 이렇게 하면 반복문 내에서만 dVO에 접근할 수 있으며, 반복문 외부에서는 dVO에 액세스할 수 없습니다.

  • 두 번째 메소드: DeptVO dVO는 for 루프 내에서 선언되어, 각 반복에서 새로운 변수가 생성됩니다. 따라서 list에 추가되는 DeptVO 객체는 서로 다른 변수 dVO를 참조하며, 각 객체는 서로 독립적입니다.

  • 두 번째 메소드: 각 DeptVO 객체가 각 반복에서 새로운 변수 dVO를 참조하기 때문에, list에 추가된 모든 객체는 서로 다른 값을 가집니다. 각 객체는 해당 반복에서 생성된 DeptVO 객체의 값과 독립적입니다.

import java.util.HashMap;
import java.util.Map;
// Spring Boot- F/W
class Map1{
	//다형성을 누릴 수 있다. - 다를 수 밖에 없다. 왜냐면 Map 인터페이스이니까
	Map<String, Object> map = new HashMap<>();
	Map1(){
		System.out.println(map.size());//원본의 수 - 0이다. 아래 코드를 실행하고 나면 1로 바뀐다
		map.put("1", 1);//map.size()=1
		System.out.println(map.size());//원본의 수 - 1이다.
		System.out.println(map);//{1=1} -> JSON {"1":1, "c_name":"나신입", } -Map구조이다. -> Javascript꺼낸다
		System.out.println(map.containsKey("1"));//true
		System.out.println(map.containsKey("2"));//false
		//JSON 포맷에서 [{},{},{},,,,,, label:[{},{},{},,,,]]
	}
	Map1(int i){
		map = new HashMap<>();//새로운 객체를 생성함 - 복제본이다.(원본,복제)
		System.out.println(map.size());//복제본의 수 - 0이다.
		//map.size() =0  map을 복제하고 put호출하지 않았으므로 0이다.
	}
}
public class MapMain1 {

	public static void main(String[] args) {
		Map1 m1 = new Map1();//전변이 읽혀진다. - 디폴트 생성자가 호출되었으니까 출력이 될거야
		//insert here에서 키값이 1인 값을 출력하시오. - 인스턴스 변수 2번 오는 코드 확실하게 해둘것
		System.out.println(m1.map.get("1"));
		Map1 m2 = new Map1(50000);//15번 생성자에서 50000을 사용하고 있지 않으므로 어떤 값을 치환해도 의미 없다.

	}

}
profile
아는만큼보인다.

0개의 댓글