이 내용을 정독하면 객체 지향의 4대 특성에 대한 오해가 풀리고 완벽히 이해할 수 있다
우리가 알고 있는붕어빵틀과 붕어빵 비유,is a 관계등 잘못된 비유와 모호한 표현들을 바로 잡자!!!
Class
class
키워드를 통해 지원개발자가 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 a
is 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을 주소값으로 해석하는 것이고