히치키치

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

명품 자바 에센셜

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

히치키치 2021. 9. 1. 00:35

요약

  • 슈퍼클래스 멤버 접근
    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 PIradiusradius;
}

}

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

}

```

Comments