슈퍼클래스 멤버 접근
public
: 모두 접근 가능
protected
: 같은 패키지 내 + 패키지 무관, 상속되는 서브클래스
디폴트
: 같은 패키지 내
private
: 접근 불가능
슈퍼/서브 클래스 생성자 호출과 실행
서브 생성자 호출
-> 슈퍼 생성자 호출
-> 슈퍼 생성자 실행
-> 서브 생성자 실행
슈퍼/서브 생성자 결정 방식 (P.200)
super(인자)
이용해 서브 클래스 개발자가 슈퍼 클래스 생성자
를 명시적 선택
컴파일러
가 자동으로 슈퍼 클래스 생성자
묵시적 선택
upcasting
: 서브 클래스 객체 -> 슈퍼 클래스 객체
슈퍼 클래스 멤버만 접근 가능
(사라지는 것 X 다시 downcasting
하면 다시 접근 가능)
instanceof
: 객체의 서브 클래스와 슈퍼 클래스 타입 검사, 객체에만 가능
동적바인딩
: 실행 메소드를 컴파일
시가 아니라 실행(runtime)
때 결정
메소드가 오버라이딩
됨 (P.214)
-> by 동적 바인딩
, 서브 클래스
의 오버라이딩란 메소드
호출됨
super
: 슈퍼클래스
에 대한 레퍼런스
super 키워드로 정적 바인딩
하여 슈퍼 클래스
멤버 접근
메소드 오버로딩
: 동일 클래스/상속 관계 : 정적 바인딩
메소드 중복 선언
하여 상황에 따라 다양하게 사용
동일 : 메소드 이름
차이 : 메소드 인자 갯수
/ 타입
메소드 오버라이딩
: 상속 관계 : 동적 바인딩
슈퍼 클래스의 메소드는 무시
, 서브 클래스에서 재정의
동일 : 메소드 이름
, 인자
, 갯수
, 리턴 타입
추상 메소드
: abstract
키워드와 함수 원형만 선언 : 다형성 실현
함수 원형 : 리턴타입 이름 () ;
-> { }
들어가면 함수 원형 아님
추상 클래스
만이 추상 메소드
가짐, 인스턴스 생성 불가
추상 클래스
상속 -> 서브클래스도 추상 클래스
추상 클래스 구현
:
서브 클래스에서 상속 받은 모든 추상 메소드 오버 라이딩함 -> 정상 클래스
됨
인터페이스
:implements
: 객체 생성 불가능, 레퍼런스 변수 선언 가능, 다중 상속 가능
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();
}
}
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));
}
}
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();
}
}
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();
}
}
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()+" ");
}
}
}
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("잘못된 입력입니다.");
}
}
}
}
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());
}
}