계층별로 패키지 정렬하기

 

 

객체지향 프로그래밍 기술은 코딩을 쉽게 하려고 하는 것이기 때문에, 일부 요소를 제작할 때 어렵다면 사용하지 않아도 된다.

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. 오버로딩의 한계  - 자료형이 한정되어 있을때 사용

오브젝트 - 구체적인것
클래스 - 추상적이거나, 구체적.  이것을 이용해서 구체적인 것(오브젝트)를 만들 수 있는 것

state - 변수

behavior - 함수(메서드)

------------------

생성자 자동생성

------------------

 

public - 모든 패키지에서 접근 가능

private - 클래스 내부

( 비어있는) - 같은 패키지에서 찾을 수 있음

------------------

시퀀스 - 일정하게 증가

-----------------

아래의 field는  heap 전역변수공간을 말한다

----------------

final 즉, 상수는 대문자로 적는게 약속

---------------

static 변수 - 공유변수 - heap끼리 공유할 수 있는 변수

---------------

package stars;

// 다크템플러 DarkTempler, 리버 River

class Zealot {
	final String NAME; // 한번 초기화하면 Read Only , 대문자로 적는 것이 약속
	int hp;
	static int attack = 10;

	public Zealot(String name) {
		this.NAME = name;
		this.hp = 100;
	}

}

class Dragoon {
	final String NAME;
	int hp;
	static int attack = 15;

	public Dragoon(String name) {
		this.NAME = name;
		this.hp = 100;
	}

}

class DarkTempler {
	final String NAME;
	int hp;
	static int attack = 50;

	public DarkTempler(String name) {
		this.NAME = name;
		this.hp = 100;
	}

}

class River {
	final String NAME;
	int hp;
	static int attack = 70;

	public River(String name) {
		this.NAME = name;
		this.hp = 100;
	}

}

public class GameStart {

	// 질럿이 드라군을 때림
	static void attack(Zealot u1, Dragoon u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	// 오버로딩 - 추가적재 - 다른함수로 인식
	static void attack(Dragoon u1, Zealot u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(Zealot u1, Zealot u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(Dragoon u1, Dragoon u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(Zealot u1, DarkTempler u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(Zealot u1, River u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(Dragoon u1, DarkTempler u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(Dragoon u1, River u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(DarkTempler u1, Zealot u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}
	
	static void attack(DarkTempler u1, DarkTempler u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(DarkTempler u1, Dragoon u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(DarkTempler u1, River u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(River u1, Zealot u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	static void attack(River u1, Dragoon u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 " + u1.NAME + "에 의해서 공격당하고 있습니다.");
		if(u2.hp <= 0) {
			System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
			System.out.println(u2.NAME+ "이 죽었습니다.");
		} else {			
			System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
		}
	}

	static void attack(River u1, DarkTempler u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}
	
	static void attack(River u1, River u2) {
		u2.hp = u2.hp - u1.attack;
		System.out.println(u2.NAME + "이 공격당하고 있습니다.");
		System.out.println(u2.NAME + "의 체력은 : " + u2.hp + "입니다.");
	}

	public static void main(String[] args) {
		// 공격력 업그레이드하기
		Zealot.attack++;

		// 질럿 생성하기
		Zealot z1 = new Zealot("1번질럿");
		System.out.println(z1.NAME + Zealot.attack);

		Zealot z2 = new Zealot("2번질럿");
		System.out.println(z2.NAME + Zealot.attack);

		Dragoon d1 = new Dragoon("1번드라군");
		Dragoon d2 = new Dragoon("2번드라군");

		DarkTempler dt1 = new DarkTempler("1번 다크템플러");
		DarkTempler dt2 = new DarkTempler("1번 다크템플러");

		River r1 = new River("1번 리버");
		River r2 = new River("1번 리버");

		// 공격하기
		attack(z1, d1);
		attack(z1, z2);
		attack(z1, dt1);
		attack(z1, r1);

		attack(d1, z1);
		attack(d1, d2);
		attack(d1, dt1);
		attack(d1, r1);
		
		attack(dt1, z1);
		attack(dt1, dt2);
		attack(dt1, d1);
		attack(dt1, r1);
		
		attack(r1, z1);
		attack(r1, r2);
		attack(r1, d1);
		attack(r1, dt1);
		
		

	}
}

package ch04;

class Rabbit {
	private String name; // heap변수, 전역변수, 맴버변수, 필드, 속성, 프로퍼티
	private int power;

	public Rabbit(String name, int power) {
		this.name = name;
		this.power = power;
	}

	// 행위 - 객체에 접근하는 것을 메서드로 하는게 객체지향의 시작
	// 변수를 변경하는 행위는 신중하게 접근자를 선택해야한다
	// 메서드는 그 클래스의 책임을 담당한다 (중요)
	boolean drink() {
		if (power >= 100) {
			return false;
		}
		power++;
		return true;
	}

	
//	void drink() {
//		if (power < 100) {
//			power++;
//		}
//	}

	public int getPower() {
		return power;
	}
	
	void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	

}

public class RabbitApp {
	public static void main(String[] args) {
		Rabbit r1 = new Rabbit("토끼", 20); // power 는 100이 max라고 가정
		System.out.println(r1.getPower());
		r1.drink();
		System.out.println(r1.getPower());
		r1.drink();
		System.out.println(r1.getPower());

		while (r1.drink()) {}
		System.out.println(r1.getPower());
		
		
		//이름변경
		r1.setName("산토끼");
		System.out.println(r1.getName());
	}
}

public - 모든 패키지에서 접근 가능

private - 클래스 내부

( 비어있는) - 같은 패키지에서 찾을 수 있음

코드 페이지에서 마우스 오른쪽을 눌러서 source -> generate constructor 를 이용

디폴트 생성자(없어도 호출됨 - 컴파일러가 자동으로만들어준다) - 초기화 용도
생성자를 수동으로 만든다면 디폴트 생성자를 만들어 주지 않는다.

package ch04;

// 상태와 행동
public class Person {

	String name;
	String job;
	int age;
	char gender;
	String bloodType;

	// 디폴트 생성자(없어도 호출됨 - 컴파일러가 자동으로만들어준다) - 초기화 용도
	// 생성자를 수동으로 만든다면 디폴트 생성자를 만들어 주지 않는다.
	// 매개변수가 없다
	public Person() { // 함수와 비슷하게 생겼지만 첫글자가 대문자며 클래스이름과 같다.

	}

	// 오버로딩(함수명이 같아도 매개변수가 다르면 다른 함수로 인식한다)
	public Person(String name, String job, int age, char gender, String bloodType) {
		this.name = name;
		this.job = job;
		this.age = age;
		this.gender = gender;
		this.bloodType = bloodType;
	}

}
package ch04;

public class PersonApp {
	public static void main(String[] args) {
		Person p1 = new Person(); // 인스턴스화
		p1.name = "최승희"; // 변수에 값넣기는 문법적으로는 가능하지만 현실적이지 않다. 이렇게 짜면 좋지 않다.
		p1.job = "의사";
		p1.gender = '여';
		p1.bloodType = "AB";
		p1.age = 45;

		Person p2 = new Person();
		p2.name = "이미녀";
		p2.job = "골프선수";
		p2.gender = '여';
		p2.bloodType = "O";
		p2.age = 28;

		Person p3 = new Person();
		p3.name = "김미남";
		p3.job = "교수";
		p3.gender = '남';
		p3.bloodType = "AB";
		p3.age = 47;

		System.out.println(p3.name);
		System.out.println(p3.job);
		System.out.println(p3.gender);
		System.out.println(p3.age);
		System.out.println(p3.bloodType);

		Person p4 = new Person(
			"홍길동",
			"학생",
			33,
			'남',
			"O"
		);
		
		System.out.println(p4.name);

	}
}

'Programming Language > Java' 카테고리의 다른 글

자바 public, private 비교  (0) 2020.03.27
자바 생성자 자동 생성하는법  (0) 2020.03.27
자바 final과 static 변수 이해하기  (0) 2020.03.27
200323 // STACK, 표현식, DAEMON  (0) 2020.03.23
이클립스 run 설정  (0) 2020.03.23

+ Recent posts