명품 자바 에센셜 5장 실습 문제

히치키치·2021년 6월 5일
0

요약

  • 슈퍼클래스 멤버 접근
    public : 모두 접근 가능
    protected : 같은 패키지 내 + 패키지 무관, 상속되는 서브클래스
    디폴트 : 같은 패키지 내
    private : 접근 불가능

  • 슈퍼/서브 클래스 생성자 호출과 실행
    서브 생성자 호출 -> 슈퍼 생성자 호출 -> 슈퍼 생성자 실행 -> 서브 생성자 실행

  • 슈퍼/서브 생성자 결정 방식 (P.200)
    super(인자)이용해 서브 클래스 개발자가 슈퍼 클래스 생성자를 명시적 선택
    컴파일러가 자동으로 슈퍼 클래스 생성자 묵시적 선택

  • upcasting : 서브 클래스 객체 -> 슈퍼 클래스 객체
    슈퍼 클래스 멤버만 접근 가능
    (사라지는 것 X 다시 downcasting하면 다시 접근 가능)

  • instanceof : 객체의 서브 클래스와 슈퍼 클래스 타입 검사, 객체에만 가능

  • 동적바인딩 : 실행 메소드를 컴파일 시가 아니라 실행(runtime) 때 결정

  • 메소드가 오버라이딩 됨 (P.214)
    -> by 동적 바인딩, 서브 클래스오버라이딩란 메소드 호출됨

  • super : 슈퍼클래스에 대한 레퍼런스
    super 키워드로 정적 바인딩 하여 슈퍼 클래스 멤버 접근

  • 메소드 오버로딩 : 동일 클래스/상속 관계 : 정적 바인딩
    메소드 중복 선언하여 상황에 따라 다양하게 사용
    동일 : 메소드 이름
    차이 : 메소드 인자 갯수 / 타입

  • 메소드 오버라이딩 : 상속 관계 : 동적 바인딩
    슈퍼 클래스의 메소드는 무시, 서브 클래스에서 재정의
    동일 : 메소드 이름, 인자, 갯수, 리턴 타입

  • 추상 메소드 : abstract 키워드와 함수 원형만 선언 : 다형성 실현
    함수 원형 : 리턴타입 이름 () ; -> { } 들어가면 함수 원형 아님

  • 추상 클래스만이 추상 메소드 가짐, 인스턴스 생성 불가

  • 추상 클래스 상속 -> 서브클래스도 추상 클래스

  • 추상 클래스 구현 :
    서브 클래스에서 상속 받은 모든 추상 메소드 오버 라이딩함 -> 정상 클래스

  • 인터페이스 :implements : 객체 생성 불가능, 레퍼런스 변수 선언 가능, 다중 상속 가능

1번

class Circle{
	private int radius;
	public Circle(int radius) {this.radius=radius;}
	public int getRadius() {return radius;	}
	
}

public class NamedCircle extends Circle{
	private String name;
	public NamedCircle(int radius, String name) {
		super(radius);
		this.name=name;
	}
	public void show() {
		System.out.println(name+", 반지름 = "+getRadius());
	}


public static void main(String[] args) {
	NamedCircle w= new NamedCircle(5, "Waffle");
	w.show();
	}
}

2번

interface AdderInterface{
	int add(int x, int y);//x와 y의 합 리턴
	int add(int n);//1에서 n까지의 정수 합 리턴. n은 0보다 큰 수 가정
}
public class MyAdder implements AdderInterface{
	
	public int add(int x, int y) {
		return x+y;
	}
	public int add(int x) {
		int sum=0;
		for(int i=1;i<=x;i++) {
			sum+=i;
		}
		return sum;
	}
	
	public static void main(String[] args) {
		MyAdder adder=new MyAdder();
		System.out.println(adder.add(5,10));
		System.out.println(adder.add(10));
	}

}

3번

import java.util.Scanner;

abstract class Calculator{
	protected int a,b;
	abstract protected int calc();//추상 매소드
	protected void input() {//두 정수를 입력받는 메소드
		Scanner scanner=new Scanner(System.in);
		System.out.print("정수 2개를 입력하시오>>");
		a=scanner.nextInt();
		b=scanner.nextInt();
	}
	public void run() {//두 정수를 입력받아 계산하고 결과를 출력하는 메소드
		input();
		int res=calc();
		System.out.println("계산된 값은 "+res);
	}
}

//Adder와 Subtracter 클래스 작성

class Adder extends Calculator{
	protected int calc() {
		return this.a+this.b;
	}
}

class Subtracter extends Calculator{
	protected int calc() {
		return this.a-this.b;
	}
	
}



public class App {
	
	public static void main(String[] args) {
		Adder adder=new Adder();
		Subtracter sub= new Subtracter();
		
		adder.run();
		sub.run();
	}

}

4번


class Point{
	private int x,y;
	public Point (int x, int y) {this.x=x; this.y=y;}
	public int getX() {return x;}
	public int getY() {return y;}
	protected void move(int x, int y) {this.x=x; this.y=y;	}
}


public class ColorPoint extends Point{
	String color;
	public ColorPoint(int x, int y, String color){
		super(x,y);
		this.color=color;
	}
	public void setPoint(int x, int y) {
		super.move(x,y);//슈퍼 클래스의 move 메소드 사용
	}
	public void setColor(String color) {
		this.color=color;
	}

	public void show() {
		System.out.println(color+"색으로("+getX()+","+getY()+")");
	}

	
	public static void main(String[] args) {
		ColorPoint cp=new ColorPoint(5,5,"Yellow");
		cp.setPoint(10,20);
		cp.setColor("GREEN");
		cp.show();
	}

}

5번


import java.util.Scanner;

interface StackInterface{
	int length();
	String pop();
	boolean push(String ob);
}

class StringStack implements StackInterface{
	String stack[]=new String[5];
	private int cnt=0; //zero indexing
	public int length() {
		return cnt+1; //갯수니까 0이 아니라 1부터 시작
	}
	public String pop() {
		return stack[--cnt]; //다섯 단어 다 입력되면 cnt=5인데 index는 0~4d임으로 cnt 1 감소해서 4로 만들고 시작 
	}
	
	public boolean push(String ob) {
		if(cnt==5) {return false;}
		else {
			stack[cnt]=ob;	//0부터 index 시작
			cnt++; //index 하나 증가해서 다음 칸으로 넘겨
			return true;
			}
	}
	
	
}

public class StackManger {
	
	public static void main(String[] args) {
		StringStack stringstack=new StringStack();
		Scanner scanner=new Scanner(System.in);
		for(int i=0;i<5;i++) {
			stringstack.push(scanner.next());
		}
		for(int i=0;i<5;i++) {
			System.out.print(stringstack.pop()+" ");
		}
	}

}

6번

package java_5;

import java.util.Scanner;

abstract class shape{
	abstract void draw();
}

class Editor extends shape{
	
	
	static int i=0;
	private String shape[]=new String[10];
	Scanner scanner=new Scanner(System.in);
	public void insert() {
		
		System.out.print("도형 종류 Line(1), Rect(2), Circle(3)>>");
		int choice=scanner.nextInt();
		switch(choice) {
		case 1:
			shape[i++]="Line";
			break;
		case 2:
			shape[i++]="Rect";
			break;
		case 3:
			shape[i++]="Circle";
			break;
		default:
			System.out.print("잘못된 입력입니다.");
		}

	}
	public void remove() {
		
		System.out.print("삭제할 도형의 위치>>");
		int idx=scanner.nextInt();
		if (idx<=i) {shape[idx--]=null;}
		else System.out.println("삭제할 수 없습니다.");
	}
	public void draw() {
		for(int k=0;k<i;k++) {
			//배열의 길이까지 출력하도록 설정하면 10개 다 안 찼을 떼 이상하게 출력됨 
			//도형이 입력된 i까지 출력되도록 ...
			System.out.println(shape[k]);
		}
	}

	
}

public class GraphicEdit {
	
	public static void main(String[] args) {
	Scanner scanner=new Scanner(System.in);
	Editor editor=new Editor();
	
	while(true) {

		System.out.print("삽입(1), 삭제(2), 모두 보기(3), 종료(4)>>");
		int choice=scanner.nextInt();
		switch(choice) {
		case 1:
			editor.insert();
			break;
		case 2:
			editor.remove();
			break;
		case 3:
			editor.draw();
			break;
		case 4:
			System.out.print("프로그램을 종료합니다...");
			System.exit(0);
		default:
			System.out.print("잘못된 입력입니다.");
		}
	}
	}
}

Bonus 1


package java_5;

interface Shape{
	
	final double PI=3.14;
	void draw();
	double getArea();
	default public void redraw() {
		System.out.println("--- 다시 그립니다. ---");
		draw();
	}
}

class Circle implements Shape{
	private int radius;
	public Circle(int radius) {
		this.radius=radius;
	}
	public void draw() {
		System.out.print("반지음 "+radius+" ");
	}
	public double getArea() {
		return PI*radius*radius;
	}
	
}

public class ShapeApp {
	public static void main(String[] args) {
		Shape coin=new Circle(10);//반지름이 10인 코인 객체 생성 
		coin.redraw(); //코인 다시 그리기
		System.out.println("코인의 면적은 "+coin.getArea());
	}

}

0개의 댓글