이 내용을 정독하면 객체 지향의 4대 특성에 대한 오해가 풀리고 완벽히 이해할 수 있다
우리가 알고 있는붕어빵틀과 붕어빵 비유,is a 관계등 잘못된 비유와 모호한 표현들을 바로 잡자!!!
Classclass 키워드를 통해 지원개발자가 class를 만드는 과정이 곧 모델링하는 과정이고 그게 곧 추상화를 하고 있는 것이다
public class Mouse {
public String name;
public int age;
public static int countOfTail = 1;
public void sing() {
System.out.println(name + " 찍찍!!");
}
}
--------------------------------------------------
public class MouseDriver {
public static void main(String[] args) {
Mouse mickey = new Mouse();
mickey.name = "미키";
mickey.age = 50;
}
}

main(), countOfTail과 같은 static 변수, static 메서드는 static 영역에 단 1개 생성된다{)를 만나면 stack 영역에 스택 프레임이 생성된다{ 이건 해당 메서드 안에 생성된다})를 만나면 스택 프레임 사라진다Mouse mickey = new Mouse(); 에서 Mouse객체의 참조 변수인 mickey는 이 스택 프레임안에 존재함mickey는 heap에 생성되어 있는 Mouse 객체의 참조값(주소값)을 갖고 있다 (포인팅하고 있다고 생각하면 됨)Mouse mickey = new Mouse();를 통해 객체가 생성되면 Mouse 객체는 heap 영역에 생성된다| 이름 | 다른 이름 | 서식지 |
|---|---|---|
| static 변수 | 클래스 속성(멤버), 정적 변수 … | static 영역 |
| 인스턴스 변수 | 객체 속성(멤버), 객체 변수, … | heap 영역 |
| local 변수 | 지역 변수 | stack 영역(해당 스택 프레임 내부) |
상위 클래스의 특성을 하위 클래스에서 상속하고 거기에 더해 필요한 특성을 추가, 즉 확장해서 사용할 수 있다는 의미재사용 & 확장이 더 맞는 워딩추상화, 일반화됐다고 말함구체화, 특수화됐다고 말함is a 관계다? → 아님!!is ais a kind of 관계가 더 명확한 표현이다is a kind of 상위 클래스is a kind of 동물 → 포유류는 동물의 한 분류다swim() 메서드를 수행하면 사람의 swim()을 실행해야할지 물고기의 swim()을 실행해야 할지 모호해진다 → 다중 상속의 다이아몬드 문제is able to 인터페이스public class Animal {
public String name;
public void showName() {
System.out.println(name + "입니다");
}
}
public class Whale {
public String habitat;
@Overriding
public void showName() {
System.out.println("overriding: " + name + "입니다");
}
public void showHabitat() {
System.out.println(habitat + "에 살아요");
}
//Overloading
public void showHabitat(String param) {
System.out.println(habitat + "에 살아요" + param);
}
}
public class Driver {
public static void main(String[] args) {
Whale theWhale = new Whale();
theWhale.name = "고래고래1";
theWhale.habitat = "남극";
theWhale.showName();
theWhale.showHabitat();
Animal aWhale = new Whale();
aWhale.name = "하나의 고래";
// aWhale.habitat = "북극";
aWhale.showName();
// aWhale.showHabitat();
}
}
Whale)를 생성하면 자동으로 먼저 상위 클래스들의 인스턴스부터 생성된다Whale theWhale = new Whale(); 을 실행하면 Heap 영역에 **Whale 클래스의 인스턴스와 Animal 클래스의 인스턴스와 Object 클래스의 인스턴스**도 생성된다awhale 객체 참조 변수는 사실은 Whale이지만 자신은 Whale인지 모르고 Animal이라고만 알고 있다 ( → 암묵적 형변환)aWhale 참조 변수는 habitat 관련된 것들을 수행할 수 없다오버라이딩과 오버로딩이라고 할 수 있다재정의**중복 정의**Animal의 showName()을 Whale에서 Overriding한 경우, 상위 클래스 타입의 객체 참조 변수를 사용하더라도 자동으로 하위 클래스에서 overriding한 메서드가 호출된다Animal aWhale = new Whale();aWhale.showName() 호출할 때 Animal의 showName()이 호출되지 않고 Whale의 showName()이 호출된다addIntDouble(int, double)addDoubleInt(double, int)add(int, double)add(double, int)private, default, protected, public 을 통해 가능하다클래스명.클래스 변수명 형식으로 접근하는 것을 권장무조건 Call By Value다Animal ref_a = new Animal();
Animal ref_b = ref_a;
ref_a.age = 10;
ref_b.age = 20;
System.out.println(ref_a.age); // 20
System.out.println(ref_b.age); // 20

ref_a가 저장하고 있는 Animal 객체의 주소값을 넘기는거다 → 그래서 자바는 Call By Value다ref_a 의 value인 100을 주소값으로 해석하는 것이고