40일차 java 연산(2023-02-17)

권단비·2023년 2월 17일
0

IT

목록 보기
75/139

[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

0개의 댓글