[Eclipse 연습]
[계산]
//Scanner를 이용하여 한 라인을 읽고,
//공백으로 분리된 어절이 몇 개인지 출력을 반복하는
//프로그램을 작성하라. “exit”이 입력되면 종료한다.
//
//단)stringTokenizer 활용
//try catch 구문 넣으시오.
package Override;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Test1 {
public static void main(String[] args) {
boolean run = true;
Scanner sc = new Scanner(System.in);
try {
while (run) {
System.out.println("문자를 입력하세요.");
String input = sc.nextLine();
StringTokenizer st1 = new StringTokenizer(input, " ");
int count = 0;
while (st1.hasMoreTokens()) { // StringTokenizer에 사용할 수 있는 토큰이 더 있는지 확인
System.out.println(st1.nextToken() + ' '); // StringTokenizer에서 다음 토큰을 불러오는 메서드
count++;
}
System.out.println("count" + count + "개의 단어입니다.");
System.out.println("종료하시겠습니까? replay / exit");
String yOrN = sc.nextLine();
if (yOrN.equals("replay")) {
continue;
} else if (yOrN.equals("exit")) {
System.out.println("종료합니다.");
run = false;
} else {
System.out.println("replay OR exit를 입력해주세요.");
run = false;
}
}
} catch (Exception e) {
System.out.println("오류발생");
}
}
}
[결과값]
문자를 입력하세요.
무궁화 꽃이 피었습니다.
무궁화
꽃이
피었습니다.
count3개의 단어입니다.
종료하시겠습니까? replay / exit
replay
문자를 입력하세요.
무궁화 꽃이 피었을까요?
무궁화
꽃이
피었을까요?
count3개의 단어입니다.
종료하시겠습니까? replay / exit
exit
종료합니다.
[계산]
package Override;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Test2 {
public static void main(String[] args) {
int count = 0;
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("문장을 입력하세요.");
try {
String words = scanner.nextLine();
if (words.trim().toUpperCase().equals("EXIT")) {
// toUpperCase() : 모든 문자를 대문자로 변환한다.
// trim() : 양 사이드 공백제거
break;
}
StringTokenizer tokens = new StringTokenizer(words, " ");
while (tokens.hasMoreTokens()) {
count++;
System.out.println(tokens.nextToken());
}
System.out.println("단어 갯수는: " + count);
count = tokens.countTokens();
} catch (Exception e) {
e.printStackTrace();
// System.out.println("잘못된 입력입니다. 프로그램을 처음부터 시작합니다.");
continue;
}
}
}
}
[결과값]
문장을 입력하세요.aa a a
aa
a
a
단어 갯수는: 3
문장을 입력하세요.df dfdae
df
dfdae
단어 갯수는: 2
문장을 입력하세요.exit
[제네릭]
[제네릭 이전 코드가 갖는 문제점]
aBox.set("Apple"); // 데이터 타입이 String이라 캐스팅 에러 나옴
oBox.set("Orange"); // 데이터 타입이 String이라 캐스팅 에러 나옴
System.out.println(aBox.get());
1.Object.toString()을 호출해서 주소가 나오게 되지만,
2.자식=부모로 되어 있기 때문에 Apple 문자열이 그대로 출력된다.
실제로는 에러가 떠야하지만, 실행 과정에서 조차 발견할 수 없어서 큰 문제가 된다!
[계산 : 제네릭 이전의 코드]
package 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) { // = new Apple()이 전달된다.
ob = o;
}
public Object get() {
return ob;
}
}
public class Test1 {
public static void main(String[] args) {
Box aBox = new Box(); // 상자 생성
Box oBox = new Box(); // 상자 생성
// 과일을 박스에 담는다.
aBox.set(new Apple());
oBox.set(new Orange());
// aBox.set("Apple"); // 데이터 타입이 String이라 캐스팅 에러 나옴
// oBox.set("Orange"); // 데이터 타입이 String이라 캐스팅 에러 나옴
// 자식=부모로 되어 있어서 변환을 시켜준다.
Apple ap = (Apple) aBox.get(); // 상자에서 사과를 꺼낸다.
Orange og = (Orange) oBox.get(); // 상자에서 오렌지를 꺼낸다.
System.out.println(ap);
System.out.println(og);
//어쩔 수 없이 형 변환의 과정이 수반된다.
// 그리고 이는 컴파일러의 오류 발견 가능성을 낮추는 결과로 이어진다.
}
}
[계산 : 제네릭 사용 코드]
package Generic;
//인스턴스 생성 시 결정이 되느느 자료형으이 정보를 T로 대체한다.
class Apple1 {
public String toString() {
return "Apple";
}
}
class Orange1 {
public String toString() {
return "Orange";
}
}
class BoxTest<T> { // <Apple> 을 받는다.
// <T> : 타입 매개변수(Type Parameter)
// 타입 인자(Type Argument)
private T ob;
public void set(T o) {
ob = o;
}
public T get() {
return ob;
}
}
public class GenericTest {
public static void main(String[] args) {
// 먼저 데이터 타입을 정해서
BoxTest<Apple1> aBox = new BoxTest<Apple1>(); // T를 Apple로 결정 // 박스애플이라 읽는다.
BoxTest<Orange1> oBox = new BoxTest<Orange1>(); // T를 Orange로 결정 // 박스오렌지라 읽는다.
aBox.set(new Apple1());
oBox.set(new Orange1());
System.out.println(aBox.get());
System.out.println(oBox.get());
// 상기와 동일한 내용
// Apple1 ap = aBox.get();
// Orange1 og = oBox.get();
//
// System.out.println(ap);
// System.out.println(og);
}
}
[결과값]
Apple
Orange
[계산 : 제네릭 사용 코드]
package 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;
}
}
public class GenericTest2 {
public static void main(String[] args) {
DBox<String, Integer> box = new DBox<String, Integer>();
box.set("Apple", 25);
System.out.println(box);
}
}
[결과값]
Apple & 25