1. 상속
class Tv{
boolean power;
int channel;
void power() {
power = !power;
}
void channelUp(){
++channel;
}
void channelDown(){
–channel;
}
}
class CaptionTv extends Tv{
boolean caption;
void displayCaption(String text){
if(caption){
System.out.println(text);
}
}
}
public class Hello {
public static void main(String[] args) {
CaptionTv ctv = new CaptionTv();
ctv.channel = 10;
ctv.channelUp();
System.out.println(ctv.channel);
ctv.displayCaption(“Hello World!1”);
ctv.caption = true;
ctv.displayCaption(“Hello World!2”);
}
}
2. 상속에서 ~is~a, ~has~a 구분
public class Hello {
public static void main(String[] args) {
Point[] p = {
new Point(100, 100),
new Point(140, 50),
new Point(200, 100)
};
Triangle t = new Triangle(p);
Circle c = new Circle(new Point(100, 100), 50);
t.draw();
c.draw();
}
}
class Shape {
String color = “black”;
void show(){
System.out.printf(“[color = %s]%n”, color);
}
}
class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
Point(){
this (0,0);
}
String getXY(){
return “(“+x+”, “+y+”)”;
}
}
class Circle extends Shape{
Point center;
int r;
Circle(){
this (new Point(0,0), 100);
}
Circle(Point center, int r){
this.center = center;
this.r = r;
}
void draw(){
System.out.printf(“[center = (%d, %d), r = %d, color = %s] %n”, center.x, center.y, r, color);
}
}
class Triangle extends Shape{
Point[] p = new Point[3];
Triangle(Point[] p){
this.p = p;
}
void draw(){
System.out.printf(“귀찮아%n”);
}
}
3. 상속 종합
public class Hello {
public static void main(String[] args) {
Point[] p = {
new Point(100, 100),
new Point(140, 50),
new Point(200, 100)
};
Triangle t = new Triangle(p);
Circle c = new Circle(new Point(100, 100), 50);
t.draw();
c.draw();
}
}
class Shape {
String color = “black”;
void show(){
System.out.printf(“[color = %s]%n”, color);
}
}
class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
Point(){
this (0,0);
}
String getXY(){
return “(“+x+”, “+y+”)”;
}
}
class Circle extends Shape{
Point center;
int r;
Circle(){
this (new Point(0,0), 100);
}
Circle(Point center, int r){
this.center = center;
this.r = r;
}
void draw(){
System.out.printf(“[center = (%d, %d), r = %d, color = %s] %n”, center.x, center.y, r, color);
}
}
class Triangle extends Shape{
Point[] p = new Point[3];
Triangle(Point[] p){
this.p = p;
}
void draw(){
System.out.printf(“귀찮아%n”);
}
}
4. 단일상속 조건 하에서 포함관계 이용해서 다중상속처럼 구현하기
class Tv{
boolean power;
int channel;
void power() {
power = !power;
}
void channelUp(){
++channel;
}
void channelDown(){
–channel;
}
}
class VCR{
boolean power;
int counter = 0;
void power(){
power = !power;
}
void play(){}
void stop(){}
void rew(){}
}
class TVCR extends Tv{
VCR vcr = new VCR();
int counter = vcr.counter;
void play(){
vcr.play();
}
void stop(){
vcr.stop();
}
void rew(){
vcr.rew();
}
}
5. super 이용하기
public class Hello {
public static void main(String[] args) {
Child c = new Child();
c.method();
}
}
class Parent{
int x = 10;
}
class Child extends Parent{
int x = 20;
void method(){
System.out.println(super.x); //10
System.out.println(this.x); //20
System.out.println(x); //20
}
}
6. super() 메서드 사용
public class Hello{
public static void main(String[] args){
Point3D p3 = new Point3D(1,2,3);
}
}
class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
String getLocation(){
return “x :”+x+”, y: “+y;
}
}
class Point3D extends Point{
int z;
Point3D(int x, int y, int z){
super(x, y);
this.z = z;
}
String getLocation(){
return “귀찮”;
}
}
7. import문 사용
import java.text.SimpleDateFormat;
import java.util.Date;
public class Hello{
public static void main (String[] args){
Date today = new Date();
SimpleDateFormat date = new SimpleDateFormat(“yyyy/MM/dd”);
SimpleDateFormat time = new SimpleDateFormat(“hh:mm:ss a”);
System.out.println(“오늘 날짜는 ” + date.format(today));
System.out.println(“현재 시간은” + time.format(today));
}
}
8. import static 사용
import static java.lang.System.out;
import static java.lang.Math.*;
public class Hello{
public static void main (String[] args){
out.println(random());
out.println(“Math.PI : “+PI);
}
}
9. final 멤버변수는 선언과 동시에 초기화 해야하지만 인스턴스 변수의 경우 생성자에서 초기화할 수 있다.
class Card{
final int NUMBER;
final String KIND;
static int width = 100;
static int height = 250;
Card(String kind, int num){
KIND = kind;
NUMBER = num;
}
Card(){
this (“HEART”, 1);
}
public String toString(){
return KIND + ” ” + NUMBER;
}
}
public class Hello{
public static void main(String[] args){
Card c = new Card(“HEART”, 10);
System.out.println(c.NUMBER);
}
}
10. getter와 setter 이용하기
class Card{
final int NUMBER;
final String KIND;
static int width = 100;
static int height = 250;
Card(String kind, int num){
KIND = kind;
NUMBER = num;
}
Card(){
this (“HEART”, 1);
}
public String toString(){
return KIND + ” ” + NUMBER;
}
}
public class Hello{
public static void main(String[] args){
Card c = new Card(“HEART”, 10);
System.out.println(c.NUMBER);
}
}
11. 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다. 다만 인스턴스에서 사용할 수 있는 멤버의 범위를 조절할 뿐.
public class Hello{
public static void main(String[] args){
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
fe.water();
car = fe;
fe2 = (FireEngine)car;
fe2.water();
}
}
class Car{
String color;
int door;
void drive(){
System.out.println(“drive, Brrr~”);
}
void stop(){
System.out.println(“stop!”);
}
}
class FireEngine extends Car{
void water(){
System.out.println(“water!”);
}
}
12.instanceof 연산자는 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위한 연산자이다.
public class Hello{
public static void main(String[] args){
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
fe.water();
car = fe;
fe2 = (FireEngine)car;
fe2.water();
}
}
class Car{
String color;
int door;
void drive(){
System.out.println(“drive, Brrr~”);
}
void stop(){
System.out.println(“stop!”);
}
}
class FireEngine extends Car{
void water(){
System.out.println(“water!”);
}
}
13. 멤버변수가 조상 클래스와 자손 클래스에 중복으로 정의된 경우 조상 타입의 참조변수를 사용했을 때는 조상 클래스에 선언된 멤버변수가 사용되고, 자손타입의 참조변수를 사용했을 때는 자손 클래스에 선언된 멤버변수가 사용된다.
public class Hello{
public static void main(String[] args){
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
fe.water();
car = fe;
fe2 = (FireEngine)car;
fe2.water();
}
}
class Car{
String color;
int door;
void drive(){
System.out.println(“drive, Brrr~”);
}
void stop(){
System.out.println(“stop!”);
}
}
class FireEngine extends Car{
void water(){
System.out.println(“water!”);
}
}
다만 이런 경우를 막기 위해서라도 주로 멤버변수들을 private으로 접근을 제한하여 외부에서는 메서드 통해서만 접근할 수 있도록 해야 한다.
14. 매개변수의 다형성
class Product{
int price;
int bonusPoint;
Product (int price){
this.price = price;
this.bonusPoint = (int)(price/10.0);
}
}
class Tv extends Product{
Tv(){
super(100);
}
public String toString(){
return “Tv”;
}
}
class Computer extends Product{
Computer(){
super(200);
}
public String toString(){
return “Computer”;
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
void buy(Product p){
if(money < p.price){
System.out.println("잔액이 부족하여 물건을 살 수 없습니다");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p+"를 구입했습니다");
}
}
public class Hello{
public static void main(String[] args){
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
System.out.println(b.money);
System.out.println(b.bonusPoint);
}
}
15. 14번에서 Product를 객체 배열로 받기.
class Product{
int price;
int bonusPoint;
Product (int price){
this.price = price;
this.bonusPoint = (int)(price/10.0);
}
}
class Tv extends Product{
Tv(){
super(100);
}
public String toString(){
return "Tv";
}
}
class Computer extends Product{
Computer(){
super(200);
}
public String toString(){
return "Computer";
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
void buy(Product p){
if(money < p.price){
System.out.println("잔액이 부족하여 물건을 살 수 없습니다");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p+"를 구입했습니다");
}
}
public class Hello{
public static void main(String[] args){
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
System.out.println(b.money);
System.out.println(b.bonusPoint);
}
}
- itemList += (i == 0) ? ""+item[i] : ", "+item[i]; 신박
16.
Vector item = new Vector();
item.add(p);
item.isEmpty()
item.get(i);
item.size(); --> length 구하기
class Product{
int price;
int bonusPoint;
Product (int price){
this.price = price;
this.bonusPoint = (int)(price/10.0);
}
}
class Tv extends Product{
Tv(){
super(100);
}
public String toString(){
return “Tv”;
}
}
class Computer extends Product{
Computer(){
super(200);
}
public String toString(){
return “Computer”;
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
void buy(Product p){
if(money < p.price){
System.out.println("잔액이 부족하여 물건을 살 수 없습니다");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p+"를 구입했습니다");
}
}
public class Hello{
public static void main(String[] args){
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
System.out.println(b.money);
System.out.println(b.bonusPoint);
}
}
17. 인터페이스
class Product{
int price;
int bonusPoint;
Product (int price){
this.price = price;
this.bonusPoint = (int)(price/10.0);
}
}
class Tv extends Product{
Tv(){
super(100);
}
public String toString(){
return "Tv";
}
}
class Computer extends Product{
Computer(){
super(200);
}
public String toString(){
return "Computer";
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
void buy(Product p){
if(money < p.price){
System.out.println("잔액이 부족하여 물건을 살 수 없습니다");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p+"를 구입했습니다");
}
}
public class Hello{
public static void main(String[] args){
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
System.out.println(b.money);
System.out.println(b.bonusPoint);
}
}
-인터페이스는 인터페이스를 '상속'할 수 있다.
18. 인터페이스를 이용한 다형성의 구현
class Product{
int price;
int bonusPoint;
Product (int price){
this.price = price;
this.bonusPoint = (int)(price/10.0);
}
}
class Tv extends Product{
Tv(){
super(100);
}
public String toString(){
return "Tv";
}
}
class Computer extends Product{
Computer(){
super(200);
}
public String toString(){
return "Computer";
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
void buy(Product p){
if(money < p.price){
System.out.println("잔액이 부족하여 물건을 살 수 없습니다");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p+"를 구입했습니다");
}
}
public class Hello{
public static void main(String[] args){
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
System.out.println(b.money);
System.out.println(b.bonusPoint);
}
}
19. 인터페이스의 실례
class Product{
int price;
int bonusPoint;
Product (int price){
this.price = price;
this.bonusPoint = (int)(price/10.0);
}
}
class Tv extends Product{
Tv(){
super(100);
}
public String toString(){
return "Tv";
}
}
class Computer extends Product{
Computer(){
super(200);
}
public String toString(){
return "Computer";
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
void buy(Product p){
if(money < p.price){
System.out.println("잔액이 부족하여 물건을 살 수 없습니다");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p+"를 구입했습니다");
}
}
public class Hello{
public static void main(String[] args){
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
System.out.println(b.money);
System.out.println(b.bonusPoint);
}
}
20.
인터페이스를 대체 왜 쓰는가
인터페이스를 적절하게 써야 사용자와 제공자 간의 '간접관계'가 형성될 수 있다.
class Product{
int price;
int bonusPoint;
Product (int price){
this.price = price;
this.bonusPoint = (int)(price/10.0);
}
}
class Tv extends Product{
Tv(){
super(100);
}
public String toString(){
return "Tv";
}
}
class Computer extends Product{
Computer(){
super(200);
}
public String toString(){
return "Computer";
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
void buy(Product p){
if(money < p.price){
System.out.println("잔액이 부족하여 물건을 살 수 없습니다");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p+"를 구입했습니다");
}
}
public class Hello{
public static void main(String[] args){
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
System.out.println(b.money);
System.out.println(b.bonusPoint);
}
}
21.
class Product{
int price;
int bonusPoint;
Product (int price){
this.price = price;
this.bonusPoint = (int)(price/10.0);
}
}
class Tv extends Product{
Tv(){
super(100);
}
public String toString(){
return "Tv";
}
}
class Computer extends Product{
Computer(){
super(200);
}
public String toString(){
return "Computer";
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
void buy(Product p){
if(money < p.price){
System.out.println("잔액이 부족하여 물건을 살 수 없습니다");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p+"를 구입했습니다");
}
}
public class Hello{
public static void main(String[] args){
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
System.out.println(b.money);
System.out.println(b.bonusPoint);
}
}
-이 문제의 class B의 toString() 메서드를 오버라이딩 할 때 public 이 붙어야 한다.
Object 클래스에 정의된 toString() 메서드 자체가 public 접근자를 가지고 있기 때문에
이를 오버라이딩한 메서드는 당연히 public 이 붙어야 한다.
22. default와 static 메서드
class Product{
int price;
int bonusPoint;
Product (int price){
this.price = price;
this.bonusPoint = (int)(price/10.0);
}
}
class Tv extends Product{
Tv(){
super(100);
}
public String toString(){
return "Tv";
}
}
class Computer extends Product{
Computer(){
super(200);
}
public String toString(){
return "Computer";
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
void buy(Product p){
if(money < p.price){
System.out.println("잔액이 부족하여 물건을 살 수 없습니다");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p+"를 구입했습니다");
}
}
public class Hello{
public static void main(String[] args){
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
System.out.println(b.money);
System.out.println(b.bonusPoint);
}
}
-default는 키워드지 접근 제어자가 아니다. default 메서드도 접근 제어자는 public이다.