NullPointerException & List FrameWork

지환·2023년 10월 24일
0

JAVA

목록 보기
36/39
post-thumbnail
package com.step5;

class ForgetA
{
	int ival;
	String s = null;
	String s1 = new String();
	ForgetA()
	{
		s = new String("나신입");
	}
	ForgetA(int ival)
	{
		s = new String("나초보");
	}
	
	
}

public class Forgets {
	
	public static void main(String[] args) {
		System.out.println("main 호출");
		String s = null;
		System.out.println(s);
		//이렇게 하면 nullpointException
		System.out.println(s.length());
	
	}
	

}
-----------------------------------------------
main 호출
null
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "s" is null
	at com.step5.Forgets.main(Forgets.java:27)


NullPointetException 발생 -> 해결하려면? -> 인스턴스화 해서 사용

package com.step5;

class ForgetA
{
	int ival;
	String s = null;
	String s1 = new String();
	ForgetA()
	{
		s = new String("나신입");
	}
	ForgetA(int ival)
	{
		s = new String("나초보");
	}
	
	
}

public class Forgets {
	
	public static void main(String[] args) {
		System.out.println("main 호출");
		String s = null;
		ForgetA fa = new ForgetA();
		
		System.out.println(fa.s);
		//이렇게 하면 nullpointException
		System.out.println(s.length());
	
	}
	

}
-------------------------------
main 호출
나신입
NullPointerException

왜 안 되는것인가?

package com.step5;

class ForgetA
{
	int ival;
	String s = null;
	String s1 = new String();
	ForgetA()
	{
		s = new String("나신입");
	}
	ForgetA(int ival)
	{
		s = new String("나초보");
	}
	
	
}

public class Forgets {
	
	public static void main(String[] args) {
		System.out.println("main 호출");
		String s = null;
		ForgetA fa = new ForgetA();
		
		System.out.println(fa.s);
		//이렇게 하면 nullpointException
		System.out.println(fa.s.length());
	
	}
	

}
-----------------------------------------
main 호출
나신입
3

나신입을 -> 나지환으로 바꾸고 싶음

package com.step5;

class ForgetA
{
	int ival;
	String s = null;
	String s1 = new String();
	ForgetA()
	{
		s = new String("나신입");
	}
	ForgetA(int ival)
	{
		s = new String("나초보");
	}
	
	
}

public class Forgets {
	
	public static void main(String[] args) {
		System.out.println("main 호출");
		String s = null;
		ForgetA fa = new ForgetA();
		fa.s = "나지환";
		System.out.println(fa.s);
		//이렇게 하면 nullpointException
		System.out.println(fa.s.length());
	
	}
	

}
--------------------------------------
main 호출
나지환
3
  • ForgetA를 인스턴스화 하는 순간 s에 나신입이 들어간다. fa.s = "나지환"; 호출 전 까진 s엔 "나신입"이 들어간 상태 -> 하지만 재정의를 통해서 답이 다르다.

핵심은 NullPointerException

package com.step5;

class ForgetA
{
	int ival;
	String s = null;
	String s1 = new String();
	ForgetA()
	{
		s = new String("나신입");
	}
	ForgetA(int ival)
	{
		s = new String("나초보");
	}
	
	ForgetA(String name)
	{
		s = new String(name);
	}
	
}

public class Forgets {
	
	public static void main(String[] args) {
		System.out.println("main 호출");
		String s = null;
		s = "김초보";
		ForgetA fa = new ForgetA();
		fa.s = "나지환";
		System.out.println(fa.s);
		//이렇게 하면 nullpointException
		System.out.println(fa.s.length());
	
		ForgetA fa1 = new ForgetA(s);
		System.out.println(fa1.s);
	}
	

}
---------------------------------------------
main 호출
나지환
3
김초보

핵심은 NullPointerException

package com.step5;

class ForgetA
{
	int ival;
	String s = null;
	String s1 = new String();
	ForgetA()
	{
		s = new String("나신입");
	}
	ForgetA(int ival)
	{
		s = new String("나초보");
	}
	
	ForgetA(String name)
	{
		s = new String(name);
	}
	
}

public class Forgets {
	
	public static void main(String[] args) {
		System.out.println("main 호출");
		String s = null;
		s = "";
		ForgetA fa = new ForgetA();
		fa.s = "나지환";
		System.out.println(fa.s);
		//이렇게 하면 nullpointException
		System.out.println(fa.s.length());
	
		ForgetA fa1 = new ForgetA(s);
		System.out.println(fa1.s);
	}
	

}
-------------------------------------------
main 호출
나지환
3

핵심은 NullPointerException

package com.step5;

class ForgetA
{
	int ival;
	String s = null;
	String s1 = new String();
	ForgetA()
	{
		s = new String("나신입");
	}
	ForgetA(int ival)
	{
		s = new String("나초보");
	}
	
	ForgetA(String name)
	{
		s = new String(name);
	}
	
}

public class Forgets {
	
	public static void main(String[] args) {
		System.out.println("main 호출");
		String s = null;
		ForgetA fa = new ForgetA();
		fa.s = "나지환";
		System.out.println(fa.s);
		//이렇게 하면 nullpointException
		System.out.println(fa.s.length());
	
		ForgetA fa1 = new ForgetA(s);
		System.out.println(fa1.s);
	}
	

}
---------------------------------------------
main 호출
나지환
3
Exception in thread "main" java.lang.NullPointerException: Cannot read field "value" because "original" is null
	at java.base/java.lang.String.<init>(String.java:260)
	at com.step5.ForgetA.<init>(Forgets.java:19)
	at com.step5.Forgets.main(Forgets.java:35)

length에 대한 내용

package com.step5;

import java.util.ArrayList;
import java.util.List;

class ForgetC
{
	List<Integer> nums = new ArrayList<>();
	int ival;
	String s = null;
	String s1 = new String();
	ForgetC()
	{
	}
	ForgetC(int ival)
	{
		s = new String("나초보입니다.");
	}
	

	
}

public class ForgetsB {
	
	public static void main(String[] args) {
		System.out.println("main 호출");
		String s = null;
		ForgetC fc = new ForgetC();
		fc.s = "나지환";
		System.out.println(fc.s.length());
		fc = new ForgetC(3);
		System.out.println(fc.s.length());
		
		
		
	}
	

}
----------------------------------------
main 호출
3
7

Try-Catch문

package com.step5;

import java.util.ArrayList;
import java.util.List;

class ForgetC
{
	List<Integer> nums = new ArrayList<>();
	int ival;
	String s = null;
	String s1 = new String();
	ForgetC()
	{
	}
	ForgetC(int ival)
	{
		s = new String("나초보입니다.");
	}
	

	
}

public class ForgetsB {
	
	public static void main(String[] args) {
		System.out.println("main 호출");
		ForgetC fc = new ForgetC();
		System.out.println(fc.s.length());
		fc = new ForgetC(3);
		System.out.println(fc.s.length());
		
		
		
	}
	

}
-------------------------------------
main 호출
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "fc.s" is null
	at com.step5.ForgetsB.main(ForgetsB.java:29)

이런 에러가 발생한다. 이런 에러가 발생하지 않도록 하려면 -> Try-Catch문을 사용하여 작성해야한다.

Try-Catch문에 대해서 부족함

package com.step5;

import java.util.ArrayList;
import java.util.List;

class ForgetC
{
	List<Integer> nums = new ArrayList<>();
	int ival;
	String s = null;
	String s1 = new String();
	ForgetC()
	{
	}
	ForgetC(int ival)
	{
		s = new String("나초보입니다.");
	}
	

	
}

public class ForgetsB {
	
	public static void main(String[] args) {
		System.out.println("main 호출");
		ForgetC fc = new ForgetC();
		try
		{
			System.out.println(fc.s.length());
		}
		catch(Exception e)
		{
			System.out.println("NullPointerException : 디폴트 생성자에서는 s에 대한 인스턴스화가 안됐음");
		}
		;
		fc = new ForgetC(3);
		System.out.println(fc.s.length());
		
		
		
	}
	

}
-------------------------------------------
main 호출
NullPointerException : 디폴트 생성자에서는 s에 대한 인스턴스화가 안됐음
7

ArrayList - NullPointerException

package com.step5;

import java.util.ArrayList;
import java.util.List;



class List1
{
	List<Integer> nums = null;
	List1()
	{
		List<Integer> nums = new ArrayList<>();
		
	}
	}

public class ListMain1 {
	
	
	
	
	
	public static void main(String[] args) {
		List1 list1 = new List1();
		System.out.println(list1.nums.size());
		/**
		 * list1은 Null이 아니다. ->List1 list1 = new List1() 이 부분
		 * list1.연산자 다음의 nums변수는 전변이다.[지변 x]
		 * 인스턴스화 하면 nums 지역변수 사용 x
		 */
	
	
	}

}
--------------------------------------------------
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.size()" because "list1.nums" is null
	at com.step5.ListMain1.main(ListMain1.java:26)
/*
		 * Why? -> List1 생성자에서 num-> List<Integer> nums = new ArrayList<>(); -> 다시 선언했음 복사본이 생김 그렇게 되면 전변은 null
		 * 그래서 nullpointerexception
		 */

NullPointerException 여기서 없애고 싶음

package com.step5;

import java.util.ArrayList;
import java.util.List;



class List1
{
	List<Integer> nums = null;
	List1()
	{
		nums = new ArrayList<>();
		
	}
	}

public class ListMain1 {
	
	
	
	
	
	public static void main(String[] args) {
		List1 list1 = new List1();
		System.out.println(list1.nums.size());
		/**
		 * list1은 Null이 아니다. ->List1 list1 = new List1() 이 부분
		 * list1.연산자 다음의 nums변수는 전변이다.[지변 x]
		 * 인스턴스화 하면 nums 지역변수 사용 x
		 */
	
	
	}

}
------------------------------------
0

이렇게도 가능함

package com.step5;

import java.util.ArrayList;
import java.util.List;



class List1
{
	List<Integer> nums = null;
	List1()
	{
		List<Integer>nums = new ArrayList<>();
		this.nums = nums;
	}
	
	
	}

public class ListMain1 {
	
	
	
	
	
	public static void main(String[] args) {
		List1 list1 = new List1();
		System.out.println(list1.nums.size());
		/**
		 * list1은 Null이 아니다. ->List1 list1 = new List1() 이 부분
		 * list1.연산자 다음의 nums변수는 전변이다.[지변 x]
		 * 인스턴스화 하면 nums 지역변수 사용 x
		 */
	
	
	}

}
-----------------------------------
0
package com.step5;

import java.util.ArrayList;
import java.util.List;



class List1
{
	List<Integer> nums = null;
	List1()
	{
		List<Integer>nums = new ArrayList<>();
	}
	
	
	}

public class ListMain1 {
	
	
	
	
	
	public static void main(String[] args) {
		List1 list1 = new List1();
		/**
		 * list1은 Null이 아니다. ->List1 list1 = new List1() 이 부분
		 * list1.연산자 다음의 nums변수는 전변이다.[지변 x]
		 * 인스턴스화 하면 nums 지역변수 사용 x
		 */
		list1.nums = new ArrayList<>(); // 이렇게도 표현가능
		System.out.println(list1.nums.size());
		
	
	
	}

}
-----------------------------------
0
  • 이렇게 쓰는 건 전역변수 일 때 사용가능하다.
  • 지역변수일 땐 어떻게 하지? -> return 타입으로 해결할 수 있다.

List FrameWork

package com.mapexam;


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
//수정은 기존에 있는 정보를  바꾼다.
//입력은 새로운 정보를 추가한다.
class List4{
	List<Integer> rank = new ArrayList<>();//rank.size()=0
	
	void init() {//전역변수의 선언된 깡통에 3가지 정보를 추가하기
		rank.add(1);
		rank.add(2);
		rank.add(3);
	}
	
	//List에 등록된 순위를 수정하는 메소드 구현
	//사용자로 부터 두 개의 정보를 입력 받아온다.(UI, UX, View계층에서)
	boolean rankUpdate(int index, int value) {
		boolean isOk = false;
		Integer it = rank.set(index, value); // it에 이전에 바꾸기 전 값을 넣음[1,2,3] => 1|3 => x엔(2들어감)
		//41번을 경유하는지 아니면 스킵하게 되는 건지 짐작가능함
		int x = it;//오토박싱이 제공되고 있어서 원시형 타입과 래퍼클래스 타입사이에 형전환은 자동으로 해줌
		System.out.println(x+", " +value); // x => 2 / value => 3
		//"1".equals("1")
		System.out.println(it == value);
		if(it !=null) {
		//if(it == value) {//사용자로 부터 받아온 값과 set메소드의 리턴값으로 받아온 값을 비교하기
			System.out.println("받아온 값과 수정된 값이 같니?");
			isOk = true;			
		}
		return isOk;
	}
}

public class ListMain4 {

	public static void main(String[] args) {
		System.out.println("수정하고자 하는 위치값과 숫자를 입력하시오. 예)위치값|변경할값");
		Scanner sc = new Scanner(System.in);//화면을 그리진 않지만 화면이 갖는 효과는 누릴 수 있다.
		//2|5 -> index=2, value = 5  3|7 -> index=3, value =7
		String user = sc.nextLine();
		StringTokenizer st = new StringTokenizer(user, "|");
		String imsi = st.nextToken();
		int index = Integer.parseInt(imsi);//String -> int 바꿔줘(기능:처리:메소드 힘)
		String value = st.nextToken();
		int ivalue = Integer.parseInt(value);//String -> int 바꿔줘(기능:처리:메소드 힘)
		List4 l4 = new List4();
		l4.init();
		boolean isOk = l4.rankUpdate(index, ivalue);
		if(isOk) {
			System.out.println("수정 처리되었습니다.");
			System.out.println(l4.rank);//[1,2,3] ->  1|3 -> [1,3,3]
		}
		else System.out.println("수정 실패하였습니다.");
	}

}

-------------------------------------------------------
수정하고자 하는 위치값과 숫자를 입력하시오.)위치값|변경할값
1|3
2, 3
false
받아온 값과 수정된 값이 같니?
수정 처리되었습니다.
[1, 3, 3]
package com.mapexam;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;

class List5{
	//원시형타입에서 참조형(XXXVO, Map)으로 제네릭을 바꾸었다.
	List<String> rank = new ArrayList<>();//rank.size()=0
	void init() {//전역변수의 선언된 깡통에 3가지 정보를 추가하기
		rank.add(0,"나신입");
		rank.add(1,"나초보");
		rank.add(2,"나일등");
	}
	boolean rankUpdate(int index, String newValue) {
		boolean isOk = false;
		boolean isEqual = false;
		//oldValue: 기존에 들어있던 값을 담는 변수 선언
		//newValue: 새로 들어갈 값을 담을 변수(사용자가 입력한 이름으로 담음)
		for(int i=0;i<rank.size();i++) {
			//사용자가 입력한 인덱스의 위치값과  rank리스트의 인덱스 값이 같으면 그 자리가 변경할 위치이다.
			if(i==index) {
				String oldValue = rank.get(index);//그 때 그 위치값이 우리가 비교할 기존에 이름값이다.
				System.out.println(oldValue);
				if(oldValue.equals(newValue)) {
					isEqual = true;
				}
			}////////// end of if
		}/////////////end of for
		//문제 - 기존에 값과 같은 값이면 수정처리 하지 않도록 코드를 수정하시오.
		if(isEqual) {
			System.out.println("기존 이름과 같은 이름을 입력하셨습니다. 다시 확인하세요.");
			return false;
		}else {		
			System.out.println("기존 이름과 다른 이름을 입력하셨습니다. 수정을 진행합니다.");
			String oldValue = rank.set(index, newValue);
			isOk = true;							
		}
		return isOk;
	}
}
public class ListMain5 {

	public static void main(String[] args) {
		System.out.println("수정하고자 하는 위치값과 이름을 입력하시오. 예)위치값|변경할값");
		Scanner sc = new Scanner(System.in);//화면을 그리진 않지만 화면이 갖는 효과는 누릴 수 있다.
		//2|5 -> index=2, value = 5  3|7 -> index=3, value =7
		String user = sc.nextLine();
		StringTokenizer st = new StringTokenizer(user, "|");
		String imsi = st.nextToken();
		int index = Integer.parseInt(imsi);//String -> int 바꿔줘(기능:처리:메소드 힘)
		String value = st.nextToken();
		List5 l4 = new List5();
		l4.init();
		boolean isOk = l4.rankUpdate(index, value);
		if(isOk) {
			System.out.println("수정 처리되었습니다.");
			System.out.println(l4.rank);//[1,2,3] ->  1|3 -> [1,3,3]
		}
		else System.out.println("수정 실패하였습니다.");
	}

}
----------------------------------------
수정하고자 하는 위치값과 이름을 입력하시오.)위치값|변경할값
1|나초보
나초보
기존 이름과 같은 이름을 입력하셨습니다. 다시 확인하세요.
수정 실패하였습니다.

--------------------------------------------------
수정하고자 하는 위치값과 이름을 입력하시오.)위치값|변경할값
1|황궁아파트
나초보
기존 이름과 다른 이름을 입력하셨습니다. 수정을 진행합니다.
수정 처리되었습니다.
[나신입, 황궁아파트, 나일등]

해당 부분 check) 10.25

package com.mapexam;

/*
 * 제네릭을 VO나 Map으로 선택하는 건 JSON형식에 사전 준비 작업이다.
 * 공공포털이나 회사들이 자신들의 서버를 공개하지 않는대신 요청에 대한 검색 결과를 JSON으로 제공한다.
 * List<VO> -> JSON,  JSON -> List<VO> , List<Map>바꾸어 쓸 수 있다.
입력 - add(element):boolean -> 응답처리시 선택, add(int, element):void -> 응답처리시 부적합
리턴타입이 boolean이라서 처리 결과에 대한 응답을 받아 볼 수 있다(보이지 않는걸 확인해줌)
메소드 선택시 기준이 될 수 있다. - 리턴타입이 있고 없고가 기준에 영향이 있다.
:사용자 정의 메소드를 설계할 때 리턴타입을 반드시 고려 하시오. - 안전한 코드를 작성하기위해
제네릭을 반드시 정한다. - 직관적이다. - 담는 사람도 꺼내는 사람도 기억할 수 없다.
그런데 서비스는 기억(알림설정, 메시지 푸쉬- 서비스)해준다.
수정 - set(int, element):Element(=Object) : 내가 추가한 것을 그대로 반환해준다.
상세보기
전체보기
삭제
 */

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;

class List6{
	//원시형타입에서 참조형(XXXVO, Map)으로 제네릭을 바꾸었다.
	List<String> rank = new ArrayList<>();//rank.size()=0
	void init() {//전역변수의 선언된 깡통에 3가지 정보를 추가하기
		rank.add(0,"나신입");
		rank.add(1,"나초보");
		rank.add(2,"나일등");
	}
	boolean rankDelete(String delValue) {
		boolean isOk = false;
		//insert here
		isOk = rank.remove(delValue);
		return isOk;
	}
}
public class ListMain6 {

	public static void main(String[] args) {
		System.out.println("삭제하고자 하는 이름을 입력하시오.");
		Scanner sc = new Scanner(System.in);//화면을 그리진 않지만 화면이 갖는 효과는 누릴 수 있다.
		String value = sc.nextLine();
		List6 l4 = new List6();
		l4.init();
		boolean isOk = l4.rankDelete(value);
		if(isOk) {
			System.out.println("삭제 처리되었습니다.");
			System.out.println(l4.rank);//[1,2,3] ->  1|3 -> [1,3,3]
		}
		else System.out.println("삭제 실패하였습니다.");
	}

}
----------------------------------
삭제하고자 하는 이름을 입력하시오.
나초보
삭제 처리되었습니다.
[나신입, 나일등]
  • isOk = rank.remove(delValue); 한 순간 return 할 때 true로 바뀜
  • 불린타입으로 -> 체크 가능 -> 이 아이디어로 많은 구현이 가능 -> 로그인 체크

해당 부분 check) 10.25


package com.baseballgameClassDiv;

import java.util.ArrayList;
import java.util.List;

public class asdasd {

	public static void main(String[] args) {
		
		List<String> list = new ArrayList<>();
		
		boolean isOk = list.add("지환");
		
		System.out.println(isOk);
		System.out.println(list);
		
		boolean isOk1 = list.remove("지환");
		System.out.println(list);
	}

}
------------------------------------------
true
[지환]
[]
package com.mapexam;
/*
 * 제네릭을 VO나 Map으로 선택하는 건 JSON형식에 사전 준비 작업이다.
 * 공공포털이나 회사들이 자신들의 서버를 공개하지 않는대신 요청에 대한 검색 결과를 JSON으로 제공한다.
 * List<VO> -> JSON,  JSON -> List<VO> , List<Map>바꾸어 쓸 수 있다.
입력 - add(element):boolean -> 응답처리시 선택, add(int, element):void -> 응답처리시 부적합
리턴타입이 boolean이라서 처리 결과에 대한 응답을 받아 볼 수 있다(보이지 않는걸 확인해줌)
메소드 선택시 기준이 될 수 있다. - 리턴타입이 있고 없고가 기준에 영향이 있다.
:사용자 정의 메소드를 설계할 때 리턴타입을 반드시 고려 하시오. - 안전한 코드를 작성하기위해
제네릭을 반드시 정한다. - 직관적이다. - 담는 사람도 꺼내는 사람도 기억할 수 없다.
그런데 서비스는 기억(알림설정, 메시지 푸쉬- 서비스)해준다.
수정 - set(int, element):Element(=Object) : 내가 추가한 것을 그대로 반환해준다.
상세보기
전체보기
삭제
 */

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;

class List7{
	//원시형타입에서 참조형(XXXVO, Map)으로 제네릭을 바꾸었다.
	List<String> rank = new ArrayList<>();//rank.size()=0
	void init() {//전역변수의 선언된 깡통에 3가지 정보를 추가하기
		rank.add(0,"나신입");
		rank.add(1,"나초보");
		rank.add(2,"나일등");
		//rank.add(3,"입력한 이름");
	}
	//아래 코드가 실행되면 
	boolean rankInsert(String newName) {
		boolean isOk = false;
		//insert here
		isOk = rank.add(newName);
		return isOk;
	}
}
public class ListMain7 {

	public static void main(String[] args) {
		System.out.println("추가하고자 하는 이름을 입력하시오.");
		Scanner sc = new Scanner(System.in);//화면을 그리진 않지만 화면이 갖는 효과는 누릴 수 있다.
		String value = sc.nextLine();
		List7 l4 = new List7();
		l4.init();
		boolean isOk = l4.rankInsert(value);
		if(isOk) {
			System.out.println("추가 처리되었습니다.");
			System.out.println(l4.rank);//[1,2,3] ->  1|3 -> [1,3,3]
		}
		else System.out.println("추가 실패하였습니다.");
	}

}
-----------------------------------------
추가하고자 하는 이름을 입력하시오.
오지환
추가 처리되었습니다.
[나신입, 나초보, 나일등, 오지환]

해당 부분 check) 10.25

package com.mapexam;

/*
 * 제네릭을 VO나 Map으로 선택하는 건 JSON형식에 사전 준비 작업이다.
 * 공공포털이나 회사들이 자신들의 서버를 공개하지 않는대신 요청에 대한 검색 결과를 JSON으로 제공한다.
 * List<VO> -> JSON,  JSON -> List<VO> , List<Map>바꾸어 쓸 수 있다.
입력 - add(element):boolean -> 응답처리시 선택, add(int, element):void -> 응답처리시 부적합
리턴타입이 boolean이라서 처리 결과에 대한 응답을 받아 볼 수 있다(보이지 않는걸 확인해줌)
메소드 선택시 기준이 될 수 있다. - 리턴타입이 있고 없고가 기준에 영향이 있다.
:사용자 정의 메소드를 설계할 때 리턴타입을 반드시 고려 하시오. - 안전한 코드를 작성하기위해
제네릭을 반드시 정한다. - 직관적이다. - 담는 사람도 꺼내는 사람도 기억할 수 없다.
그런데 서비스는 기억(알림설정, 메시지 푸쉬- 서비스)해준다.
수정 - set(int, element):Element(=Object) : 내가 추가한 것을 그대로 반환해준다.
상세보기
전체보기
삭제
 */

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;

class List9{
	//원시형타입에서 참조형(XXXVO, Map)으로 제네릭을 바꾸었다.
	List<String> rank = new ArrayList<>();//rank.size()=0
	void init() {//전역변수의 선언된 깡통에 3가지 정보를 추가하기
		rank.add(0,"나신입");
		rank.add(1,"나초보");
		rank.add(2,"나일등");
		//rank.add(3,"입력한 이름");
	}
	//아래 코드가 실행되면 
	//전역변수이면 어차피 동기화가 된다. - 하나이다 - static
	//단 최초에는 빈통이니까 3명의 명단을 출력하려면 init()경유시킬것.- 전처리 - 출력전에 먼저 init()호출 할것.
	void rankSelect() {//형 왜 리턴타입을 void로 바꾸는 건가요? - 전역변수이잖아
		System.out.println(rank);
	}
	//자료구조에 들어있는 값을 순회하는데 get(int)메소드의 리턴타입이 Element인 것을
	//사용자 정의메소드를 구현하여서 굳이 리턴타입을 boolean으로 바꾸어본다.(if문 복습하기)
	//한건 조회하기 ->  조건식이 필요하니까 파라미터가 필요하고 전체 조회일땐  있는 거 모두 출력이니까 파라미터가 필요없잖아
	boolean rankDetail(int index) {
		boolean isOk = false;
		String name = null;
		//insert here
		name = rank.get(index);
		System.out.println("찾는 이름은  "+name+" 입니다.");
		if(name!=null) {
			isOk = true;
		}
		return isOk;
	}
}
public class ListMain9 {
	public static void main(String[] args) {
		System.out.println("전체조회 	1번을 입력하고 상세조회이면 2번을 입력하시오.");
		Scanner sc = new Scanner(System.in);//화면을 그리진 않지만 화면이 갖는 효과는 누릴 수 있다.
		List9 l4 = new List9();
		l4.init();
		//for(int i=0;i<5;i++) {
		while(true) {
			String menu = "-1";//-1 : End of file
			menu = sc.nextLine();
			if("1".equals(menu)) {
				System.out.println("1번 전체조회를 선택하셨습니다.");
				l4.rankSelect();
				//return;//메인메소드를 빠져나간다.
				continue;
			}
			else if("2".equals(menu)) {
				System.out.println("2번 상세조회를 선택하셨습니다.");
				System.out.println("상세조회를 원하는 번호를 입력하세요.");
				String user = sc.nextLine();
				System.out.println("상세보기를 원하는 번호는 "+user + " 입니다.");
				int index = Integer.parseInt(user);
				if(index>=0) {
					l4.rankDetail(index);
				}
				//return;
				continue;
			}
			else if("q".equals(menu)) {
				//return;
				System.out.println("프로그램을 종료합니다.\n");
				System.exit(0);
			}
		}
	}//////////// end of main
}/////////////// end of ListMain8

-------------------------------------
전체조회 	1번을 입력하고 상세조회이면 2번을 입력하시오.
1
1번 전체조회를 선택하셨습니다.
[나신입, 나초보, 나일등]
----------------------------------------
전체조회 	1번을 입력하고 상세조회이면 2번을 입력하시오.
2
2번 상세조회를 선택하셨습니다.
상세조회를 원하는 번호를 입력하세요.
1
상세보기를 원하는 번호는 1 입니다.
찾는 이름은  나초보 입니다.

해당 부분 복습

Map

package com.mapexam;

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

class Map1{
	Map<String, Object>map = new HashMap<>();
	Map1()
	{
		map.put("1", 1);
		System.out.println(map.containsKey("1"));
		System.out.println(map.size());
		}
	Map1(int i)
	{
		map = new HashMap<>(); // 새로운 객체를 생성함-복제본이다.
		//map.size()=0 map에 대한 추가는 일어나지 않았다.
		System.out.println(map.size());
	}
}
public class MapMain1 {

	public static void main(String[] args) {
		Map1 map1 = new Map1();
		Map1 map2 = new Map1(2);
		

	}

}
----------------------------------------------
true
1
0

Map CollectionFrameWork

map 안에 저장되어있는 "1"를 꺼내라.

package com.mapexam;

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

class Map2{
	Map<String, CustomerVO>map = new HashMap<>();
	Map2()
	{
		CustomerVO cvo = new CustomerVO(13,"오지환","김철스");
		map.put("1", cvo);
		System.out.println(map.size());
		}
	Map2(int i)
	{
		map = new HashMap<>(); // 새로운 객체를 생성함-복제본이다.
		//map.size()=0 map에 대한 추가는 일어나지 않았다.
		System.out.println(map.size());
	}
}
public class MapMain2 {

	public static void main(String[] args) {
		Map2 m = new Map2();
		/*
		 * map 안에 저장되어있는 "1"를 꺼내라.
		 */
		

	}

}

여기서 - m.map.get("1")이렇게 입력하게 된다면, 주소번지가 찍힌다. -> 그 map.get에 대한 id를 주세요

package com.mapexam;

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

class Map2{
	Map<String, CustomerVO>map = new HashMap<>();
	Map2()
	{
		CustomerVO cvo = new CustomerVO(1,"오지환","1997-09-20");
		map.put("1", cvo);
		cvo = new CustomerVO(2,"김철수","1998-09-20");
		map.put("2", cvo);
		System.out.println(map.size());
		System.out.println("======================================");
		}
	Map2(int i)
	{
		map = new HashMap<>(); // 새로운 객체를 생성함-복제본이다.
		//map.size()=0 map에 대한 추가는 일어나지 않았다.
		System.out.println(map.size());
	}
}
public class MapMain2 {

	public static void main(String[] args) {
		Map2 m = new Map2();
		/*
		 * map 안에 저장되어있는 "1"를 꺼내라.
		 */
		CustomerVO cvo = m.map.get("1");
		System.out.println(cvo.getC_name());
		System.out.println(cvo.getC_id());
		System.out.println("===========================");
		System.out.println(m.map.get("1"));
		System.out.println(m.map.get("1").getC_id());
		System.out.println(m.map.get("1").getC_name());
		System.out.println(m.map.get("1").getC_birthday());
		System.out.println("===========================");
		cvo = m.map.get("2");
		System.out.println(m.map.get("2")); // 2번 키에 대한 방주소
		System.out.println(m.map.get("2").getC_name());
		System.out.println(m.map.get("2").getC_id());
		System.out.println(m.map.get("2").getC_birthday());
		

	}

}
----------------------------------------------
2
======================================
오지환
1
===========================
com.mapexam.CustomerVO@2f92e0f4
1
오지환
1997-09-20
===========================
com.mapexam.CustomerVO@28a418fc
김철수
2
1998-09-20

Map 심화 복습

문제

package com.mapexam;

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

public class MapMain3 {

	Map<String,List<Map<String,CustomerVO>>> map = new HashMap<>();
	public static void main(String[] args) {

		//초기화를 진행해라
		
		// 수정해라
		
		// 삭제해라
		
		// 접근해라
		
		// 출력해라 
	}

}
package com.mapexam;

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

class Map3
{
	Map<String,List<Map<String,CustomerVO>>> outermap = new HashMap<>();
	
	Map3()
	{
		List<Map<String,CustomerVO>> list = new ArrayList<>();
		Map<String,CustomerVO> innermap = new HashMap<>();
		CustomerVO cvo = new CustomerVO(13, "나초보", "1997-090-08");
		innermap.put("1", cvo);
		list.add(innermap);
		outermap.put("outer", list);
		
	}


}
/**
 * 
 * {  }  찍히면 맵
 * [  ]  리스트
 * 주소번지 : VO
 */

public class MapMain3 {

	public static void main(String[] args) {

		Map3 m3 = new Map3();
		System.out.println(m3.outermap.get("outer"));
		System.out.println(m3.outermap.get("outer") instanceof List);
		System.out.println(m3.outermap.get("outer").get(0).get("1").getC_id());
		System.out.println(m3.outermap.get("outer").get(0).get("1").getC_name());
		System.out.println(m3.outermap.get("outer").get(0).get("1").getC_birthday());
		

	}

}
----------------------------------------------------
[{1=com.mapexam.CustomerVO@2f92e0f4}]
true
13
나초보
1997-090-08
profile
아는만큼보인다.

0개의 댓글