본문 바로가기
학원수업/12월

12/29 국비학원 자바수업 24회차(컬렉션 프레임워크, List, Map)

by 코딩마스터^^ 2022. 12. 29.

컬렉션프레임워크

 

자바 컬렉션은 객체를 수집해서 저장하는 역할을 한다 프레임워크란 사용 방법을 미 리 정해 놓은 라이브러리를 말한다 자바 컬렉션 프레임워크는 몇 가지 인터페이스를 통해서 컬렉션 클래스를 이용할 수 있도록 하고 있다 컬렉션 프레임워크의 주요 인터페이스로는 List, Set, Map이 있다 이 인터페이스들은 컬렉션을 사용하는 방법을 정의한 것인데 다음은 이 인터페이스로 사용 가능한 컬렉션 클래스를보여준다

출처 : 이것이 자바다 p.756

Map, List 는 인터페이스

ArrayList Vector... 은  구현체 클래스

 

 

 

하나의 자원을 공유하는것이다.

그러면 경합이 벌어지고 인터셉트가 일어날수있고

그로인해 자원유실이 될수도있다.

 

벡터는 멀티스레드에서 안전하다.

멀티스레드는 동기화를 지원하기때문에 느릴수있지만 안전하다.

 

ArrayList와 HashMap은 싱글 스레드에서 안전하다.

두사람 혹은 세사람이 붙으면 안전하지 않다.

값이 바뀔 수 있다.

무조건 다룰 줄 알아야된다.

 

Map은 키와 값을 쌍으로 가지고 있다.

키값은 스트링

값은 오브젝트로 여러가지를 담을 수 있게 하는것이 좋다.

 

List

List는 배열과 비슷한점이 있다.

배열은 얕은 복사와 깊은 복사가 있다.

 

List 공통으로 사용가능한 인터페이스의 메소드 종류

DB연동하기

# JDBC의 구조

 - JDBC는 JDBC interface 와 JDBC Driver로 구성되어 있다.

 - 애플리케이션에서 SQL문을 만들어 JDBC interface를 통해 전송하면 실제 구현 클래스인 JDBC Driver에서 DBMS에 접속하여 SQL문을 전송한다. 그에 따른 결과를 다시 응용프로그램에게 전달한다. 

 - JDBC는 애플리케이션과 DBMS를 연결해주는 다리 역할이라고 보면된다.

 

 * 여기서 JDBC Driver은 데이터베이스의 종류마다 다르기 때문에 종류와 버전에 맞는 Driver를 맞게 사용해줘야 한다.

 

JDBC 의 구조

DRIVER 클래스가 있어야 물리적으로 떨어져 있는 오라클 서버에 접속이 가능하다.

 

package dev_java.util;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConnectionMgr {
  public static final String _DRIVER = "oracle.jdbc.driver.OracleDriver";

  public static final String _URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl11";
  public static String _USER = "scott";
  public static String _PW = "tiger";

  public Connection getConnection(){
    Connection con =null;
    try {
      Class.forName(_DRIVER);
      con=DriverManager.getConnection(_URL, _USER, _PW);
    } catch (ClassNotFoundException e) {
     System.out.println("드라이버 클래스를 찾을 수 없습니다.");
    }catch(Exception e){//가장 범위가 넓은 클래스를 가장 바깥에 적기. 에러중에 젤 큰애다.
      //멀티 블럭 작성시 더 넓은 클래스가 뒤에 와야함
      System.out.println("오라클 서버와 커넥션 실패!");
    }
    return con;
  }

  public static void main(String[] args) {
    DBConnectionMgr dbMgr=new DBConnectionMgr();
    Connection con =dbMgr.getConnection();
    System.out.println("con====>"+con);
  }
}

/*
 * JDBC API를 이용하여 DB연동하기
 * 1. 각 제조사가 제공하는 드라이버 클래스를 로딩한다.
 * 2. 물리적으로 떨어져있는 오라클 서버와 연결 통로를 확보해준다.
 * 3. DML문을 자바에서 오라클 서버로 전달 해 줄 인터페이스를 생성한다.(Statement:정적 쿼리문, PreparedStatement:동적 쿼리문 지원)
 * 4. SELECT의 경우 오라클 서버에서 제공하는 커서를 지원하는 ResultSet인터페이스를 활용하여
 * 테이블에 제공되는 커서를 조작하여 해당 로우에 데이터가 존재하면 Cursor...open....fetch과정을 통해서
 * 오라클 서버로부터 데이터를 꺼내서 Lsit<DeptVO>에 담을 수 있다.
 * 주의 : INSERT,UPDATE,DELETE에서는 커서가 필요없음
 * 리턴값은 int임
 * 이것들을 요청할때는 executeUpdate(INSERT문orUPDATE, DELETE문)
 * SELECT일때는
 * ResultSet rs=executeQuery("SEKECT * FROM dept");
 * 오라클에서 제공되는 커서를 조작하는 인터페이스를 리턴 타입으로 제공받아서
 * 조회 결과를 Collection에 담을 수 있다.
 * List<DeptVO> deptList= new ArrayList<>();
 * DeptVO dVO=null;
 * while(re.next()){
 * dVO=new DeptVo();
 * 
 * deptLsit.add(dVO);
 * }
 * 사용한 자원을 반납할 때에는 사용한 역순으로 닫아주면됨
 * SELECT인경우 
 * ResultSet먼저 닫고
 * Statement혹은 PreparedStatement 두번째로 닫고
 * Connection을 맨 나중에 닫아 주면 됨
 * 닫지않으면 자동으로 언젠가는 닫아주지만 명시적으로 닫아주면 
 * 닫는 시간을 앞당길 수 있어 플젝에서는 명시적으로 닫는 코드 작성을 가이드로 정함
 * 
 * INSERT, UPDATE, DELETE는 두번째와 세번째만 닫으면 된
 * 왜냐면 리턴타입이 커서가 필요 없으니까...
 */

package dev_java.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
/*
 * 변수 이름 앞에 final이 붙으면 상수가 됨.
 * 상수는 다른 값으로 재정의 불가함.
 */
public class JDBCTest {
	//DRIVER 클래스를 읽어야 오라클 제품인것을 확인가능함.
	//DRIVER 클래스가 있어야 물리적으로 떨어져 있는 오라클 서버에 접속이 가능하다.
	public static final String _DRIVER 
						= "oracle.jdbc.driver.OracleDriver";
	//물리적으로 떨어져 있는 오라클 서버에 URL정보 추가
	//오라클 제품에서는 물리적으로 떨어져있는 서버에 접속하는 방식으로 thin방식과 oci방식을 지원
	//멀티티어 환경에서는 thin방식이다.서버의 DNS,포트번호-1521, SID이름-물리적인 저장소 참조
	public static final String _URL 
						= "jdbc:oracle:thin:@127.0.0.1:1521:orcl11";
	public static String _USER = "scott";
	public static String _PW = "tiger";
	//물리적으로 떨어져 있는 오라클 서버와 연결통로를 만들 때 사용
	Connection con = null;
	java.sql.PreparedStatement pstmt = null;
	//오라클에 살고 있는 커서를 조작하는 클래스를 제공함.
	//커서 위치에 로우가 존재하면 true,  조회된 결과가 없으면 false리턴
	//java.lang폴더를 제외하고는 모두 다 import해주어야 JVM이 그 클래스를 찾음.
	java.sql.ResultSet rs = null;
	public String currentTime() throws Exception{
		Class.forName(_DRIVER);//오라클 제조사 정보를 가지고 있어요.
		String sql = "select to_char(sysdate,'HH24:MI:SS') from dual";
		//아래 메소드가 호출되면 오라클 서버와 연결통로를 갖게됨.
		//이 연결통로를 통해서 select문을 전령 클래스가 가지고 들어가야 함.
		con = DriverManager.getConnection(_URL, _USER, _PW);
		pstmt = con.prepareStatement(sql);
		rs = pstmt.executeQuery();//오라클 서버에게 처리를 요청함.
		if(rs.next()) {
			return rs.getString(1);
		}
		return "15:09:49";
	}
	public static void main(String[] args) throws Exception{
		//java.lang패키지에 클래스는 모두 찾지만 그 외 패키지는 찾을 수 없다.
		//Scanner scan = new Scanner(System.in);
		JDBCTest jt = new JDBCTest();
		String ctime = jt.currentTime();
		System.out.printf("현재 시간은 %s 입니다.\n",ctime);
	}
}

 

출처 : DB 개요: DDL, DML, DCL, TCL이란? (velog.io)

 

DB 개요: DDL, DML, DCL, TCL이란?

SQL 도식화👉 SQL은 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다. 👉 관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리,

velog.io

트랜잭션의 Commit과 Rollback

👉 Commit

Commit은 모든 작업들을 정상 처리하겠다고 확정하는 명령어이다. 해당 처리 과정을 DB에 영구 저장하겠다는 의미로 Commit을 수행하면 하나의 트랜잭션 과정이 종료된다. Commit을 하기 전에는 다른 사용자가 트랜잭션 내용을 확인할 수 없다. 또한, 변경된 행은 잠금이 설정되어 있어서 다른 사용자가 변경할 수 없다.

👉 Rollback

Roll-back은 작업 중 문제가 발생되어 트랜잭션의 처리 과정에서 발생한 변경사항을 취소하는 명령어이다. 해당 명령을 트랜잭션에게 하달하면 트랜잭션은 Commit 되기 이전의 데이터오 돌아가 변경에 대하여 취소한다. 관련된 행에 대한 잠금이 풀리고 데이터 변경 사항이 복구되는 것이다.

커밋 업로드

롤백 되돌리기

커서는 디폴트의 가장 상단에 있다...

ResultSet이 있으면 커서를 조작할수있다.

 

SQL(Structured Query Language)

📎 SQL이란?

👉 SQL 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다.
👉 관계형 데이터베이스 관리 시스템에서 자료의 검색 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안되었다.

📎 DML이란?

데이터베이스의 내부 데이터를 관리하기 위한 언어이다. 데이터를 조회, 추가, 변경, 삭제 등의 작업을 수행하기 위해 사용된다.

 

📎 DML 특징

DDL과 달리 DML은 적는 즉시 반영(Auto Commit)이 되기 않는다. 다시 말해, DML에 의한 데이터 변동은 영구적인 변경이 아니기 때문에 ROLLBACK으로 다시 되돌릴 수 있다.

또한, DML은 Target 테이블 메모리 버퍼 위에 올려두고 변경을 수행하기 때문에, 실시간으로 테이블에 반영되지 않는다. Commit 명령어를 통해 Transaction을 종료해야 해당 변경 사항이 테이블에 반영된다.

📎 DML 종류

명령어내용

SELECT 데이터베이스에서 데이터를 검색하는 역할
INSERT 테이블에 데이터를 추가하는 역할
UPDATE 테이블 내에 존재하는 데이터를 수정하는 역할
DELETE 테이블에서 데이터를 삭제하는 역할

 

package dev_java.util;

import java.beans.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DBConnectionMgr {
  public static final String _DRIVER = "oracle.jdbc.driver.OracleDriver";

  public static final String _URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl11";
  public static String _USER = "scott";
  public static String _PW = "tiger";

  public Connection getConnection(){
    Connection con =null;
    try {
      Class.forName(_DRIVER);
      con=DriverManager.getConnection(_URL, _USER, _PW);
    } catch (ClassNotFoundException e) {
     System.out.println("드라이버 클래스를 찾을 수 없습니다.");
    }catch(Exception e){//가장 범위가 넓은 클래스를 가장 바깥에 적기. 에러중에 젤 큰애다.
      //멀티 블럭 작성시 더 넓은 클래스가 뒤에 와야함
      System.out.println("오라클 서버와 커넥션 실패!");
    }
    return con;
  }
  //사용한 자원을 반납하는 코드를 명시적으로 하는 것을 원칙으로 하고있음
  //반납하는 순서는 생성된 역순으로 진행할 것-자바 튜닝팀 지적사항
  
  //사용한 자원 반납하기 SELECT-커서 조작이 필요함
  public void freeConnection (Connection con, Statement stmt, ResultSet rs){
    if(rs!=null){
      try {
        rs.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(stmt!=null){
      try {
        stmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(con!=null){
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  }

  
  public void freeConnection (Connection con, PreparedStatement pstmt, ResultSet rs){
    if(rs!=null){
      try {
        rs.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(pstmt!=null){
      try {
        pstmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(con!=null){
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  }
  //사용한 자원 반납하기-INSET, UPDATE, DELETE

  public void freeConnection (Connection con, Statement stmt){
    
    if(stmt!=null){
      try {
        stmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(con!=null){
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  }

  public void freeConnection (Connection con, PreparedStatement pstmt){
    
    if(pstmt!=null){
      try {
        pstmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(con!=null){
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  }

  public static void main(String[] args) {
    DBConnectionMgr dbMgr=new DBConnectionMgr();
    Connection con =dbMgr.getConnection();
    System.out.println("con====>"+con);
  }
}
/*
 * JDBC API를 이용하여 DB연동하기
 * 1. 각 제조사가 제공하는 드라이버 클래스를 로딩한다.
 * 2. 물리적으로 떨어져있는 오라클 서버와 연결 통로를 확보해준다.
 * 3. DML문을 자바에서 오라클 서버로 전달 해 줄 인터페이스를 생성한다.(Statement:정적 쿼리문, PreparedStatement:동적 쿼리문 지원)
 * 4. SELECT의 경우 오라클 서버에서 제공하는 커서를 지원하는 ResultSet인터페이스를 활용하여
 * 테이블에 제공되는 커서를 조작하여 해당 로우에 데이터가 존재하면 Cursor...open....fetch과정을 통해서
 * 오라클 서버로부터 데이터를 꺼내서 Lsit<DeptVO>에 담을 수 있다.
 * 주의 : INSERT,UPDATE,DELETE에서는 커서가 필요없음
 * 리턴값은 int임
 * 이것들을 요청할때는 executeUpdate(INSERT문orUPDATE, DELETE문)
 * SELECT일때는
 * ResultSet rs=executeQuery("SEKECT * FROM dept");
 * 오라클에서 제공되는 커서를 조작하는 인터페이스를 리턴 타입으로 제공받아서
 * 조회 결과를 Collection에 담을 수 있다.
 * List<DeptVO> deptList= new ArrayList<>();
 * DeptVO dVO=null;
 * while(re.next()){
 * dVO=new DeptVo();
 * 
 * deptLsit.add(dVO);
 * }
 * 사용한 자원을 반납할 때에는 사용한 역순으로 닫아주면됨
 * SELECT인경우 
 * ResultSet먼저 닫고
 * Statement혹은 PreparedStatement 두번째로 닫고
 * Connection을 맨 나중에 닫아 주면 됨
 * 닫지않으면 자동으로 언젠가는 닫아주지만 명시적으로 닫아주면 
 * 닫는 시간을 앞당길 수 있어 플젝에서는 명시적으로 닫는 코드 작성을 가이드로 정함
 * 
 * INSERT, UPDATE, DELETE는 두번째와 세번째만 닫으면 된
 * 왜냐면 리턴타입이 커서가 필요 없으니까...
 */

커서 움직이는 원리

rs.next()

 

boolean 형태로 나온다

메모리에 올리는거 패치?

rs.getInt

rs.getString

 

서버의 데이터를 리스트에 넣어서 뽑아보기

package dev_java.oracle;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;//커서를 조작하는 인터페이스
import java.util.ArrayList;
import java.util.List;

import dev_java.util.DBConnectionMgr;

public class DeptList {
  Connection con =null;
  PreparedStatement pstmt=null;
  ResultSet rs =null;
  DBConnectionMgr dbMgr =new DBConnectionMgr();

  public List<DeptVO> getDeptList(){
    con = dbMgr.getConnection();
		String sql="SELECT deptno, dname, loc FROM dept";
    List<DeptVO> deptList= new ArrayList<>();
    try{
		  pstmt = con.prepareStatement(sql);
		  rs = pstmt.executeQuery();//오라클 서버에게 처리를 요청함.
      DeptVO dVO=null;
        while(rs.next()){//4번 반복한다. next의 리턴타입 불리언.
          //get으로 가져올때 columnLabel로한다.
          dVO=DeptVO.builder().deptno(rs.getInt("deptno")).dname(rs.getString("dname")).loc(rs.getString("loc")).build();
          deptList.add(dVO);
        }
    }catch(Exception e){

    }
    return deptList;
}
  public static void main(String[] args) {
    DeptList deptList =new DeptList();
    List<DeptVO> list=null;
    list=deptList.getDeptList();
    
    for(DeptVO rdVO:list){
      System.out.println(rdVO.getDeptno()+","+rdVO.getDname()+","+rdVO.getLoc());
    }

    for(int i=0;i<list.size();i++){
      System.out.print(list.get(i).deptno+",");
      System.out.print(list.get(i).dname+",");
      System.out.println(list.get(i).loc);
    }


  }
  
}

 

Map

Map 컬렉션은 키 (key) 와 (value) 으로 구성된 EntIy 객제를 저장하는 구조를 가지고 있다 여기서 키와 값은 모두 객체이다 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.

Map은 순서가 랜덤으로 나온다. 값을 뽑을때.

List와는 다르게 랜덤으로 지그재그로 키와 값을 담아준다. 차곡차곡 담는것이 아니다. 빈자리가 있으면 일단 담음. 그래서 빠르다고 함.

 

key는 unique값이다.

중복되면 안된다.

 

hashMap

Hashtable

콜백메소드 빼고는 인스턴스화 하고 그 안에 메소드를 직접 호출해야한다

package dev_java.oracle;

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

public class MapTest1 {
  Map <String, Object> rMap=new HashMap<>();//rMap.size()=0
  public void setMap(){
    rMap.put("deptno",10);
    rMap.put("dname","인사부");
    rMap.put("loc","뉴욕");
  }
  public static void main(String[] args) {
    MapTest1 mt1=new MapTest1();
    mt1.setMap();//이렇게 안해도 되는것은 콜백 메소드뿐이다.
    System.out.println(mt1.rMap.size());//0->3
    Set<String> set =mt1.rMap.keySet();
    Iterator<String> iter=set.iterator();
    while(iter.hasNext()){//이터레이터쓰니 hasnext사용할수있다. 자료구조 안에 값이 있는지 체크해서 있으면 트루 없으면 폴스 반환
      String key=iter.next();
      System.out.println(key);
    }
    
  }
  
}

 

Iterator사용해서 Map의 키와 값을 뽑기

hasNext 

자료구조안에 값이 있으면 true 반환 없으면 false

 

package dev_java.oracle;

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

public class MapTest1 {
  Map <String, Object> rMap=new HashMap<>();//rMap.size()=0
  public void setMap(){
    rMap.put("deptno",10);
    rMap.put("dname","인사부");
    rMap.put("loc","뉴욕");
    rMap.put("loc","부산");//새로 덮어쓰기 된다. 키는 바뀌지 않는거라서.
  }
  public static void main(String[] args) {
    MapTest1 mt1=new MapTest1();
    mt1.setMap();//이렇게 안해도 되는것은 콜백 메소드뿐이다.
    System.out.println(mt1.rMap.size());//0->3
    //Map에서 제공하는 메소드 중에서 key값을 묶음 처리하는 메소드가 있다.
    Set<String> set =mt1.rMap.keySet();//set은 모든 키를 set객체에 담아서 리턴
    //set인터페이스가 제공하는 메소드 중에서 toArray()를 지원한다.
    Object obj[]=set.toArray();//deptno,dname,loc
    for(int i=0;i<obj.length;i++){//length는 배열의 원소의 갯수
      String key=(String)obj[i];//배열에서 꺼낸 값은 key값이다.
      System.out.println("key :"+key);//3번 출력-Map은 순서대로가 아니다.
    }
    System.out.println("=========================");
    Iterator<String> iter=set.iterator();
    while(iter.hasNext()){//이터레이터쓰니 hasnext사용할수있다. 자료구조 안에 값이 있는지 체크해서 있으면 트루 없으면 폴스 반환
      String key=iter.next();
      // String value=(String)mt1.rMap.get(key);//강제형전환 키가 오브젝트타입이다. 오류남
      Object value=mt1.rMap.get(key);//get은 주어진 키의 값을 리턴
      System.out.println(key+":"+value);
    }
    
  }
  
}

Map에 이렇게 넣으면 덮어쓰기만 된다.

그래서 List안에 Map을 넣어준다.

출처 : 천재은재

값을 넣을때 put()

Map<String, Object> m1=new HashMap<>();
    m1.put("mem_id","tomato");

키를 알고있다면 get() 메소드로 간단하게

System.out.println(m1.get("mem_name"));

저장된 전체 객체를 대상으로 하나씩 얻고 싶을 경우

첫 번째는 keySet () 메소드로 모든 키를 Set으로 얻은 다음 반복지를 통해 키를 하나씩 얻고

get() 메소드를 통해 값을 얻으면 된다.

 

참조형은 디폴트값이 다 null이다

 

//Object클래스에는 toString()정의되어있다.
//모든 클래스는 toString()을 오버라이딩 할 수 있다.

원래는 주소값이 나온다.

그런데 toString을 오버라이딩 해서 바꿔줬다.

오버라이딩 안했을 경우 원래 toString으로 객체를 찍으면 주소값이 나온다.

오버라이딩 후 찍히는 것

package dev_java.oracle;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//회원정보를 담기
public class MapTest3 {

  public static void main(String[] args) {
    List<Map<String, Object>> list=new ArrayList<>();
    //회원아이디, 회원이름, 비번, 성별
    //키는 mem_id,mem_name,mem_pw,mem_gender
    //정보 3가지 tomato, 토마토, 123, 남자
    // banana, 바나나, 123, 여자
    // kiwi, 키위, 123, 남자
    //Map을 세개만들어라?
    System.out.println(list);//아무것도 없어. 넣기전 []만 출력된다.
    Map<String, Object> m1=new HashMap<>();
    m1.put("mem_id","tomato");
    m1.put("mem_name","토마토");
    m1.put("mem_pw","123");
    m1.put("mem_gender","남자");
    list.add(m1);
    System.out.println(m1);//@abcd1234아니고 자동으로 값이나온다. toString을 Object이 갖고있다.
    // System.out.println(m1.toString());//@abcd1234아니고 자동으로 값이나온다. toString을 Object이 갖고있다. 
    //자료구조중에 toString을 가지고 있는 애들이 있다.
    System.out.println(m1.get("mem_name"));

    Map<String, Object> m2=new HashMap<>();
    m2.put("mem_id","banana");
    m2.put("mem_name","바나나");
    m2.put("mem_pw","123");
    m2.put("mem_gender","여자");
    list.add(m2);
    Map<String, Object> m3=new HashMap<>();
    m3.put("mem_id","kiwi");
    m3.put("mem_name","키위");
    m3.put("mem_pw","123");
    m3.put("mem_gender","남자");
    list.add(m3);
    
    System.out.println(list);
    //list를 이용해서 토마토만 출력....
    Object a=list.get(0).get("mem_id");
    System.out.println(a);

    System.out.println("1 : "+list.get(0));//Map만 찍기
    System.out.println("2 : "+list.get(0).get("mem_name"));
    System.out.println("3 : "+list.get(0).get("mem_pw"));
  }
  
}

[{mem_gender=남자, mem_pw=123, mem_name=토마토, mem_id=tomato}, {mem_gender=여자, mem_pw=123, mem_name=바나나, mem_id=banana}, {mem_gender=남자, mem_pw=123, mem_name=키위, mem_id=kiwi}]

 

리스트는[ ] 안에 담긴다

맵은 { }

키는 = 로 연결

List에서 값 가져올때

get(0)

get(1)...

Map에서도 get사용

그래서 다트연산자 두번사용

Object a=list.get(0).get("mem_id");

 

17번을 주석 처리 하고 안하고 차이난다.

새로운 맵을 만들어서 리스트에 넣었다.

댓글