13. 다형성 2
다운캐스팅
자식 = 부모 / 부모 객체를 자식 객체로 형변환
보통은 안됨. 되는 경우? → 미리 자식으로 메모리에 올라가 있으면 가능
Shape circleShape = new Circle(10); //이미 circle이 메모리에
Circle circle = (Circle) circleShape;
Java
복사
•
업캐스팅된 것을 다시 원상태로 돌리는 것과 같음 (다형성 적용으로 잃어버린 특성을 복귀시키기 위해 )
instanceOf
instanceOf란?
객체 타입을 확인하는 연산자이다.
연산자 구조
객체 instanceof 클래스
System.out.println( objA instanceof Parent ); // true
Java
복사
활용 방법
public static void print(Shape shape) {
if (shape instanceof Rectangle) {
System.out.println("실제 타입은 Rectangle 입니다");
} else if (shape instanceof Circle) {
System.out.println("실제 타입은 Circle 입니다");
} else {
System.out.println("알 수 없는 타입입니다.");
}
}
Java
복사
넘어온 매개 변수의 type에 따라서 코드를 짜는 방식으로 활용 할 수 있다.
null 의 instanceOf는?
ArrayList list = null;
System.out.println(list instanceof Object); // false
System.out.println(list instanceof ArrayList); // false
System.out.println(list instanceof List); // false
System.out.println(list instanceof Set); // false
Plain Text
복사
object가 null이라면 instanceOf는 항상 false를 return 한다
문제 해결
if (ph2 instanceof SmartPhone) {
System.out.println("TRUE");
} else {
System.out.println("FALSE");
} // "TRUE" 출력 ?? 왜?
Java
복사
9월 27일자 회고에서 ph2의 instanceOf의 출력이 왜 true 인지 팀원들 모두가 정확히 알고 있지 못했다.
해결
ph2를 스마트폰 객체로 생성하긴 했지만 스마트폰 객체가 결국 부모 클래스 모바일폰 클래스를 상속받고 있기에 업캐스팅 개념이 적용되어서 true를 출력하는 것
System.out.println(objA instanceof Child); // false
System.out.println(objB instanceof Parent); // true
Plain Text
복사
14. 추상클래스 - 조예지
○ 추상클래스란?
클래스를 설계도에 비유하면 추상클래스는 미완성 설계도에 비유할 수 있다. 클래스가 미완성이라는 것은 멤버의 개수에 관련된 것이 아니라, 미완성 메서드 (추상 메서드)를 포함하고 있다는 의미이다.
추상클래스로 인스턴스는 생성할 수 없으며, 추상클래스는 상속을 통한 자손클래스에 의해서만 완성될 수 있다.
추상클래스 용도
추상클래스 자체로는 클래스로서의 역할을 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상클래스로서 중요한 의미를 갖는다.
여러 클래스에서 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고, 기존의 클래스의 공통적인 부분을 뽑아서 만들기도 한다.
•
추상화 : 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
•
구체화 : 상속을 통해 클래스를 구현, 확장하는 작업
추상 클래스를 통해서
1.
상황에 따라 동작 방법이 달라지는 메소드는 추상 메소드로 만들어서 하위 클래스에서 구현한다.
2.
공통적으로 사용하는 메소드는 상위에 두어서 코드의 중복, 유지보수의 편의성을 높여준다.
상속을 강제한다.
추상 메서드로 정의되면 자식 클래스에서 반드시 오버라이드하여야 한다.
추상클래스 구조
•
추상 메서드가 하나라도 있으면 클래스는 추상클래스가 된다.
◦
추상 메서드를 포함하지 않을 수도 있다. 포함하지 않더라도 인스턴스를 생성할 수 없다.
•
일반 클래스처럼 생성자, 멤버변수, 메서드를 가질 수 있다.
abstract class 클래스 이름 {
abstract 리턴타입 메서드이름();
}
Java
복사
추상메서드
•
추상메서드는 선언부만 있고, 구현부 (바디)는 작성하지 않은 것이다.
•
상속받는 클래스 (자손 클래스)는 오버라이딩을 통해 추상 메서드를 모두 구현하여야 한다.
◦
하나라도 구현하지 않는다면 자손클래스도 추상 클래스로 지정해야 한다.
/*주석을 통해 어떤 기능을 수행하는 지 적어준다.*/
abstract 리턴타입 메서드이름;
Java
복사
인터페이스가 있어서 추상클래스는 거의 쓰지 않는다.
○ 추상클래스 예제
지역변수를 조건문에서 초기화하기
int result = 0;
Calc c;
if (cal.equals("+")) {
c = new Add();
} else if (cal.equals("-")) {
c = new Sub();
} else if (cal.equals("*")) {
c = new Mul();
} else if (cal.equals("/")) {
c = new Div();
} else {
return;
}
c.setValue(a,b);
result = c.calculate();
System.out.println(result);
Java
복사
Initialization of local variable in a conditional block in Java
1. If the specified condition is true, and ‘values’ are provided in the condition, the program compiles fine.
2. If the specified condition is true, but ‘variables’ are provided in the condition, we get a compilation error.
3. If the specified condition is false, we get a compilation error.
조건절에 변수가 아니라 값이 들어가면 컴파일 가능, 조건절에 변수가 들어가면 에러 발생
error: variable c might not have been initialized
Java
복사
14. 인터페이스 - 정희준
인터페이스
•
자바에서 객체의 사용 방법을 정해두는 타입 입니다.
•
객체의 교환성을 높여 , 다형성을 구현하는데 중요한 역할을 합니다.
•
동일한 목적 하에 동일한 기능을 수행하도록 강제하는 것이 인터페이스 역할 입니다.
•
자바는 메소드 출처의 모호성 때문에 클래스를 통한 다중 상속을 허용하지 않습니다.
•
인터페이스는 다중 상속을 지원 합니다.
•
추상 클래스에는 추상 메소드,생성자,일반 메소드,필드를 포함 하는데 인터페이스는 추상 메소드와 상수만을 포함 할 수 있습니다. JAVA8 부터는 디폴트 메소드,정적 메소드도 포함 가능 해졌습니다.
인터페이스 문법
접근제어자 interface 인터페이스이름 {
타입 상수명 = 값; // 상수
타입 메소드명(); // 추상 메소드
default 타입 메소드명(매개변수...){ // 디폴트 메소드
구현 코드 }
static 타입 메소드명(매개변수...){ // 정적 메소드 : 디폴트 메소드와 달리 객체가
구현 코드 } // 없어도 인터페이스만으로도 호출 가능.
Java
복사
인터페이스 선언 방법은 클래스 선언과 같습니다. 접근제어자와 함께 interface 키워드를 사용하여 선언 해주면 됩니다.
인터페이스의 모든 필드는 타입 앞에 public static final 이어야 하고, 모든 추상 소드는 타입 앞에 public abstract가 붙어야 합니다.
하지만 인터페이스에 공통적으로 들어가야 하는것이기 때문에 생략을 해도 됩니다. 만약 적지 않았다면 컴파일시에 컴파일러가 자동으로 추가해 컴파일 할 것 입니다.
인터페이스 구현
인터페이스는 인터페이스가 포함되어 있는 추상 메소드를 구현해 줄 클래스를 작성해야만 합니다.
자바에서 인터페이스는 클래스를 통해 구현하는 법
class 클래스이름 implements 인터페이스이름{
}
Java
복사
만약 구현할 때 모든 추상 메소드를 구현하지 않는다면 그 구현 클래스도 추상 클래스가 되기 때문에 abstract 를 사용하여 추상 클래스로 만들어 줘야 합니다.
class 클래스이름 extends 상위클래스이름 implements 인터페이스이름{
}
Java
복사
자바에서는 위와 같이 상속과 구현을 동시에 할 수도 있습니다.
디폴트 메소드는 왜 있는 것일까?
프로그램이 완성되어 서비스중에 새로운 기능을 추가해야 되는 상황이 생기게 됬다고 가정해보자. 하지만 이 기능은 회사마다 상황에 따라 만들어야 할수도,또 당장 만들지, 그리고 인터페이스를 구현한 다양한 프레임워크 등에 의해서 회사마다 달라질 수 있다. 근데 이 기능을 인터페이스에 추상 메소드로 추가하면 클래스에 인터페이스 추상 메소드를 구현한 모든 회사들은 강제적으로 추상 메소드를 구현 해야하고 그렇지 못한다면 컴파일 에러가 나서 서비스가 그 회사의 프로그램이 멈추게 되어 버리는 상황이 발생하기 때문에 이런 추가적이고 선택적인 기능들을 위해 디폴트 메소드가 필요하다.
인터페이스의 장점
1.
대규모 프로젝트에서 일관되고 정형화된 개발을 위한 표준화가 가능합니다.
2.
클래스의 작성과 인터페이스 구현을 동시에 할 수 있어 개발 시간을 단축 할 수 있습니다.
3.
클래스와 클래스간의 관계를 인터페이스로 연결하면, 동일한 동작을 구현 할 수 있다.