티스토리 뷰
오늘은 상속과 캡슐화에 대해서 배웠다.
상속은 할아버지가 아버지에게, 아버지가 나에게 무언가를 대물림하듯
상위 클래스의 멤버들을 하위 클래스가 따로 정의하지 않고도 사용할 수 있다.
extends 키워드를 사용하며 여러 장점이 존재한다.
상속을 사용하면 코드의 중복을 제거하고
다형적 표현이 가능하며 ex) 프로그래머는 사람이다. 프로그래머는 프로그래머다.
유지보수가 편리해진다. (부모 클래스를 수정하면 자식 클래스도 수정되기 때문이다.)
추가로 final키워드를 붙여서 상속이 불가하다는 것을 나타낼 수 있고
자바에서는 단일 상속만을 허용한다고 한다.
이후에 배우는 인터페이스를 통해 다중 상속 효과를 낼 수는 있다.
Object클래스는 자바 최상위 클래스로 모든 클래스의 부모, 즉 상위 클래스라고 할 수 있다.
우리가 따로 extends를 통해 상속관계를 나타내지 않아도 자동으로 상속이 된다.
포함은 상속처럼 클래스를 재사용하는 방법이지만, 구조가 다르다.
포함은 클래스의 멤버로 다른 클래스 타입의 참조 변수를 선언한다.
프로그래머는 사람이다 (상속) / 프로그래머는 사람을 갖고 있다 (포함) → 포함은 적용할 수 없다.
고용자는 주소다 (상속) / 고용자는 주소를 갖고 있다 (포함) → 상속보다는 포함을 적용시키는 게 맞다고 볼 수 있다.
상속과의 비교는 이렇게 할 수 있다.
오버라이딩은 오버로딩과 어감이 비슷하지만 사용은 명확하게 구분된다. (상속을 전제로 한다.)
오버로딩은 같은 메서드명에 다른 매개변수로 한 메서드를 여러 방법으로 쌓고 쌓는 느낌이라면
오버라이딩은 같은 메서드명에 같은 매개변수 같은 반환 타입을 사용하며
상위 클래스의 메서드를 하위 클래스의 메서드가 덮어쓴다는 느낌이다.
super와 super()는 느낌이 this와 this()와 쓰임이 비슷하다. (상속을 전제로 한다.)
부모와 자식 클래스의 멤버 변수 이름이 같다거나, 상위 클래스의 객체의 멤버 값을 참고해야 할 경우 super를 사용하고
super()는 상위 클래스의 생성자를 호출하여 사용할 때 이용된다. 생성자 안에서만 사용 가능하고 첫 줄에 와야 하는 것이 this()와 동일하다.
사실 모든 생성자의 첫 줄에는 this()나 super()가 선언된다고 한다.
기본 생성자처럼 따로 정의하지 않으면 자동으로 생성되는 것이다.
그러니 기본 생성자도, this(), super()도 모두 따로 정의하지 않으면 자동으로 생성되기 때문에 우리는 신경 쓰지 않아도
되었던 것이다.
캡슐화는 외부로부터 오는 데이터에 대해 보호하고, 내부적으로만 실행되어야 하는 코드를 외부로 노출시키지 않기 위한 은닉을 위해 사용한다. 데이터 변경 시 다른 객체에 영향을 주지 않기 때문에 독립성을 확보할 수 있다.
접근제어자를 통해 우리는 어디까지 접근을 제한할 것인가를 정할 수 있다.
| 접근 제어자 | 클래스 내 | 패키지 내 | 다른 패키지의 하위 클래스 |
패키지 외 |
| private | O | X | X | X |
| default | O | O | X | X |
| protected | O | O | O | X |
| public | O | O | O | O |
데이터를 보호한다고 해도 어떠한 경우 때문에 외부에서 그 값을 변경해야 할 때도 있는데
그럴 때 우리는 setter와 getter메서드를 이용할 수 있다.
setter 메서드는 외부에서 메서드에 접근해 조건에 맞을 경우 데이터 값을 변경하게 해 주고 set- 키워드를 통해 설정한다.
ex) setName()
getter 메서드는 변경한 변수 값을 읽어오는 데 사용한다. get-키워드를 통해 설정한다.
ex) getName()
둘의 메서드는 이런 원리로 작동하는 것 같다.
setName() 메서드를 통해 외부로부터 매개변수 값을 받아 그것을 인스턴스 변수에 저장하고,
getName() 메서드를 통해 인스턴스 변수 값을 리턴하여 다른 변수든 어딘가에 할당하여 사용한다.
이 두 개의 메서드를 통해 데이터를 효과적으로 보호하면서도 값을 변경하는 기능을 얻어낼 수 있다.
오늘의 일기
오늘은 OOP의 심화 부분에 대해 학습했다.
사실 한번 배웠던 내용이라 그런지 머릿속에 개념들을 집어넣는 것이 그렇게 어렵진 않았다.
하지만 뭔가 불안한 느낌이 들었다.
내가 다 알고 있다고 착각하는 것은 아닌지 말이다.
개념들을 다시 한번 읽고 정리하며 한번 더 학습을 이뤘지만,
그래도 주말을 이용해서 내가 완벽하게 알고 있는 것인가 예제 코드들을 직접 만들어 봐야겠다.
'SEB_BE_41' 카테고리의 다른 글
| 09.08 열다섯 번째 수업(보이는 라디오) (0) | 2022.09.09 |
|---|---|
| 09.07 열 네 번째 수업(다형성, 추상화) (0) | 2022.09.07 |
| 09.05 열두 번째 수업(생성자, 이너클래스) (2) | 2022.09.05 |
| 09.03~04 조건문, 반복문, OOP 복습 (0) | 2022.09.05 |
| 09.02 열한 번째 수업(OOP) (0) | 2022.09.02 |