클래스와 객체의 관계는 붕어빵틀과 붕어빵이 아니다!
클래스 객체명 = new 클래스();
붕어빵틀 붕어빵 = new 붕어빵틀();
새로운 붕어빵틀을 하나 만들었더니 붕어빵이 되었다?
말이 안된다!
⭐️클래스는 분류에 대한 개념이고, 객체는 실체다.⭐️
클래스 : 객체 = 펭귄 : 뽀로로 = 사람 : 김연아 다.
구체적인 것을 분해해서 관찰자가 관심 있는 특성만 가지고 재조합.
=> 구체적인 것을 분해해서 관심영역(애플리케이션 바운더리)에 있는 특성만 가지고 재조합하는 것(모델링)
객체지향에서 추상화의 결과는 클래스이다.
자바가 객체 지향의 추상화를 지원하는 방법? class
키워드
public class Mouse{
public String name;
public int age;
public int countOfTail;
public void sing(){
System.out.pringln(name + "찍찍");
}
}
public class MouseDriver {
public static void main(String[] args) {
Mouse mickey = new Mouse();
mickey.name = "미키";
mickey.age = 3;
mickey.countOfTail = 1;
mickey.sing();
mickey = null;
}
}
java.lang
패키지와 모든 클래스
들(Mouse, MouseDriver)이 메모리의 스태틱
영역에 배치된다.
Mouse
에서 name
, age
, countOfTail
은 Mouse
클래스에 속한 속성이 아니라 Mouse
객체에 속한 속성이므로 객체가 생성돼야만 속성의 값을 저장하기 위한 메모리 공간이 힙 영역에 할당된다.
스택 프레임
속 객체 참조 변수가 힙
영역의 객체를 참조한다.
= 객체 참조 변수는 객체의 주소를 가지고 있다.
Mouse mickey = new Mouse();
// 한 마리 쥐가 태어났으니 그 이름을 mickey라 하였다.
// 쥐 : 클래스
// 한 마리 쥐 : 클래스의 인스턴스 = 객체
// mickey : 객체 참조 변수
mickey = null;
코드가 실행된 후에는 객체 참조 변수 mickey
가 더 이상 힙
영역의 객체를 참조하지 않으므로 가비지 컬렉터
가 이를 수거해간다.
모든 객체가 모두 같은 값을 갖는 속성이 있다?
static
키워드를 통해 스태틱 영역에 단 하나의 저장 공간을 갖게 하자.
public static int countOfTail = 1;
상속의 개념은 조직도나 계층도가 아니라 분류도다!
상속보단 확장이라는 단어가 더 맞다!
상위 클래스 - 추상화, 일반화
하위 클래스 - 구체화, 특수화
하위클래스는 상위클래스다 -- 이게 성립되어야함.
딸은 엄마이다 (x) 부모 자식 관계로 생각하지 말고
펭귄은 동물이다 (o) 분류와 확장으로 생각하기.
extends
키워드 사용
자바는 다중 상속 허용하지 않는다, 대신 인터페이스
라는 개념이 있다.
⭐️상위 클래스는 하위 클래스에게 특성(속성, 메서드)을 상속해주고
인터페이스는 클래스가 '무엇을 할 수 있다'라고 하는 기능을 구현하도록 강제하게 된다.⭐️
public interface 날수있는 {
void fly();
}
상위 클래스는 물려줄 특성이 풍성할수록 좋다.
인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다.
하위 클래스의 인스턴스가 생성될 때 상위 클래스의 인스턴스도 함께 생성된다.
-> 하위 클래스의 인스턴스만 힙
영역에 생긴 게 아니라 상위 클래스의 인스턴스도 함께 힙
영역에 생긴다.
public class Penguin extends Animal{
public String habitat;
public void showHabitat() {
System.out.println(habitat);
}
Penguin pororo = new Penguin();
Animal pingu = new Penguin();
pingu
의 객체 참조 변수는 펭귄이면서 기억 상실에 걸린건지 자신이 펭귄이라는 사실을 모르고 있다.
다만 자신이 동물이라는 것만 인식하고 있다.
따라서 핑구 객체 참조 변수는 펭귄의 서식지 속성과 서식지를 알려주는 메서드를 사용할 수 없다.
Penguin happyfeet = new Animal();
결과 : incompatible types: Animal cannot be converted to Penguin
Penguin pororo = new Penguin();
// 펭귄 한 마리가 태어나니(new Penguin()) 펭귄 역할을 하는(Penguin) pororo라 이름 지었다.
pororo.name = "뽀로로";
// pororo의 name을 "뽀로로"라 하자.
pororo.habitat = "남극";
// pororo의 habitat를 "남극"이라 하자.
pororo.showName();
// pororo야 너의 이름을 보여다오.
pororo.showHabitat();
// pororo야 너의 서식지를 보여다오.
객체 지향에서 다형성 : 오버라이딩, 오버로딩
상위클래스 타입의 객체 참조 변수를 사용하더라도 하위 클래스에서 오버라이딩(재정의)한 메서드가 호출된다.
스프링 입문을 위한 자바 객체지향의 원리와 이해