TIL(2022.02.15)

조지성·2022년 2월 15일
0

TIL

목록 보기
33/78
post-thumbnail

클래스와 오브젝트, 인스턴스

클래스 : 설계도
오브젝트 : 클래스가 인스턴스 될 수 있는 것 == 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.목마름상태확인());
		
	}
}

상속 - extends

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 : (요리사만 떠 있기 때문에 불가능)
	}
}
profile
초보 개발자의 성장기💻

0개의 댓글