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
- 게시글 목록 api
- jpa 활용2 - api 개발 고급
- 스프링 mvc1 - 서블릿
- 스프링 mvc2 - 타임리프
- 자바의 정석 기초편 ch4
- 타임리프 - 기본기능
- 코드로 시작하는 자바 첫걸음
- 자바의 정석 기초편 ch5
- 2024 정보처리기사 수제비 실기
- @Aspect
- 자바의 정석 기초편 ch3
- 스프링 고급 - 스프링 aop
- 스프링 db2 - 데이터 접근 기술
- 자바의 정석 기초편 ch7
- 자바의 정석 기초편 ch12
- 스프링 db1 - 스프링과 문제 해결
- 자바의 정석 기초편 ch11
- 자바의 정석 기초편 ch2
- 자바의 정석 기초편 ch1
- 스프링 mvc1 - 스프링 mvc
- 자바의 정석 기초편 ch9
- 스프링 mvc2 - 로그인 처리
- 자바의 정석 기초편 ch8
- 스프링 mvc2 - 검증
- 자바의 정석 기초편 ch13
- 자바의 정석 기초편 ch6
- 스프링 입문(무료)
- 자바의 정석 기초편 ch14
- 2024 정보처리기사 시나공 필기
- jpa - 객체지향 쿼리 언어
Archives
- Today
- Total
나구리의 개발공부기록
자바의 정석 기초편 ch7 - 5 ~ 9[단일상속, Object클래스,오버라이딩, 오버로딩 vs 오버라이딩] 본문
유튜브 공부/JAVA의 정석 기초편(유튜브)
자바의 정석 기초편 ch7 - 5 ~ 9[단일상속, Object클래스,오버라이딩, 오버로딩 vs 오버라이딩]
소소한나구리 2023. 11. 23. 14:101) 단일상속
- Java는 단일 상속만을 허용 (C++은 다중상속 허용)
- 다중상속은 충돌문제가 있어서 다중상속을 제외했음
- Java는 인터페이스를 이용하면 충돌문제를 해결하면서 다중상속 효과를 낼 수 있음 - 이후에 배움
class TvDVD extends Tv, DVD { // 에러 발생
}
// 조상은 하나만 허용된다.
(1) 인터페이스를 사용하지 않고 다중상속처럼 하려면?
- 비중이 높은 클래스 하나만 상속관계로 설정하고 나머지는 포함관계로 설정하면 다중 상속 효과를 낼 수 있음
class TV { // 상속
내용 생략
}
class DVD { // 포함
void power() { 내용생략 }
void play() { 내용생략 }
void stop() { 내용생략 }
void rew() { 내용생략 }
}
class TvDVD extends TV { // TV클래스는 상속하고
DVD dvd = new DVD(); // DVD클래스는 포함으로 작성
void play() { // 포함 객체 사용(메서드 호출)
dvd.play()
}
void stop() { // 포함 객체 사용(메서드 호출)
dvd.play();
}
void rew() {
dvd.play() // 포함 객체 사용(메서드호출)
}
}
2)Object 클래스
- 모든 클래스의 조상
- 모든 클래스는 자동으로 Object 클래스를 상속 받게 되며 우리가 상속 없이 class를 만들어서 사용했더라도 Object 클래스는 상속을 받음
- 즉, 모든 클래스의 최상위 조상으로 Object가 있으며 프로그램 실행 시 컴파일러가 자동으로 extends Object를 자동 추가 함
- 모든 클래스는 Object클래스에 정의 된 11(9장에서 더 배움)개의 메서드를 상속 받음
- ex) toSting(), equals(Object obj), hashCode(), 등등등
(1) 예제
- Object 클래스를 상속하지 않아도 프로그램을 실행하면 컴파일러가 자동으로 추가함
- toSpring()이라는 메서드를 어디에도 만들지 않았지만 Object클래스를 자동으로 상속 받으므로 사용할 수 있음
- toString메서드는 출력할때 사용하는 기능
class MyPoint { // 컴파일 하면 자동으로 Object 추가
int x;
int y;
}
class Circle { // 컴파일 하면 자동으로 Object 추가
MyPoint p;
int r;
Circle() {
p = new MyPoint();
}
}
public class InheritanceTest { // 컴파일 하면 자동으로 Object 추가
public static void main(String[] args) {
Circle c = new Circle();
Circle c2 = new Circle();
System.out.println(c.toString()); // 객체의 주소 출력
// c.toString()과 동일한 결과 참조변수 c만 출력하나 결과가 똑같음
System.out.println(c);
System.out.println(c2.toString()); // 객체의 주소 출력
}
}
출력결과
Circle@18b4aac2
Circle@18b4aac2
Circle@764c12b6
3) 오버라이딩(overriding; 메서드 오버라이딩)
- 상속받은 조상의 메서드를 자신에 맞게 변경하는 것 즉, 기능을 재정의함
- 내용만 변경 가능(구현부)하며 선언부는 변경 불가
class MyPoint3 {
int x;
int y;
String getLocation() { // 메서드
return"x:" + x + ", y:" + y;
}
}
class MyPoint3D extends MyPoint3 { // Point클래스 상속
int z;
String getLocation() { // 메서드 오버라이딩
return"x:" + x + ", y:" + y +", z:" +z;
}
}
public class OverrideTest {
public static void main(String[] args) {
MyPoint3D p = new MyPoint3D();
p.x = 3;
p.y = 5;
p.z = 7;
System.out.println(p.getLocation());
}
}
오버라이딩 안하면 z가 출력 안됨
오버라이딩 출력 결과
x:3, y:5, z:7
(1) 오버라이딩의 조건
- 메서드의 선언부가 조상 클래스의 메서드와 반환타입, 메서드이름, 매개변수 목록이 모두 일치 해야함,
- 접근 제어자를 조상 클래스의 좁은 범위로 변경할 수 없음 - 접근제어자는 이후에 배움
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없음 - 예외선언은 8장에서 배움
(2) 오버로딩과 오버라이딩
- 서로 전혀 관계가 없음(헷갈리면 안됨)
- 오버로딩 : 이름이 같은 새로운 메서드를 정의 하는 것 - 상속하고 관계가 없음
- 오버라이딩 : 상속받은 메서드의 내용을 변경 하는 것
(3) 예제
- toString()메서드를 오버라이딩하여 출력형식을 재정의
- 참조변수로만 출력해도 오버라이딩된 출력형식이 적용되는 이유는 print(), println(), printf()모두 호출 시 toString() 메서드가 호출되도록 정의 되었기 때문임
class MyPoint3 { // 자동으로 Object클래스 상속
int x;
int y;
MyPoint3(int x, int y) { // 생성자로 변수 초기화
this.x = x;
this.y = y;
}
// Object 클래스의 toString()을 오버라이딩
// Object 클래스의 toString()메서드에는 public이 붙어있음
public String toString() { // 오버라이딩시 선언부는 똑같아야함
return "x:"+x+", y:"+y;
}
}
public class OverrideTest { // 자동으로 Object클래스 상속
public static void main(String[] args) {
MyPoint3 p = new MyPoint3(2,3);
// p.x = 3; // 직접 변수를 초기화 할 수 있음
// p.y = 5;
// 3개 모두다 출력값이 같음
System.out.println("x:"+p.x+", y:"+p.y); // 양식을 직접 입력하여 출력
System.out.println(p.toString()); // 간단히 toString으로 출력
System.out.println(p); // 참조변수로만 출력
}
}
/*
출력 결과(생성자로 변수를 초기화 했을 시)
x:2, y:3
x:2, y:3
x:2, y:3
출력 결과(직접 변수를 초기화 했을 시)
x:3, y:5
x:3, y:5
x:3, y:5
*/
** 출처 : 남궁성의 정석코딩_자바의정석