- 클래스의 상속
- 부모 클래스를 상속받아서 자식 클래스를 작성하는 것
- 목적
1) 코드의 중복 제거 : 자식 클래스들의 공통속성을 부모 클래스로 작성하면, 자식 클래스에서는 코드 작성 없이 사용할 수 있다.
2) 생산성의 향상 : 부모 클래스를 상속받아서 자식 클래스를 빠르게 작성할 수 있다.
3) 관련있는 여러 클래스들을 같은 종류로 묶을 수 있다.
- Car를 상속받아서 작성한 다양한 자동차 객체들은 전부 Car 타입이다.
- 클래스 형변환
- 자식객체를 부모타입의 참조변수로 참조할 수 있는 것이다.
- 클래스 형변환이 발생하면, 생성한 객체를 참조한는 것이 아니라 생성한 객체의 부모객체 중에서 참조변수의 타입과 일치하는 객체를 참조하게 된다.
- 참조변수의 타입에 따라서 실행할 수 있는 메소드가 달라진다.
- 생성한 객체에서 참조변수가 실제로 참조하는 객체 및 그 부모객체에 정의된 것만 사용할 수 있다.- 목적
1) 여러 객체를 하나의 타입으로 관리할 수 있다.
- Car타입의 객체로 소나타 객체, 캐스퍼 객체, 제네시스 객체를 참조할 수 있다.
- Car타입의 배열로 소나타 객체, 캐스퍼 객체, 제네시스 객체를 저장하루 수 있다.
- Car타입의 매개변수는 소나타객체, 캐스퍼객체, 제네시스객체를 전달받을 수 있다.public void test(Car car) {...} x.test(new 캐스퍼()); x.test(new 제네시스());-Car타입의 반환타입이 정의된 메소드는 소나타객체, 캐스퍼객체, 제네시스객체를 반환값으로 반환할 수 있다.
public void Car test() { 수행문; return 소나타(): }2) 타입으로 객체의 종류를 제한할 수 있다.
- 매개변수의 타입을 특정타입으로 지정함으로써 해당 종류의 객체만 전달받을 수 있다.// Phone종류 객체만 전달받는다. Public void test(Phone p) {...} // 인터넷, 게임 등이 지원되는 SmartPhone종류 객체만 전달받는다. Public void test(SmartPhone p) {...} Public void test(Galaxy p) {...}
- 메소드 재정의
- 부모클래스, 부모인터페이스에 정의된 메소드를 자식클래스에 똑같은 이름을 다시 정의하는 것
1) 부모클래스에서 구현한 내용이 자식클래스에서 맞지 않아서 자신에게 적합한 동작으로 메서드를 재정의할 수 있다.
2) 부모인터페이스에서 기능에 대한 명세만 정의되어 있을 때, 각각의 자식클래스에서 자신에게 적합한 동작으로 메소드를 재정의할 수 있다.
- 목적
1) 자식객체로의 강제 클래스 형변환이 불필요하다.
- 클래스 형변환 되어서 부모객체를 참조하고 있더라도 실제 생성된 자식객체에서 재정의된 메소드를 실행되게 할 수 있다.
- 구체적인 자식객체의 타입을 모르더라도 그 자식객체에 재정의된 메소드를 실행할 수 있다.
2) 다형성을 발휘시킬 수 있다.
- 같은 사용법으로 실행하더라도 참조하는 객체가 달라지면 실행결과가 다르게 발휘되게 할 수 있다.
- 추상화
- 여러 자식클래스들이 구현할 기능을 추상화(메소드 선언만 있고, 구현부가 없이 작성하는 것)하고 추상화된 기능을 구체화시키는 것은 자식클래스에서 하게 하는 것이다.
- 추상클래스나 인터페이스에서 자식클래스에 구현할 기능을 추상화한 추상메소드를 작성하고, 자식 클래스에서 해당 추상메소드를 재정의하게 한다.
- 같은 사용법으로 실행하더라도 참조하는 객체가 달라지면 실행결과가 다르게 발휘되게 할 수 있다.- 목적
1) 모든 자식객체들이 비슷한 기능들을 같은 사용법(같은 반환타입, 같은 메소드명, 같은 매개변수)으로 구현하게 한다.
2) 다형성을 발휘시킬 수 있다.
- 인터페이스
- 자식클래스에서 구현할 기능에 대한 명세를 제공한다.
- 특정 인터페이스를 구현한 모든 구현클래스는 정부 동일한 명세를 구현한 것이기 때문에 사용법(같은 반환타입, 같은 메소드명, 같은 배개변수)이 동일하다.
외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어진다.
내부클래스를 포함하고 있는 외부클래스의 모든 구성요소(멤버변수, 클래스변수, 멤버베소드, 클래스메소드)를 사용할 수 있다. 또한 외부클래스의 은닉화된 필드, 은닉화된 메소드도 사용할 수 있다.
외부클래스의 객체가 생성된 후에 사용할 수 있다.
static 변수와 static 메소드는 포함할 수 없다. 내부클래스의 멤버메소드에서 외부클래스의 은닉화된 필드, 은닉화된 메소드도 사용할 수 있다.
public calss A {
private int x;
public void m1() {
수행문;
}
// 인스턴스 내부클래스
public class B {
int y;
public void m2() {
수행문
}
}
}
외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다루어진다.
외부 클래스를 객체생성여부와 상관없이 클래스변수나 클래스메소드처럼 즉시 사용할 수 있다.
외부 클래스의 구성요소 중에서 클래스변수와 클래스메소드만 사용할 수 있다.
static 내부 클래스는 외부 클래스의 객체 생성하지 않고도 사용할 수 있기 때문에, 객체 생성후에만 사용할 수 있는 외부 클래스의 멤버변수, 외부클래스의 멤버메소드에 사용할 수 없다.
public calss A {
private int x;
public void m1() {
수행문;
}
// 정적(static) 내부클래스
public static class B {
int y;
public void m2() {
수행문
}
}
}
public calss A {
private int x;
public void m1() {
수행문;
}
public void m2() {
int y = 10;
//지역 내부 클래스
class B {
int z;
public void m3() {
수행문;
}
}
}
}
형식)
부모 인터페이스 정의
public interface Pen {
void draw();
}
익명 내부클래스 정의
Pen pen1 = new Pen() {
public void draw() {
수행문;
}
};