Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 2024 정보처리기사 수제비 실기
- 자바의 정석 기초편 ch8
- 2024 정보처리기사 시나공 필기
- 자바의 정석 기초편 ch4
- 자바의 정석 기초편 ch13
- 스프링 mvc1 - 스프링 mvc
- 자바의 정석 기초편 ch6
- 스프링 db1 - 스프링과 문제 해결
- 자바의 정석 기초편 ch7
- 스프링 mvc2 - 검증
- 자바의 정석 기초편 ch12
- 자바의 정석 기초편 ch3
- 코드로 시작하는 자바 첫걸음
- 스프링 mvc1 - 서블릿
- 타임리프 - 기본기능
- 자바의 정석 기초편 ch5
- jpa - 객체지향 쿼리 언어
- 자바의 정석 기초편 ch9
- jpa 활용2 - api 개발 고급
- 자바의 정석 기초편 ch11
- 스프링 mvc2 - 로그인 처리
- 자바의 정석 기초편 ch2
- 스프링 고급 - 스프링 aop
- @Aspect
- 스프링 입문(무료)
- 자바의 정석 기초편 ch1
- 스프링 db2 - 데이터 접근 기술
- 스프링 mvc2 - 타임리프
- 게시글 목록 api
- 자바의 정석 기초편 ch14
Archives
- Today
- Total
나구리의 개발공부기록
자바의 정석 기초편 ch7 - 1 ~ 4[상속, 클래스간의 관계, 상속과포함] 본문
1) 상속
- 기존의 클래스로 새로운 클래스로 작성 하는 것 -> 기존 클래스의 코드를 재사용
- 두 클래스를 부모와 자식으로 관계를 맺어 주는 것
- class 자식클래스이름 extends 부모클래스이름 { }
class Parent { }
class Child extends Parent { // Child class와(자식) Parent class를(모) 상속관계로 만듦
}
(1) 하위 클래스(자손)는 상위 클래스(조상)들의 모든 멤버를 상속 받음
- 생성자와 초기화블럭은 제외
- 자신의 바로 상위클래스 뿐만아니라 그 상위의 클래스의 멤버도 모두 상속 받음
- 하위 클래스의 멤버개수는 상위 클래스보다 적을 수 없음, 즉 같거나 많을 수 밖에 없음
class Parent {
int age; // 멤버가 1개
}
class Child extends Parent { }
// 멤버가 없지만 상위 클래스를 상속하였으므로 멤버가 1개 들어있음
(2) 하위클래스의 변경은 상위 클래스에 영향을 미치지 않음
- 하위클래스인 Child에 play() 메서드를 추가하여 멤버를 추가하여도 상위 클래스인 Parent 클래스는 영향이 없음
class Parent {
int age; // 멤버가 1개
}
class Child extends Parent { // Parent class를 확장해서 Child클래스를 만듦
void play() { // 새로운 멤버 추가
}
// Parent class = 멤버 1개
// Child class = 멤버 2개 (상속받은 멤버와 추가한 멤버)
(3) 상속 클래스간의 관계 예시
- Point3D_2 클래스는 Point 클래스를 상속 받았으므로 Point 클래스가 변경되면 멤버가 변경됨
class Point { // 2차원 좌표 클래스
int x; // 멤버 2개
int y;
}
// 상속 되지 않았으므로 별도 클래스
class Point3D { // 3차원 좌표 클래스 - 그냥 만들기 (Point클래스와 관계가 없음)
int x; // 멤버 3개
int y;
int z;
}
// Point클래스를 상속하였으므로 Point클래스가 변경되면 멤버가 변경 됨
class Point3D_2 extends Point { // 3차원 좌표 클래스 - 상속ver. (Point클래스를 상속)
int z; // Point클래스 멤버를 포함하여 총 3개
}
// 모두 객체 생성시 동작되는 메커니즘은 같음
(4) 상속 예시
- Tv 클래스를 정의후 SmartTv 클래스에 상속
- SmartTv() 객체를 생성하여 선언한 참조변수로 Tv클래스의 멤버를 모두 사용할 수 있음
// 멤버 5
class Tv {
boolean power; // 전원상태(on/off)
int channel; // 채널
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
// Tv클래스의 멤버를 포함해서 총 7개
class SmartTv extends Tv { // SmartTv는 Tv에 캡션(자막)을 보여주는 기능을 추가
boolean caption; // 캡션상태(on/off)
void displayCaption(String text) {
if (caption) { // 캡션 상태가 on(true)일 때만 text를 보여 준다.
System.out.println(text);
}
}
}
class ex7_1 {
public static void main(String args[]) {
SmartTv stv = new SmartTv();
stv.channel = 10; // 조상 클래스로부터 상속받은 멤버
stv.channelUp(); // 조상 클래스로부터 상속받은 멤버
System.out.println(stv.channel);
stv.caption = true; // 캡션(자막) 기능을 켠다.
stv.displayCaption("Hello, World");
}
}
2) 포함
- 클래스의 멤버로 다른클래스타입의 참조변수를 선언하고 그 타입의 객체를 생성
- 작은 단위의 클래스를 만들고 이들을 조합해서 큰단위의 새로운 클래스를 만든다고 보면됨
// 1. 멤버변수 3개인 클래스
class Circle {
int x;
int y;
int r;
}
// 2. Point 클래스를 Circle 클래스에 포함
class Circle {
// 포함한다는 것은 클래스에 다른 클래스의 객체를 생성하는 것
Point c = new Point();
int r;
}
// 멤버변수가 2개인 클래스
class Point {
int x;
int y;
}
(1) 1번클래스와 2번 클래스의 new Circle() 객체 생성 시 구조 차이
- Circle c = new Circle()로 객체를 생성했다고 가정
- 1번: Circle클래스의 멤버로 각 변수가 저장되어있어서 객체 생성시 선언한 참조변수로 모든 변수에 접근이 가능함
- 2번: Circle 클래스의 직접적인 멤버변수는 c.r로 접근해야하고 포함관계인 Point()클래스의 멤버변수는 c.c.x, c.c.y로 접근해야함
3) 클래스 간의 관계 결정하기
- 문장을 만들어 보면 무엇으로 해야할지 결정하는 데 도움이 될 수 있음
(1) 상속관계 = 약 10% 비율
- 여러가지 제약이 많아서 꼭 필요할 때만 사용
- A는 B이다
(2) 포함관계 = 약 90% 비율
- 대부분 포함으로 코드를 작성하므로 잘 모르겠으면 포함으로 코드 작성을 권장함
- A는 B를 가지고 있다
// Pointclass는 포함하는게 좋을까 상속하는게 좋을까?
// 문장 만들어 보기
class Point {
int x;
int y;
}
// 서클은 포인트를 가지고 있다 = 포함으로 코드 작성 진행
class Circle {
Point c = new Point();
int r;
}
// 서클(자식)은 포인트(모)다
class Circle extends Point {
int r;
}
(3) 상속과 포함의 저장공간 구조 차이
- 저장공간 개수는 같음
- 상속은 마치 멤버 변수들이 Circle클래스에 선언되어있던 것처럼 변수들을 사용함
(4) 예제1
- 상속으로 출력
class MyPoint {
int x;
int y;
}
class Circle extends MyPoint { //상속
int r;
}
public class InheritanceTest {
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
(4) 예제2
- 포함으로 출력
class MyPoint {
int x;
int y;
}
class Circle {
MyPoint p = new MyPoint();
int r;
}
public class InheritanceTest {
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
** 출처 : 남궁성의 정석코딩_자바의정석