본문 바로가기
Java/Java 예습

[Java] 자바의 객체 Part.2 예습_4

by 박채니 2022. 1. 25.

안녕하세요, 코린이의 코딩 학습기 채니입니다.

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( ) { }