[2017/2/14] Project Java: CH 7. 객체지향 프로그래밍 II 코드

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이다.

댓글 남기기