본문 바로가기

JAVA

[WEB]DAY19_Wrapper 클래스, 빠른 for문, 제네릭(Generic), 컬렉션 프레임워크(Collection Framework)

Wrapper클래스

 : 기본형 타입을 클래스 타입으로 사용하는 방법

 

- 박싱(Boxing)

기본형 타입 > Wrapper 클래스

 

- 언박싱(Unboxing)
Wrapper 클래스 > 기본형 타입

 

     jdk1.5버전부터는 오토(auto)가 지원된다.


- Wrapper 클래스를 사용하는 이유
  ① 변수를 객체로 만들기 위해
  ② 필요한 메소드를 사용하기 위해


package day19;

public class WrapperTest {
	public static void main(String[] args) {
		int data = 10;

		//Auto Boxing
		Integer i_data = data;
		//Auto Unboxing
		data = i_data;
		
//		int data = 10;
//		
//		//Boxing
//		Integer i_data = new Integer(data);
//		
//		//Unboxing
//		data = i_data.intValue();
		
	}
}

빠른 for문(향상된 for문, forEach문)

- 변수에 각 값이 순서대로 담긴다.
- 반복 횟수를 몰라도 사용할 수 있다.

 

for(자료형 변수 : 배열명){

 

}


package day19;

public class ForEachTest {
	public static void main(String[] args) {
		
		Object[][] arrObj = {{"ABC", 10},{3.156, 3.587F},{'a', "컴퓨터"}};
		
		//출력 예(빠른 for문만 사용)
		//"ABC" 10
		//3.156 3.587F
		//'a' "컴퓨터"
		for(Object[] arObj : arrObj) {
			for(Object obj : arObj) {
				
				if(obj instanceof Float) {
					System.out.println(obj + "F");
					continue;
				}
				System.out.println(obj);
			}
		}
		
		//up casting
		//auto boxing
//		Object[] arObj = {"ABC", 'a', 10, 10.987};
//		
//		for(Object obj : arObj) {
//			System.out.println(obj);
//		}
	}
}




 

제네릭(Generic)

: 자료형을 정하지 않는 기법

 <대문자>이 있으면 제네릭!

 

1. Genric Class
   클래스 내부에서 사용될 자료형을 선언한다.

 

2. Generic Method
   메소드 내부에서 사용될 자료형을 선언한다.

 

3. Generic Interface
   인터페이스를 지정받은 클래스에서 사용될 자료형을 선언한다.

 


package generic;

import java.util.ArrayList;

class GnrClass<T>{
	private T data;

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}
}

class GnrMethod{
	public static <T> T function(T data) {
		T result = null;
		if(data instanceof Integer) {
			result = (T)"정수";
		}else if(data instanceof Double || data instanceof Float) {
			result = (T)"실수";
		}else if(data instanceof Character) {
			result = (T)"문자";
		}else if(data instanceof String) {
			result = (T)"문자열";
		}
		return result;
	}
}

public class GnrTest implements GInter<Double, Integer>{
	public static void main(String[] args) {
//		System.out.println(GnrMethod.function(3.14F));
//		GnrClass<Integer> g = new GnrClass();
//		g.setData(540);
//		System.out.println(g.getData());
	}

	@Override
	public Double add(Double data1, Double data2) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Double sub(Double data1, Integer data2) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Integer mul(Integer data1, Integer data2) {
		// TODO Auto-generated method stub
		return null;
	}
}

package generic;

public interface GInter <N1, N2>{
	N1 add(N1 data1, N1 data2);
	N1 sub(N1 data1, N2 data2);
	N2 mul(N2 data1, N2 data2);
}

 

 


컬렉션 프레임워크(Collection Framework)

 : 많은 데이터를 쉽고 효과적으로 관리할 수 있는
   표준화된 방법을 제공하는 클래스의 집합

 

1. List extends Collection

구현된 클래스
- Vector
- ArrayList

     컬렉션 클래스 중 가장 많이 사용되는 클래스
     배열이 인덱스를 이용해서 값을 저장한다.
     인덱스를 이용해서 배열 요소에 빠르게 접근 가능하지만
     크기를 늘리기 위해서는 새로운 배열을 생성하고
     기존의 값들을 옮겨야 하므로 상대적으로 느리다.

 

     * Collections : 다양한 자료구조 메소드가 선언된 클래스


- LinkedList

 

2. Set extends Collection

3. Map

 

List, Collection, Set은 인터페이스다.

 


 

?) Integer인 타입으로 받을 때, remove애서 new한 객체를 삭제하는데.

값이 2개 이상인 객체의 경우 객체를 선언할 때 equals와 hashCode를 재정의 하는데

Integer은 재정의된 상태인지?

package collection;

import java.util.ArrayList;
import java.util.Collections;

public class ArListTest {
	public static void main(String[] args) {
		ArrayList<Integer> dataList = new ArrayList<>();
		dataList.add(10);
		dataList.add(80);
		dataList.add(90);
		dataList.add(30);
		dataList.add(20);
		dataList.add(50);
		dataList.add(40);
		
		System.out.println(dataList.size());
//		for (int i = 0; i < dataList.size(); i++) {
//			System.out.println(dataList.get(i));
//		}
//		for(int data : dataList) {
//			System.out.println(data);
//		}
		//90을 900으로 수정
		int index = dataList.indexOf(90);
		if(index != -1) {
			System.out.println(dataList.set(index, 900));
			System.out.println(dataList);
		}else {
			System.out.println("찾는 값이 없습니다.");
		}
		//30 삭제
		index = dataList.indexOf(30);
		if(dataList.remove(new Integer(30))) {
			System.out.println("삭제 성공");
			System.out.println(dataList);
		}
//		if(index != -1) {
//			System.out.println(dataList.remove);
//		}
		
		Collections.shuffle(dataList);
		
		System.out.println("===섞은 후===");
		System.out.println(dataList);
		
		System.out.println("===정렬===");
		Collections.sort(dataList);
		System.out.println(dataList);
		
		System.out.println("===좌우 반전===");
		Collections.reverse(dataList);
		System.out.println(dataList);
		
		//50 뒤에 있는 정수 출력
		index = dataList.indexOf(50);
		if(index != -1) {
			if(index+1 != dataList.size()) {
				System.out.println(dataList.get(index + 1));
			}
		}
	}
}






 


로그인 로그아웃

 

package collection;

import java.util.ArrayList;

public class User {
	ArrayList<ArrayList<String>> users = new ArrayList<>();
	private final int KEY = 3;
	
	private static ArrayList<String> session;
	
	public static ArrayList<String> getSession() {
		return session;
	}
	public static void setSession(ArrayList<String> session) {
		User.session = session;
	}
	//회원가입(아이디, 패스워드, 이름)
	public void join(ArrayList<String> user) {
		user.set(1, encrypt(user.get(1)));
		users.add(user);
	}
	//로그인(아이디, 패스워드)
	public boolean login(String id, String pw) {
		for (ArrayList<String> user : users) {
			if(user.get(0).equals(id)) {
				if(decrypt(user.get(1)).equals(pw)) {
					session = user;
					return true;
				}
			}
		}
		return false;
	}
	
	//로그아웃
	public void logout() {
		session = null;
	}
	
	//암호화
	public String encrypt(String pw) {
		String en_pw = "";
		for (int i = 0; i < pw.length(); i++) {
			en_pw += (char)(pw.charAt(i) * 3);
		}
		return en_pw;
	}
	//복호화
	public String decrypt(String pw) {
		String de_pw = "";
		for (int i = 0; i < pw.length(); i++) {
			de_pw += (char)(pw.charAt(i) / 3);
		}
		return de_pw;
	}
}








package collection;

import java.util.ArrayList;
import java.util.Scanner;

public class Index {
	public static void main(String[] args) {
		int choice = 0;
		Scanner sc = new Scanner(System.in);
		User u = new User();
		
		ArrayList<String> user = null;
		String id = "";
		String pw = "";
		
		while(true) {
			System.out.println("1.회원가입\n2.로그인\n3.나가기");
			choice = sc.nextInt();
			
			if(choice == 3) {
				break;
			}
			
			switch(choice) {
			case 1:
				user = new ArrayList<>();
				System.out.print("아이디 : ");
				user.add(sc.next());
				System.out.print("비밀번호 : ");
				user.add(sc.next());
				System.out.print("이름 : ");
				user.add(sc.next());
				
				u.join(user);
				
				break;
			case 2:
				System.out.print("아이디 : ");
				id = sc.next();
				System.out.print("비밀번호 : ");
				pw = sc.next();
				
				if(u.login(id, pw)) {
					System.out.println(User.getSession().get(2) + "님 환영합니다.");
					while(true) {
						System.out.println("1.로그아웃");
						choice = sc.nextInt();
						break;
					}
				}
				
				break;
			}
			
			
		}
	}
}

To Do LIST

① up casting 부분 다시 공부


get,set여는 방법 (alt + shift + s -> r)

 

③ remove(Object 0)는 객체를 넣는건데

   객체가 값 하나만 존재하는게 아닐 때는 포함되는 모든 경우를 지운다 ? 이런 얘기인지?

   A) 위의 경우에는 타입이 Integer(int 값을 가진 클래스)였기 때문에 int인 숫자를 넣었지만

       예를 들어, 타입이 User(생성자가 String user_name, int user_num)인 경우,

       equals와 hashCode를 재정의하고 remove(new User(user_name,user_num))를 해서 사용..?


④ -1은 마지막 인덱스라는 의미. 어떻게 사용할 때 ?


⑤ String은 왜 빠른 for문에서 사용이 불가능한지.

   A) String은 배열인 값을 가지고 있지만 자체로는 타입이기 때문이다.

       String을 배열로 만들어서 사용하기 위해선 char배열로 만들어주는 메소드를 이용해야함.

 

⑥ 인터페이스끼리 상속가능.