티스토리 뷰

728x90

 

 

 

상속관계 vs 포함관계

  • 상속관계 : is-a (A truck is a car.)
class Truck extends Car {
    // ...
}
  • 포함관계 : has-a (A truck has a wheel.) → 멤버로 갖는다.
class Car {
    int wheel = 4;
    // ...
}

 

 

오버라이딩 vs 오버로딩

  • 오버라이딩 (overriding)
    • 조상으로부터 상속받은 메서드의 내용을 변경하는 것이다.
    • 조상보다 좁은 범위의 접근제어나 예외선언 불가능하다.
  • 오버로딩 (overloading)
    • 매개변수의 수나 타입을 다르게하여, 기존에 없는 새로운 메서드를 정의하는 것이다.

 

 

상속 (inheritance)

  • 자바는 단일상속만 가능하다.
  • 복잡한 기능의 클래스 작성은 쉽지 않다.
  • 클래스 간 관계가 명확하고, 코드의 신뢰성이 높다.
  • Object 클래스
    • 최상위 조상클래스
    • 다른 클래스를 상속받지 않는 모든 클래스에 자동 상속한다.
    • 생략 가능하다.
  • class와 생성자의 접근 제어자는 보통 같다.

예시)

  • Truck 인스턴스를 new 연산자로 생성하면,
    Truck() → Truck(int wheel, int cargo) → Car(int wheel) → Object() 순서로 호출한다.
  • Truck 클래스의 Truck 생성자 안에 super(wheel); 이 없을 경우,
    자동으로 super();를 삽입하기 때문에 오류 발생한다. (∵ Car()가 정의되지 않음)

 

 

 

다형성 (polymorphism)

  • 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다.

예시)

class Phone {
	int serialNumber;
    void phoneCall(){ }
}

class SmartPhone extends Phone {
	boolean internetAccess;
    void faceCall() { }
}

일 때,

SmartPhone s = new SmartPhone();

참조변수 s는 SmartPhone 인스턴스 멤버 모두 사용 가능하다.

s.serialNumber		O
s.internetAccess	O
s.phoneCall()		O
s.faceCall()		O

반면,

Phone p = new SmartPhone();

참조변수 p는 SmartPhone 중 상속받은 멤버만 사용 가능하다.

p.serialNumber		O
p.internetAccess 	X
p.phoneCall()		O
p.faceCall()		X

 

  • 자손타입 참조변수로 조상타입 인스턴스 참조 불가
    • e.g. SmartPhone s = new Phone();    X
  • instanceof 연산자를 이용해 참조변수가 참조하고 있는 인스턴스의 실제 타입을 확인할 수 있다.
    • 연산 결과가 true이면 검사한 타입으로 형변환이 가능하다.

 

 

추상클래스 (abstract class)

// 추상클래스
abstract class Animal {
	// 추상메서드
	abstract void crawl();
}

// 추상클래스 상속받은 자식클래스 (구체화)
class Cat extends Animal {
	// 추상메서드 구현
	void crawl() {
    	...
    }
}
  • 인스턴스 생성 불가 상속받은 자식클래스를 통해야 한다.
  • 자식 클래스에서 추상메서드를 구현하도록 강요하기 위해 abstract를 붙여 추상메서드로 선언한다.

 

 

인터페이스 (interface)

  • 추상메서드와 상수만 멤버로 가질 수 있다.
  • 모든 멤버변수는 public static final (생략 가능)
  • static/default를 제외한 모든 메서드는 public abstract (생략 가능)
  • 인트페이스로부터만 상속 가능하다.
  • 다중 상속 가능하다.
  • 인스턴스 생성 불가하다.
  • 리턴타입이 인터페이스 = 인터페이스를 구현한 클래스의 인스턴스를 반환한다.
interface Connectible {
	void connect(Phone p); // public abstract 생략되었으므로
}

class SmartPhone extends Phone implements Connectible {
	public void connect(Phone p){ // 접근제어자는 반드시 public
    	...
    }
}

 

 

 

728x90
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
05-03 19:54