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

 

 

 

// 상속 & 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

 

상속(Inheritance) 정의

특정 클래스의 변수, 메소드확장,상속해서 다른 클래스갖도록 하는 것

 

상속의 장점

  1. 코드의 재사용성up
  2. 유지보수 편의성 up
  3. 가독성 up
  4. 코드의 양 down

 

 

 

  • 부모클래스(=superClass)
  • 자식클래스(=subClass)

 

부모 클래스 기능에서 자식 클래스추가 & 재정의(오버라이딩) 가능

 

오버라이딩(Overriding)

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

예시)

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;    // 부모가 가진 기능을 재정의(수정)
	}
}

 

 

오버로딩(Overloading)

뜻 : 과적하다

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

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

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;
	}
}

 

 


 

 

this는 자기 자신

class Cal111 {
	// this
	// 자기 자신을 뜻함
	public int sum(int v1, int v2, int v3) { 
		return this.sum(v1,v2)+v3;	    // .sum() 자기자신
	}
}

 

 

super는 자신의 부모

자식 클래스의 메소드가 부모 클래스의 메소드를 호출하고 그 결과를 이용할 수 있게 하는 것

super.부모클래스의 메소드명;

breakpoint로 디버깅체크 가능

public int sum(int v1, int v2){
		return super.sum(v1,v2);
}

super의 사용 예시

class Cal1111 {
	int v1,v2;				  	        // 정수 데이터타입 세팅
	Cal1111(int v1, int v2) { 	  // 생성자 
		this.v1 = v1; this.v2 = v2; // this.v1의 v1은 class Cal1111 { 아랫줄 int v1
		//매개변수에 들어온 값				// this.v1 = v1;에서 v1;은 Cal1111(int v1, int v2)에서 int v1
		System.out.println("Cal init!!!");
	}
}
class Cal3333 extends Cal1111{  // extends : Cal1을 상속
	Cal3333(int v1, int v2) {
		**super**(v1, v2);	// **super**=부모클래스. 즉,부모클래스의 생성자를 실행시킴. 
						// 부모클래스의 생성자는 아래와 같다
						// Cal1111(int v1, int v2) {
						// 		this.v1 = v1; this.v2 = v2;
	System.out.println("Cal3 init!!!");
	}
}
public class Inheritance05 {
	public static void main(String[] args) {
		// new cal() 안에 입력값 2,1 새로 입력
		Cal1111 c1 = new Cal1111(2,1); // 출력 : 클래스cal1에서 println() 한번만 출력 
		Cal3333 c3 = new Cal3333(2,1); // 출력 : super(v1, v2); 이 문구가 
									   // 클래스cal1에서 println() 한번 출력시키고
									   // 클래스cal3에서 println() 한번 출력시켜 두번출력
	}
}

 

 

생성자(Constructor)

자식 클래스에서 부모클래스를 계승 받아 실행하게 될 때, 반드시 부모클래스의 생성자를 실행해야한다

ex)

class Cal1111 {
	int v1,v2;				  	      // 정수 데이터타입 세팅
	Cal1111(int v1, int v2) { 	// 생성자 
		this.v1 = v1; this.v2 = v2;
		//매개변수에 들어온 값
	}
}
class Cal3333 extends Cal1111{    // error 발생
}
public class Inheritance05 {
	public static void main(String[] args) {
		
		Cal1111 c1 = new Cal1111(2,1); // new cal() 안에 입력값 2,1입력
		Cal3333 c3 = new Cal3333();
	}
}

생성자(Constructor) 메커니즘

오리지널 클래스(cal)를 제대로 계승했다면, Cal이 인스턴스로 만들어질 때 반드시 해야되는 일들이 생성자에 들어있다. 때문에 이 생성자를 Cal3도 실행시켜야만 제대로 작동한다

 

 


 

다형성(Polymorphism)

자식 클래스를 부모클래스로써 동작하도록 규제하는 기능

ParentClass obj = new ChildClass()

 

다형성(polymorphism)이란 하나의 객체여러 가지 타입을 가질 수 있는 것

자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현

 

접근제어자(Access Modifers)

public, default, protected, private

클래스,메소드,변수를 사용자들이 아무거나 건드리지 못하게 제한하는 기능

 

Final

내가 만든 클래스를 다른 사람이 더이상 상속하게 하고 싶지 않을 때

메소드를 오버라이딩(Overriding)하게 하고 싶지않을 때

변수를 다른 사람이 마음대로 수정하게 하고 싶지 않을 때

이런 규제를 하고 싶다면 final을 사용

 

Abstract

final과 반대

클래스를 상속해서 사용하려는 사람에게 어떤 특정 메소드는 꼭 구현해라라고 강제하고 싶은 메소드가 있다면 사용

상속자가 직접 구현해야 하는 기능을 구현하도록 강제할 수 있다

Abstract Class Imcompletion

 

 

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

 

dd자바에서 상속 구현은 자식 클래스가 부모 클래스를 참조하여 인스턴스를 통해 구현되기에

상속할려면 인스턴스 사용도 필수

 

return값을 모니터 출력할려면 print()메소드 사용 잊지말고, 시스템 내에서는 잘 return 되고 있는 것도 다시 remind

 

상속 extends 명령어 & 오버라이딩 개념 이해 및 적용 완료

 

 

 

728x90
반응형

+ Recent posts