package animal;
// 인터페이스의 변수와 함수
// 1. 변수 : public static final 생략
// 2. 함수 : public abstract 생략
// 3. 통로의 역할 - 동적 바인딩
// 4. 무조건 추상메서드만 존재가능 -> 강제성부여
// 5. new 할 수 없다
// 고정된 범위의 값을 주는 것을 [도메인]을 준다고 한다
interface 부서 {
int 총무과 = 10; // 공통코드
int 생산팀 = 20; // 공통코드
int 인사과 = 30; // 공통코드
int 행정과 = 40; // 공통코드
}
interface Cal {
int num = 10; // 인터페이스의 변수는 무조건 public static final 이다.
}
public class InterfaceEx01 {
public static void main(String[] args) {
System.out.println(Cal.num);
}
}
package stars1;
// 인터페이스는 추상 클래스와 유사
// 다른점 : 추상 메서드만 존재가능
// 동적 바인딩의 통로로만 사용
// 메서드에 public abstract를 생략가능
// 제작자와 이용자의 약속 - 키보드에서 a를 누르면 작동원리를 몰라도 컴퓨터에 a가 입력된다
// 프로토콜 : 동등한 관계의 상호 협의하에 이루어진 약속
// 인터페이스 : 제작자가 사용법만 알려주고 이용자가 사용하는 식의 약속
public interface Behavior {
public abstract void move();
public void repair();
void attack(Behavior unit);
public String getName();
public int getHp();
public void setHp(int hp);
}
추상클래스
package stars1.protoss;
import stars1.Behavior;
public abstract class Protoss implements Behavior {
// 움직임과 쉴드 치료는 프로토스 유닛 공통이기 때문에 추상 클래스에 바로 만들어준다
// 이렇게 만든 공통 메서드들은 구체클래스들에 구현하지 않아도 되서 어댑터 역할도 한다
@Override
public void move() {
System.out.println("이동");
}
@Override
public void repair() {
System.out.println("쉴드 치료");
}
public static void upgrade() {
Zealot.attack++;
Dragoon.attack++;
System.out.println("프로토스 업그레이드 완료");
}
}
일반 클래스
package stars1.protoss;
import stars1.Behavior;
public class Zealot extends Protoss {
private String name;
private int hp;
private int sh; // 보호막
public static int attack = 10;
public Zealot(String name) {
this.name = name;
this.hp = 100;
this.sh = 100;
}
@Override
public void attack(Behavior unit) {
unit.setHp(unit.getHp() - attack);
System.out.println(unit.getHp());
}
@Override
public int getHp() {
return hp;
}
@Override
public void setHp(int hp) {
this.hp = hp;
}
@Override
public String getName() {
return name;
}
}
메인
package stars1;
import stars1.protoss.Dragoon;
import stars1.protoss.Protoss;
import stars1.protoss.Zealot;
public class StartGame {
public static void move(Behavior b) {
b.move();
}
public static void repair(Behavior b) {
b.repair();
}
public static void attack(Behavior b1, Behavior b2) {
System.out.println(b1.getName() + "이 " + b2.getName() + "을 공격했습니다.");
System.out.println(b2.getName() + "의 현재 체력");
b1.attack(b2);
}
public static void main(String[] args) {
Protoss.upgrade();
Zealot z1 = new Zealot("질럿1");
Zealot z2 = new Zealot("질럿2");
Dragoon d1 = new Dragoon("드라군1");
attack(z1, d1);
repair(z1);
}
}
주의 : 이클립스 또는 STS를 한글디렉토리 또는 띄어쓰기가 있는 디렉토리에 설치하신 분은 프로그램이 실행 안될 가능성이 있습니다. 띄어쓰기 없는 영문명 디렉토리에 IDE를 설치해주세요
롬복을 사용하면 게터와 세터를 자동으로 만들어준다
package stars1.protoss;
import lombok.Data;
@Data
public class Zealot{
private String name;
private int hp;
private static int attack;
public static void main(String[] args) {
Zealot z1 = new Zealot();
z1.getName();
z1.setHp(10);
}
}
게터만 만들려면
package stars1.protoss;
import lombok.Getter;
@Getter
public class Zealot{
private String name;
private int hp;
private static int attack;
public static void main(String[] args) {
Zealot z1 = new Zealot();
z1.getName();
z1.setHp(10);
}
}
롬복 디폴트생성자, 모든 변수 생성자, 게터 세터
package stars1.protoss;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
// 어노테이션 - 컴파일러가 읽고 해당 내용을 코드를 띄우기전에 먼저 동작
@AllArgsConstructor // 모든 힙 변수를 받는 생성자 자동생성
@NoArgsConstructor // 디폴트 생성자 자동생성
@Data // 게터와 세터 자동생성 @Getter @Setter 를 이용할 수도 있다.
public class Zealot{
private String name;
private int hp;
private static int attack;
}
객체지향 프로그래밍 기술은 코딩을 쉽게 하려고 하는 것이기 때문에, 일부 요소를 제작할 때 어렵다면 사용하지 않아도 된다.
1. 오버라이드 override : 부모 클래스의 메서드를 무효화시킨다. 2. 상속 : (1) 부모의 모든 것을 물려 받는 것. (2) 다형성이 충족 되어야 한다 (생물 - 동물 - 사자) -- 사자는 생물이며 동물이며 사자다. 3. 동적 바인딩 : 런타임시 필요한 메서드를 찾아가는 것.
상속
배우는 한국인이 아닐 수 있기 때문에 한국인에 상속되지 않는다
박서준을 new하면 사람 아시아인 한국인 박서준의 모든 속성이 뜬다
num을 호출하는 순간 부모 클래스들을 쭉 찾아 올라간다
자료형을 부모 자료형으로 제작하고, 생성자는 자식으로 할 수 있다
다운캐스팅
package ch05;
class 사람 {
int num = 10;
}
class 아시아인 extends 사람 {
int num = 30;
}
class 한국인 extends 아시아인 {
}
class 박서준 extends 한국인 {
int num = 20;
}
public class EveryPerson {
public static void main(String[] args) {
박서준 b1 = new 박서준();
System.out.println(b1.num);
한국인 b2 = new 박서준(); // 한국인 자료형이지만 박서준 클래스의 데이터도 메모리에 떠 있다
System.out.println(b2.num);
박서준 downB2 = (박서준)b2; // 업캐스팅이 선행되어 new를 한 경우 다운캐스팅이 가능하다
System.out.println(downB2.num);
사람 b3 = new 한국인();
System.out.println(b3.num);
// 박서준 b4 = new 한국인(); //오류가 난다
// System.out.println(b4.num);
}
}
오버라이딩, 동적 바인딩
package ch05;
class Car {
void run() {
System.out.println("기본 움직임");
}
}
class Sonata extends Car {
// 오버라이드 : 부모 클래스의 메서드를 무효화 시키는 것 (재사용과는 다르다는 것을 주의)
// [실행시!!]에 부모 메서드를 무시한다!
// 동적 바인딩 (C언어에서는 동적 로딩 이라고 한다)
// 동적 바인딩은 런타임시 필요한 메서드를 찾아가는 것이다.
@Override // 어노테이션
void run() {
super.run(); // super는 부모의 heap
System.out.println("소나타만의 움직임");
}
}
public class CarEx01 {
public static void main(String[] args) {
Car c1 = new Car();
c1.run();
System.out.println("----------");
Car s1 = new Sonata();
s1.run();
}
}
package ch05;
class Animal {
// 오버라이딩 하려면 원본 메서드가 필요하다.
String getName() {
return "동물";
}
}
class Dog extends Animal {
final String NAME = "강아지";
// 오버라이딩
String getName() {
return NAME;
}
}
class Cat extends Animal {
final String NAME = "고양이";
// 오버라이딩
String getName() {
return NAME;
}
}
class Bird extends Animal {
final String NAME = "새";
// 오버라이딩
String getName() {
return NAME;
}
}
public class AnimalEx01 {
// 매개변수를 Animal 타입으로 받으니 Dog Cat Bird가 묵시적 업캐스팅이 된다.
// Animal에는 NAME이 없으니 빨간줄이 뜬다.
// 그것을 해결 하려면 오버라이딩을 사용한다.
// 변수 호출은 자료형 기준이다.
// 함수(메서드)호출은 생성자 기준이다.(오버라이딩)
// 자식의 오버라이딩을 찾아 내려가는 것을 동적 바인딩이라고 한다.
static void attack(Animal u1, Animal u2) {
System.out.println(u2.getName() + "가 " + u1.getName() + "에게 공격 당했습니다.");
}
public static void main(String[] args) {
Dog d1 = new Dog();
Cat c1 = new Cat();
Bird b1 = new Bird();
System.out.println(d1.NAME + "탄생");
System.out.println(c1.NAME + "탄생");
System.out.println(b1.NAME + "탄생");
// 강아지 vs 고양이
attack(d1, c1);
// 강아지 vs 새
attack(d1, b1);
// 고양이 vs 새
attack(c1, b1);
}
}
객체지향 프로그래밍 1. Object - 실제로 존재할 수 있는 것을 상상 - 생산될 질럿을 머릿 속으로 상상 2. class - 추상적인 설계도, 또는 구체적인 설계도 - 프로토스 또는 질럿의 속성과 기능을 코드로 표현 3. Instance - 클래스를 통해 Object가 실체화 된 것 - 생산된 질럿 4. 생성자 - 클래스의 속성을 초기화 5. this - 인스턴스화 했을때 해당 인스턴스를 가리킨다 6. 행동(책임) - 메서드 7. 속성은 행동에 의해 변경된다. 8. 오버로딩 - 동일한 이름의 메서드를 여러가지 매개변수로 생성 9. final - 한번 초기화 하면 변경 할 수 없다. 불변데이터. Read Only 10. 오버로딩의 한계 - 자료형이 한정되어 있을때 사용
오브젝트 - 구체적인것 클래스 - 추상적이거나, 구체적. 이것을 이용해서 구체적인 것(오브젝트)를 만들 수 있는 것