728x90

 

▶ 추상클래스(abstract)

몸체(=중괄호 ) 없는 메소드

중괄호{ } 없는 메소드

미완성된 클래스를 뜻함

선언되어 있지만 구현되지 않은 미완성의 메소드(추상 메소드)를 포함하고 있는 클래스일 때 반드시 abstract 키워드를 class 앞에 붙여 준다.

클래스 앞에 ‘abstract’ 키워드를 붙이면 추상 클래스가 생성되며, 객체를 생성할 수 없다는 점만 빼면 일반 클래 스와 다른 점이 없다

 

1.미완성 클래스

자체적으로 객체 생성 불가 → 반드시 상속하여 객체 생성

  1. abstract 메소드가 포함된 클래스는 반드시 abstract 클래스 abstract 메소드가 없어도

abstract 클래스 선언 가능 3. 클래스 내에 일반 변수, 메소드 포함 가능 4. 객체 생성은 안되지만 참조형 변수 타입으로는 사용 가능

클래스로서의 객체 생성은 못 하지만, 새로운 클래스를 작성할 때 부모 클래스로 이용되며 새 클래스 작성을 위한 템플릿이 되어 상속 받은 클래스들의 규칙을 주는 용도로 사용 가능

abstract

추상, 추상개념, 추상의, 추상적인

abstract 붙은 클래스는 ‘추상클래스’라고 부름

abstract : 예약어

 

 

 

추상메소드

중괄호 없이 바로 세미콜론 ;

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

추상 메소드 : [접근제한자] abstract 반환형 메소드명( [매개변수] )  ;  

 

 

추상메소드를 왜 만들까?

나를 상속한 얘가 반드시 나를 만들 수 있도록(오버라이딩) 강제하기 위해서 만듬

상속 시, 반드시 오버라이딩 할 수 있도록 강제화

공통적 규약을 만들기 위해 쓰인다

 

오버라이딩 강제 why?

전화기면 모든 전화기는 전화통화는 가능해야하니 전화기능을 공통적으로 가져야만 한다

안에서 꼭 필요한 기능이 있으면 강제적으로 그 기능을 가지게 하므로 규약을 만드는 것

미완성 메소드

=추상메소드

미완성이라 static과 사용 불가

몸체(=중괄호)가 없다보니 미완성메소드

반드시 오버라이딩시키는 이유도 미완성이라 완성 시킬려고 하는 것

내 몸체 안에 추상클래스(=미완성클래스, 중괄호x)가 있을수 있다

추상클래스 자체를 객체로 만들어 사용할 수 있을까?

no

 

특징

1)자체적으로 객체생성 불가

객체생성은 안되나 참조변수로 활용은 가능

상속을 시켜서 객체를 만드는 건 가능

2)추상 메소드가 없어도 추상클래스 선언 가능

추상클래스는 꼭 추상메소드를 포함하고 있어야한다? no

3)추상 클래스 내에 일반 변수나 메소드 포함가능

 

유의사항

1)클래스에 abstract와 final 동시 사용 불가

abstract는 상속(extends)해야만 하고

final은 클래스에서 상속이 안된다는 것

둘이 완전 정반대

2)메소드에 abstract와 static 동시 사용 불가

abstract는 미완성 메소드인데 미완성 메소드를 static공유한다는건데

미완성 공유는 말이 안됨

3)abstract 메소드의 접근제한자로 private 불가능

미완성 메소드라 오버라이딩 해야되는데 private이면 오버라이딩 자체가 불가능하기에 논리가 안맞음

 

*추상 클래스의 상수는 static 선언이 필요

 

 


 

 

▶ 인터페이스(Interface)

상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체

메소드 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것

상속 시 인터페이스 내에 정의된 모든 추상메소드 구현해야 함

공통적 규약을 만들기 위해 쓰이며, abstract보다 더 강력한 규약을 만들기 위해 사용함

abstract < Interface

*왜 그렇게 말할까?

추상 메소드만 작성할 수 있음

 

사용법

[접근제한자] interface 인터페이스명 { }

이 안에는 상수형 필드와 추상 메소드만 들어갈 수 있다

상수형 필드 : [public static final]

추상 메소드 : [public abstract]

[접근제한자] interface 인터페이스명 {
		// 상수도 멤버로 포함할 수 있음
		public static final 자료형 변수명 = 초기값; // 추상 메소드만 선언 가능

		[public abstract] 반환자료형 메소드명([자료형 매개변수]); // public abstract가 생략되기 때문에
		// 오버라이딩 시 반드시 public 표기해야 함
}

 

 

인터페이스 앞 수식어들을 생략할 수 있는 이유

어차피 들어갈 수 있는 수식어들이 한정되어 있고

없으면 어차피 인터페이스 자체가 존재 불가능이기 때문

 

 

특징

1)모든 인터페이스의 메소드는

상수형 필드와 추상메소드만 들어갈 수 있기 때문에 묵시적으로public static final, public abstract

2)변수는 묵시적으로 public static final,

따라서 인터페이스 변수의 값 변경 시도 시 컴파일 시 에러 발생

3)인터페이스 자체로 객체 생성 x

상속(implements)으로 객체생성 o (abstract의 상속은 extends)

참조변수로 사용 o

728x90
반응형
728x90

 

상속(Inheritance)

부모 클래스가 가지고 있는 멤버(필드or메소드)를 자식 클래스에게 넘겨주는 것

자식은 부모를 확장한 것

다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써, 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능

 

명령어 : extends

[접근제한자] class 클래스명 extends 클래스명{}

 

 

상속 명칭

부모클래스 = 조상클래스 = 상위클래스(super class)

자식클래스 = 자손클래스 = 하위클래스(sub class)

 

 

상속 목적

1.클래스의 재사용 가능

2.공통적인 규약 정의

 

 

상속 장점

1.코드량 감소

직접 만들지않고 부모클래스를 가져다 쓰기 때문

적은 양의 코드로 클래스 작성 가능

 

2.코드 추가,삭제,변경 용이

부모클래스의 데이터가 공통분모가 되서 일괄변환됨

코드를 공통적으로 관리하기 때문에 코드 추가/변경 용이

 

3.중복 제거 → 생산성,유지보수up

 

 

상속 특징

1.모든 클래스는 Object클래스의 후손(=Object는 최상위 클래스)

    Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현 가능

         ex) java.lang.String 클래스의 equals()와 toString()

부모클래스로부터 멤버(필드,메소드) 받아오는 것

 

2.부모 클래스의 생성자, 초기화 블록은 상속 안됨

자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행

자식 클래스 생성자 안에 부모 클래스 생성자를 호출하고 싶으면 super() 활용

    - 부모클래스에 접근하는 방법 : super()

 

3.부모의 private멤버는 상속은 되지만 직접 접근 불가

자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우, 자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입 불가

(private 접근 범위, 해당 클래스 안이기에 직접적으로는 접근 불가)

 

접근 하는 방법

  1. super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨 생성
  2. setter, getter 메소드를 이용하여 접근

 

*부모클래스와 자식클래스의 주소값은 다르다

(=참조하고 있지 않다는 의미. 주소값이 다르기에 )

부모클래스의 객체 주소값은 고정되어있지 않다

자식 클래스라고 해서 부모클래스가 그대로 들어가지 않는다

 

 

자바의 단일상속, 다중 상속

※ 다중 상속

C++에서 사용 가능한 기능

여러 클래스로부터 상속이 가능하며 복합적인 기능을 가진 클래스를 쉽게 생성 가능

    - 서로 다른 클래스로부터 상속받은 멤버 간의 이름이 같은 경우 문제 발생

 

자바에서 다중상속 불가

단일 상속만 가능. 만약 다중상속이 필요하면 단일 상속을 여러번 사용해서 구현 가능

하나의 자식에 여러 부모 불가

하나의 부모에 여러 자식 가능

화살표 : 아래에서 위로

자식이 부모를 가리키는 것

고로, 자식 클래스에서 부모클래스를 화살표가 가리켜야 한다

상속에서 쓰이는 화살표는 머리가 빈 화살표시

 

 

상속 시 딱 하나만 상속 받아오는 것

자바에서는 다중상속하지 않고 단일 상속을 지원함

why?

어느 클래스에서 받아왔는지 알기가 어려워지기 때문 단일 상속만 지원

클래스간의 관계가 다중 상속보다 명확하고 신뢰성 있는 코드 작성가능

 

자바에서 다중상속이 필요한 경우,

단일 상속을 여러번해서 다중상속을 표현할 수 있다

 

 

※ 해당 필드나 getter,setter가 어느 클래스에 속한지 알아볼 때 유용한 팁

대쉬 안에 있는건 어디 안에 있는 메소드인지 보여주는것

 

 

상속의 예시

Object에 있는 메소드들

어떻게 들어가 있을 수 있을까?

모든클래스는 object클래스 후손이기 때문

내가 만든 클래스(사용자 정의 클래스)도 object의 후손이기 때문에 object 안에 있는 클래스들을 다 상속 받은거고 사용할 수 있는 것

.

java.lang.Object

모든 클래스의 부모클래스

최상위 클래스라고 부른다

 

 

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

 

우리의 관심사

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

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

 

기능 추가

오리지널 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