안녕하세요, 코린이의 코딩 학습기 채니입니다.
Java 객체를 예습했던 내용을 정리한 포스팅입니다.
@run
package com.kh.p2.over.run;
import com.kh.p2.over.child.model.vo.CoffeeShop;
import com.kh.p2.over.parent.model.vo.Shop;
public class Run {
public static void main(String[] args) {
// Shop sp = new Shop("채니", "서울 송파구");
// System.out.println(sp);
// sp.order("부모 메소드 >> ");
// CoffeeShop sc = new CoffeeShop("채니", "서울 송파구", "핫초코", 4000, "채니샵");
// sc.order("오버라이딩에 의한 자식 메소드 >>");
CoffeeShop cs1 = new CoffeeShop("아메리카노", 3000, "채니네");
CoffeeShop cs2 = new CoffeeShop("아메리카노", 3000, "채니네");
System.out.println(cs1.toString());
System.out.println(cs2);
System.out.println(cs1.hashCode()); //메모리공간 주소값
System.out.println(cs2.hashCode()); //메모리공간 주소값
System.out.println("equals 비교 결과 : " + cs1.equals(cs2)); //주소값 비교 equals는 boolean형이므로 true/false 출력
}
}
@출력값
커피명 : 아메리카노, 가격 : 3000, 가게명 : 채니네
커피명 : 아메리카노, 가격 : 3000, 가게명 : 채니네
1313922862
495053715
equals 비교 결과 : false
cs1과 cs2에 같은 값을 입력을 하고 hashCode로 메모리 공간의 주소값을 불러왔을 때 서로 다른 곳에 입력이 되어있다는 것을 확인할 수 있었다.
equals 를 사용하여 cs1과 cs1의 주소값을 비교해보았을 때 서로 공간이 상이하므로, false가 출력 되는 것을 확인 하였고,
나는 같은 값이 들어가면 equals가 true라고 반환되게끔 하고 싶었다.
하기와 같이 Object 메소드로 오버라이딩하여 위와 같은 처리를 하였다.
// CoffeeShop 자식클래스
@Override
public boolean equals(Object obj) {
CoffeeShop cs = (CoffeeShop)obj;
if(this.coffeeName == cs.coffeeName && this.price == cs.price && this.shopName == cs.shopName) {
return true;
} else {
return false;
}
// return this.coffeeName == cs.coffeeName && this.price == cs.price && this.shopName == cs.shopName
// 결과값은 같음
}
}
obj로 매개변수를 받고 있기 때문에 obj를 CoffeeShop으로 받아주게끔 (CoffeeShop)obj 를 cs 변수에 저장하였고 조건문을 활용하여 this. 과 cs. 이 같다면 true를 출력하도록 하였다.
run class와 CoffeeShop은 Object를 상속 받고 있음. (Object는 모든 클래스의 부모 클래스)protected는 Object와 run // Object와 CoffeeShop의 관계일 때 clone메소드를 사용할 수 있지만, run 클래스에서 CoffeeShop 의 관계에서 clone메소드를 사용은 불가→ 부모로부터 물려받은 clone메소드를 run클래스에서 접근할 수 없음!! protected는 상속관계이고 부모/자식 관계에서는 clone메소드를 사용할 수 있지만 run클래스에서 clone메소드를 가진 클래스에 접근 할 수 없기 때문에 protected는 public으로 변경 해줘야 하며 반환형의 자식클래스로는 오버라이딩할 수 있으므로 반환형을 CoffeeShop(자식클래스)으로 변경해줘야함
@Override
public CoffeeShop clone() { // 모든 클래스는 object의 자식클래스이므로 object를 coffeeshop으로 변환 가능
return this;
}
@run
CoffeeShop cs3 = null;
//protected Object clone() 기본형
//cs3 = (CoffeeShop)cs1.clone();
cs3 = cs1.clone();
System.out.println(cs3);
@출력값
커피명 : 아메리카노, 가격 : 3000, 가게명 : 채니네
오버로딩(Overloading)
: 한 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것
조건
1) 같은 메소드 이름
2) 다른 매개변수 선언부 (매개변수 타입, 개수, 순서)
주의사항
* 메소드의 리턴 타입은 오버로딩 조건과 관계 없음
오버라이딩과 오버로딩
오버라이딩(Overriding) | 오버로딩(Overloading) |
하위 클래스에서 메소드 정의 | 같은 클래스에서 메소드 정의 |
메소드 이름 동일 매개변수 동일 (개수, 타입) 리턴 타입 동일 (하위 클래스(java1.5~)) |
메소드 이름 동일 매개변수 다름 (개수, 타입) 리턴 타입 상관 없음 |
자식 메소드의 접근 범위가 부모 메소드의 접근 범위보다 넓거나 같아야 함 |
접근 제어자와 상관 없음 |
자식 메소드의 예외 수가 부모 메소드의 예외 수보다 적거나 범위가 좁어야 함 |
예외처리와 상관 없음 |
final 예약어
final 클래스: 상속이 불가능한 클래스 (상속 관계를 갖지 않음. 자식 클래스는 될 수 있겠지만 부모 클래스는 될 수 없음)public final class FinalClass { }
final 메소드: 상속 시 오버라이딩이 불가능한 메소드public final void method( ) { }
'Java > Java 예습' 카테고리의 다른 글
[Java] 자바의 객체 Part.2 실습_2 (0) | 2022.01.26 |
---|---|
[Java] 자바의 객체 Part.2 예습_5 (0) | 2022.01.26 |
[Java] 자바의 객체 Part.2 예습_3 (0) | 2022.01.24 |
[Java] 자바의 객체 Part.2 실습_1 (0) | 2022.01.20 |
[Java] 자바의 객체 Part.2 예습_2 (0) | 2022.01.20 |