본문 바로가기

coding/Java

[Java] 배열과 상속 연습문제(1~3)

 

Q1. 다음 TV클래스가 있다. 아래의 main 메소드와 실행 결과를 참고하여 TV 클래스를 상속하여 ColorTV 클래스를 작성하라.

 

 

A1. main에서 객체 myTV의 printProperty() 함수를 호출한 걸 보니까 ColorTV 클래스에는 이 메소드가 있어야 한다. size 변수는 접근 수준 지시자가 private이기 때문에 그냥 접근할 수는 없고, getSize() 메소드를 통해 가져와야 한다는 걸 알 수 있다.

 

class TV {
	private int size;
	
	public TV(int size) { this.size = size; }
	
	protected int getSize() { return size; }
}

class ColorTV extends TV {
	private int resolution;
	
	public ColorTV(int size, int resolution) {
		super(size);
		this.resolution = resolution;
	}
	protected int getResolution() { return resolution; }
	
	public void printProperty() {
		System.out.println(getSize() + "인치 " + resolution + "컬러");
	}
}

public class FinalTermTest {
	public static void main(String[] args) {
		ColorTV mytv = new ColorTV(32, 1024);
		mytv.printProperty();
		
	}
}

 

 

 

Q2. 아래의 main 메소드, 실행 결과를 참고하여 위 1번 문제의 ColorTV를 상속하는 IPTV 클래스를 작성하시오.

 

 

A2. 일단 생성자의 인수가 늘어났으며, 여전히 printProperty() 메소드를 쓰는 것으로 보아 오버라이딩 했음을 알 수 있다.

 

import java.util.*;

class TV {
	private int size;
	
	public TV(int size) { this.size = size; }
	
	protected int getSize() { return size; }
}

class ColorTV extends TV {
	private int resolution;
	
	public ColorTV(int size, int resolution) {
		super(size);
		this.resolution = resolution;
	}
	protected int getResolution() { return resolution; }
	
	public void printProperty() {
		System.out.println(getSize() + "인치 " + resolution + "컬러");
	}
}

class IPTV extends ColorTV {
	private String address;
	
	public IPTV(String address, int size, int resolution) {
		super(size, resolution);
		this.address = address;
	}
	
	@Override
	public void printProperty() {
		System.out.println("나의 IPTV는 " + address + " 주소의 " + getSize() + "인치 " + getResolution() + "컬러");
	}
}

public class FinalTermTest {
	public static void main(String[] args) {
		IPTV iptv = new IPTV("192.1.1.2", 32, 2048);
		iptv.printProperty();
		
	}
}

 

 

 

Q3. 다음 Stack 인터페이스를 구현하는 StringStack 클래스를 만드시오. 그리고 다음 실행 예와 같이 작동하도록 main() 메소드를 작성하시오. "그만"을 입력하면 입력이 종료됩니다.

 

 

A3. c에서 배운 스택 자료구조랑 똑같이 짜면 됨(ptsd온다) 문자열 입력받는 Scanner랑 정수 입력받는 Scanner의 레퍼런스를 다르게 만드는게 중요함. 안그러면 입력을 이상하게 받음... 아직도 왜인지는 모른다...

 

import java.util.*;

interface Stack {
	int length(); //현재 스택에 저장된 개수
	int capacity(); //스택의 전체 저장 가능한 개수
	String pop(); //스택의 top에 실수 저장
	boolean push(String val); //스택의 top에 저장된 실수 반환
}

class StringStack implements Stack {
	private String[] stack;
	private int top;
	
	public StringStack(int capacity) {
		stack = new String[capacity];
		top = -1;
	}
	
	@Override
	public int length() {
		return top + 1;
	}
	
	@Override
	public int capacity() {
		return stack.length;
	}
	
	@Override
	public String pop() {
		if(top == -1)
			return null;
		String str = stack[top];
		top--;
		return str;
	}
	
	@Override
	public boolean push(String val) {
		if(top == stack.length - 1)
			return false;
		else {
			top++;
			stack[top] = val;
			return true;
		}
	}
}

public class FinalTermTest {
	public static void main(String[] args) {
		Scanner inputInt = new Scanner(System.in);
		Scanner inputString = new Scanner(System.in);
		
		System.out.print("총 스택 저장 공간의 크기 입력 >> ");
		int max = inputInt.nextInt();
		StringStack s1 = new StringStack(max);
		
		while(true) {
			System.out.print("문자열 입력 >> ");
			String str = inputString.nextLine();
			if(str.equals("그만"))
				break;
			boolean choice = s1.push(str);
			if(choice == false) 
				System.out.println("스택이 가득 참");
			
		}
		System.out.print("스택이 저장된 모든 문자열 팝 : ");
		int len = s1.length();
		for(int i = 0; i < len; i++)
			System.out.print(s1.pop() + " ");
		inputInt.close();
		inputString.close();
	}
}