티스토리 뷰
[자바의 정석] Ch 7-1 상속(Inheritance)란? Ch 7-3 포함(composite) 관계란? Ch 7-4 클래스 간의 관계 결정하기 Ch 7-5 단일 상속(Single Inheritance)란? Ch 7-6 Object 클래스란? Ch 7-7 오버라이딩(overriding)이란? Ch 7-9 ..
da_devel 2022. 6. 21. 02:08
🤔 상속(Inheritance)란?
✔ 기존의 클래스로 새로운 클래스를 작성하는 것.(코드의 재사용)
두 클래스를 부모와 자식으로 관계를 맺어주는 것
✔ ⭐ 자손은 조상의 모든 멤버를 상속받는다.
(생성자, 초기화블럭 제외)
따라서
✔ 자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다.)
왜냐 모든 멤버를 상속받으니까!!
✔ 자손의 변경은 조상에 영향을 미치지 않는다.
🤔 포함(composite) 관계란?
✔ 포함(composite)이란?
클래스의 멤버로 참조변수를 선언하는 것
작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
class Poitn {
int x;
int y;
}
class Circle {
int x; // 원점의 x좌표
int y; // 원점의 y좌표
int r; // 반지름(radius)
}
class Circle {
Point c = new Point(); // 원점
int r; // 반지름 (radius)
}
그림으로 그려보자.
✅ 클래스 간의 관계 결정하기
상속관계 : '~은 ~이다. (is-a)'
포함관계 : '~은 ~을 가지고 있다. (has-a)'
(대부분의 관계는 포함이다.)
위의 예제에서
원은 점이다. - Circle is a Point.
원은 점을 가지고 있다. - Circle has a Point.
중에서 아래의 문장이 좀 더 적합하기 때문에 '포함관계'에 속한다.
// 포함관계
class Circle {
Point c = new Point();
int r;
}
// 상속
class Circle extends Point {
int r;
}
다음을 그림으로 그리면 다음과 같다.
상속 관계 예제
class MyPoint {
int x;
int y;
}
class Circle extends MyPoint {
int r;
}
public class Ch6_39 {
public static void main(String[] args) {
Circle c = new Circle();
c.x = 1;
c.y = 2;
c.r = 3;
System.out.println("c.x = " + c.x);
System.out.println("c.y = " + c.y);
System.out.println("c.r = " + c.r);
}
}
실행결과
c.x = 1
c.y = 2
c.r = 3
포함관계 예제
class MyPoint {
int x;
int y;
}
class Circle { // 포함관계
MyPoint p = new MyPoint();
int r;
}
public class Ch6_39 {
public static void main(String[] args) {
Circle c = new Circle();
c.p.x = 1;
c.p.y = 2;
c.r = 3;
System.out.println("c.p.x = " + c.p.x);
System.out.println("c.p.y = " + c.p.y);
System.out.println("c.r = " + c.r);
}
}
실행결과
c.p.x = 1
c.p.y = 2
c.r = 3
🤔 단일 상속(Single Interitance)란?
Java는 단일 상속만을 허용한다. (C++은 다중상속 허용)
비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
🤔 Object 클래스 - 모든 클래스의 조상
부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
toString(), equals(Object obj), hashCode(), ...
🤔 메서드 오버라이딩(overriding)이란?
상속받은 조상의 메서드를 자신에 맞게 변경하는 것
예시를 통해 살펴보자.
class Point {
int x;
int y;
String getLocation() {
return "x : " + x + ", y : " + y;
}
}
class Point3D extends Point {
int z;
String getLocation() { // 오버라이딩
return "x : " + x + ", y : " + y + ", z : " + z;
}
}
override : 덮어쓰다.
말그대로
내용 즉, 구현부를 변경하는 것이다.
선언부는 변경 불가능하다. ❗
다음의 코드를 보자.
(코드를 잘 짜는 것이 얼마나 코드를 단축시킬 수 있는지 알게 되는 코드이다.)
필자는 처음에 강의를 듣고 소름이 돋았다. 👍
class MyPoint3 extends Object {
int x;
int y;
// Object 클래스의 toString()을 오버라이딩
public String toString() {
return "x : " + x + ", y : " + y;
}
}
public class T2 {
public static void main(String[] args) {
MyPoint3 p2 = new MyPoint3();
p2.x = 3;
p2.y = 5;
System.out.println("p2.x = " + p2.x);
System.out.println("p2.y = " + p2.y);
}
}
위 코드의 실행결과를 보자.
p2.x = 3
p2.y = 5
위의 코드를 간단하게 줄이면 다음과 같다.
class MyPoint3 extends Object {
int x;
int y;
MyPoint3(int x, int y) {
this.x = x;
this.y = y;
}
// Object 클래스의 toString()을 오버라이딩
public String toString() {
return "x : " + x + ", y : " + y;
}
}
public class T1 {
public static void main(String[] args) {
MyPoint3 p = new MyPoint3(3,5);
System.out.println(p);
}
}
보이는가? 엄청난 양의 코드가 줄었다.
만약 매개변수와 출력문이 훨씬 더 많았다고 생각해보라.
어마무시한 코드의 중복을 해결한 것이다!!
이제 출력결과가 일치하는지 확인해보자.
x : 3, y : 5
출력결과가 일치한다.
이 예제를 보고 필자는 객체 지향의 개념을 완벽하게 이해하고
감탄했다.
객체 지향의 개념을 완벽하게 깨우친 느낌이었다. 👍
그간에는 왜 생성자를 배우며,, 왜 참조형 매개변수를 사용하며,,
아무것도 모른채 기계적으로 학습했다면
이 강의를 듣고 객체지향이 무엇인지
객체지향 프로그래밍이 왜 중복된 코드를 줄여주는지에 대해 확실히 이해했다!!
암튼 다음의 내용을 이어서 공부하자.
✅ 오버라이딩의 조건 ⭐⭐
✔ 선언부가 조상 클래스의 메서드와 일치해야 한다.
✔ 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
✔ 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
🤔 선언부란?
반환타입, 메서드 이름, 매개변수 목록을 의미한다.
🤔 오버로딩과 오버라이딩의 차이는?
✔ 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new)
상속과 상관 x
✔ 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)
상속받은 메서드를 변경
차근차근 처음부터 시작하고 있지만
새로운 것을 알아가고 있어 너무 뿌듯하다.
더 열심히 공부하자. 📙
'프로그래밍 > 자바' 카테고리의 다른 글
- Total
- Today
- Yesterday
- 백준
- 강의
- 해커랭크 자바
- LinkedList
- 자바
- challenges
- stack
- 정보처리 산업기사
- hackerrank
- 해커랭크
- Java
- 그리디
- hackerrank challenges
- ORM
- 정보처리산업기사 공부법
- 정보처리산업기사
- 풀이
- 해커랭크 자바 챌린지
- 22 정보처리 산업기사
- queue
- 22 정보처리산업기사
- 디버깅
- JPA
- 소스코드
- 챌린지
- 코드
- 개발자
- 자바의 정석
- BAEKJOON
- 해커랭크 챌린지
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |