Record 2

Record 2

"객체 지향의 추상화는 곧 모델링이다? --> Yes"

모델링은 객체들의 특징을 뽑아내어 클래스를 만드는 것

뽑아내고자 하는 특성(Application Boundary)에 따라 클래스의 구조는 많이 달라질 수 있다.

바꿔 말하면 클래스 설계를 위해 Application Boundary부터 정해야 한다.

OOP의 객체는 유일무이한 사물로, 실제 '개체'라는 용어와 비슷하다.

OOP의 클래스는 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념이다.

instance ~= object

클래스를 통해 객체를 만들 때 이를 좀 더 강조하기 위해 instance를 사용

Java는 추상화를 어떻게 지원할까? --> class 키워드를 통해 지원하고 있다.

Tip: 클래스 모델을 표현하는 국제 표준 표기법은 UML 클래스 다이어그램이다.

TMI: Static 영역에 올라간 정보는 main() 메서드가 시작되기 전에 올라가서 main() 메서드가 종료된 후에 내려올 정도로 단단히 고정돼 있기 때문에 static 영역이라고 한다.

"상속은 기존 클래스의 확장이다."

LSP(리스코프 치환 원칙)에 의해서 "하위 클래스는 상위클래스다"라고 표현할 수 있다.

포유류는 동물이다. (o)

고래는 포유류다. (o)

고래는 동물이다. (o)

but 붕어빵은 붕어빵틀이다. (x)

아버지 영희아빠 = new 딸(); // (x)

동물 뽀로로 = new 펭귄(); // (o)

자바 언어에서 이를 반증하듯, inheritance나 inherit라는 키워드는 없다. 대신 extends(확장)가 있다.

제임스 고슬링은 객체 지향의 상속이라는 의미를 정확히 이해하고 자바를 탄생시킨 것이다.

(TMI 상속은 벤 다이어그램으로 표기하기 좋은 거 같다.)

네이밍을 할 때, 클래스는 클래스답게, 객체 참조 변수명은 객체답게 지어야 한다.

(== 클래스명은 분류스럽게, 객체 참조 변수명은 유일무이한 사물처럼 작명)

확장의 강력함을 보여주는 코드

// Driver01.java

package inheritance01;

public class Driver01{

public static void main(String[] args) {

동물 animal = new 동물();

포유류 mammal = new 포유류();

고래 whale = new 고래();

참새 aparrow = new 참새();

animal.showMe();

mammal.showMe();

whale.showMe();

sparrow.showMe();

}

}

// Driver03.java

package inheritance01;

public class Driver01{

public static void main(String[] args) {

동물[] animals = new 동물[4];

동물[0] = new 동물();

동물[1] = new 포유류();

동물[2] = new 고래();

동물[3] = new new 참새();

for(int i=0; i

animal[i].showMe();

}

}

}

Driver01과 Driver03은 같은 결과를 보여준다.

--> 메서드를 재구현할 필요가 없다. 동물이라는 상위 클래스의 배열로 확장된 하위 클래스를 묶어서 사용 가능하다.

클래스 상속 구조에서 최상위 클래스는 Object다. 따라서 모든 클래스가 Object의 특성을 물려 받는다!

상속에서 하위 클래스외 상위 클래스는 is a 관계가 아니라, is a kind of이다.

클래스는 집단이므로 is a를 쓰면 논리가 무너진다.

ex) 펭귄은 하나의 조류이다. (x)

펭귄은 조류의 한 분류이다. (o)

is a 관계는 클래스 간의 상속을 나타내면 반드시 오해의 소지가 생긴다.

In an "is a" relationship, the derived class is clearly a kind of the base class.

( https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2008/27db6csx(v=vs.90)?redirectedfrom=MSDN )

객체 지향의 상속은 상위 클래스의 특성을 재사용하는 것이다.

객체 지향의 상속은 상위 클래스의 특성을 확장하는 것이다.

객체 지향의 상속은 is a kind of 관계를 만족해야 한다.

Java가 다중 상속을 빼버린 이유는, 다중 상속의 다이아몬드 문제가 존재하기 때문이다.

대신 interface를 도입해서 C++와 다르게 다중 상속의 득은 취하고 실은 버렸다.

UML 표기 방법

우측 끝은 인터페이스 약식 표기

Eclipse 플러그인 중에서 Amateras UML을 사용하면 코드를 통해 UML을 그릴 수 있다.

인스턴스가 생성될 때, 해당 클래스의 상위 클래스에 관한 인스턴스도 같이 생긴다. (!)

( 사실 하나가 더 생성된다. 모든 클래스의 최상위 클래스인 Object 클래스의 인스턴스 )

각각 오버라이딩, 오버로딩

같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의

같은 메서드 이름, 다른 인자 목록으로 상위 클래스의 메서드를 재정의

// pingu에 관한 코드

Animal pingu = new Penguin();

pingu.name = "핑구";

pingu.showName();

위의 코드에 관한 T 메모리 구조

→ 상위 클래스 타입의 객체 참조 변수를 사용하더라도 하위 클래스에서 오버라이딩한 메서드가 호출된다는 것 !

(물론 실무에서는 상위 클래스로 선언하는 걸 피해야 하지 않을까?)

다형성 ~= 사용 편의성

상위 클래스 타입의 객체 참조 변수에서 하위 클래스가 오버라이딩한 메서드를 자동으로 호출해주기 때문에 깔끔한 코드 유지가 가능해진다.

from http://verycrazy.tistory.com/25 by ccl(A) rewrite - 2021-11-03 02:27:58