Day 38 (23.02.17)

Jane·2023년 2월 17일
0

IT 수업 정리

목록 보기
45/124

1. StringTokenizer 예제


import java.util.Scanner;
import java.util.StringTokenizer;

class JavaTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		while (true) {
			System.out.print("문장 입력 : ");
			int count = 0;
			try {

				String words = sc.nextLine();
				if (words.trim().toUpperCase().equals("EXIT")) {
					// trim() : 처음과 끝의 공백 제거
					// toUpperCase() : 문자열을 모두 대문자로
					System.out.println("종료");
					System.exit(0);
				}

				StringTokenizer tokens = new StringTokenizer(words, " ");

				while (tokens.hasMoreTokens()) {
					System.out.println(tokens.nextToken());
					count++;
				}

				System.out.println("단어의 개수 : " + count);
				// count = tokens.countTokens();

			} catch (Exception e) {
				// e.printStackTrace();
				System.out.println("잘못된 입력입니다. 프로그램을 처음부터 시작합니다.");
				continue;
			}

		} // end of while

	} // end of main

}

2. Generic

2-1. Generic 이전의 코드

  • 사과가 담긴 박스, 오렌지가 담긴 박스
class Apple {
	@Override
	public String toString() {
		return "I AM AN APPLE";
	}
}

class Orange {
	@Override
	public String toString() {
		return "I AM AN ORANGE";
	}
}

class Box {
	private Object ob;

	public void set(Object o) {
		ob = o;
	}

	public Object get() {
		return ob;
	}
}

class JavaPractice {
	public static void main(String[] args) {
		Box aBox = new Box();
		Box oBox = new Box();

		// 박스에 과일 넣기
		aBox.set(new Apple());
		oBox.set(new Orange());

		// 과일 빼기 : get을 하면 Object가 return되므로, 강제 형 변환을 해줘야 한다. 
		Apple ap = (Apple) aBox.get();
		Orange og = (Orange) oBox.get();

		System.out.println(ap);
		System.out.println(og);
	}
}

[Console]
I AM AN APPLE
I AM AN ORANGE

2-2. Box 코드의 오류

  • 과일을 넣을 때 객체가 아닌 문자열로 담았다.
    코드 상에서 컴파일 에러가 나오지는 않지만, (문자열_String도 Object의 종류)
    박스에서 과일을 뺄 때 ClassCastException이 일어난다.
    (String을 Apple이나 Orange로 형 변환을 할 수 없다.)
aBox.set("Apple");
oBox.set("Orange");

Apple ap = (Apple) aBox.get();
Orange og = (Orange) oBox.get();

[Console]
Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class Apple (java.lang.String is in module java.base of loader 'bootstrap'; Apple is in unnamed module of loader 'app')
at JavaPractice.main(JavaPractice.java:37)

  • 문자열을 담으면, Apple 객체 / Orange 객체를 return 하는 것이 아니라,
    "Apple"이라는 문자열(String), "Orange"라는 문자열(String)이 return된다.
    • Object는 무엇이든 return할 수 있다.
    • String을 return하면 Override 적용한다.
aBox.set("Apple");
oBox.set("Orange");

System.out.println(aBox.get());
System.out.println(oBox.get());

2-3. Generic 정의하기

  • < T >로 선언하여 타입을 받는다. Object가 아닌 각각의 타입이 있는 객체를 생성할 수 있다.
    • 박스 클래스가 Object를 받는 것이 아니다.
      박스 클래스의 타입을 선언해서, 박스라는 큰 틀은 같지만 형태는 다른 방식으로 대응할 수 있도록 만든다.
    • 사과 박스, 오렌지 박스, 바나나 박스, 키위 박스...
  • 원하는 타입의 객체를 선언할 수 있으므로, 강제 형 변환을 하지 않아도 된다.
class Apple {
	@Override
	public String toString() {
		return "I AM AN APPLE";
	}
}

class Orange {
	@Override
	public String toString() {
		return "I AM AN ORANGE";
	}
}

class Box<T> {
	private T ob;

	public void set(T o) {
		ob = o;
	}

	public T get() {
		return ob;
	}
}

class JavaPractice {
	public static void main(String[] args) {
		Box<Apple> aBox = new Box<Apple>();
		Box<Orange> oBox = new Box<Orange>();
		
		aBox.set(new Apple());
		oBox.set(new Orange());
		
		Apple ap = aBox.get();
		Orange og = oBox.get();
		
		System.out.println(ap);
		System.out.println(og);
		
	}
}

[Console]
I AM AN APPLE
I AM AN ORANGE

  • Generic 을 적용했으므로, 미리 자료형(Data type)이 정해진 상태이다.
    그러므로, String 형식으로는 (만들어지지 않은 방식으로는) 받을 수 없다.

2-4. Generic의 특징

  • E(Element) K(Key) N(Number) T(Type) V(Value)
  • Generic에는 int, double과 같은 기본 자료형이 들어올 수 없다.
    Integer, Double과 같은 Wrapper 클래스를 사용한다.
  • 꺽쇄(<>) 안에 아무 것도 넣지 않아도, 컴파일러가 알아서 넣어준다.
Box<Apple> aBox = new Box<>();

3. Generic 연습

3-1. 둘 이상의 타입을 선언한 Generic

class DBox<L, R> {
	private L left;
	private R right;

	public void set(L o, R r) {
		left = o;
		right = r;
	}

	@Override
	public String toString() {
		return left + " & " + right;
	}
}

class JavaPractice {
	public static void main(String[] args) {

		DBox<String, Integer> box = new DBox<String, Integer>();
		box.set("Apple", 25);
		System.out.println(box);
	}
}

[Console]
Apple & 25

3-2. Box in Box

class Box<T>{
	private T ob;
	
	public void set(T o) {ob = o;}
	public T get() {return ob;}
}
class JavaTest {

	public static void main(String[] args) {
		Box<String> sBox = new Box<>();
		sBox.set("I am so happy.");
		System.out.println(sBox);
		
		Box<Box<String>> wBox = new Box<>(); // 박스 안의 박스
		wBox.set(sBox);
		System.out.println(wBox);
		
		Box<Box<Box<String>>> zBox = new Box<>(); // 박스 안의 박스 안의 박스
		zBox.set(wBox);
		System.out.println(zBox);
		
		System.out.println(zBox.get().get().get());
		System.out.println(wBox.get().get());
		System.out.println(sBox.get());
	} // end of main

}

[Console]
Box@4926097b
Box@762efe5d
Box@5d22bbb7
I am so happy.
I am so happy.
I am so happy.

3-3. 이름과 나이를 저장하는 Generic 클래스

class Person<L, R>{
	private L name;
	private R age;
	
	public void set(L name, R age) {
		this.name = name;
		this.age = age;
	}
	
	public String toString() {
		return (name + " " + age + "세입니다.");
	}
}


class JavaTest {

	public static void main(String[] args) {
		Person<String, Integer> p = new Person<String, Integer>();
		p.set("홍길동", 25);
		System.out.println(p);

	}

}

[Console]
홍길동 25세입니다.

profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글