일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 예외
- 예제
- 크롤링
- 함수
- 키-값 데이터베이스
- HTML역사
- R1C3
- 데이터베이스
- Doit입문SQL
- 생성자
- 웹 브라우저 전쟁
- 페이지분석
- 웹브라우저 수용도
- 우아한테크
- html
- 숫자 형식
- DoitSQL
- 숫자형식오류
- dbms
- 함수 선언
- 배열 3요소
- SQL입문
- SQL
- DoitSQL입문
- 크롤링 오류
- 자바 오류
- 배열 예제
- 자바
- 자바 예외
- DoIt
- Today
- Total
프로그래밍
[자바 기초] day10 : 상속 심화(오버라이딩 점 예제) 본문
2023.05.16.화
오버라이딩
오버라이딩은 메서드를 재정의 하는 것이다
오버라이딩을 통해 기존에 있던 메서드를 원하는 기능으로 바꾸어 쓸 수 있다
오버라이딩
다음 코드는 해당 두 객체의 이름(name)이 같으면 알을 획득했다는 메세지가 출력되며
같지 않으면 "..."이라는 메세지가 출력되는 프로그램이다
package class01;
// [ 상속 - 심화 ]
class Pokemon{
String name;
Pokemon(){
this("포켓몬");
}
Pokemon(String name){
this.name=name;
}
void printInfo() {
System.out.println("이 포켓몬은 "+this.name+"입니다.");
}
}
class Pika extends Pokemon{
Pika(){
super("피카츄");
}
}
class Charmander extends Pokemon{
Charmander(){
super("파이리");
}
}
public class Test01 {
public static void main(String[] args) {
Pika p1=new Pika();
Pika p2=new Pika();
Charmander c1=new Charmander();
if(p1.equals(c1)) {
System.out.println("알을 획득했습니다!");
}
else {
System.out.println(".....");
}
}
}
위의 코드로 실행을 시켰을때 이름이 같음에도 "..."이라고 출력되는 결과를 볼 수 있다
해당 문제가 발생하는 이유는 연산의 대상이 객체가 될 수 없기 때문이다
우린 이런 일을 String 비교에서도 볼 수 있다
String은 == 비교연산자로 비교가 불가능하며 equals를 사용해야 한다
그렇다면 equals를 사용해도 오류가 나는 이유는 무엇일까?
해당 코드처럼 작성할시 비교하는 것은 두 객체의 이름이 아닌 주소이다
그렇기에 같지 않다고 나온다
이러한 현상을 해결하기 위해
오버라이딩을 해보자
다음 코드는 Pokemon 클래스 안에 있다
@Override
public boolean equals(Object obj) {
Pokemon pokemon = (Pokemon)obj; // 강제 형변환, 명시적 형변환, 다운 캐스팅
if(this.name.equals(pokemon.name)) {
return true;
}
return false;
}
원래 equals()는 자바에서 기본 제공해주는 최상위 클래스, Object 클래스의 것이다
우린 명시적 형변환(강제 형변환, 다운캐스팅)을 통해 pokemon의 클래스 것으로 바꾸었다
그 후 두 객체의 이름끼리 비교한 뒤 같으면 true, 다르면 false로 출력한다
[ 연습 문제 ]
점 클래스 Point가 있다.
int x,int y(좌표)를 멤버변수로 가지고 있다.
x,y의 좌표가 같다면 같은 점으로 인식할 수 있도록 하여라
main(){
Point[] data=new Point[3];
data[0]에는 점(10,20)
data[1]에는 점(123,20)
data[2]에는 점(10,20)
이 저장되어있다.
data[0]과 data[1],
data[0]과 data[2]를 비교
}
package class01;
class Point { // 점 클래스
int x;
int y;
// 생성자 x, y 모두 입력받음
Point(int x, int y) {
this.x = x;
this.y = y;
}
// 오버라이딩
@Override
public boolean equals(Object obj) {
Point point = (Point) obj; // 명시적 형변환
if ((this.x == point.x) && (this.y == point.y)) { // 같으면 true
return true;
}
return false;
}
}
//색깔 점 클래스 (점 클래스 상속)
class ColorPoint extends Point {
String color; // 부모에 없는 멤버변수
//생성자 x, y, 색깔 모두 입력 받음
ColorPoint(int x, int y, String color) {
super(x, y);
this.color = color;
}
// 오버라이딩
@Override
public boolean equals(Object obj) {
ColorPoint colorPoint = (ColorPoint) obj; // 명시적 형변환
// x, y, 색깔 모두 같으면 true
if ((this.x == colorPoint.x) && (this.y == colorPoint.y) && (this.color.equals(colorPoint.color))) {
return true;
}
return false;
}
}
public class Test03 {
public static void main(String[] args) {
//점 클래스 객체 배열
Point[] data = new Point[3];
data[0] = new Point(10, 20);
data[1] = new Point(123, 20);
data[2] = new Point(10, 20);
//색깔 점 클래스 객체 배열
ColorPoint[] data2 = new ColorPoint[3];
data2[0] = new ColorPoint(10, 20, "blue");
data2[1] = new ColorPoint(10, 20, "blue");
data2[2] = new ColorPoint(10, 20, "red");
// 점 객체 비교
if (data[0].equals(data[1])) {
System.out.println("O");
} else {
System.out.println("X");
}
if (data[0].equals(data[2])) {
System.out.println("O");
} else {
System.out.println("X");
}
// 색깔 점 객체 비교
if (data2[0].equals(data2[1])) {
System.out.println("O");
} else {
System.out.println("X");
}
if (data2[0].equals(data2[2])) {
System.out.println("O");
} else {
System.out.println("X");
}
}
}
'자바 > 자바 기초' 카테고리의 다른 글
[자바 기초] day11 : 캡슐화(private-getter, setter) (0) | 2023.05.18 |
---|---|
[자바 기초] day10 : 상속 오버라이딩 예제 (0) | 2023.05.18 |
[자바 기초] day09 : 상속 예제 (0) | 2023.05.16 |
[자바 기초] day09 : 클래스 상속 (0) | 2023.05.16 |
[자바 기초] day07 : 포켓몬 생성자 예제 (0) | 2023.05.15 |