회고 11일차
오늘 배운 것은 자바의 oop 심화과정인 상속, 캡슐화에 대해서 배웠다. 객체 지향에 가장 중요한 4기둥 상속, 다형성, 캡슐화, 추상화
중 두가지이다.
상속이란 ---> extends 키워드를 이용하여 코드의 중복과 코드의 길어짐을 방지하는 방법이다.
class Car{
int wheel;
Car(){
}
public void run(){
}
}
만약 Car라는 키워드 가 있을 때 상속이란 개념이 없을 시에는 SuperCar이라는 클래스를 만들 기 위해서는
class SuperCar{
int wheel;
SuperCar(){
}
public void run(){
}
.
.
.
}
이런식으로 다른 클래스를 만들어서 코드가 길어지고 프로젝트의 클래스의 양이 많아 질 것이다. 하지만 상속이란 키워드를 사용했을 때는 코드가 간편해지고, 코드의 중복이 줄어든다 지금과 같은 경우도 wheel이라는 맴버 변수와 run이라는 메서드가 중복 되게 된다.
class SuperCar extends Car{
SuperCar(){
super()
}
void run(){
System.out.println(super.wheel);
System.out.println(this.wheel);
}
}
이렇게 코드의 중복을 줄이고 간편화를 시켜줄 수 있다.
여기서 메서드 오버라이딩과 , super(),super의 개념이 나오게된다.
<!---알고 갈 사실-->
일단 모든 클래스는 상속을 받지 않을 시 Object라는 가장 큰 범위가 디폴트로 할당이 되고,
toString, equals, hashcode(), wait(), notify()라는 메서드를 사용할 수 있다.
<상위 클래스에 나온 기능들 표>
정의 | 기능 |
super | 상위 클래스 객체를 뜻한다. |
super() | 상위 클래스 생성자를 불러올 때 사용하는 메서드이다. |
메서드 오버라이딩 | 상위 클래스의 매개변수,반환타입,이름이 동일하고, 접근제어자 범위가 같거나 크면 가능 |
전의 회고에서 내부 클래스라는 개념을 언급했다. 외부 클래스 안에 내부 클래스를 포함시키는 개념이였다. 그럼 상속과 포함의 차이는 무엇인가??
포함 | 상속 |
~는 ~이다. | ~는 ~를 가지고 있다. |
라는 것이다. 예를 들면 supercar는 car이다. 슈퍼카는 차이다? 는 맞는 명제이다. 하지만 슈퍼카는 car를 가진다. 이것은 말이 안되기 때문에 상속 확장의 개념으로 들어가는 것이고,
person사람 클래스에서 address라는 클래스와 관계를 맺고 싶을 때 사람은 주소이다? 는 맞지않는 명제이다. 사람은 주소를 가진다. 가 맞는 명제이므로 포함관계가 된다.
포함 | 상속 |
슈퍼카는 차이다. | 사람은 주소를 가진다. |
다음은 캡슐화 이다.
간략하게 정의하자면: 객체안에 관련된 속성과 기능을 하나의 캡슐로 만들어 외부로 부터 보호하는 것이다.
내부에서만 사용되는 데이터를 굳이 외부로부터 참조나 접근 수정이 가능하게 할 필요는 없다는 것이다.
캡슐화를 공부하면서 중요하게 느낀점은 개념보다는 어떻게 데이터를 은닉하고, 수정이 불가능 할까 이다.
1. 접근제어자
2. getter setter
3. import,package
#1접근제어자
접근 제어자 | 범위 |
public | 모든 클래스 모든 패키지 접근 가능 |
private | 같은 클래스만 가능 |
default | 같은 패키지만 가능 |
protected | 다른 패키지 하위 패키지만 가능 |
접근 제어자를 붙임으로써 다른 클래스 다른 패키지의 접근을 허용하거나 허용하지 않게 할 수 있다. 하지만 여기서 private을 서서 다른 클래스에서 참조를 하고 싶을 경우 사용하는 것이 getter,setter이다. 메서드를 이용해 값을 수정하고 불러오는 것이다.
그럼 getter,setter로 값을 불러올 수 있게 할거면 왜? 굳이 private으로 설정해서 귀찮게 하나? 라는 질문이 있을 수 있다.
나는 그게 오늘 해결 되었다. 아예 못불러오게 할거면 getter setter을 안만들어주면 된다. 웬만하면 정보의 은닉을 위해 private으로 선언해 주고, 용도에 따라 유동적으로 처리하면 된다는 것이다.
package는 디렉토리 tree형식으로 많은 파일을 관리 하는 것이고, .포인트 연산을 통해서 하위 단계로 내려간다. 그리고 다른 클래스에서 반복되는 선언을 피하고 싶을때는 import를 사용하게 된다.
*추가사항*
캡슐화 위반? 이란 다른 클래스에서 상위 클래스의 내용에 대해 너무 잘 알게끔 작성 되었을 때를 이야기한다.
만약 Car에 대한 속성과 메서드의 내용을 supercar에서 변형하고 사용하게 되어있다면 Car클래스를 변경할 때 오류도 오류인 만큼 많은 것들을 변경해 주어야한다. 이를 캡슐화 위반이라고 한다. 한 클래스의 속성과 변수 메서드들은 그 클래스에서 처리하는 것이 좋다.
오늘은 월요일... 열심히 달렸으니 내일도 보람찬 하루가 되기위해 달려보자
중요한건 꺾이지 않는 마음.