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

양희정·2023년 7월 20일
0

오늘의 과정 목록

  • java.util 패키지
    (날짜와 시간 처리에 대한 클래스 LocalDateTime 클래스)
  • java.io 패키지
  • 제너릭, 열거형, 어노테이션, 람다식

+ API, Library, Framework의 차이점, Object란

LocalDateTime 클래스

  • JDK 8 이후에 나온 날짜 및 시간 관련 API 클래스이다.
  • Date 클래스나 Calendar 클래스보다 직관적인 표현 및 연산이 가능하다.
  • 특정한 요소에 대해 연산을 직접하지 않아도 된다.

LocalTime 클래스 - 시간 관리 클래스
LocalDate 클래스 - 날짜 관리 클래스
LocalDateTime 클래스 - 날짜 및 시간 관리 클래스

  • LocalTime 클래스
    now() : 현재시간 기준으로 인스턴스 생성.
    of() : 특정 시간을 지정해서 인스턴스 생성.
		LocalTime localTime1 = LocalTime.now();
		LocalTime localTime2 = LocalTime.of(9, 33, 20);
		
		System.out.println(localTime1);
		System.out.println(localTime2);
/*
출력 결과)
18:04:27.608937800
09:33:20
*/
  • LocalDate 클래스
		LocalDate localDate1 = LocalDate.now();
		LocalDate localDate2 = LocalDate.of(2023, 11, 30);
		
		System.out.println(localDate1);
		System.out.println(localDate2);
/*
출력 결과)
2023-07-20
2023-11-30
*/
  • LocalDateTime 클래스
		LocalDateTime localDateTime1 = LocalDateTime.now();
		LocalDateTime localDateTime2 = LocalDateTime.of(localDate2, localTime2);
		
		System.out.println(localDateTime1);
		System.out.println(localDateTime2);
/*
출력 결과)
2023-07-20T18:07:08.392384200
2023-11-30T09:33:20
*/
  • 특정 요소 가져오기
    해당 인스턴스에서 get???
		year = localDateTime1.getYear();
		month = localDateTime1.getMonthValue(); 
		dates = localDateTime1.getDayOfMonth();
		int hour = localDateTime1.getHour();
		int minute = localDateTime1.getMinute();
		int second = localDateTime1.getSecond();
  • 특정 요소 연산.
    해당 인스턴스에서 minus??? | plus???
    값을 반환하기 때문에 다시 받아와야 한다.

		localDateTime2.minusYears(6).plusMonths(3).plusDays(10);\
        System.out.println(localDateTime2);
		localDateTime2 = localDateTime2.minusYears(6).plusMonths(3).plusDays(10);
		System.out.println(localDateTime2);
		
/*
2023-11-30T09:33:20
2018-03-10T09:33:20
*/
  • 특정 요소 지정
    해당 인스턴스에서 with???
		localDateTime2 = localDateTime2.withHour(21).withMinute(10).withSecond(1);
		System.out.println(localDateTime2);
		
/*
2018-03-10T21:10:01
*/
  • 날짜 및 시간 비교
    isAfter() : 특정 인스턴스가 매개변수로 전달되는 날짜 인스턴스보다 이후 인지.
    isBefore() : 특정 인스턴스가 매개변수로 전달되는 날짜 인스턴스보다 이전 인지.
    isEqual() : 특정 인스턴스가 매개변수로 전달되는 날짜 인스턴스와 같은지.
		System.out.println(localDateTime1.isAfter(localDateTime2));
		System.out.println(localDateTime1.isBefore(localDateTime2));
		System.out.println(localDateTime1.isEqual(localDateTime2));

/*
true
false
false
*/
  • until.
    날짜와 시간의 차이
		System.out.println(localDateTime1);
		System.out.println(localDateTime2);
		System.out.println(localDateTime1.until(localDateTime2, ChronoUnit.YEARS));
		
		System.out.println(localDateTime1.getMonth()); // 열거. 숫자로 반환하지 않음.

/*
2023-07-20T18:15:00.783799100
2018-03-10T21:10:01
-5
JULY
*/

java.io 패키지

  • input, output(입출력) 관련 클래스들을 포함하고 있다.
  • 파일 입출력, 네트워크 입출력, 메모리 입출력 등 다양한 입출력 기능을 지원하고 있다.

제너릭

  • 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 말한다.
  • 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 것이 가능해져, 코드의 재사용성을 높이고 타입 안전성을 제공한다.

1) 상속

  • 문제점 : 여러개의 클래스를 만들어 상속을 받아야 하는 번거로움이 있다.
class Result {
	 int code;
	 String message;
	 String name;

	 void print() {
	 System.out.println("안녕하세요");
	 }
 }

 class Result1 extends Result {
	 int age;
 }
 class Result2 extends Result {
	 String age;
 }
 class Result3 extends Result {
	 double age;
 }

2) Object

  • 1번 문제를 해결하기 위해 상위 클래스, 모든 클래스의 부모 클래스인 Object를 사용하여 해결할 수 있다.
  • 단점 : 오브젝트는 불러와 사용하는 시점에서 어떤 타입인지 모르게 때문에 인스턴스 오브라고 하는 특정한 연산자를 사용하여 어떤 인스턴스인지 반환할 수 있지만 코드의 안전성이 떨어지게 된다.(강제성이 떨어진다)
class Result {
	 int code;
	 String message;
	 String name;
	 Object age;

	 void print() {
	 System.out.println("안녕하세요");
	 }
 }

 public class Generic {
 	 public static void main(String[] args) {
 		 Result result = new Result();
		 Object object = new Result();
		
		 // 공통 부모인 Object로 받았기 때문에 함께 중복으로 사용 가능.
		 result.age = "23"; // String 타입
		 result.age = 23; // Integer타입
		 // 지금은 age를 마지막으로 Integer타입으로 받았기 때문에 정상적으로 실행이 된것.
		 // 위의 타입을 반대로 받게 된다면 java.lang.ClassCastException 가 발생한다
	  	 int age = (Integer) result.age; // 다운캐스팅 
	 	 System.out.println(age + 10);
/*
출력 결과)
33
*/

3) 제너릭

  • 1번과 2번의 단점을 잡아준다.
  • 꺽쇠 안에는 대부분 한 글자 대문자를 사용한다. (T, E, D)
  • 어떤 이름이 들어가도 상관 없다.
  • 메서드에서도 사용이 가능하다.
  • 선언할 때 타입을 정하는게 아니라 사용할 때 타입을 정한다.
class Result<Type> {
	int code;
	String message;
	String name;
	Type age;
	
	void print() {
		System.out.println("안녕하세요");
        
	<Parameter> void print(Parameter parameter) {
	}
}
public class Generic {
	public static void main(String[] args) {
		
		Result<Integer> result1 = new Result<>();
		result.age = 23;

4) 제너릭 제한

  • Comparable를 넣으면 그보다 상위 클래스인 오브젝트가 올 수 없다.
  • Comparable은 인터페이스지만 <> 꺽쇠 안의 extends의 의미가 다르기 때문에 사용이 가능하다.
class Result<Type extends Comparable> 

5) 제너릭 와일드카드

  • 알 수 없는 타입을 의미하는 '?'이다.
  • 제너릭 코드 작성 시, 파라미터 타입을 미정으로 둘 수 있게 하여 유연성을 높이는 데 도움을 준다.
  • 메서드의 반환 타입으로 많이 사용한다
		//참조변수에 값을 넣을 적에 어떤 타입이 올지 모르니  ?로 Integer로도, String으로도 받을 수 있다.
		// 이렇게 하나하나 만들어야 하지만.
		List<Integer> list = new ArrayList<Integer>();
		List<String> list2 = new ArrayList<String>();
		
		// new 생성자를 아무거나 받을 수 있다.
		List<?> list3 = new ArrayList<Integer>();
		list3 = new ArrayList<String>();

5-1) 제너릭 와일드카드 예시
입력 받은 숫자만큼 배열을 만든다.
만약 flag가 트루이면 요소 타입이 정수 형태로 들어가고, false이면 문자형태로 들어가게 된다.

public class Generic {
	// List<? extends Comparable> -> Comparable의 하위 타입을 의미한다. (Upper Bounded Wildcard)
	// List<? super Comparable> -> Comparable의 상위 타입을 의미한다. (Lower Bounded Wildcard)
	List<?> createList(int number, boolean flag) {
		if(flag) {
			List<Integer> list = new ArrayList<Integer>();
			for(int index = 0; index < number; index++) {
				list.add(index);
			}
			return list;
		} else {
			List<String> list = new ArrayList<String>();
			for(int index = 0; index < number; index++) {
				list.add(Integer.toString(index)); // 문자열로 0 ~ 9
			}
			return list;
		}
	}

열거형 (enum)

  • Java에서 제한된 값 집합을 나타내는 데 사용되는 특수한 클래스 유형이다.
  • 제한된 선택을 하도록 강제하는 타입이다.
  • 주로 요일, 월, 카드 랭팅 등 제한된 집합을 표현할 때 사용된다.
enum Gender {
	MALE, FEMALE
}

public class Etc {
	static void printGenger(String gender) {
	if(gender.equals("남")) {
		System.out.println("남자입니다.");
	}
	if(gender.equals("여")) {
		System.out.println("여자입니다");
	}
}

	static void printGenger(Gender gender) {
		if(gender.equals(Gender.MALE)) {
			System.out.println("남자입니다.");
		}
		if(gender.equals(Gender.FEMALE)) {
			System.out.println("여자입니다");
		}
	}	
	
	static void printGenger(Gender gender) {
		if(gender.equals(Gender.MALE)) {
			System.out.println("남자입니다.");
		}
		if(gender.equals(Gender.FEMALE)) {
			System.out.println("여자입니다");
		}
	}
	public static void main(String[] args) {
		
		printGenger("남");
		printGenger("여");
		// 같은 뜻이지만 다른 표현이 오면 출력 되지 않는다.
		printGenger("남자");
		
		// 고민 없이 선택 타입만 지정 할 수 있다.
		printGenger(Gender.FEMALE);
	}
}

/*
출력 결과)
여자입니다.
*/

어노테이션

  • Java의 메타프로그래밍 기능으로, 코드에 메타데이터를 추가하는 방법을 제공한다.
  • 코드가 어떻게 동작하는지 정의하는 것이 아니라, 툴이나 프레임뭐크가 해당 코드를 어떻게 해석하고 사용해야 하는지에 대한 정보를 제공한다.
  • Override와 같이 동작을 하는 것이 아니라 컴파일러에게 코드 작성의 의도를 명확하게 알리는 것이다.
  • 코드 분석 툴이 코드를 더 잘 이해하고 오류를 찾는 데 도움이 된다.
  • 코드의 가독성을 높여준다.

@Override : 이 메소드가 슈퍼클래스의 메소드를 오버라이드하는 것임을 명시한다.

@Deprecated : 이 메소드가 더 이상 사용되지 않음을 명시한다.
(Integer i = new Integer(10); 와 같이 사용하지 않는 메소드를 표시해준다.)
@SuppressWarnings : 컴파일러 경고를 숨기기 위해 사용된다.
(노란색 줄로 표시되어 있는 컴파일러 경고)

람다식

  • 1회성 함수로 함수형 프로그래밍 스타일(트렌드)을 가지고 있으며 불필요한 코드를 줄이고 코드의 가독성을 향상시킬 수 있어 최근에 많이 사용하는 추세이다.
  • 람다식의 문법으로는 (매개변수) -> { 실행코드 }으로 람다식을 쓰므로써 함수 메서드를 변수처럼 다룰 수 있게 된다. 이를 화살표 함수라고도 부른다.
  • 함수형 프로그램을 위해 만들어졌기 때문에 자바에서는 많이 쓰이지 않고 자바 스크립트에서 많이 사용하고 있다.

API

  • Application Programming Interface
  • 인터페이스이며 의사소통의 도구이다.
  • 일반적으로 특정한 입력을 하면 특정한 데이터가 나오는 것을 API라고 한다.

Library

  • Math와 같이 구조를 미리 만들어 놓은 하나의 그룹이다.

Framework

  • 어떠한 목적을 달성하기 위해 복잡하게 얽혀있는 문제를 해결하기 위한 구조이며 개발에 있어서 뼈대, 틀 역할을 한다.
  • 정해진 규칙에 따라 개발을 하도록 만들어 놓았으며 규칙에 어긋나며 개발에 어려움이 발생한다.

Object 클래스란

  • 모든 클래스는 오브젝트라는 클래스를 상속 받아 만들어 지기 때문에 오브젝트 클래스는 모든 클래스의 부모 클래스가 된다.

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

좋은 글 잘 읽었습니다, 감사합니다.

답글 달기