상속 : 특정 클래스를 구성할 때 기존 클래스의 데이터(속성)와 메소드를 상위(부모) 클래스에서 그대로 물려받아서 중복적인 코드를 줄인다는 장점과, 하나의 변수 타입으로 여러 종류의 객체를 의미하는 추상화 된 방식의 프로그램이 가능하게 하는 객체지향 기법
부모 클래스(Super 클래스)
자식 클래스(Sub 클래스)
extends : 상속을 사용하는 문법
WheelMouse m = new Mouse();
휠마우스의 휠 기능의 정의를 못하므로 에러인가봄
public class MouseTest{ public static void main(String[] args){ System.out.println("------------"); Mouse op = new OpticalMouse(); op.clickLeft(); op.clickRight(); } }
결과
---------------------
광센서로 왼쪽 클릭
광센서로 오른쪽 클릭
실행되는 메소드는 실제 객체의 메소드가 호출 - 변수의 타입이 무엇이든 간에 실제로 움직이는 것은 리모컨(레퍼런스)에 연결된 객체
- 컴파일러는 변수 타입으로 선언된 클래스에 해당하는 메소드가 있는지만 확인
- 실제로 움직이는 것은 연결된 객체
- 만일 실제 객체에 해당 메소드가 없다면 부모 클래스의 정보를 추적해서 실행
오버라이드 : 자식 클랙스에서 부모 클래스의 메소드를 다시 정의
super : 부모 클래스를 부르는 키워드, 부모 클래스에 정의된 생성자를 사용(this로 자식에서 재정의 가능)
다형성 : 상속을 사용하여 하나의 변수 타입으로 여러 가지 종류의 객체를 가리킬 수 있어서 기존 코드를 고치지 않고도 처리할 수 있는 부분이 많아짐
상속의 장점 - 변수의 타입과 실제 객체가 일치하지 않아도 됨, 부모 타입으로 파라미터, 배열을 선언가능
생성자....
추상 클래스 : 변수의 타입으로만 의미가 있고, 객체로 생성될 가능성이 없는 것은 클래스 선언 앞에 'abstract'를 붙여서 추상 클래스로 생성, 용도는 객체 생성은 하지 않으나 변수 선언 용도, 상속의 고유 기능인 하위 클래스에 같은 데이터와 기능을 가지도록 물려줌
추상 메소드 : 하위에서 반드시 오버라이딩 해야하는 메소드
프로그램 제작 순서
1. 해당 데이터 들을 몇 개의 클래스로 만들어야 할지 결정
2. 상속 구조가 가능한지 결정
3. 일반 상속이 나은가 추상 클래스가 나은가
4. 부모 클래스에 있어야 할 속성과 메소드를 조절
5. 데이터를 활용하는 계산은 객체가 알아서 하도록 결정
인스턴스 변수에 protected는 상속 관계에서 변수나 메소드의 접근을 허용 private는 같은 클래스 내에서만 메소드나 변수로의 접근 허용
상속의 다운 캐스팅 : 부모가 아닌 자식이 가진 메소드 지정
instanceof : 해당 클래스의 타입인지를 따져보는 연산자 하지만 해당 변수를 원하는 타입으로 볼 수 있는지를 판단하므로 문제가 될 수 있음 0, 1, 2다 일반 마우스로 나옴
getClass()가 instanceof보다 더욱 정확한 결과를 가져온다.final : 더이상 변경 불가
-메소드 선언 시 : 자식 클래스가 오버라이드 못함
-클래스 선언 시 : 더이상 상속 못함 -> 타입도 제한, 하위 클래스를 검색하지 않으므로 미세하게 속도 빨라짐
-변수 선언시 : 변수값 변경을 막음
상속 사용의 체크 포인트 : '반드시 ~의 일종'이 성립할 때, 하위 클래스에서 오버라이드를 많이 쓰면 위험한 신호, 조합을 많이 하면 상속이 아니라 프로그래밍이 나음
인터페이스 : 인터페이스는 실제 객체를 의미하지 않음, 인터페이스의 상수는 private으로 만들 수 없음(자동으로 public static final이 됨), 추상 메소드만 존재, 객체의 타입으로만 사용
인터페이스 사용 상황 : 메소드의 형태가 결정,
느슨한 커플링 : 상속이나 인터페이스를 이용한 다형성을 구현
인터 페이스 예시
CopyMachine a = new Machine(); FaxMachine a = new Machine(); PrinterMachine a = new Machine();
댓글
댓글 쓰기