웹_프론트_백엔드/단과

[단과_JAVA_심화반] 2020.09.17

shine94 2020. 9. 18. 14:17

1. 제네릭(Generic)
 : 자료형을 정하지 않는 기법(외부에서 지정)

** 문법
 : <대문자>
   E - Element
   K - Key
   N - Number
   T - Type
   V - Value

1) Generic Class
 : 클래스 내부에서 사용될 자료형을 지정한다.
   클래스명 뒤에서 제네릭을 선언한다.

2) Generic Method
 : 클래스에 제네릭에 선언하지 않고, 메소드에만 제네릭을 선언하는 방법.
   메소드의 매개변수 또는 리턴타입이 제네릭이라면 리턴타입 앞에도 제네릭을 선언해야 한다.

3) Generic Interface
인터페이스에서 제네릭을 선언하고, 지정받은 클래스에서 타입을 정한다.

 

 

2. 제네릭 예제

** com.lec.java.generic > GerInter 인터페이스

package com.lec.java.generic;

// 3. Generic Interface
public interface GerInter<N1, N2> {
	N1 add(N1 data1, N1 data2);
	N1 sub(N1 data1, N2 data2);
	N1 mul(N2 data1, N2 data2);
}

 

** com.lec.java.generic > GnrTest.java

package com.lec.java.generic;

// 1. Generic Class
class GnrClass<T> {
	private T data;

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

class GnrClass2 {
	// 2. Generic Method
	public static <T> T function(T data) {
		T result;
		
		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)"문자열";
		} else {
			// 어떤 주소값이 들어올 지 모를 때에는 null로 초기화 해준다.
			// 제네릭은 항상 클래스타입을 지정받기 때문에 null은 대입할 수 있다.
			result = null;
		}
		return result;
	}
}

// 3. Generic Interface
// : 인터페이스에 제네릭을 선언하고 지정받은 클래스에서 타입을 정한다.
class GenInterClass implements GerInter<Double, Integer> {
	@Override
	public Double add(Double data1, Double data2) {
		return data1 + data2;
	}

	@Override
	public Double sub(Double data1, Integer data2) {
		return data1 / data2;
	}

	@Override
	public Double mul(Integer data1, Integer data2) {
		return (double)(data1 * data2);
	}
}

public class GnrTest {
	public static void main(String[] args) {
		// 1. Generic Class
		// : 클래스 내부에서 사용될 자료형을 지정한다.
		//   클래스명 뒤에서 제네릭을 선언한다.
		
		// 제네릭에는 Wrapper 클래스 형태로 작성해야 한다.
		// 제네릭 클래스는 아래의 두가지 방법으로 인스턴스 할 수 있다.
		GnrClass<Integer> gc1 = new GnrClass<Integer>();
		GnrClass<Integer> gc2 = new GnrClass<>();
		
		gc1.setData(100);
		System.out.println(gc1.getData());
		
		gc2.setData(200);
		System.out.println(gc2.getData());
		
		System.out.println("======================================");
		// 2.Generic Method
		// : 클래스에 제네릭을 선언하지 않고 메소드에만 제네릭을 선언하는 방법.
		//   메소드의 매개변수 또는 리턴타입이 제네릭이라면 리턴타입 앞에도 제네릭을 선언해야 한다.
		System.out.println(GnrClass2.function("안녕"));
		System.out.println(GnrClass2.function(4));
		System.out.println(3.4f);
		System.out.println('a');
	}
}

 


3. 이번 심화 과정에서 제네릭은 컬렉션 프레임워크를 사용하기 위해 필요한 만큼 간단하게 배웠다.

 


4. 자료구조, 알고리즘
1) 알고리즘? 문제를 해결할 수 있는 순서

2) 자료구조? 알고리즘을 여러 개 묶어놓은 것

3) 의미가 없는데 자료구조 통과하면 정보가 된다.

   즉 코드에서 숫자 10이 int age = 10에 담기면 나이의 정보가 되는 것과 같다.



5. 컬렉션 프레임워크(Collection Framework)
 : 많은 데이터를 쉽고 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 인터페이스와 클래스들의 집합

 


6. 컬렉션 프레임워크의 주요 인터페이스
1) List extends Collection
   [구현 클래스] Vector, ArrayList, LinkedList
   ** Vector : 용량관리(정해진 용량만큼씩 늘릴 수 있다)
   ** LinkedList : stack구조(FILO, 선입후출)
   ** ArrayList

2) Set extends Collection


3) Map extends Collection

 


7. ArrayList
 : 컬렉션 클래스 중 가장 많이 사용되는 클래스, 배열의 동작원리를 이용해서 값을 저장한다.
   
   인덱스를 이용해서 배열 요소에 빠르게 접근 가능하나,

   데이터를 추가할 때 인덱스를 관리해야 하므로 상대적으로 속도가 느리다.
   
   값을 추가할 때마다 한 칸씩 늘어난다.

   만약 다음 주소에 무언가가 있을 때 비어있는 칸을 탐색한 후 할당하고 새로 추가된 값을 넣어준다.
   만약 다음 주소가 비어있다면 그대로 추가된다.

 


8. 배열과 ArryList
 : 배열은 크기를 제한해야 할 때 사용하고
   ArrayList는 몇 개의 데이터가 들어갈지 알 수 없을 때 사용한다.
   
   예) 학급당 반 30명으로 제한이 필요할 때는 배열, 헬스장 회원 수는 제한을 있으면 안되므로 ArrayList를 사용

 

 

9. ArrayList 예제

** com.lec.java.arrayList > ArrayListTest.java

package com.lec.java.arrayList;

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

public class ArrayListTest {

	public static void main(String[] args) {
		// ArrayList는 주로 접미사에 List를 붙이거나 복수형으로 만듦.
		// 예) dataList 혹은 datas
		ArrayList<Integer> dataList = new ArrayList<>();
		
		System.out.println("dataList.size() : " + dataList.size());
		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() : " + dataList.size());
		
		// for문을 이용하여 출력하기
		for(int i = 0; i < dataList.size(); i++) {
			System.out.println(dataList.get(i));
		}
		// for문을 이용하여 출력해도 되나 
		// 컬렉션은 toString()을 재정의했기 때문에 
		// 위에 번거로운 for문 대신 toString()를 사용하면 편리하게 출력할 수 있다.
		System.out.println(dataList);
		
		// Collection : 인터페이스
		// Collections : 클래스
		Collections.sort(dataList);
		System.out.println(dataList);
		
		Collections.shuffle(dataList);
		System.out.println(dataList);
	}
	
}

 

 

10. ArrayList 문제

 : 10 다음에 15 값 넣기, 60을 600으로 값 변경하기, 15 값 지우기

 

1) 내 코드

** com.lec.java.arrayList > ArrayListTaskMe.java

package com.lec.java.arrayList;

import java.util.ArrayList;

public class ArrayListTaskMe {
	
	public static void main(String[] args) {
		// 문제
		// 1. 10 다음에 15를 넣는다.
		// 2. 60을 600으로 변경한다.
		// 3. 15를 지운다.
		System.out.println("첫번째 문풀===========================================");
		ArrayList<Integer> dataList1 =  new ArrayList<>();
		dataList1.add(10);
		dataList1.add(80);
		dataList1.add(90);
		dataList1.add(30);
		dataList1.add(20);
		dataList1.add(50);
		dataList1.add(40);
		dataList1.add(60);
		System.out.println("dataList1 : " + dataList1);
		
		// 1. 10 다음에 15를 넣는다.
		int index = dataList1.indexOf(10);
		if(!(index == -1)) {
			dataList1.add((index + 1), 15);
		}
		System.out.println(dataList1);
		
		// 2. 60을 600으로 변경한다.
		index = dataList1.indexOf(60);
		if(!(index == -1)) {
			dataList1.set(index, 600); 
		}
		System.out.println(dataList1);
		
		// 3. 15를 지운다.
		index = dataList1.indexOf(15);
		if(!(index == -1)) {
			dataList1.remove(index);
		}
		System.out.println(dataList1);
		
		System.out.println("\n두번째 문풀(검색 결과가 여러 개일 때)==========================");
		ArrayList<Integer> dataList2 =  new ArrayList<>();
		dataList2.add(10);
		dataList2.add(80);
		dataList2.add(90);
		dataList2.add(60);
		dataList2.add(30);
		dataList2.add(10);
		dataList2.add(60);
		dataList2.add(20);
		dataList2.add(50);
		dataList2.add(40);
		dataList2.add(10);
		dataList2.add(60);
		System.out.println("dataList2 : " + dataList2);
		
		// 1. 10 다음에 15를 넣는다.
		for(int i = 0; i < dataList2.size(); i++) {
			if(dataList2.get(i) == 10) {
				dataList2.add((i + 1), 15);
			}
		}
		System.out.println(dataList2);
		
		// 2. 60을 600으로 변경한다.
		for(int i = 0; i < dataList2.size(); i++) {
			if(dataList2.get(i) == 60) {
				dataList2.set(i, 600);
			}
		}
		System.out.println(dataList2);
		
		// 3. 15를 지운다.
		for(int i = 0; i < dataList2.size(); i++) {
			if(dataList2.get(i) == 15) {
				dataList2.remove(i);
			}
		}
		System.out.println(dataList2);
		
		System.out.println("\nremove(int index)말고 remove(Object O) 메서드 이용하기===");
		dataList2.add(90);
		dataList2.add(90);
		dataList2.add(90);
		System.out.println(dataList2);
		while(dataList2.remove((Integer)90)) {;}
		System.out.println(dataList2);
		
		System.out.println("\n프로그램 종료");
	}

}

 

2) 강사님 코드

** com.lec.java.arrayList > ArrayListTaskTeacher.java

package com.lec.java.arrayList;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.UnaryOperator;

public class ArrayListTaskTeacher {

	public static void main(String[] args) {
		// 문제
		// 1. 10 다음에 15를 넣는다.
		// 2. 60을 600으로 변경한다.
		// 3. 15를 지운다.
		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(60);
		dataList.add(40);
		
		Collections.shuffle(dataList);
		System.out.println(dataList);
		// 1. 10 다음에 15를 넣는다.
		if(dataList.contains(10)) {
			// 원래 여기에서 배열 같은 경우는 마지막 방에서 +1 뒤에 값을 대입하려면 IndexOutOfBoundsException 에러가 발생한다.
			// 하지만, ArrayList의 add(index, element)는 마지막 방에서 +1 초과해도 에러 발생 없이 추가 된다.
			// 대신 마지막 방에서 +2 초과하면 에러 발생!
			dataList.add(dataList.indexOf(10) + 1, 15);
			System.out.println(dataList);
		} else {
			System.out.println("찾으시는 값이 없습니다.");
		}
		
		// 2. 60을 600으로 변경한다.
		if(dataList.contains(60)) {
			dataList.set(dataList.indexOf(60), 600);
			System.out.println(dataList);
		} else {
			System.out.println("찾으시는 값이 없습니다.");
		}
		
		// 3. 15를 지운다.
		if(dataList.contains(15)) {
			// 1) remove(int index)를 이용하여 지우기
			//dataList.remove(dataList.indexOf(15));
			// 2) remove(Object o)를 이용하여 지우기
			dataList.remove(new Integer(15));
			System.out.println(dataList);
		} else {
			System.out.println("찾으시는 값이 없습니다.");
		}
		
		// ====================================================
		System.out.println("\nreplaceAll() 메서드 사용해보기");
		dataList.replaceAll(new UnaryOperator<Integer>() {

			@Override
			public Integer apply(Integer t) {
				return 5;
			}
			
		});
		System.out.println(dataList);
		
	}
}

 

 

11. Ctrl + 클릭 시 API가 나오지 않을 때 조치 방법
 : attach source 클릭 > External Location 체크 후 Path의 External File... 클릭 > JAVA\jdk1.8.0_xxx\src.zip

 

 

12. 로그인, 회원가입, 암호화, 복호화

 : 미완성된 로그인, 암호화, 복호화는 다음시간에 진도나가면서 완성할 예정

** com.lec.java.user > User.java

package com.lec.java.user;

public class User {
	private String id;
	private String pw;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
}

 

** com.lec.java.user > Field.java

package com.lec.java.user;

import java.util.ArrayList;

public class Field {
	// 내부 DB
	ArrayList<User> users = new ArrayList<>();
	// vs 외부 DB : oracle DB, MariaD, MySQL 등
	
	// 중복체크
	public User checkId(String id) {
		User user = null;
		for (int i = 0; i < users.size(); i++) {
			if(users.get(i).getId().equals(id)) {
				user = users.get(i);
			}
		}
		return user;
	}
	
	// 회원가입
	public void join(User user) {
		if(checkId(user.getId()) != null) {
			users.add(user);
		}
	}
	
	// 로그인
	
	// 암호화
	
	// 복호화

}

 

 

13. Alt + Shift + A : 그리드 모드, 커서를 늘려서 여러 줄을 한 번에 쓸 수 있다.

 

 

14. 다음 수업 내용 : 로그인, 회원가입, 암호화, 복호화, Set