🦁멋쟁이 사자처럼 15기/3월달 수업 내용 정리

멋쟁이 사자처럼 12회차 ( 03 / 14 )

코딩하는 하마 2025. 3. 14. 16:43

 

[학습 목표]

1. 자바의 유틸 패키지(java.util)를 활용하여 다양한 컬렉션 프레임워크와 유틸리티 기능을 효과적으로 사용할 수 있다.

2. 람다식을 이해하고 이를 활용하여 코드의 간결성과 가독성을 높이며 함수형 프로그래밍을 구현할 수 있다.

3. 스트림 API를 활용하여 데이터를 효율적으로 변환, 필터링, 집계 및 병렬 처리를 할 수 있으며, 성능을 최적화할 수 있다.

4. 스트림의 중간 연산 (Intermediate Operation) 과 최종 연산 (Terminal Operations)의 개념을 이해하고, 다양한 연산 (map, filter, sorted, reduce, collect )을 활용하여 데이터를 효과적으로 처리할 수 있다.

 


 

java.util 패키지

java.util 패키지에서 날짜 , 시간 , 패턴, split을 나타내는 클래스들을 살펴보겠다.

 

- java.util.Calendar

package com.sec11.myutil02;

import java.util.Calendar;

public class CalendarTest {

	public static void main(String[] args) {

		//추상클래스 -> 필드 -> 생성자, 메소드 -> getInstance() 메소드 : static 메소드를 통해 메모리를 단한번 로드
		Calendar cal = Calendar.getInstance(); //싱글톤 패턴  public static Calendar getInstance()

		int year = cal.get(Calendar.YEAR);
		int mon = cal.get(Calendar.MONTH);
		int day = cal.get(Calendar.DAY_OF_MONTH);
		int hour = cal.get(Calendar.HOUR_OF_DAY);
		int min = cal.get(Calendar.MINUTE);
		int sec = cal.get(Calendar.SECOND);

		System.out.println("현재 날짜와  시간");
		System.out.println(year + "년 " + mon + "월 " + day + "일");
		System.out.println(hour + "시 " + min + "분 " + sec + "초");

		System.out.println("24시간 기준  시간 : " + cal.get(Calendar.HOUR_OF_DAY));

		System.out.println("12시간 기준 시간." + cal.get(Calendar.HOUR));

		System.out.println("오늘이 이번주의 몇번째 날: " + cal.get(Calendar.DAY_OF_WEEK));

		System.out.println("이번주의 요일이 이번달의 몇번째 요일 :  "
				+ cal.get(Calendar.DAY_OF_WEEK_IN_MONTH) +" 번째");

		System.out.println("1년중에  오늘이 " + cal.get(Calendar.DAY_OF_YEAR)
				+ "  번째 날 ");

	}

}

 

이 코드를 보면 Calendar의 getInstance() 메소드를 사용한 것을 볼 수 있다.

 

2) java.util.Date

package com.sec11.myutil02;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTest {

	public static void main(String[] args) {

		// (국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각)
		// 밀리초 단위(*1000은 1초), 음수이면 이전 시각
		long time1 = System.currentTimeMillis();
		System.out.println(time1);

		Date today = new Date(); // 현재시간 출력_ cmd
		System.out.println(today);

		long time2 = System.currentTimeMillis();
		System.out.println((time2 - time1) / 1000.0);

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //Zone, 형식의 포맷
		System.out.println("현재날짜 : " + sdf.format(today));
	}
}

 

위 코드는 Date 클래스를 사용하여 현재 시간과 날짜를 리턴받는 것을 볼 수 있다.

 

3) java.util.Regex

package com.sec11.myutil02;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest02 {
	public static void main(String[] args) {
		String str = new String("java2 java3 java4");
		System.out.println("대상문자열 :  " + str);
		System.out.println("--------------------------\n");
		Pattern pattern01 = Pattern.compile("java");
		Matcher matcher01 = pattern01.matcher(str);
		System.out.println("java를 찾아서 spring으로 변경");
		System.out.println(matcher01.replaceAll("spring"));
		System.out.println("--------------------------\n");

		Pattern pattern02 = Pattern.compile("java");
		Matcher matcher02 = pattern02.matcher(str);
		StringBuffer appStrBuf = new StringBuffer();
		while (matcher02.find()) {
			matcher02.appendReplacement(appStrBuf, "spring");
		}
		matcher02.appendTail(appStrBuf);
		System.out.println("java를 찾아서 spring으로 변경");
		System.out.println(appStrBuf.toString());
	}
}

 

위 코드는 java.util.regex.Matcher와 java.util.regex.Pattern을 사용하여 조건에 맞는 문자열을 찾아 변환하는 코드를 짠 것을 볼 수 있다.

실행 결과는 다음과 같다. 

4) split

package com.sec11.myutil02;

public class SplitTest {

	public static void main(String[] args) {		
		String str ="java,jdbc,servlet/jsp,spring/JDBC|Template";		
		String[] res= str.split(",|\\/|\\|", 7);
		
		for(String result : res){
			System.out.println(result);
		}			

	}

}

 

위 코드는 split을 사용하여 문자열을 분리하는 코드를 짠 것이다.

 

5) java.util.StringTokenizer

package com.sec11.myutil02;

import java.util.StringTokenizer;
/*
 * IO 단위 문자열 추출해서 < find 할 경우 >문자열 단위로 자르기 찾기 , 변환
 * 1. Scanner
 * 2. java.util.regx
 * 3. String
 * 4. StringTokenizer
 */
public class StringTokenizerTest {
	public static void main(String[] args) {
		String str = "java,jdbc,servlet/jsp,spring/JDBCTemplate";
		StringTokenizer st = new StringTokenizer(str, ",/");
		while (st.hasMoreTokens())
			System.out.println(st.nextToken());
	}

}

 

위 코드는 주어진 문자열에 따라 분리하는 코드를 짠 것이다.

 


람다식

1) 람다식의 주요특징 -> 함수형 인터페이스

익명 함수(Anonymous Function) 이름 없이 사용되는 함수로 함수형 인터페이스의 변수에 할당 가능.

함수형 인터페이스 : 하나의 추상 메소드만을 가지는 인터페이스를 말한다. -> @FunctionalInterface

람다식은 단 하나의 추상 메소드만을 가지는 함수형 인터페이스에서만 사용 가능하다.(default,static 메소드는 여러 개 가질 수 있다.)

간결한 코드 구조로 기존의 익명 클래스를 람다식을 사용하여 간단하게 표현할 수 있다.

자바 컴파일러가 문맥을 보고 타입을 자동으로 추론한다.

java.util.function 패키지에는 다양한 기본 함수형 인터페이스

(Function : 입력값을 받아서 가공한 후 다른 타입으로 변환하여 반환하는 인터페이스 R apply(T t),

Predicate: 입력값을 받아서 조건을 체크한 후 true 또는 false를 반환하는 인터페이스 boolean test(T t),

Consumer : 입력값을 받아서 특정 작업을 수행하고 반환값이 없는 인터페이스 void accept(T t),

Supplier : 입력값 없이 값을 생성하여 반환하는 인터페이스 T get())가 제공된다.

 

[람다 표현식 ]

lambda 표현식은 익명으로 처리되어 이름이 없다.

lambda 표현식은 compiler context 에 맞는 타입을 유추하기 때문에 return type이없다.

lambda 표현식은 compiler context 에서 유추되어 throws clause 가 없다.)

lambda 표현식은 람다 표현식은 Generic 이 될 수 없어 type 파라미터를 선언할 수없다.

 

2) 형식

(int x, int y) -> { return x + y; } // 기존 방식

(x, y) -> x + y // 타입 생략 가능

 

case1 : 매개변수가 없는 경우

() -> System.out.println("Hello World!");

 

case2: 매개변수가 하나인 경우

x -> x * x;

 

case 3: 매개변수가 여러 개인 경우

(x, y) -> x + y;

 

case4 실행문이 여러 개일 경우

(x, y) -> {

int sum = x + y;

return sum;

 

3) 다양한 형식

형식에 정의된 구문은 매개인자에 따라 괄호 () , 중괄호{}가 생략가능하다.

>> 매개인자로 su 을 받아 출력 하는 구문

(int su) -> { System.out.println(su); }

interface test {

public void test(int su); }

 

>> 자료형이 생략 가능하다.

(su) -> { System.out.println(su); }

>> 매개인자 하나일경우 (), {}생략 가능하다

su -> System.out.println(su);

 

>> 매개인자 없는 경우 빈 괄호()만 사용하여 명령 실행할 수 있다.

()->{ System.out.println('a')}

void에 매개인자 없음

>> 매개인자 두 개 이상 이면 자료형 생략 하여 실행한다.

(a, b) -> { return a + b; }

void가 아니고 매개인자 두 개 받음

 

>>매개인자 두 개이상이면 {}return 키워드를 생략해서 사용한다

(a, b) -> a + b;

 

ex)

package com.sec12.labmbda;

/*
 * 1) 인터페이스의 추상 메소드가 무조건 하나여야 함 
 * 2) @FunctinalInterface가 없어도 위 조건을 만족하면 람다식 쓸 수 있음 
 *  
 */

public class LambdaTest {

	@FunctionalInterface  //함수형 인터페이스 체크 
	interface Fun01{
		public String prn(String name); // 매개인자 메소드
	}

	
	interface Fun02{
		public String prn02(); // 매개인자 없는 메소드
	}

	interface Fun03 {
		//반환형이 void인 메소드
		public void say(String name); //문자열을 받아서 출력하는 메소드 
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Fun01 m_name = name -> "hello" + name; //(name)괄호를 생략  -> : return 키워드 포함 
		System.out.println("m_name : " + m_name.prn("홍길동"));
		
		Fun02 m_test = () -> "hello"; //{}와 return 키워드 생략 return "테스트";
		System.out.println("m_test : "+m_test.prn02());

		Fun03 m1 = (name) -> System.out.println("hello"+ name);
		m1.say("정길동");
	}

}