[20230719] 클라우드 플랫폼 기반 웹서비스 개발자 양성 과정 10일차.

양희정·2023년 7월 19일
0

오늘의 과정 목록

  • java.lang 패키지
    (String, StringBuilder, StringBuffer 클래스 | Wrapper 클래스 | Math 클래스 | System 클래스)
  • java.util 패키지
    (Collection Framework | List, Set, Map 인터페이스 | Iterator 날짜와 시간 처리에 대한 클래스 | Random 클래스

java.lang 패키지

  • Java 프로그래밍에서 가장 기본이 되는 클래스들을 포함하고 있다.
  • 이 패키지에 속한 클래스들은 자동으로 import되므로 별도의 import 구문 없이 사용할 수 있다.
  • 이 패키지에는 String, StringBuilder, StringBuffer, Math, System등의 중요한 클래스들이 포함되어 있다.

String, StringBuilder, StringBuffer 클래스 이해하기

  • String
    - 문자열을 다루는 데 사용한다.
    - 한 번 생성이 된 String 객체의 값은 변경할 수 없다는 불변성으로 안전성을 보장해주지만, 문자열 조작이 빈번하게 발생하는 경우에는 비효율적일 수 있다.
String str = "Hello, ";
str += "World!";
System.out.println(str);
/*
출력 결과)
HelloWorld!
*/
  • StringBuilder와 StringBuffer 클래스
    - 내용을 변경할 수 있으므로, 문자열의 추가, 수정, 삭제 등의 조작이 자주 발생하는 경우 효율적인 처리가 가능하다.
    -StringBuffer는 메소드들이 동기화되어 있어서 멀티스레드 환경에서도 안전하게 사용할 수 있다.
    - StringBuilder는 동기화를 지원하지 않아서 멀티스레드 환경에서는 안전하지 않지만, 단일 스레드 환경에서는 StringBuffer보다 빠른 성능을 보인다.
StringBuilder sb = new StringBuilder("Hello, ");
		sb.append("World!");
		System.out.println(sb);
/*
출력 결과)
Hello, World!
*/

Wrapper 클래스

  • 기본형 데이터 타입을 참조형 데이터 타입으로 다루고자 할 때 사용할 수 있는 클래스이다.

  • 자바의 기본 타입은 객체를 다루지 않기 때문에 자바에서 클래스만 요구할 때 기본형데이터 타입을 사용할 수 없으니 참조할 수 있도록 돕는다.

  • 각 기본형 타입마다 참조형 타입의 클래스가 존재한다.
    byte -> Byte | short -> Short | int -> Integer | long -> Long
    float -> Float | double -> Double
    char -> Character
    boolean -> Boolean

  • 장점
    기본형데이터 타입에 넣을 수 없는 데이터를 참조형 데이터 타입에 넣을 수 있다.

  • null값을 받아야 하는 상황에서 Interger(Wrapper)을 사용하는게 좋다.

  • 단점
    유용하게 쓰이지만 인스턴스 메서드가 있는 만큼 그 만큼의 메모리 공간을 차지해 버린다.
    숫자만 쓴다면 Wrapper를 사용하지 않는 것이 바람직하다.

		// 이전에는 클래스이기 때문에 아래와 같이 생성자를 만들어야 했다.
        Integer integer1 = new Integer(100);
        // 정수 다루듯이 다룰 수 있다.
		Integer integer2 = 100;
 		Double double2 = 3.1488888;
        
         // Integer 값에 저장된 주소값을 들고온 것.
        int int1 = integer1;
		double double3 = double2;
        
         // 숫자 100이 문자열 100으로 출력됨. 눈에 보이기에는 숫자 100으로 보이지만 문자열이다.
        String string1 = integer1.toString();
		System.out.println(string1);
		int int2 = Integer.parseInt(string1); // 문자열을 정수로 바꿈.
		System.out.println(int2); // 숫자 정수 100으로 변환..
        

/*
출력 결과)
100
100
*/

Math 클래스

  • 자바에서 제공하는 수학 연산에 관련된 메서드를 담고 있는 클래스이다.
  • 모든 메서드가 static이기 때문에 객체를 생성하지 않고도 바로 사용할 수 있다.

Math 클래스의 메서드

  • abs() : 절대값을 구한다.
  • ceil() : 올림 값을 구한다.
  • floor() : 내림 값을 구한다.
  • round() : 반올림 값을 구한다.
  • min(), max() : 최소값, 최대값을 구한다.
  • exp() : 자연상수 e의 지수 값을 구한다.
  • log(), log10() : 로그 값을 구한다.
  • pow() : 거듭제곱 값을 구한다.
  • sqrt() : 제곱근을 구한다.
  • sin(), cos(), tan() : 삼각함수 값을 구한다.
  • asin(), acos(), atan() : 삼각함수의 역함수 값을 구한다
  • toDegrees(), toRadians() : 각도를 도와 라디안 사이로 변환한다.

Math 클래스의 상수

  • Math.PI : 원주율 π (약 3.14159)
  • Math.E : 자연상수 e (약 2.71828)
 		Double double2 = 3.1488888;
		double double3 = double2;

		// 반올림
		System.out.println(Math.round(double3));
		System.out.println(Math.round(double3 * 100) / 100.0);
/*
출력 결과)
3
3.15
*/

System 클래스

  • JVM과 관련된 여러 필드와 메서드를 제공하는 final 클래스이다.
  • 이 클래스의 모든 필드와 메서드는 static이므로, System 클래스의 객체를 생성할 필요 없이 바로 사용 할 수 있다.

System 클래스의 주요 필드

  • System.in : 표준 입력 스트림을 나타냅니다. 일반적으로 키보드 입력을 읽는 데 사용된다.
  • System.out : 표준 출력 스트림을 나타냅니다. 일반적으로 콘솔에 출력하는 데 사용된다.
  • System.err : 표준 에러 스트림을 나타냅니다. 일반적으로 콘솔에 에러 메시지를 출력하는 데 사용된다.

System 클래스의 주요 메서드

  • currentTimeMillis() : 1970년 1월 1일 0시 0분 0초(UTC)를 기점으로 현재까지 경과한 시간을 밀리초로 반환한다.
  • nanoTime() : JVM이 시작된 시점을 기점으로 경과한 시간을 나노초로 반환한다. 성능 측정에 유용하다.
  • getProperty(String key) : 시스템 속성을 가져오는 데 사용된다. 예를 들어, "java.version"을 인자로 전달하면 현재 JVM의 자바 버전을 얻을 수 있다.
  • arraycopy(): 배열의 특정 부분을 다른 배열의 특정 위치에 복사다. 이는 배열 복사에 있어서 가장 빠른 방법이다.
  • exit(): 현재 실행 중인 JVM을 종료다. 인자로 전달하는 값은 종료 상태를 나타낸다.

java.util 패키지

  • 자바의 핵심 패키지 중 하나로, 데이터 구조, 날짜와 시간, 난수 생성 등 다양한 유틸리티 클래스와 인터페이스를 제공한다.

Collection Framework

  • 데이터를 저장하는 구조를 제공하는 표준화된 인터페이스 및 클래스이다
  • 저장, 검색, 수정, 삭제에 대한 기능을 제공해준다.
  • List, Set, Map, Queue, Stack
  • 이 중에서 List, Set, Map을 주로 사용한다.
+ Collection과 Collections의 차이
	- Collection은 인터페이스로, 여러 데이터를 저장하는데 사용되는 구조의 상위 형태입니다. List, Set, Queue 등이 Collection 인터페이스를 구현한다.
    - Collections는 유틸리티 클래스로, 정렬(sort), 반전(reverse), 탐색(search) 등의 기능을 제공한다.

List 인터페이스

  • 순서가 있고 중복을 허용하는 데이터 저장 구조를 표현할 때 사용한다. (일반적으로 알고 있는 배열)
  • ArrayList, LinkedList

1) ArrayList 구현체

  • 내부적인 인덱스를 사용하여 요소를 저장한다.
  • 인덱스로의 접근이 빠르다.
  • List<참조형타입> 변수이름 = new ArrayList<참조형타입. (공란으로 두어도 된다.)>();
		
        // List<Integer> arrayList; : 변수에 배열을 담을 수 있는 참조변수이기 때문에 생성자가 필요하다.
		List<Integer> arrayList = new ArrayList<Integer>(); // : [] - 배열이 만들어 짐
		
		// list에 데이터 추가 - add(); (add메서드)
		arrayList.add(10); // : [10]
		arrayList.add(12); // : [10, 12]
		arrayList.add(1, 13); // : [10, 13, 12]
//		arrayList.add("10"); - Integer 타입이기 때문에 문자열 불가.
		System.out.println(arrayList);
		
		// list에 요소 불러오기 - get();
		System.out.println(arrayList.get(2));
//		System.out.println(arrayList.get(4)); - 인덱스 자리를 벗어남 (java.lang.IndexOutOfBoundsException)
		
		// list에 요소 수정하기 - set();
		arrayList.set(1, 100); // : [10, 100, 12]
		System.out.println(arrayList);
//		arrayList.set(4, 100); - java.lang.IndexOutOfBoundsException
//		System.out.println(arrayList);
		
		// list에 요소 삭제하기 - remove();
		// 요소 자체를 지정할 수 있다.
		arrayList.remove(0); // : [100, 12]
		System.out.println(arrayList);
//		arrayList.remove(100); - java.lang.IndexOutOfBoundsException
//		System.out.println(arrayList);

		Integer element = 100; // int를 Integer인지 구별을 못해 바꾸어줌.
		arrayList.remove(element); // : [12]
		System.out.println(arrayList);
		
/*
출력 결과)
[10, 13, 12]
12
[10, 100, 12]
[100, 12]
[12]
*/

2) LinkedList 구현체

  • 내부적인 이중 연결 리스트(요소와 요소의 관계가 맺어져 있다)를 사용하여 요소를 저장한다.
  • 데이터 추가, 삭제가 빠르지만 인덱스로의 접근이 느리다.
  • 개발할 적에 잘 사용하지 않는다.
List<Integer> linkedList = new LinkedList<Integer>();

Set 인터페이스

  • 순서가 없고 중복을 허용하지 않는 데이터 저장 구조를 표현할 때 사용한다.

1) HashSet

  • 해싱 기법을 이용해서 요소를 저장한다.
  • 검색 속도가 빠르다.
  • 쌓이면서 들어간다.
		Set<Integer> hashSet = new HashSet<Integer>(); // 일반적인 방법.
//		HashSet<Integer> hashSet = new HashSet<Integer>(); // 이렇게 써도 상관은 없다.
		
		// set에 데이터 추가 - add();
		// 읽기와 수정이 불가능하다.
		hashSet.add(99);
		hashSet.add(77);
//		hashSet.add(1,0); // 순서가 없기 때문에 특정 인덱스에 추가되지 않는다.
		hashSet.add(99); // 99는 중복되기 때문에 추가하지 않는다.
		System.out.println(hashSet);
		
		// set에 데이터 존재 여부 - contains(); (true인지, false인지 알려준다)
		System.out.println(hashSet.contains(99));
		
		// set에서 데이터 삭제 - remove();
		hashSet.remove(99); // 인덱스가 존재하지 않기 때문에 요소로 지울 수 있다
		System.out.println(hashSet);
		
		// set에 구조의 사이즈 확인 - size(); 
		System.out.println(hashSet.size()); // 요소의 개수, 사이즈 길이.

/*
출력 결과)
[99, 77]
true
[77]
1
*/

2) LinkedHashSet

  • 해싱 기법과 요소와 요소간의 연결을 이용해서 요소를 저장한다.
  • 요소의 추가, 삭제가 빠르다.
		Set<Integer> linkedHashSet = new LinkedHashSet<Integer>();

3) TreeSet

  • Tree 구조를 사용하여 요소를 저장하는 기법이다.
  • 요소가 정렬되어 저장된다.
		Set<Integer> treeSet = new TreeSet<Integer>();
		treeSet.add(99);
		treeSet.add(77);
		System.out.println(treeSet);

/*
[77, 99]
*/

Map 인터페이스

  • key와 value를 한 쌍으로 요소를 가지는 구조다.
  • 순서가 없고(인덱스가 없다), key에 대해서 중복을 허용하지 않는다.

1) HashMap 구현체

  • 해싱 기법을 이용하여 데이터를 저장한다.
  • 검색 속도가 빠르다.
		Map<String, String> hashMap = new HashMap<>();
		
		// map에 데이터 추가 - put();
		hashMap.put("banana", "바나나"); // {banana=바나나}
		hashMap.put("apple", "사과"); // {banana=바나나, apple=사과}
		hashMap.put("apple", "사과1"); // {banana=바나나, apple=사과1}
		System.out.println(hashMap);
		
		// map에 데이터 읽기 - get();
		// - 순서가 없어 인덱스를 넣지 않는다.
		// - 존재하지 않는 키를 넣으면 null이 나온다.
		System.out.println(hashMap.get("apple"));
		System.out.println(hashMap.get("apple1"));
		
		// map에 키 존재 여부 - containsKey();
		// - true, false로 출력
		System.out.println(hashMap.containsKey("apple"));
		
		// map에 데이터 삭제 - remove();
		// - 지우는게 아니라 있는 것을 빼는 것으로.
//		hashMap.remove("apple");
//		System.out.println(hashMap);
		hashMap.remove("apple1"); // 존재하지 않는 키를 넣게 된다면 아무 일도 일어나지 않는다.
		System.out.println(hashMap);

/*
출력 결과)
{banana=바나나, apple=사과1}
사과1
null
true
{banana=바나나}
{banana=바나나}
null
null
*/

2) LinkedHashMap 구현체

  • 해싱 기법과 요소와 요소간의 연결하여 데이터를 저장하는 방식이다.
  • 추가와 삭제가 빠르다.
		Map<String, String> linkedHashMap = new LinkedHashMap<>();

3) TreeMap 구현체

  • 트리 기법을 이용해서 데이터를 저장한다.
  • key를 기준으로 정렬되어 저장된다.
		Map<String, String> treeMap = new TreeMap<>();

Random 클래스

  • 자바에서 난수를 생성하는데 사용되는 클래스이다. 여러 가지 메서드를 제공하여 다양한 범위와 형태의 난수를 생성할 수 있다.
  • Random 클래스는 시드(seed)라는 개념을 이용하여 난수를 생성합니다. 시드는 난수 발생 알고리즘이 초기화하는데 사용되는 값이다. 동일한 시드값으로 Random 객체를 생성하면 동일한 난수 시퀀스가 발생한다.

예시

1) 로또 : 순서 X | 중복 X | 6자리 수(정수)

  • 추첨 (순서없이. 정렬없이. 서로 다른 수가 나옴. 정렬없이 쌓임)
  • 자동 (정렬되어 나오려면 TreeSet을 사용하면 된다.
  • lotto는 set 구조이기 때문에 add를 하게 되면 중복된 수가 생성이 되면 수가 안들어가기 때문에 6개 다 안 나올 수 있다.
Set<Integer> lotto = new HashSet<Integer>();
		Random random = new Random();
//		lotto.add(random.nextInt(45) + 1);
//		lotto.add(random.nextInt(45) + 1);
//		lotto.add(random.nextInt(45) + 1);
//		lotto.add(random.nextInt(45) + 1);
//		lotto.add(random.nextInt(45) + 1);
		
		while(lotto.size() < 6) {
			lotto.add(random.nextInt(45) + 1);
		}
		
		System.out.println(lotto);
/*
출력 결과)
[35, 21, 11, 14, 30, 15]
*/

2) 연금복권 : 7자리. 첫번째 자리는 1~5까지, 나버지는 중복을 허용해서 0~9 | 순서O

		List<Integer> youngeom = new ArrayList<Integer>();
		for(int count = 0; count < 7; count++) {
			if(count == 0) {
				youngeom.add(random.nextInt(5) + 1);
				continue;
			}
			youngeom.add(random.nextInt(10));
		}
		System.out.println(youngeom);
		System.out.println();
/*
출력 결과)
[4, 2, 8, 8, 4, 2, 2]
*/

3) UUID

  • 중복이 되면 안 될 때 사용하는 코드
		System.out.println(UUID.randomUUID().toString());
/*
출력 결과)
f3b74998-0437-4d6c-91e3-a7c2ef922e86
*/

날짜와 시간 처리에 대한 클래스

1) System.currentTimeMillis();

  • 현재 운영체제의 시간을 1970년 1월 1일 0시 0분 0초 0밀리초 기준으로 경과한 시간을 밀리초 기준으로 표현한다.
  • 반환타입 : long
//		int start = System.currentTimeMillis(); // Type mismatch: cannot convert from long to int
		long start = System.currentTimeMillis();
		System.out.println("시작 시간 : " + start);
		
		// 경과 시간을 
		for(int index = 0; index < 10000000; index++) {
			System.out.println("출력중...");
		}
		long end = System.currentTimeMillis();
		System.out.println("종료 시간 : " + end);
		
		System.out.println("경과 시간 : " + (end - start));
/*
출력 결과)
출력중...
출력중...
  .
  .
  .
출력중...
출력중...
출력중...
종료 시간 : 1689756412368
경과 시간 : 9801

2) Date 클래스

  • 초창기 자바에서부터 사용되어 오던 날짜 및 시간 관련 클래스
  • JDK 1.0 ~ JDK 1.1 -> 사용하지 않는 것을 권장하고 있다.
  • 대부분의 라이브러리가 Date 클래스를 사용하기 때문에 넘겨주는 데이터 인자의 타입이 Date이다.
  • 날짜를 표시하는 타입에서 사용된다.
  • 자바 유틸에서 받아야 한다.
		Date date = new Date();
		System.out.println(date);
		
//		date = new Date("2023.07.01"); //  java.lang.IllegalArgumentException
		date = new Date(123,7,1,10,10,10); // 직관적이지 않는다. (현재년도 - 1900) 컴퓨터가 계산하기 쉽게 나오기 때문에. 지금과 같이생성자를 사용하는 방법은 쓰지 않는다.
		System.out.println(date);
		
		int year = 0;
		int month = 0;
		int dates = 0;
		year = date.getYear();
		month = date.getMonth();
		dates = date.getDate();
		System.out.println(year + " " + month + " " + dates); // 추가로 연산이 계속 필요함.

/*
출력 결과)
Wed Jul 19 17:49:31 KST 2023
Tue Aug 01 10:10:10 KST 2023
123 7 1
*/

3) Calendar 클래스

  • Date 클래스를 대체하기 위해 나온 클래스로 추상 클래스이다.
  • GregorianCalendar 클래스를 사용해서 확장이 필요하다.
  • or getInstance() 메서드 사용
  • JDK 8 버전까지 사용되었다. -> LocalDateTime으로 대체되었다.
  • 지금은 사용하지 않지만 구글검색에 대부분 캘린더, 데이터 형태이기 때문에 읽을줄 모르면 작업, 공부에 지장이 생기기 때문에 알아야 한다.
//		Calendar calendar = new Calendar(); // Cannot instantiate the type Calendar
		Calendar calendar = new GregorianCalendar();
		System.out.println(calendar);
		
		year = calendar.get(Calendar.YEAR);
		month = calendar.get(Calendar.MONTH);
		dates = calendar.get(Calendar.DATE);
		
		System.out.println(year + " " + month + " " + dates);
		
		calendar.set(Calendar.YEAR, 2001);
		year  = calendar.get(Calendar.YEAR);
		System.out.println(year);

/*
출력 결과)
java.util.GregorianCalendar[time=1689756760054,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Seoul",offset=32400000,dstSavings=0,useDaylight=false,transitions=30,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2023,MONTH=6,WEEK_OF_YEAR=29,WEEK_OF_MONTH=4,DAY_OF_MONTH=19,DAY_OF_YEAR=200,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=52,SECOND=40,MILLISECOND=54,ZONE_OFFSET=32400000,DST_OFFSET=0]
2023 6 19
2001
*/

4) SimpleDateFormat 클래스

  • Date 타입의 인스턴스를 문자열로 표현하는 클래스
  • y : 년도 | M : 월 | d : 일 | h : 시간 | m : 분 | s : 초
    + a : 오전/오후 | E : 요일
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); // "-" 대신에 "."을 찍어도 상관없다.
		System.out.println(simpleDateFormat.format(date));
		System.out.println(simpleDateFormat.format(new Date())); // 현재시간
/*
출력 결과)
2023-08-01
2023-07-19
*/

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

정말 깊이 있는 글이었습니다.

답글 달기