1. 프로젝트 생성
src에는 자바코드가 들어간다.
소스코드가 들어가는 폴더를 ‘패키지’라고 한다.

>> src 안에 ex00 패키지를 만들어 Mem01 자바 파일을 만들어줬다.

2. 객체지향의 핵심
객체는 상태와 행위를 가진다. 상태는 행위를 통해서만 변경한다.
면접관 : “객체지향이 뭐에요?”
나: “상태를 행위를 통해서 변경시키는 것입니다!”
Code
목마른 상태(상태)를 물마시기(행위)를 통해서 해소시키기(변경시키기)
package ex00;
class Elice {
private int thirsty; // 직접 변경못하게 private를 사용. heap에 뜬다.
public Elice(int thirsty) { // 객체는 생성자로 초기화한다.
this.thirsty = thirsty;
}
void drink(){ // heap에 뜬다. 상태를 변경하는 setter
thirsty = 0;
}
int thirstyCheck(){ // 상태를 출력해주는 getter
return thirsty;
}
// getter는 자동으로 만들어도 되자만, setter는 직접만들어줘라.
// get목마름은 의도를 파악할 수 있지만(목마름 얼마인지 get해라)
// set목마름은 의도를 파악하기 어려움으로 setter는 직접 만들어서 사용 (물마시기 drink)
}
// 생성자는 초기화를 위해 사용한다, setter와 getter는 private에 값을 넣고 꺼내기 위해서 필요
public class Mem01 {
public static void main(String[] args) {
Elice e = new Elice(100); // 이 라인에서 동적할당(heap)
// e.thirsty = 100; // 객체지향x. 상태는 행위를 통해서면 변경한다.
// 힙공간은 여러개 띄우는게 가능하다.
//Elice e1 = new Elice(200);
// 1. 값 변경 (행위)
e.drink(); // 행위
// 2. 값 확인
int thisty = e.thirstyCheck();
System.out.println(thisty); // 0
}
}
수업 시간 설명 요약)
상태(=변수.
stack에 있는 변수가 아닌 객체가 생성될 때 지니고 있는 변수.
강아지가 태어나면 몸무게, 키, 이름을 가지게 된다.
강아지 이름은 final상수, 키는 시간이 지나면 변경되는 것이고,
몸무게는 ‘먹는다’는 행위가 있어야 늘어난다.
즉, 상태는 행위를 통해서 늘어난다!!)
행위없이 상태만 가진 애들은 객체가 아닌 그냥 데이터 덩어리다.
그냥 데이터를 가지고 있는 것 일 뿐…
8bit = 1byte(영어 문자 하나)
최대로 가질수있는게 255 (128 + 64 + 32 + 16 + 8 + 4 + 2 + 1)

RAM
램 8기가바이트
기가 = 10억 이니까
8기가바이트는 ? 80억개의 영문자를 저장할 수 있다.
운영체제가 일반적으로 램의 절반을 사용(4기가바이트)
남은 4기가에 JVM이 할당된다. (자바 가상 머신)
일반적으로 JVM는 500메가바이트 사용(메가 = 백만)
즉, JVM은 5억개의 문자를 저장할 수 있는 공간이 된다.
heap에 자리가 부족하면 static, stack에게 자리남냐고 물어본다.
static, stack에 자리가 있으면 그쪽으로 좀 자리차리를 한다.
stack에 공간이 없어서 넘치면 스택오버플로우에러가 발생한다.
마찬가지로, static에 공간이 없으면 스테틱오버플로우에러가 발생.
램을 3개의 이름으로 나눠쓴다. static, stack, heap
효율적 사용을 위해 이렇게 이름으로 나누는것이지
물리적인 공간으로 부르면 그냥 RAM
추가) 램 16기가바이트 - 160억개의 영문자를 넣을수있음
int 4바이트
연습이 되면 논리적은 것은 추상화할 수 있다.
3. 다형성
3-1. 다형성 개념

자동차 - 스포츠카 는 “is 관계”
스포츠카야 너 자동차니? 응 ( is )
자동차야 너 스포츠카니? 아니 (is 관계에서 부모는 자식이 될 수 없다)
엔진 - 자동차 는 “has 관계”
자동차야 너 엔진이니? 아니 (has)
엔진아 너 자동차니? 아니 (has)
→ 스포츠카는 스포츠카이지만 자동차도 된다.
→ 자동차가 스포츠카가 되려면 강제로 다운캐스팅 해줘야한다.(?)
3-2. 다형성 코드 (code)
Car s1 = new Sonata(); // sonata, car
소나타야 너 car니? 응 (가능)
Sonata o1 = new Sonata();
소나타야 너 소나타니? 응 (가능)
Sonata t1 = new Car();
자동차야 너 소나타니? 아니 (불가능)
Car s1 = new Sonata(); // sonata, car
여기서 부모의 매서드를 때리면 부모의 매서드를 무효화(오버라이드)시키고, “동적바인딩”해서
부모의 매서드랑 동일한 이름으로 만든 자식의 매서드(재정의)가 실행된다.
오버라이드 - 무효화
부모를 무효화하고 자식을 재정의한다.
추상화시키면 부모만 바라보면 된다는 장점이 있다.
부모를 때리면 동적바인딩해서 자식의 매서드를 실행시킬 수 있다.
이 세상에 존재하지 않는것을 객체로 생성할 수 없으니까 추상 클래스(abstract class)로 만들어 사용한다.
Car 의 역할은 추.상.화
이 세상에 존재하지 않는 추상적인것 (ex. 동물, 사람, 자동차, 컴퓨터, 선생님…)
이런건 애초에 abstract 추상 클래스로 만든다 (new car 할 수 없음. new human 할 수 없음.
new 제네시스 ok, new 김철수 ok → car와 human은 추상 클래스로 만든다.)
객체로 만들수 없는… 이 세상에 존재하지 않는…
선생님이란 것을 new 할 수없게 추상클래스로 만들어 new 생성을 막아둬야함.
추상매서드는 abstract void run(); 이렇게 쓰는데
상속받은 자식들이 이 매서드를 어떻게 쓸지 부모는 모르니까
몰라도되니까 추상매서드로 만들어둔다.
추상매서드로 만들면 상속받은 자식이 무조건 이 추상매서드를
구현하도록 강제할 수 있다.
추상화 장점
추상적으로 지칭할 수 있는 것을 만들어서 사용하면 편리하다.
예를들어 추상적으로 사용하는 ‘컴퓨터’라는게 있다.
교실의 모든 컴퓨터를 지칭할 때 ‘컴퓨터’를 사용하면 편리하다.
1번 컴퓨터, 2번 컴퓨터, 3번 컴퓨터, 4번 컴퓨터를 모두 한꺼번에 가리켜 지칭할 수 있다.
1번 컴퓨터 종료 매서드 , 2번 컴퓨터 종료 매서드, 3번 컴퓨터 종료 매서드
다 따로 구현할 필요없이 ‘컴퓨터 종료 매서드’만 구현해두면 되니까 편리하다.
공통되는 컴퓨터 종료 매서드를 상속받은 1번 컴퓨터, 2번 컴퓨터, 3번 컴퓨터…. 가
각자의 종료 매서드를 구현해 실행시키게 된다. (다형성)

Car
Sonata
class Car {
void run();
}
class Sonata extends Car{
void run(){
System.out.println(”소나타 달린다”);
}
}
public class Mem02 {
static void 레이싱 (Car car = new Sonata() ){
car.run();
}
public static void main(String[] args){
Car s1 = new Sonata(); // Sonata, Car
레이싱 (s1);
}
Car의 run 매서드를 무효화(오버라이드)하고,
동적바인딩 해서 Sonata의 run을 실행(재정의)한다.
그럼 추상화랑 다형성의 차이가 뭐지…?
추상화는 클래스들의 공통적인 부분들을 찾아서 재사용이 가능한
클래스를 설계하는 것이고 ( abstract class Human, Car … )
다형성은 공통적인 메소드로 여러가지 기능들을 만들어낼 수 있는 것이 다형성이다. ( abstract void eat();)
class 제네시스 extends Car {
void eat() {
System.out.println(”제네시스 기름 먹는다”);
}
}
q ) 만약에 Human 추상클래스에 eat 추상매서드를 만들어서
제네시스가 상속받게 해서 eat 매서드를 구현할 수는..?
없겠지. 제네시스는 Human을 상속받을수 없으니까?
제네시스야 너 사람이니? 아니 (불가능)
그럼 비슷한 매서드라도 Car 추상클래스, Human 추상클래스에
각각 구현해야하는건가
슬라임이 나오든, 머쉬룸이 나오든, 골렘이 나오든
몬스터를 상속받았다면 attack에 동적바인딩 되어서
슬라임은 몸통박치기, 골렘은 주먹휘두르기가 나오는것.
Share article