객체 지향 프로그램에서는 객체는 다른 객체와 관계를 맺음..
관계의 종류는 총 3가지이다.
<아래 둘은 코드는 똑같지만, 인간이 해석했을 때는 의미가 다른 것 뿐이다>
(1) Composition : 둘이 빼놓고는 설명이 안되면 집합관계이다. - 포함관계.
Ex) 사람과 뇌. 사람은 뇌를 빼놓고는 설명을 할 수가 없지.
계좌와 계좌번호. 계좌번호를 빼놓고는 계좌를 어떻게 설명하냐.
(2) Aggregation : 둘이 빼놓고 설명 할수도 있다. - 사용관계
Ex) 사람과 자동차. 사람은 자동차를 가질 수도 있고 안 가질 수도 있지.
고객과 계좌. 고객은 계좌를 가질 수도 있고 안 가질 수도 있지.
<사람은 자동차를 보유하고 있다>
Java는 객체지향이다.
가장 강력한 툴이지만, 핵심은 코드를 줄이기 위해서이다. 내가 부분적으로 관리하는 클래스에서 뭔가를 잘못했더라도 다른 클래스의 내용은 온전하기 때문에 사고가 나더라도 쉽게 수습이 가능한 것이다.
또한, 객체로 만들다보면, 자손 객체들이 부모 객체를 상속 받아서 부모 객체에 심각한 영향을 줘서 contaminate 하는 경우가 생기는데 그럼 각각 권한을 부여해야하지 않을까?
상속은 근본적으로 각 class들간의 관계를 맺어주는 것이다. 그런데, 이 관계를 맺어주는 게 단순히 inheritance만 있는 건 아니다.
Class Parent {}
Class Child extend parent{
}
Problem : 부모 class을 copy해서 가져다 오는 것이 상속이라고 했다. 그런데, 내가 가져온 부모 class가 자식 class에 무조건 다 맞을까? 분명히 조정을 해야할 필요가 있을 수도 있다. 그럼 수정을 해야하는데, 부모 클래스는 내버려두고 자식 클래스 안에서 부모클래스에서 온 메소드를 조금 수정해서 받을려고 하면 어떻게 해야할까?
Solution : 간단하다. 자식 class안에서 부모 클래스의 methods를 재정의하면 된다.
주석을 보자.
class Point{ int x; int y; String getLocation(){ return : 'x : ' + x + "y" + y; } }위는 부모 클래스이다. 2차원 좌표 (x,y)
``` class Point3D extends Point{ int z; String getLocation(){ return : 'x : ' + x + "y" + y + "z"+ z; } } ```아래는 자식 클래스임. (x,y)에 z선언해주고, 메소드를 다시 정의해준 것이 보이는가?
원칙 3가지
2번과 3번의 이유는 아직 잘 모른다.
Overloading과 Overriding의 차이가 뭔가? 완전히 다른 내용이다. 로딩은 메소드를 추가하는 거고, 라이딩을 메소드를 변경하는 거다.
딱 2가지 방법이 있다. super와 this.
super와 this 모두 당연히 primitive type이 아니니 reference type의 변수이고, 둘다 같은 변수 이름을 지닌 변수를 찾아다 참조해주는 변수이지만, super은 무조건 부모 class의 변수를 찾고, this는 우선적으로 자기 class 안에 있는 변수를 찾는다는 것 뿐이다.
예를 들어, 부모 클래스에 int x = 10이 있고, 자식클래스에도 int x = 20; 이 있다면, super x = 10; this x = 20; 이지만
예를 들어, 부모 클래스에 int x =10이 있고, 자식클래스에는 없다면, super x = 10; this x = 10;인 셈이다.
It is very simple concepts. We packed all the concepts as sophisticated word "Encapsulation". But, It is very straightforward. I will discuss about it in derived concepts as It is why 'Objects' exist.
사실 이 개념도 Syntax 의 하위 개념이다. 그러나 너무나도 중요한 개념이라서 따로 뺐다.
public class Time{
protected int hour;
protected int 변수;
...
메소드~~
}
주로 protected 접근자를 부모 클래스에 적어준다. private는 ㅈ