728x90

 

 

오버라이딩(Overriding)

자식이 부모한테 상속받은 메소드를 재작성하는 것

부모 클래스가 가진 기능을 자식 클래스가 재정의(추가,수정 등)하는 것

    *부모클래스를 자식클래스가 호출하는 개념

 

조건

  1. 부모 메소드 이름과 같아야한다
  2. 매개변수 전부 동일
  3. 반환타입 동일  ↔ 오버로딩은 반환타입 영향x 매개변수만 영향
  4. 부모 메소드가 private이면, 그 메소드는 오버라이딩 불가
  5. final 메소드 오버라이딩 불가

*final 종단 의미. 변경 불가, 여기까지 끝

변수 외에도 메소드,클래스에도 가능(예약어)

 

 

상속불가 조건

부모가 final,private면 상속불가

[접근제한자] [예약어] 반환형 메소드명 ( [매개변수] ) {}

  상속불가 조건                     선언부라고 부름

                           (선언부가 부모자식 동일해야함)

 

상속불가 조건 선언부라고 부름

 

 

@Override 

오버라이드 어노테이션

오버라이딩 했다는 표시 : 어노테이션(Annotation, 주석)

첫글자 대문자 아니면 빨간줄 에러남

@Override 붙이고 메소드명 변경하면 빨간줄 에러 발생

오버라이딩이 잘되고 있는지 검사해서 알려주는 것이 @Override

 

 


 

 

오버로딩(overloading)

한 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것

 

조건

같은 메소드 이름 다른 매개변수 선언부(매개변수 타입, 개수, 순서)

메소드의 리턴타입은 오버로딩 조건과 관계 없음

 

 

 

상속에서 오버라이딩한 예

 

toString 작성하는 것도 오버라이딩 한 것

@Override
public String toString() {
	return "Sub [x=" + x + ", y=" + y + ", a=" + a + "]";
}

 

 

728x90
반응형
728x90

@Override

public boolean equals(Object obj) 

@Override
	public boolean equals(Object obj) {
		// 객체 비교
		if (this == obj) { // this는 주소값 비교할려고 넣은 것
			return true;
		}
		if(obj == null) {
			return false;
		}
		if(getClass() != obj.getClass()) { // 내 클래스 정보와 상대방의 클래스 정보가 같은지 비교
			return false;
		}
		
		pModelVo02 other = (pModelVo02)obj; // 다운캐스팅 : obj->Snack
		if(name == null) {      // other는 레퍼런스 변수
			if(other.name != null) { 
				return false;
			}
		}else if(!name.equals(other.name)) { // 이름에 대한 비교
			return false;
		}
		
		if(weight != other.weight) { // 목록에 대한 비교
			return false;
		}
		return true;
	}

 

@Override

public int hashCode()

	@Override
	public int hashCode() {
		final int PRIME = 31; // 컴퓨터가 이해하기 좋은 숫자가 31이라함
		int result = 1;
		
		result = PRIME * result + (name == null ? 0 : name.hashCode()); // 내 해쉬코드가 아니라 스트링의 해쉬코드를 가져오는 것
		result = PRIME * result + weight; // 형이 안맞아서 에러나니 캐스팅 또는 소수점 없게끔 계산
		
		return result;
	}

 

@Override

public int compareTo(Object o)

	@Override
	public int compareTo(Object o) {
	    // Dog 이름 오름차순
		// Object o를 다운 캐스팅 해줘야함
		pModelVo02 otherP = (pModelVo02)o;
		
		String other = otherP.name;
		
		int result = name.compareTo(other); // compareTO 자체가 인트값 반환
		return 0;
	}

 

 

728x90
반응형
728x90

 

 

 

// 상속 & overriding
class Parents {
	public String doo() {
		return "parents doo";
	}
}
class children extends Parents {
	public String dont() {
		return "children dont";
	}
	//Overriding
	public String doo() {
		System.out.println(super.doo());	// super.
		return "children doo";
	}
}
public class practice_everyday04 {
	public static void main(String[] args) {
		
	Parents one = new Parents();
	one.doo();
	
	children two = new children();
	two.dont();
	two.doo();
//	System.out.println(one);		// 인스턴스one 바로 호출하면 메모리 주소값 출력
									// 객체를 호출하면 디폴트값으로 객체명과 메모리주소를 반환
	System.out.println(one.doo());  // 인스턴스.메소드() 호출해야 return값 반환
	System.out.println(two.dont());
	System.out.println(two.doo());
	}
}
728x90
반응형
728x90

오버라이딩(Overriding)

부모가 가진 기능재정의(수정, 추가 등)하는 것을 오버라이딩(Overriding)

 

오버로딩(Overloading)

과적하다 의미. 상속과 관련x

부모클래스도 자식클래스도 오버로딩 가능. 자식 클래스는 부모 클래스를 오버라이딩, 오버로딩 둘 다 가능

자바는 형태만 다르면 같은 이름의 메소드같은 클래스 내에서도 여러개 사용 가능

ex)

class Cal11 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int sum(int v1, int v2, int v3) { // 같은 이름 메소드 // int v3 추가
		return v1+v2+v3;
	}
}

 

 

전체코드

// Java 상속 - 2. 기능의 개선과 발전

class Cal11 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int sum(int v1, int v2, int v3) { // 같은 이름 메소드 // int v3 추가
		return v1+v2+v3;
	}
}
class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return v1+v2;
	}
}
public class Inheritance02 {

	public static void main(String[] args) {

		Cal11 c1 = new Cal11();
		System.out.println(c1.sum(2,1));
		System.out.println(c1.sum(2,1,1));
		
		Cal33 c3 = new Cal33();
		System.out.println(c3.sum(2,1));
		System.out.println(c3.minus(2,1));	// 자식클래스에 추가된 minus기능
		
		
	}
class Cal22 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1-v2;
	}
}
}
728x90
반응형
728x90

 

우리의 관심사

어떻게하면 자식 클래스가 부모 클래스가 가지고 있지 않은 새로운 기능을 추가할 것인가?

또 부모 클래스가 가지고 있는 기능을 덮어쓰기(수정) 할 것인가?

 

기능 추가

오리지널 Cal의 sum기능을 복사해서 Cal3에 넣고 minus로 변경

Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재

 class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
}

Cal33 c3 = new Cal33();
System.out.println(c3.sum(2,1));
System.out.println(c3.minus(2,1));	// 자식클래스에 추가된 minus기능

오리지널의 기능 수정 가능?

가능

오리지널의 sum에 프린트기능 추가 수정해서 cal3에서 써보자

class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return v1+v2;    // 부모가 가진 기능을 재정의(수정)
	}
}

오버라이딩(Overriding)

부모가 가진 기능재정의하는 것을 오버라이딩(Overriding)

 

 

전체코드

// Java 상속 - 2. 기능의 개선과 발전

class Cal11 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
}
class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return v1+v2;
	}
}
public class Inheritance02 {

	public static void main(String[] args) {

		Cal11 c1 = new Cal11();
		System.out.println(c1.sum(2,1));
		
		Cal33 c3 = new Cal33();
		System.out.println(c3.sum(2,1));
		System.out.println(c3.minus(2,1));	// 자식클래스에 추가된 minus기능
		
		
	}
class Cal22 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1-v2;
	}
}
}

 

728x90
반응형
728x90

 

JAVA1 - 13.5. 자바 문서 보는 법 - 상속(inheritance)

 

JAVA API 문서

PrintWriter클래스를 만든 사람은 처음부터 만들고 싶지 않아서 Writer클래스에서 상속받아 PrintWriter클래스를 만들었고 Writer클래스를 만든 사람은 마찬가지로 Object클래스를 상속받아 쉽게 Writer클래스를 만든

 

*자바에서는 변수 필드라고 함 (Field = variable)

 

 

이클립스에서 상속관계(hierarchy) 보는 방법

[보기 원하는 클래스 위에 우클릭] - [Open tpye Hierarchy 클릭(F4) ]

 

Object 아래 toString 있고 Writer 있음

Object 아래 상속 Writer 아래 상속 PrintWriter 상속

PrintWriter클래스 쓰면 같은 부모 Object 아래 상속 되었기에, Object 아래있는 다른 클래스인 toString 같이 사용가능

 

 

 

자바의 모든 클래스는 Object클래스를 반드시 상속받음

누군가가 Writer라고 하는 어떤 취지를 가진 클래스를 만드는데 필수이기도 하고

Object기능을 사용하기도해서 Object 상속 받는데 이때 사용하는 키워드가 extends

 

 

, Object 확장(extends)해서 Writer 클래스를 만들었다는

마찬가지로, PrintWriter클래스도 Writer 클래스를 확장(extends)해서 만든

 

 

PrintWriter p1 = new PrintWriter("result 1");
p1.toString()

PrintWriter 인스턴스(P1) 만들고 인스턴스에 .toString()이라고 하게되면

상태에서 toString() 오브젝트에 있다고 하면, 자바가 어떻게 동작하는가?

 - PrintWriter클래스에 toString 있는지 보고 없으면 extends 가리키는 Writer 찾아보고 없으면 extends 가리키는 Object 찾아본다. 없으면 에러가 나고 있으면, toString() 메소드를 실행

 


 

Writer클래스는 String 받는 write클래스( write(String) : void  ) 정의되어 있다

PrintWriter클래스에서도 String 받는 write클래스( write(String) : void  ) 정의되어 있다

 - , Writer클래스에도 write메소드가 있는데 Writer클래스를 상속 받는 PrintWriter클래스에도 write메소드가 있는 . 다시말해, 덮어쓰기(overriding)

 

위의 상태에서 write()메소드는 누구의 write 메소드일까?

 - PrintWriter클래스 write(String) : void 사용하는

 

 

덮어쓰기(Override)?

PrintWriter클래스를 만든 사람이 Writer클래스의 write()메소드가 마음에 들지 않거나 취지에 맞지 않는다면 부모클래스의 메소드를 사용하지않고 자식클래스(자신) write()메소드를 사용하는데, 이를 덮어쓰기(overriding) 한다고한다

 


 

<JAVA API 보는법>

Tree

클래스 상속관계(Hierarchy) 있는

 

자바가 기본적으로 제공하는 표준 라이브러리들이 서로 간에 어떤 상속관계를 가지고 있는지 보여준다.

정점에는 역시 Object. 페이지 상단에 위치

 

 

자바에서 변수를 필드라 부름

필드=변수

위의 Fields Summary 의미

위의 lock이라고 하는 변수(필드) Writer()클래스에 정의되어있고 상속받아서 PrintWriter() lock이라는 필드(변수) 사용할 있다는 의미

 

Object클래스로부터 상속받았기 때문에 위의 메소드들은 사용할 있다는 의미

 

 

 

728x90
반응형

+ Recent posts