클래스 : 설계도
오브젝트 : 클래스가 인스턴스 될 수 있는 것 == new가 가능한 것들
인스턴스 : 힙 공간에 뜬 것들, new된 것
객체지향 프로그래밍
1. 클래스의 필드는 메서드에 의해서 변한다
2. 필드를 직접 접근하지 못하게 private 접근 제어자를 사용한다
package ch05;
class Player{
//상태 = 필드
String name;
private int thirty; //목마름 (0~100) , 외부클래스에서 접근 불가능
public Player(String name, int thirty) {
this.name = name;
this.thirty = thirty;
}
//행위 = 메서드 = 값을 변경
void 물마시기() {
System.out.println("물마시기");
this.thirty = this.thirty - 50;
}
//값을 접근할 수 있는 메서드
int 목마름상태확인() {
return this.thirty;
}
}
public class OOPEx01 {
public static void main(String[] args) {
Player p1 = new Player("홍길동", 100);
System.out.println("이름 "+p1.name);
//System.out.println("갈증지수 "+p1.thirty);
//thirty의 값을 바꾸고싶다
//1번방법
//p1.thirty = 50; // 원인없이 갈증지수 변경 => OOP에 맞지 않음
//2번방법 = 상태가 행위를 변경함 => 이렇게 하면안됨 why) 실수할 수 있음
//p1.물마시기();
//System.out.println("갈증지수 "+p1.thirty);
//3번방법 => 이것이 객체지향 프로그래밍
// private를 접근제어자로 선언해서 실수를 막음
p1.물마시기();
System.out.println("갈증지수 "+p1.목마름상태확인());
}
}
package ch05;
class Engine{
int power = 2000;
}
class Car{ // 자동차는 엔진이 아니기 때문에 상속할 수 없다.
//콤포지션 == 결합
Engine e;
public Car(Engine e) {
this.e = e;
}
}
class Hamburger {
String name = "기본햄버거";
String 재료1 = "양상추";
String 재료2 = "패티";
}
//상속은 상태와 행위를 물려받을 수 있지만, 꼭 타입이 일치될 수 있어야한다.
class CheeseHamburger extends Hamburger{ // 치즈햄버거 == 햄버거 , 타입일치
//겹치지 않은 상태만 물려받는다.
String name = "치즈햄버거";
}
class ChikenHamburger{
//콤포지션
Hamburger h;
public ChikenHamburger(Hamburger h) {
this.h = h;
}
}
public class OOPEx02 {
public static void main(String[] args) {
Engine e1 = new Engine();
Car c1 = new Car(e1);
System.out.println("자동차 엔진 마력 "+c1.e.power);
CheeseHamburger ch1 = new CheeseHamburger();
System.out.println("햄버거의 이름은 " + ch1.name);
System.out.println("재료1 " + ch1.재료1);
System.out.println("재료2 " + ch1.재료2);
Hamburger h1 = new Hamburger();
ChikenHamburger ck1 = new ChikenHamburger(h1);
System.out.println(ck1.h.name);
System.out.println(ck1.h.재료1);
System.out.println(ck1.h.재료2);
}
}
package ch05;
//요리사
class 요리사{
String name= "요리사";
}
// 홍길동 or 요리사
class 홍길동 extends 요리사{
String name = "홍길동";
}
public class OOPEx03 {
public static void main(String[] args) {
홍길동 h1 = new 홍길동(); // 힙공간에 홍길동과 요리사가 동시 떠잇음
System.out.println(h1.name);
요리사 y1 = new 홍길동(); // heap : (홍길동,요리사)
System.out.println(y1.name);
//홍길동 h2 = new 요리사(); // heap : (요리사만 떠 있기 때문에 불가능)
}
}