
하나의 제품 정보를 가지는 Product class 를 정의하고, ProductManager class 에서 테스트
- 제품 종류, 제품명, 가격, 관리번호, 전체 등록 제품수
-> 가격 : -(minus) 값 적용 불가
관리번호 : 변경 불가
전체 등록 제품수 : 제품이 하나 추가될 때 마다 증가
package ch10_quiz;
public class Product {
private static int cnt; // 등록된 제품수
private String kind; // 종류
private String name; // 제품명
private int price; // 가격
private final String serial; // 관리번호
public Product(String kind, String name, int price, String serial) {
++cnt;
this.kind = kind;
this.name = name;
this.price = price;
this.serial = serial;
System.out.println(this.name + " 등록 완료");
}
public String getKind() { return kind; }
public void setKind(String kind) {
this.kind = kind;
}
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public int getPrice() { return price; }
public void setPrice(int price) {
if(price >= 0)
this.price = price;
}
public void info() {
System.out.println("--- 제 품 정 보 ---");
System.out.println("종 류 : " + kind);
System.out.println("제품명 : " + name);
System.out.println("가 격 : " + price + " 원");
System.out.println("S/N : " + serial);
}
public static void currentCnt() {
System.out.println("등록 제품수 : " + cnt);
}
}
package ch10_quiz;
import java.util.Scanner;
public class ProductManager {
public static void main(String[] args) {
Product proA = new Product("유제품", "꿀단지 바나나", 2000, "0001");
proA.info();
Product proB = new Product("스낵", "감자칩", 1500, "0002");
proB.info();
Product.currentCnt();
}
}
꿀단지 바나나 등록 완료
--- 제 품 정 보 ---
종 류 : 유제품
제품명 : 꿀단지 바나나
가 격 : 2000 원
S/N : 0001
감자칩 등록 완료
--- 제 품 정 보 ---
종 류 : 스낵
제품명 : 감자칩
가 격 : 1500 원
S/N : 0002
등록 제품수 : 2
package ch01_inheritance;
public class Point {
private int px;
private int py;
public Point() {
System.out.println("- Point() -");
this.px = this.py = 0;
}
public Point(int px, int py) {
System.out.println("- Point(int xp, int py) -");
this.px = px;
this.py = py;
}
public int getPx() {
return px;
}
public void setPx(int px) {
this.px = px;
}
public int getPy() {
return py;
}
public void setPy(int py) {
this.py = py;
}
public void twoPoint() {
System.out.println("좌표 X : " + px + " - Y : " + py);
}
}
상속 ( inheritance )
상속 방법
class 자식클래스명 extands 부모클래스명 {
}
package ch01_inheritance;
public class PointTriple extends Point{
private int pz;
public PointTriple() {
super(); // 부모클래스 생성자 호출 // 자동생성
System.out.println("- PointTriple() -");
}
public PointTriple(int px, int py, int pz) {
super(px,py);
System.out.println("- PointTriple(int px, int py, int pz) -");
this.pz = pz;
}
// 부모클래스에서 private를 사용했기 때문에 사용하려면 getter로 불러와야함
public void threePoint() {
System.out.println("좌표 X : " + getPx() + " - Y : " + getPy() + " - Z : " + pz);
}
}
package ch01_inheritance;
public class PointTest {
public static void main(String[] args) {
Point pointA = new Point(10,20);
pointA.twoPoint();
PointTriple ptA = new PointTriple();
// 상속받은 부모클래스 생성자 먼저 진행 후 자식클래스 생성자 진행
// super();
ptA.threePoint();
PointTriple ptB = new PointTriple(11, 22, 33);
}
}

- Point(int xp, int py) -
좌표 X : 10 - Y : 20
- Point() -
- PointTriple() -
좌표 X : 0 - Y : 0 - Z : 0
- Point(int xp, int py) -
- PointTriple(int px, int py, int pz) -
좌표 X : 11 - Y : 22 - Z : 33
package ch01_inheritance;
public class Article {
private int no; // 번호
private String title; // 제목
public Article() {}
public Article(int no, String title) {
super();
this.no = no;
this.title = title;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
package ch01_inheritance;
public class ArticleQA extends Article{
private String answer ;
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public void result() {
System.out.println("질문/답변 [ 번호 : " + getNo()
+ " - 질문 : " + getTitle()
+ " - 답변 : " + answer+ " ]");
}
}
package ch01_inheritance;
public class ArticleFile extends Article{
private String fileName; // 파일명
public ArticleFile() {}
public ArticleFile(int no, String title, String fileName) {
super(no, title);
this.fileName = fileName;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public void fileInfo() {
System.out.println("자료실 [ No." + getNo()
+ " - 제목 : " + getTitle()
+ " - 파일명 : " + fileName + " ]");
}
}
package ch01_inheritance;
public class ArticleTest {
public static void main(String[] args) {
ArticleQA qa1 = new ArticleQA();
qa1.setNo(1);
qa1.setTitle("첫번째 질문 ?");
qa1.setAnswer("답변입니다...");
qa1.result();
ArticleFile af = new ArticleFile(1, "상속 연습", "상속.pdf");
af.fileInfo();
}
}
질문/답변 [ 번호 : 1 - 질문 : 첫번째 질문 ? - 답변 : 답변입니다... ]
자료실 [ No.1 - 제목 : 상속 연습 - 파일명 : 상속.pdf ]
Product class 를 정의
- 제품명, 가격의 관리가 가능합니다
package ch02_quiz;
public class Product {
private String name;
private int price;
public Product() {}
public Product(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public void productInfo() {
System.out.println("--- Product 정보 ---");
System.out.println("제품명 :" + name);
System.out.println("가격 :" + price);
}
}
SmartPhone class 를 정의하고, PhoneTest class 에서 테스트
- Product class 를 상속받고, 전화번호, 통신사의 관리가 가능합니다
package ch02_quiz;
public class SmartPhone extends Product{
private String pn;
private String telecom;
public SmartPhone() {}
public SmartPhone(String name, int price, String pn, String telecom) {
super(name, price);
this.pn = pn;
this.telecom = telecom;
}
public String getPn() {
return pn;
}
public void setPn(String pn) {
this.pn = pn;
}
public String getTelecom() {
return telecom;
}
public void setTelecom(String agency) {
this.telecom = agency;
}
public void phoneInfo() {
System.out.println("--- SmartPhone 정보 ---");
super.productInfo(); // 부모의 메서드를 사용하는 것을 알리기 위해 super.
System.out.println("전화번호 :" + pn);
System.out.println("통신사 :" + telecom);
}
}
package ch02_quiz;
public class PhoneTest {
public static void main(String[] args) {
SmartPhone sp1 = new SmartPhone("iPhone_Xs", 123123, "010-1234-5678", "LG_u+");
sp1.phoneInfo();
sp1.setPrice(123);
sp1.setPn("010-4567-8910");
sp1.setTelecom("SKT");
sp1.phoneInfo();
SmartPhone sp2 = new SmartPhone();
sp2.phoneInfo();
sp2.setName("asdasd");
sp2.setPrice(333312);
sp2.setPn("010-1111-2124");
sp2.setTelecom("KT");
sp2.phoneInfo();
}
}
--- SmartPhone 정보 ---
--- Product 정보 ---
제품명 :iPhone_Xs
가격 :123123
전화번호 :010-1234-5678
통신사 :LG_u+
--- SmartPhone 정보 ---
--- Product 정보 ---
제품명 :iPhone_Xs
가격 :123
전화번호 :010-4567-8910
통신사 :SKT
--- SmartPhone 정보 ---
--- Product 정보 ---
제품명 :null
가격 :0
전화번호 :null
통신사 :null
--- SmartPhone 정보 ---
--- Product 정보 ---
제품명 :asdasd
가격 :333312
전화번호 :010-1111-2124
통신사 :KT
Person class 를 정의
- 이름, 나이의 관리가 가능
package ch02_quiz2;
public class Person {
private String name;
private int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void personInfo() {
System.out.println("--- 사람 정보 ---");
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
}
Celebrity class 를 정의하고, PersonTest class 에서 테스트
- Person class 를 상속받고, 소속사의 관리가 가능
package ch02_quiz2;
public class Celebrity extends Person{
private String agency;
public Celebrity() {}
public Celebrity(String name, int age, String agency) {
super(name, age);
this.agency = agency;
}
public String getAgency() {
return agency;
}
public void setAgency(String agency) {
this.agency = agency;
}
public void celeInfo() {
System.out.println("- 연예인 정보 -");
super.personInfo();
System.out.println("소속사 : " + agency);
}
}
Police class 를 정의하고, PersonTest class 에서 테스트
- Person class 를 상속받고, 계급의 관리가 가능
package ch02_quiz2;
public class Police extends Person{
private String classes;
public Police() {}
public Police(String name, int age, String classes) {
super(name, age);
this.classes = classes;
}
public String getClasses() {
return classes;
}
public void setClasses(String classes) {
this.classes = classes;
}
public void polInfo() {
System.out.println("--- 경찰 정보 ---");
super.personInfo();
System.out.println("계급 : " + classes);
}
}
package ch02_quiz2;
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.personInfo();
System.out.println("- 값 set -");
p1.setName("김사람");
p1.setAge(22);
p1.personInfo();
Person p2 = new Person("이사람", 33);
p2.personInfo();
Celebrity c1 = new Celebrity();
c1.celeInfo();
System.out.println("- 값 set -");
c1.setName("박유명");
c1.setAge(44);
c1.setAgency("YG");
c1.celeInfo();
Celebrity c2 = new Celebrity("저유명", 45,"HIVE");
c2.celeInfo();
Police pl1 = new Police();
pl1.polInfo();
System.out.println("- 값 set -");
pl1.setName("김경찰");
pl1.setAge(32);
pl1.setClasses("경위");
pl1.polInfo();
Police pl2 = new Police("이경찰", 34,"경장");
pl2.polInfo();
}
}
--- 사람 정보 ---
이름 : null
나이 : 0
- 값 set -
--- 사람 정보 ---
이름 : 김사람
나이 : 22
--- 사람 정보 ---
이름 : 이사람
나이 : 33
- 연예인 정보 -
--- 사람 정보 ---
이름 : null
나이 : 0
소속사 : null
- 값 set -
- 연예인 정보 -
--- 사람 정보 ---
이름 : 박유명
나이 : 44
소속사 : YG
- 연예인 정보 -
--- 사람 정보 ---
이름 : 저유명
나이 : 45
소속사 : HIVE
--- 경찰 정보 ---
--- 사람 정보 ---
이름 : null
나이 : 0
계급 : null
- 값 set -
--- 경찰 정보 ---
--- 사람 정보 ---
이름 : 김경찰
나이 : 32
계급 : 경위
--- 경찰 정보 ---
--- 사람 정보 ---
이름 : 이경찰
나이 : 34
계급 : 경장
오버라이드 ( override )
package ch03_override;
public class Point {
private int px;
private int py;
public Point() {
System.out.println("- Point() -");
this.px = this.py;
}
public Point(int px, int py) {
System.out.println("- Point(int xp, int py) -");
this.px = px;
this.py = py;
}
public int getPx() {
return px;
}
public void setPx(int px) {
this.px = px;
}
public int getPy() {
return py;
}
public void setPy(int py) {
this.py = py;
}
public void twoPoint() {
System.out.println("좌표 X : " + px + " - Y : " + py);
}
public void info() {
System.out.println("좌표 X : " + px + " - Y : " + py);
}
}
package ch03_override;
public class PointTriple extends Point{
private int pz;
public PointTriple() {
super();
System.out.println("- PointTriple() -");
}
public PointTriple(int px, int py, int pz) {
super(px,py);
System.out.println("- PointTriple(int px, int py, int pz) -");
this.pz = pz;
}
public void threePoint() {
System.out.println("좌표 X : " + getPx() + " - Y : " + getPy() + " - Z : " + pz);
}
// 상속받은 부모의 메소드를 재정의 하여 기능을 다르게 쓸 수 있음
@Override
public void info() {
System.out.println("좌표 X : " + getPx() + " - Y : " + getPy() + " - Z : " + pz);
}
}
package ch03_override;
public class PointTest {
public static void main(String[] args) {
Point pointA = new Point(10,20);
pointA.twoPoint();
System.out.println();
PointTriple ptA = new PointTriple();
ptA.threePoint();
System.out.println();
PointTriple ptB = new PointTriple(11, 22, 33);
ptB.threePoint();
ptB.info(); //@override
}
}
- Point(int xp, int py) -
좌표 X : 10 - Y : 20
- Point() -
- PointTriple() -
좌표 X : 0 - Y : 0 - Z : 0
- Point(int xp, int py) -
- PointTriple(int px, int py, int pz) -
좌표 X : 11 - Y : 22 - Z : 33
좌표 X : 11 - Y : 22 - Z : 33
package ch04_casting;
public class Base {
private String item;
public Base() {
item = "기본 무기";
}
public void baseAttack() {
System.out.println(item + " 사용");
}
}

package ch04_casting;
public class UnitA extends Base{
private String unitItem;
public UnitA() {
unitItem = "방어막";
}
public void unitAttack() {
System.out.println(unitItem + " 사용");
}
}
package ch04_casting;
public class UnitB extends Base{
}
instanceof 연산자
package ch04_casting;
public class CastingTest {
public static void main(String[] args) {
UnitA userA = new UnitA();
userA.baseAttack();
userA.unitAttack();
// UpCasting : 자동
Base base = userA;
base.baseAttack();
// base.unitAttack();
// -> Error -> 업캐스팅 했기 때문에 UnitA에 있는 unitAttack 는
// 타입에 맞지 않아 사용 못 함
// DownCasting : 변환 타입 지정
// 다운캐스팅 할 때 확인해야 하는 이유
// -> 다른 자식클래스도 부모클래스를 상속 받았을 수 있기 때문
if(base instanceof UnitA) {
userA = (UnitA)base;
userA.baseAttack();
userA.unitAttack();
}
// 코드작성할 때는 써짐, 하지만 실행해보면 Error
// UnitB userB = (UnitB)base; // Error
if(base instanceof UnitB) {
}else {
System.out.println("UnitB 타입이 아님");
}
}
}
추상 클래스
추상 메소드
- 기능구현은 상속받은 자식 클래스에서 override 해서 사용
- 기본적으로 상속을 위해 사용됨
- 자식클래스에서 override 가 강제성을 띔
package ch05_abstract;
public abstract class Calc {
protected int dataA;
protected int dataB;
public abstract void showData();
public void typeInfo() {
System.out.println("- Calc class -");
}
}
class Add extends Calc{
// protected 이기 때문에 상속받은 Add class 에서 바로 사용 가능
public Add(int a, int b) {
dataA = a;
dataB = b;
}
// 상속받은 Calc 클래스의 추상메소드를 override 하지 않으면 Error
@Override
public void showData() {
System.out.println(dataA + " + " + dataB + " = " + (dataA + dataB));
}
}
class Sub extends Calc{
public Sub(int a, int b) {
dataA = a;
dataB = b;
}
@Override
public void showData() {
System.out.println(dataA + " - " + dataB + " = " + (dataA - dataB));
}
}
package ch05_abstract;
import java.util.Scanner;
public class CalcMain {
public static void main(String[] args) {
Add add = new Add(11, 22);
add.showData();
Sub sub = new Sub(33, 44);
sub.showData();
// Error
// -> class의 형태가 완벽하게 잡히지 않았기 때문에 객체 생성 자체가 불가
// Calc calc = new Calc();
// 정적 binding
Calc calc = null; // -> 참조변수는 생성 가능
calc = add; // 업캐스팅
// 메소드를 override를 했다면 override 한 메소드 사용 가능
calc.showData();
calc = sub; // 업캐스팅
calc.showData();
// 부모의 객체하나로 자식클래스의 메서드를 모두 사용할 수 있게 됨
// -> 다형성
Calc run = null;
int a = 123;
int b = 45;
Scanner sc = new Scanner(System.in);
System.out.print("+ / - 입력 >> ");
char opt = sc.next().charAt(0);
switch (opt) {
case '+':
// 굳이 만들 필요가 없음
// -> 위에서 run을 만들었기 때문에 바로 사용 가능
// Add tmp = new Add(a,b);
// run = tmp;
// binding
// 동적 : 실행중에 생성하여 결정 / 정적 : 사용할 객체가 미리 정의
// 아래는 동적 binding
run = new Add(a, b);
break;
case '-':
run = new Sub(a, b);
break;
}
if (run != null) {
run.showData();
}
}
}
Military class 를 상속받는 Army, Navy, AirForce class 를 정의
- MilitaryTest class 에서 Militaty class 변수를 사용해서 다형성으로 구현한 코드를 작성
package ch06_quiz;
public abstract class Military {
private String name; // 군대 이름(육군, 해군, 공군)
public Military(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void attack(); // 공격
public abstract void move(); // 공격
}
package ch06_quiz;
public class Army extends Military{
public Army(String name) {
super(name);
}
@Override
public void attack() {
System.out.println(getName() + " 공격");
}
@Override
public void move() {
System.out.println(getName() + " 이동");
}
}
package ch06_quiz;
public class Navy extends Military{
public Navy(String name) {
super(name);
}
@Override
public void attack() {
System.out.println(getName() + " 공격");
}
@Override
public void move() {
System.out.println(getName() + " 이동");
}
}
package ch06_quiz;
public class AirForce extends Military{
public AirForce(String name) {
super(name);
}
@Override
public void attack() {
System.out.println(getName() + " 공격");
}
@Override
public void move() {
System.out.println(getName() + " 이동");
}
}
package ch06_quiz;
import java.util.Scanner;
public class MilitaryTest {
public static void main(String[] args) {
Military mi = null;
Scanner sc = new Scanner(System.in);
System.out.print("1. 육군, 2. 해군, 3. 공군 선택 >> ");
int select = sc.nextInt();
switch (select) {
case 1:
mi = new Army("육군");
break;
case 2:
mi = new Navy("해군");
break;
case 3:
mi = new AirForce("공군");
break;
default:
System.out.println("입력 오류");
}
if (mi != null) {
mi.move();
mi.attack();
}
}
}
육군, 2. 해군, 3. 공군 선택 >> 1
육군 이동
육군 공격
육군, 2. 해군, 3. 공군 선택 >> 2
해군 이동
해군 공격
육군, 2. 해군, 3. 공군 선택 >> 3
공군 이동
공군 공격