1. 상속 ( Inheritance )
* 클래스들간의 관계
==> 학생, 대학생, 컴퓨터, 트럭, 엔진, 라디오
가. is a
: 대학생 is a 학생
나. has a
: 학생 has a 컴퓨터
: 트럭 has a 엔진 ( 트럭과엔진은 같은 lifecycle을 갖는다.: composition)
트럭 has a 라디오 ( 트럭과라디오는 다른 lifecycle을 갖는다.:aggregation)
==> 코드로 표현하는 방법
class 트럭{
엔진 e; // 인스턴스 변수
메소드(){
라디오 r; //로컬 변수
}
}
class 엔진{
}
* public class Student{
String name;
int age;
}
**UML ( Unified Modeling Language )
=> 분석/설계 단계에서 나온 도식화된 문서를 만드는 언어.
=> 클래스 다이어그램 ( calss diagram)
** 상속정리
– 클래스들간의 관계이다. ( is a )
– 상속을 시키주는 클래스 : 부모클래스,super클래스,parent클래스
상속을 받는 클래스 : 자식 클래스 , sub클래스 , child 클래스
– 특징
: 모든 클래스들은 상속관계이다. ( API + 사용자 정의 클래스 )
==> root 클래스( 최상위클래스) : java.lang.Object
==> 명시적으로 상속을 시키건, 안시키건 자동으로 Object을
상속받는다.
: 상속을 받으면 부모클래스의 모든 멤버(인스턴스변수+메소드)를
선언없이 사용가능하다. ==> 재사용성
단, 생성자와 private은 상속안됨.
: 자식클래스을 생성하기 전에 반드시 부모 클래스를 생성한다.
따라서 Object클래스는 가장 먼저 생성된다.==> 모든 클래스는
Object 클래스의 멤버를 그냥 사용가능하다.
: 자바는 단일상속만 지원한다. ( 명시적으로 부모는 하나이다.)
예> 직원( Employee) , 관리자( Manager ) , 개발자(Engineer ), …
직원
관리자 개발자
public class 관리자 extends 직원 {}
public class 개발자 extends 직원 {}
2. super 키워드
: 상속관계에서만 사용가능하다.
: 용도
=> 자식클래스에서 부모의 멤버(인스턴스변수+메소드) 또는
부모 생성자를 명시적으로 호출할 때 사용한다.
가. 부모의 멤버
: super.멤버
나. 부모 생성자 ( * )
: super();
super(10);
super( 10 , “홍길동”);
: 반드시 하위클래스의 생성자의 첫라인에서 사용되어야 한다.
( 모든 하위클래스의 생성자의 첫라인에는 자동으로 super() 가 삽입된다.)
: 명시적으로 호출가능하다.
3. this 키워드
: 상속과 무관
: 같은 클래스에서 사용 가능하다.
: 용도
가. 인스턴스 변수를 명시적으로 가리킬 때
==> 인스턴스 변수와 로컬변수이름이 동일한경우에 사용가능하다.
나. 오버로딩 생성자를 호출할때
==> 하나의 생성자안에서 다른 생성자를 호출할 때 사용된다.
==> 반드시 생성사 첫 라인에서 사용 가능하다.
4. 오버라이딩 메소드 ( overriding method )
: 상속관계가 전제
: 정의
==> 부모의 메소드를 자식이 수정해서 사용하는 메소드.
: 규칙
==> – 메소드명이 일치
– 리터타입이 일치
– 인자리스트(argument list) 일치
– 접근지정자는 확대만 가능
– throws 예외는 축소만 가능.
예> super ==> public void a() throws XXXException{}
sub ==> public void a() {}
5. 다형성( Polymorphism )
: 상속이 전제
: 재사용성 증가
: 정의
==> 하나의 참조 변수가 여러 데이터형을 저장할 수 있는 능력.
예 >
Employee e = new Employee(); // 일반적 방법
e = new Manager(); // 다형성
e = new Engineer(); // 다형성
Manager e3 = new Engineer(); ( X )
Manager e = new Employee(); (X )
이유>
PDT
정수형의 종류: byte , short , int , long
short b = 12;
int c = b; // 큰타입 = 작은 타입; , 묵시적 형변환
byte d = c; // 작은타입 = 큰타입; ( 형변환 연산자이용)
RDT
직원종류: Employee, Manager, Engineer
Employee = Manger; // 큰타입 = 작은타입 , 묵시적 형변환
Manger = Employee; // 작은타입 = 큰타입 ( 형변환 )
==> Object o = 모든 클래스 객체가능. (*)
다형성의 사용예 >
java.lang.Object 클래스의 2가지 메소드
: toString()
: equals(Object obj)
예> String str = “Hello”;
String str2 = “Hello”;
if( str == str2 ) (X) ==> 위치값 비교
if( str.equals(str2) ) ==> 실제값 비교
ppublic boolean equals(String obj){ }
////////////////////////////////////////////////////
Integer i = new Integer(“123”);
Integer i2 = new Integer(“123”);
if( i.equals(i2) )
public boolean equals(Integer obj){ }
////////////////////////////////////////////////////
결론은
public boolean equals(Object obj){ } //다형성 적용
6. Object
가. toString 메소드
: 문자열로 바꾸는 메소드
: 숫자(기본형)–> 문자열
참조데이터 –> 문자열
: 모든 참조변수를 출력하는 자동으로 toString 메소드가 호출된다.
예> Student stu = new Student(“홍길동”);
System.out.println( stu );
ystem.out.println( stu.toString() );
// stu가 가지는 위치값을 문자열로 변경해서 출력한다.
Object ( toString() )
==> 패키지명.클래스명@16진수 로 구현됨.
Stdent String Integer
==> 거의 API 는 toString메소드를 오버라이딩 했다.
( 실제값을 문자열로 출력하게 구현됨 )
사용자정의 클래스는 Object 클래스의 toString 메소드를
그냥 사용하면 실제값이 아니고 클래스명@16진수로 문자열이 출력된다. 실제값을 출력할려면 overriding 해야 된다.
==> 사용자 정의 클래스를 출력하는 경우는 디버깅 용으로 사용됨.
나. equals(Object obj) 메소드
: 실제값 비교하는 메소드
예>
String str = “Hello”;
String str2 = new String(“Hello”);
if( str.equals(str2)) ==> true
==> 대부분 API가 실제값 비교하게 오버라이딩 됨.
Object (equals) ==> == 으로 비교됨.
==> 사용자생성 클래스도 실제값으로 비교하게 오버라이딩 하자.
Student String
7. 인터페이스 ( Interface )
: *.java
: 문법
public interface 인터페이스명{ }
: 구성요소
– 상수
==> public static final 로 자동 지정된다.
– 추상 메소드 ( abstract method )
==> signature 만 정의 ( 구현이 없다. {} 이 없다. )
==> public abstract 자동으로 지정된다.
예> public void a() { } // concreate 메소드(구현된 메소드)
public void a(); // abstract 메소드( 추상 메소드 )
==> abstract 메소드를 concreate 메소드로 만들어야 된다.
(일반 클래스에서 추상메소드를 구현해야 된다. )
: 특징
==> 객체생성불가 ( new 불가 )
==> 다른 클래스를 통해서 인터페이스의 구성요소를 사용 가능.
( 인터페이스와 클래스관계는 ‘준 상속관계’이다.
구현관계라고 한다. ( implements 관계 )
==> 구현 클래스에서는 반드시 인터페이스의 추상메소드를 구현해야 된다.
( 강제성 ,
==> 구현 클래스는 여러 인터페이스를 implemnents 가능하다.
( 다중 구현이 가능하다. )
==> 인터페이스 끼리 상속 가능 (다중 상속 )
==> 인터페이스는 변수타입으로 사용가능하다. ( 다형성)
인터페이스(A) ( public void a(); )
: 오버라이딩 규칙에 준함.
클래스(B) ( public void a() { } )
public interface A {
public void a();
}
public class B implements A , AA , AAA{
public void a() { }
}
public interface A extends AA, AAA { }
– 사용용도
: 하위 클래스에게 통일된 메소드를 강제할 목적으로
( 재사용 증대 )
예>
Bird SuperMan Airplane
: a(){} : aa(){} : aaa(){} ==> 이륙
: b(){} : abb(){} : bbb(){} ==> 비행
: c(){} : cc(){} : ccc(){} ==> 착륙
==> 통일을 하자 ( 강제성이 없다. 해도 그만안해도 그만)
Bird SuperMan Airplane
: takeOff(){} : takeOff(){} : takeOff(){} ==> 이륙
: fly(){} : fly(){} : bbb(){} ==> 비행
: land(){} : land(){} : ccc(){} ==> 착륙
==> 통일을 하자 ( 강제성이 주자 ). 중요하다.
Flyer (인터페이스)
takeOff();
fly();
land();
Bird SuperMan Airplane
: takeOff(){} : takeOff(){} : takeOff(){} ==> 이륙
: fly(){} : fly(){} : bbb(){} ==> 비행
: land(){} : land(){} : ccc(){} ==> 착륙
===========> JDBC ( Java DataBase Connectivity )
: 데이터베이스(오라클,mysql,mssql,DB2,..)와 자바언어와 연동하는 기술.
예>
자바 ———> 오라클 (자바A)
———> mysql(자바B)
8. 추상 클래스( abstract class )
: *.java
: 문법
public abstract class 클래스명{ }
: 구성요소
– 인스턴스변수
– 일반 메소드 ( concreate method )
– 생성자
– 추상메소드 ( abstract method )
: 특징
==> 객체생성불가( new 사용 불가 )
==> 다른 클래스를 이용해서 구성요소를 사용 가능하다. ( 상속관계 )
( 실선표기, extends 표기법 )
==> 추상메소드가 없어도 추상클래스로 선언 가능
( 추상메소드가 하나라도 있으면 반드시 추상클래스로 정의한다. )
==> 일반클래스는 반드시 추상메소드를 구현해야 된다. ( 강제성, 통일성 )
==> 추상클래스를 변수의 타입으로 사용 가능하다.
예> 추상클래스( A )
일반클래스 ( B )
public abstract class A {}
public class B extends A {}
: 용도
==> 여러가지 메소드들중에서 일부메소드만 하위 클래스에게 강제할 목적.
9. 예외처리
– 예외?
==> 자바에서는 exception 이라고 한다.
==> 프로그램 실행중에 발생되는 문제를 의미한다. ( 보통은 에러 라고 함 )
==> 비정상 종료가 된다.
-예외처리?
==> 비정상종료가 아닌 정상종료하게 만드는 것을 의미
==> exception handling 이라고 한다.
– 예외처리 방법
: 발생된 예외처리를 담당하는 클래스가 제공된다. ( 예외클래스:Excepton 클래스라고 한다. )
: try ~ catch 문
: throws 문
– 예외클래스의 계층구조 ( 상속관계 )
Object
|
Throwable
|
Error Exception
|
RuntimeException IOException SQLException
|
ArithmeticException
NullPointerException
IndexOutOfBoundsException
ClassCastException
(실행시 발생)
IOException
|
FileNotFoundException
가. try~catch 문 이용
문법:
try{
//예외발생코드
}catch(XXXException e){
// 예외처리 코드
}
예>
0 (예외발생 ) ==> 비정상 종료
try{
1
2 (예외발생)
3
}catch(XXXException e){
4
}
5
2에서 예외발생되면? 0 1 4 5
2에서 예외발생안되면? 0 1 2 3 5