티스토리 뷰
**상속(Inheritance)
=>상위 클래스의 모든 멤버를 하위 클래스가 물려받는 것
1.상속을 하는 이유
1)기능 확장 : 제공되는 클래스 만으로는 기능이 부족해서 추가해서 사용하기 위해서
2)중복된 코드 제거 : 여러 개의 클래스에 동일한 코드가 존재하는 경우에 중복을 제거하기 위해서 상속을 이용
3)다형성 구현
2.상속의 용어
1)단일상속: 하나의 클래스로부터 물려받는 것
2)다중상속: 2개 이상의 클래스로부터 물려받는 것 - 자바는 지원안함
3)상위 클래스: 물려주는 클래스로 Super, Base, 기반 클래스라고 함
4)하위 클래스: 물려받는 클래스로 Sub, Derived, 파생 클래스라고 함
3.상속방법
클래스 이름 뒤에 extends를 붙이고 상위 클래스 이름을 기재하면 됩니다.
4.Java의 모든 클래스는 반드시 상속을 받아야 합니다.
extends 키워드를 이용해서 상속을 받지 않으면 Java는 java.lang.Object라는 클래스로부터 상속받은 것으로 간주
package inheritance;
public class Super {
public void disp(){
System.out.println("나는 super class");
}
}
package inheritance;
//Super 클래스로부터 상속받는 Sub 클래스
public class Sub extends Super {
public void print(){
System.out.println("나는 Sub Class");
}
}
package inheritance;
public class Main {
public static void main(String[] args) {
Sub obj = new Sub();
//Sub 클래스에는 disp가 없지만 Super 클래스에 존재하므로
//disp를 호출할 수 있습니다.
obj.disp();
obj.print();
}
}
5.상속에서의 생성자(Constructor)
1)생성자 호출 순서
상위 클래스의 생성자 호출 -> 하위 클래스의 생성자 호출
=>상위 클래스는 노른자 : 하위 클래스를 흰자
2)생성자의 첫번째 줄은 무조건 super() 입니다.
super()는 상위 클래스의 매개변수가 없는 생성자를 호출하는 구문입니다.
상위 클래스에 매개변수가 없는 생성자가 없으면 상속을 받는 하위 클래스에서는 생성자를 만들고 super(매개변수)를 첫번째 줄에 추가해서 상위 클래스의 생성자를 호출해주어야 합니다.
6.super
=>하위 클래스에서 상위 클래스를 지칭하는 예약어
=>상위 클래스와 하위 클래스에 동일한 이름의 변수나 메소드가 존재하는 경우 하위 클래스에서 상위 클래스의 변수나 메소드를 호출하기 위해서 사용
=>this는 클래스 안에 있는 인스턴스 변수와 메소드 안에 있는 지역변수의 이름이 같을 때 메소드 안에서 인스턴스 변수를 지칭하기 위해서 사용
7.Overriding
=>상위 클래스와 하위 클래스에 동일한 원형의 메소드가 존재하는 경우
=>하는 이유
1)기능 확장 : 제공되는 클래스의 메소드의 기능이 부족한 경우 상속을 받아서 메소드를 재정의해서 필요한 내용을 추가합니다.
이 때는 super.메소드이름(매개변수)를 먼저 호출해서 상위 클래스의 기능을 수행하고 필요한 내용을 추가해야 합니다.
2)다형성 구현 : 하나의 코드가 상황에 따라 다른 메소드를 호출하는 것
3)이름 규칙을 정하기 위해서 : 템플릿 메소드 패턴을 적용하기 위해서
8.참조형 변수 사이의 대입
=>상위 클래스 타입의 참조형 변수에 하위 클래스 타입의 객체 주소를 형 변환없이 대입할 수 있습니다.
=>상위 클래스 타입의 참조형 변수가 사용할 수 있는 모든 것들을 하위 클래스 타입의 객체는 제공할 수 있기 때문입니다.
=>하위 클래스 타입의 참조형 변수에 상위 클래스 타입의 객체 주소는 형 변환 없이는 대입되지 않습니다.
=>객체 주소가 원래 하위 클래스 타입이면 가능하지만 그렇지 않은 경우는 예외가 발생합니다.
=>참조형의 형 변환은 상속관계에서만 가능한데 상속관계가 아닌데 강제로 형 변환을 수행하면 ClassCastException 이 발생합니다.
=>참조형 변수는 변수를 선언할 때 사용한 자료형을 가지고 멤버를 호출하지만 오버라이딩 된 경우에는 대입할 때 사용한 자료형을 가지고 멤버를 호출합니다.
변수를 선언할 때 사용한 자료형은 클래스의 자료형이라고 하고 대입할 때 new 생성자()를 호출한 것은 객체의 자료형이라고 합니다.
위의 내용을 가지고 다형성 구현
9.abstract class(추상 클래스)
=>객체를 만들 수 없는 클래스(new 로 생성자를 호출하지 못함)
=>class 라는 예약어 앞에 abstract를 추가해주면 됩니다.
=>다형성을 구현하기 위한 목적으로 만들어진 상위 클래스를 추상 클래스로 만듭니다.
10.abstract method(추상 메소드)
=>내용이 없는 메소드
=>메소드의 결과형 앞에 abstract를 붙여서 생성
=>이 메소드는 하위 클래스에서 반드시 재정의(Overriding)해서 사용해야 합니다.
=>추상 클래스나 인터페이스에 존재해야 합니다.
11.Interface(인터페이스)
=>추상 메소드와 final 상수 만을 가진 개체
=>class 라는 예약어 대신에 interface라는 예약어를 이용해서 생성
=>extends 대신에 implements 라고 기재해서 구현
=>추상 메소드 만을 소유할 수 있기 때문에 메소드의 결과형 앞에 abstract를 붙이지 않아도 추상 메소드입니다.
=>변수 앞에 final을 붙이지 않아도 무조건 상수입니다.
=>인터페이스를 만들고 클래스에서 implements 하는 이유: 이름을 정하기 위해서입니다.
=>인터페이스는 클래스가 아니므로 객체를 생성할 수 없지만 변수를 선언할 수 있고 implements 한 클래스의 객체 주소를 대입할 수 있습니다.
=>인터페이스는 여러 개 implements 가능
=>인터페이스 끼리도 상속이 가능 - 이 때는 extends 해서 상속
12.final
1)final class : 상속할 수 없는 클래스
2)final method : overriding 할 수 없는 클래스
3)final variable : 값을 변경하지 못하는 변수
13.클래스를 상속했을 때 에러가 나는 경우
1)상속받을 수 없는 클래스를 상속받은 경우
=>final 클래스
=>생성자의 접근 지정자가 private 인 경우
2)추상 클래스나 인터페이스를 상속받은 경우
=>모든 추상 메소드를 재정의 해야 합니다.
3)디폴트 생성자가 없는 클래스로부터 상속받은 경우
=>생성자를 만든 후 super()를 호출해주어야 합니다.
=>클래스 이름에 마우스 커서를 가져가면 에러 내용을 출력해주고 그 내용에 따라 작업을 수행하면 됩니다.
14.클래스 들 사이의 관계
=>is a : 상속관계
=>has a : 포함관계 - 클래스 안에 다른 클래스의 객체를 사용하는 경우
**inner class
=>클래스 안에 만들어진 클래스
=>다른 클래스에서는 사용하지 않을 클래스를 외부에 별도의 클래스로 만드는 것은 접근성 측면에서 바람직하지 않습니다.
=>특정 클래스에서만 사용해야 하는 클래스가 있다면 클래스 내부에 만들어서 외부에 노출이 되지 않도록 해야 합니다.
anonymous class(익명 클래스) : 다른 클래스나 인터페이스로부터 상속을 받아서 사용해야하는 경우에 별도의 클래스를 만들지 않고 바로 객체를 만들어서 사용하는 방법으로 메모리를 절약할 수 있기때문에 사용합니다.
주로 안드로이드나 클라이언트 프로그램에서 메모리를 절약할 목적으로 사용하며 서버에서는 잘 사용하지 않습니다.
*클래스나 인터페이스를 상속받아서 사용하는 방법
1.클래스나 인터페이스를 상속받은 클래스를 만들고 만들어진 클래스의 객체를 만들어서 사용하는 방법
2.클래스나 인터페이스를 anonymous class로 만들어서 사용하는 방법
**예외(Exception)
=>문법적인 에러는 아니여서 실행은 되지만 실행 도중 문제가 발생해서 프로그램을 중단하는 것
1.예외 종류
1)Runtime Exception : 예외처리하는 코드를 컴파일러가 강제하지 않는 예외
2)일반적인 예외 : 예외처리하는 코드를 반드시 작성하라고 강제하는 예외
=>Runtime Exception 은 개발자의 경험으로 해결, 예외처리를 하는 것이 아니고 코드를 직접 수정해야 하는 예외라서 해결하는 것이 어렵습니다.
=>발생한 예외가 RuntimeException의 하위클래스라면 코드를 수정해서 예외가 발생하지 않도록 해주는 것이 바람직합니다.
'IT > JAVA' 카테고리의 다른 글
7. Java 유용한 API (0) | 2017.11.09 |
---|---|
6. Java 주요 클래스 (0) | 2017.11.09 |
4. Java 클래스 기본 개념 (0) | 2017.11.09 |
3. Java 제어문 (0) | 2017.11.09 |
2. Java 연산자 (0) | 2017.11.09 |