스포츠마케터의 초보 개발자 도전기
JAVA study 14 본문
1. abstract 추상메서드
package ex1_abstract;
public abstract class AbsParent {
// ↑ 추상메서드를 하나라도 가지고 있는 클래스는 abstract 클래스로 만들어줘야한다.
int value = 100;
String str = "";
public int getValue() {
return value;
}
// 추상메서드 abstract
// 추상메서드는 body가 없다
// abstract 키워드를 가지고 있다
abstract public void setValue(int n);
}
--
package ex1_abstract;
public class AbsChild extends AbsParent {
// 추상클래스를 상속받은 자식클래스는
// 부모가 가지고 있는 추상메서드를 (사용하지 않더라도)반드시 받아두어야한다
// 부모인 추상클래스는 자신이 미완성한 기능을 자식이 완성시키도록 조건부 상속하고 있다
@Override
public void setValue(int n) {
System.out.println(n);
}
}
--
package ex1_abstract;
public class AbsMain {
public static void main(String[] args) {
AbsChild c = new AbsChild();
c.setValue(10);
// 추상클래스는 인스턴스를 직접 가질 수 없다
// 즉, 객체화 시킬 수 없다;
AbsParent p = new AbsParent() {
@Override
public void setValue(int n) {
}
};
}// main
}
추상메서드로 스타크래프트 이해
package ex2_unit;
public abstract class Unit {
String name;
int energy;
boolean fly;
abstract public void decEnergy();
public String getName() {
return name;
}
public int getEnergy() {
return energy;
}
public boolean isFly() {
return fly;
}
}
--
package ex2_unit;
public class Terran extends Unit {
public Terran(String name, int energy, boolean fly) {
super.name = name;
super.energy = energy;
super.fly = fly;
}
@Override
public void decEnergy() { // 남은 에너지
energy -= 3; // 공격받으면 깎이는 에너지
}
}
package ex2_unit;
public class Protoss extends Unit {
public Protoss(String name, int energy, boolean fly) {
super.name = name;
super.energy = energy;
super.fly = fly;
}
@Override
public void decEnergy() {
energy--;
}
}
package ex2_unit;
public class Zerg extends Unit {
public Zerg(String name, int energy, boolean fly) {
super.name = name;
super.energy = energy;
super.fly = fly;
}
@Override
public void decEnergy() {
energy -= 10;
}
}
--
package ex2_unit;
public class UnitMain {
public static void main(String[] args) {
Terran t1 = new Terran("해병", 100, false);
t1.decEnergy(); // 공격당함
t1.decEnergy(); // 공격당함
System.out.println("테란 에너지 : " + t1.getEnergy());
Zerg z1 = new Zerg("히드라", 200, false);
z1.decEnergy(); // 공격당함
System.out.println("히드라 에너지: " + z1.getEnergy());
Protoss p1 = new Protoss("셔틀", 150, true);
p1.decEnergy();
p1.decEnergy();
p1.decEnergy();
System.out.println("셔틀 에너지: " + p1.getEnergy());
}// main
}
2. interface 인터페이스
1) 인터페이스 사용시 인터페이스 클래스(일반 클래스 아님) 선택해야함
package ex3_interface;
public interface InterParent {
// interface에는 추상메서드와 상수 이외의 속성이 들어갈 수 없다
// interface는 서비스 요청에 따른 중개자 역할
abstract int getA();
final int VALUE = 10;
// final : 상수를 지칭하는 키워드
// 상수 : 프로그램 종료까지 절대 바뀌지 않는 값
// 상수는 모든 글자를 대문자로 작성하는 것이 관례
}
--
package ex3_interface;
public class InterChild implements InterParent {
//interface는 extends로 상속받지 못하고 implements로 '구현'
@Override
public int getA() {
return 10;
}
}
--
package ex3_interface;
public class InterMain {
public static void main(String[] args) {
InterChild c = new InterChild();
System.out.println(c.getA());
// 인터페이스 역시 미완성된 메서드가 있기 때문에
// 직접적으로 메모리를 할당받는 것은 불가능
InterParent ip = new InterParent() {
@Override
public int getA() {
// TODO Auto-generated method stub
return 0;
}
};
}// main
}
예제) 메뉴판
package ex4_interface;
public interface Menu1 {
// 인터페이스는 추상과 상수만 사용 가능하기 때문에
// abstract, final 키워드를 따로 명시하지 않아도 된다
public String jjajang();
public String jjambbong();
}
package ex4_interface;
public interface Menu2 {
public String tangsuyuck();
}
package ex4_interface;
public interface Menu3 {
public String boggeumbab();
}
package ex4_interface;
public interface MenuAll extends Menu1, Menu2, Menu3 {
// interface만이 유일하게 interface끼리 extends로 다중 상속가능하다
public String mandu();
}
--
package ex4_interface;
public class Kitchen implements MenuAll {
//public class Kitchen implements Menu1, Menu2, Menu3 {
//interface는 구현 능력을 가지고 있지않으므로, 일반 상속과는 다르게 다중 구현이 가능하다
@Override
public String jjajang() {
return "중면 + 춘장소스";
}
@Override
public String jjambbong() {
return "홍합 + 오징어";
}
@Override
public String tangsuyuck() {
return "돼지고기";
}
@Override
public String boggeumbab() {
return "이천쌀";
}
@Override
public String mandu() {
return "다진고기";
}
}
--
package ex4_interface;
public class UserMain {
public static void main(String[] args) {
Kitchen kit = new Kitchen();
System.out.println(kit.jjajang());
System.out.println(kit.jjambbong());
System.out.println(kit.tangsuyuck());
}// main
}
3. Anonymous 익명클래스
package ex5_anonymous;
import java.util.Random;
import java.util.Scanner;
public class Ex1_Anonymous {
public static void main(String[] args) {
// 아래코드는 sc라는 객체이름을 정해두고
// 필요할때마다 sc로부터 매서드를 호출할 수 있는 구조
Scanner cs = new Scanner(System.in);
// rnd라는 이름이 있는 Random클래스
Random rnd = new Random();
int n = rnd.nextInt(2);
int n2 = rnd.nextInt(3);
// 이름이 없는 Random클래스
// 익명클래스는 호출 되었을때 딱한번만 사용되고 메모리에서 삭제
int n3 = new Random().nextInt(5);
}// main
}
package ex6_anonymousInner;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class EventMain {
public static void main(String[] args) {
Frame f = new Frame();
f.setSize(300, 300);
Button btn = new Button("버튼입니다");
f.add(btn);
// 익명 내부클래스
// 메서드의 파라미터로 이름이 없는 클래스가 생성되는 구조
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
f.setVisible(true);
}// main
}
tip) eclipese Frame 사용시 한글이 깨지고 인식되지 않을때 해결방법 ↓
4. Generic
package ex7_generic;
public class GenTest<T> {
// 제네릭 클래스 (제너릭 타입)
// 클래스명에 <>가 있으면 제네릭 타입
// 일반적인 코드를 작성하되, 이 코드를 다양한 타입의 객체에 대하여
// 재활용이 가능하도록 만들어둔 클래스
T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
package ex7_generic;
public class GenMain {
public static void main(String[] args) {
// <>의 제네릭 타입으로는 반드시 클래스가 들어와야한다
// <>을 String클래스로 만들어서 원래만들었던 T는 String타입으로 바꼈음
GenTest<String> g1 = new GenTest<String>();
g1.setValue("Hi");
String s = g1.getValue();
System.out.println(s);
GenTest<Integer> g2 = new GenTest<Integer>();
g2.setValue(10);
int num = g2.getValue();
System.out.println(num);
}// main
}
과졔)
package ex8_work;
import java.util.Scanner;
public class Ex1_work {
public static void main(String[] args) {
// 크림빵 500원
// 새우깡 700원
// 콜라 400원
// 사용자가 현재 가지고 있는 금액을 키보드에서 입력받고,
// 크림빵, 새우깡, 콜라를 잔돈을 하나도 남기지않고 구입할 수 있는
// 모든 경우의 수를 출력. 단, 사용하지 않는 상품이 있으면 안된다.
// ----
// 소지금 입력 : 4000원
// 크림빵 1개, 새우깡 1봉지, 콜라 7캔
// 크림빵 2개, 새우깡 2봉지, 콜라 4캔
// 크림빵 3개, 새우깡 3봉지, 콜라 1캔
// 크림빵 5개, 새우깡 1봉지, 콜라 2캔
int cream = 500;
int ggang = 700;
int coke = 400;
Scanner sc = new Scanner(System.in);
System.out.print("소지금을 입력하세요 : ");
int money = sc.nextInt();
for (int i = 500; i <= money - 1100; i += 500) {
for (int j = 700; j <= money - 900; j += 700) {
for (int k = 400; k <= money - 1200; k += 400) {
if (((cream * i / 500) + (ggang * j / 700) + (coke * k / 400)) == money) {
System.out.printf("크림빵 %d개, 새우깡 %d개, 콜라 %d캔\n", (i / 500), (j / 700), (k / 400));
}
} // for3
} // for2
} // for1
}// main
}
과제) tCode
package ex8_work;
import java.util.Scanner;
public class Ex1_work_tCode {
public static void main(String[] args) {
// 크림빵 500원
// 새우깡 700원
// 콜라 400원
// 사용자가 현재 가지고 있는 금액을 키보드에서 입력받고,
// 크림빵, 새우깡, 콜라를 잔돈을 하나도 남기지않고 구입할 수 있는
// 모든 경우의 수를 출력. 단, 사용하지 않는 상품이 있으면 안된다.
// ----
// 소지금 입력 : 4000원
// 크림빵 1개, 새우깡 1봉지, 콜라 7캔
// 크림빵 2개, 새우깡 2봉지, 콜라 4캔
// 크림빵 3개, 새우깡 3봉지, 콜라 1캔
// 크림빵 5개, 새우깡 1봉지, 콜라 2캔
int cream = 500;
int ggang = 700;
int coke = 400;
Scanner sc = new Scanner(System.in);
System.out.print("소지금을 입력하세요 : ");
int money = sc.nextInt();
for (int i = 1; money - i * cream > 0; i++) {
for (int j = 1; money - j * ggang > 0; j++) {
for (int k = 1; money - k * coke > 0; k++) {
if (money == i * cream + j * ggang + k * coke) {
System.out.printf("크림빵 %d개, 새우깡 %d개, 콜라 %d개\n", i, j, k);
}
}
}
} // outer
}// main
}
'develop > JAVA' 카테고리의 다른 글
JAVA study 16 (0) | 2024.03.19 |
---|---|
JAVA study 15 (0) | 2024.03.18 |
JAVA study 13 (0) | 2024.03.14 |
JAVA study 12 (0) | 2024.03.13 |
JAVA study 11 (1) | 2024.03.12 |