buffer, next()와 nextLine(), Properties, 가변형 인수, 제네릭, enum

dev_hnbm·2023년 11월 2일
0

대덕인재개발원

목록 보기
11/30

🛢 buffer

  • 데이터를 일시적으로 저장하거나 처리하기 위한 메모리 공간
  • CPU가 일을 효율적으로 처리하기 위해서 필요
  • JAVA에서는 주로 입출력 스트림과 관련하여 사용

키보드로 입력한 데이터는 어떻게 처리될까? ⌨

  • console에서 Scanner 클래스를 사용하여 데이터를 입력받을 때
    1. CPU가 버퍼에 데이터 존재 유무를 검사한다.
    2. 데이터가 있다면 바로 가져가고, 없다면 키보드로 입력받는 작업을 버퍼에게 시킨다.
    3. 이때 CPU는 다른 일을 함!
    4. 키보드 입력 후 엔터를 치면 버퍼가 CPU에게 전달한다.



✔ next()와 nextLine()

next()

  • nextInt(), nextFloat(), nextLong() .. 등 nextLine()을 제외한 메소드 모두 동일하게 적용된다.
  • enter, tab, 공백 → 데이터를 구분하는 문자로 취급한다.
  • 따라서 Scanner로 1 2 3을 공백을 준 상태로 입력한다면 변수 3개에 1, 2, 3을 담을 수 있다.

nextLine()

  • 한줄 전체를 입력받아 enter를 제외한 나머지를 읽는다.
  • nextLine() 이전에 next()를 사용했을 때, next()가 남긴 개행 문자를 소비해야 한다.
System.out.print("전화번호 >> ");
String tel = scan.next();

scan.nextLine(); // next()가 남긴 개행 문자 소비 (입력 버퍼 비우기)
System.out.print("주소 >> ");
String addr = scan.nextLine();




📌 Properties

  • Map보다 축소된 기능의 객체로, 데이터를 파일로 입출력할 수 있는 기능이 있다.
MapProperties
key, value모든 타입의 객체를 담을 수 있다.String 타입의 객체만을 담을 수 있다.
데이터 입출력 메소드put(), get()setProperty(), getProperty()




🔢 가변형 인수

  • 메소드를 호출할 때마다 인수의 개수를 다르게 설정하고 싶을 때 사용하며,
    이때 넘겨진 인수들은 메소드 내부에서 배열로 처리된다.
  • 가변형 인수와 일반 인수를 같이 사용할 경우 가변형 인수를 제일 뒤쪽으로 배치해야 한다.
  • 한가지의 자료형만 사용 가능하다.
public int sumArgs(int ... data) {
  int sum = 0;

  for(int i=0; i<data.length; i++) {
    sum += data[i];
  }

  return sum;
}


// main
System.out.println(test.sumArgs(1, 2, 3, 4, 5));




✔ 제네릭 클래스 작성하기

제네릭 타입 글자
👇 아래의 네가지 종류를 가장 많이 사용한다.

  • T: Type
  • K: Key
  • V: Value
  • E: Element

작성 형식

class 클래스명<제네릭타입글자> {

  // 변수 선언에 제네릭 사용할 경우
  private 제네릭타입글자 변수명; 
  .
  .

  // 메소드의 반환값에 제네릭 사용할 경우
  접근제한자 제네릭타입글자 메소드명() { 
    .
    .
    return;
  }

  // 메소드의 매개변수에 제네릭을 사용할 경우
  접근제한자 반환값타입 메소드명(제네릭타입글자 변수명, ...) { 
	  .
	  .
  }

}

작성해보기

// 제네릭 사용
class MyGeneric<T> {
	private T value;
	
	public T getValue() {
		return value;
	}
	
	public void setValue(T value) {
		this.value = value;
	}
}

// 제네릭 미사용
class NonGenericTest {
	private Object value;
	
	public Object getValue() {
		return value;
	}
	
	public void setValue(Object value) {
		this.value = value;
	}
}

public class GenericTest {

	public static void main(String[] args) {
		NonGenericTest ng1 = new NonGenericTest();
		ng1.setValue("가나다라");

		NonGenericTest ng2 = new NonGenericTest();
		ng2.setValue(100);
		
		String strTemp = (String)ng1.getValue();
		System.out.println("문자열 반환값: " + strTemp);
		
		int iTemp = (int)ng2.getValue();
		System.out.println("정수형 반환값: " + iTemp);
		
		System.out.println("-----------------------");
		
		MyGeneric<String> mg1 = new MyGeneric<>();
		mg1.setValue("우리나라");
//		mg1.setValue(100); // 제네릭으로 지정한 자료형과 다른 자료형은 오류
		
		MyGeneric<Integer> mg2 = new MyGeneric<>();
		mg2.setValue(500);
//		mg2.setValue("안녕"); // 오류
		
		strTemp = mg1.getValue();
		iTemp = mg2.getValue();
		
		System.out.println("제네릭 문자열 반환값: " + strTemp);
		System.out.println("제네릭 정수형 반환값: " + iTemp);
		System.out.println("-----------------------");
		
		NonGenericTest ng3 = new NonGenericTest();
		ng3.setValue("ABCD");
	}

}




🔠 enum (열거형)

  • 서로 관련 있는 상수들의 집합
  • 클래스처럼 보이게 하는 상수

작성 위치

  • 하나의 java 파일에 독립적인 클래스처럼 만들 수 있고,
  • 하나의 java 파일에 클래스와 같이 만들 수 있고,
  • 클래스의 내부에 내부 클래스처럼 만들 수 있다.

속성 및 메소드

  • name(): 열거형 상수의 이름을 문자열로 반환
  • ordinal(): 열거형 상수가 정의된 순서값(index) 반환
  • valueOf(”열거형상수명”): 지정된 열거형에서 ‘열거형상수명’과 일치하는 열거형 상수를 반환
    • 열거형이름.상수명valueOf() 메소드와 동일
  • 열거형이름.values(): 모든 상수들을 배열로 가져옴

선언하기

  1. enum 열거형이름 { 상수명1, 상수명2, .. }
public enum Color { RED, GREEN, BLUE }
public enum Count { ONE, TWO, THREE }

// 열거형을 switch문으로 비교하기
Count mycnt = Count.ONE; // or Count.valueOf("ONE")
switch(mycnt) {
  case ONE: System.out.println("ONE값"); break;
  case TWO: System.out.println("TWO값"); break;
  case THREE: System.out.println("THREE값"); break;
}
  1. enum 열거형이름 { 상수명1(값들), 상수명2(값들), .. }
// 계절을 나타내는 상수 작성 (기간, 평균온도)
public enum Season {("3월부터 5월까지", 13),
  여름("6월부터 8월까지", 28),
  가을("9월부터 11월까지", 15),
  겨울("12월부터 2월까지", 1);
  
  // 값들이 저장될 변수
  private String span;
  private int temp;
  
  // 생성자
  Season(String span, int temp) { // private 생략해도 자동으로 됨
    this.span = span;
    this.temp = temp;
  
  }
  
  // getter 메소드 작성
  public String getSpan() {
    return span;
  }
  public int getTemp() {
    return temp;
  }
}

0개의 댓글