본문 바로가기

공부/자바 OOP

6월3일 - 상속

자체교재-chapter 15 상속

교학사 - 6장 객체지향 프로그래밍 2

 

상속 (inheritance)

의미 : 기존에 만들어져있는 클래스의 재활용

부모, 조상, super class

자식, 파생, sub class

이라는 단어가 많이 나올 수 있다. 

상속의 관계 설명도 

AA클래스 2개

BB클래스 AA2개+1개=3개

CC클래스 4개

DD클래스 2개

. . .

EE클래스 다중상속 안됨 . 하나만 상속받을 수 있다. 

 

상속을 받을 때에 형식 :

class 자식 extends 부모클래스{ }

 

final class AA(){} -> final 클래스는 종단클래스로 상속시킬 수 없다. 

 

Override - 함수의 재정의 

framework -구조화

의미 : 상속관계에서 메소드를 다시 수정하는 것 (리폼하는 것)

Method Overload 함수명 중복 (중복이지만 다 개별함수 )

 

접근제어

private     상속안됨. 함수를 은폐시킬 수 있음.

package   상속됨. 하지만 같은 경로안에서만 접근가능 앞에 package가 생략된것 

protected  상속됨. 다른 팩키지에서도 접근가능

public       상속됨. basicJava프로젝트 내에서 모두 접근 가능

자바의 뿌리 = Object 클래스

자바의 모든 클래스는 Object 클래스를 상속받아야 한다.

extends Object는 생략가능 ! 안써도 기본적으로 Object를 물려받기 때문에 Object 의 메소드를 사용할 수 있다. 

JAVA CLASS 생성칸에 SUPERCLASS OBJECT 자동설정되어있다.

자바의 기본팩키지        java.lang

자바의 최고 조상클래스 Object클래스 

자바의 모든 클래스는 생성할 때에 무조건 Object클래스를 상속받는다.

*자바의 모든 클래스는 Object의 후손이다? 맞다 ! 

 

Null

null값은 아예 존재하지 않는 것 , 

null 값 : 레퍼런스 변수를 선언만 해 놓은 상태 

true 참, false 거짓 

 

CallBy 

메소드 호출방식

- Call By Value

- Call By Reference

 

함수명 작성 시 고려사항

- is~~   : 대부분 리턴형이 boolean

- to~~

- get~~ : 가져온다, 거의 return 형이 있따

- set~~ : 준다, 주고 끝나는 것이기문에 대부분 return형이 없다. void

package oop0603;

public class Test04_CallBy {

	public static void test1(int a, int b) {}
	
	public static void test2(int[] su ) {}
	
	public static void test3(Integer a) {}
	
	public static void main(String[] args) {
		// 메소드 호출 방식
		
		int[] su={10,15,20};
		
		//값에 의한 호출방식
		//Call By Value
		test1(su[0],su[2]); //10,20
		
		//참에 의한 호출방식
		//Call By Reference 주소값이 넘어가는 것
		test2(su);
		
		//Call By Reference
		test3(new Integer(5));
		
	}//main() end
}//class end

GregorianCalendar

package밑에 java.util로 불러준다

만약 api에 내가 원하는 메소드가 없다면 , 위의 부모나 할아버지 클래스에 있을 수 있다. 

 

GregorianCalendar class 안에 있는 함수들

1. get(Calendar.~) 현재 달력의 정보 가져오기

//get~ 리턴형이 있음
System.out.println(now.get(Calendar.YEAR)); //2019
System.out.println(now.get(Calendar.MONTH)); //5로 출력이지만 6월 +1해야댐
System.out.println(now.get(Calendar.DATE)); //3

2. isLeapYear 윤년

System.out.println(now.isLeapYear(2020)); //true

3. add(Calendar.~) 날짜 데이터의 연산

날짜 데이터 연산해주는 것 

//now날짜에 3년 더하기
now.add(Calendar.YEAR, 3); //2022-5-3
System.out.println(now.get(Calendar.YEAR)); //2022
	
//now날짜에 2달 빼기
now.add(Calendar.MONTH,-2 ); //2022-3-3
System.out.println(now.get(Calendar.MONTH)); //3
		
//now날짜에 10일 더하기
now.add(Calendar.DATE, 10);
System.out.println(now.get(Calendar.DATE)); //13

문제) 2019년 5월 29일 ~ 2019년 6월 2일의 총 날 수를 구하시오

//현재 시스템의 날짜 가져오기 2019-6-3
Calendar start=Calendar.getInstance();
		
//start의 날짜값을 변경하기
//2019-5-29
start.set(2019, 5, 29);
start.set(2019, Calendar.MAY, 29);
		
//2019-6-2
Calendar end=Calendar.getInstance();
end.set(2019, Calendar.JUNE, 2);
		
//start부터 하루씩 더해준다
1. 하루 더해주는 것이 맨 뒤에 있을 때, 
while(start.before(end)){
	System.out.print(start.get(Calendar.YEAR));
	System.out.print("-");
	System.out.print(start.get(Calendar.MONTH)+1);
	System.out.print("-");
	System.out.print(start.get(Calendar.DATE));
	System.out.println();
	start.add(Calendar.DATE, 1);
}//while end

출력결과
2019-5-29
2019-5-30
2019-5-31
2019-6-1

2. 하루 더해주는 것이 맨 앞에 있을 때, 
2019-5-30
2019-5-31
2019-6-1
2019-6-2

while문에서 start.add(Calendar.DATE, 1); 이 구문을 맨뒤에 적어주었을 때,

while(2019-5-29. before(2019-6-2))

. . . .

while(2019-6-2. before(2019-6-2))는 값이 같으므로 거짓

 

Constructor

클래스 상속관계에서의 생성자 호출 순서 

부모생성자()-> 자신의 생성자() 호출된다