728x90
반응형
객체 지향 개발의 두가지 핵심 개념은 아래와 같다.
- 다형성(Polymorphism)
- 상속(Inheritance)
다형성(Polymorphism)
같은 자료형에 여러 가지 객체를 대입하여 다양한 결과를 얻어내는 성질
(동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다.)
상속(Inheritance)
부모 클래스에서 클래스의 행동과 정의를 가져다 사용할 수 있게 해준다.
기존의 정의와 상태를 상속받아 사용할 수 있으며, 새로운 행동을 추가하거나 새로운 타입에 대한 행동을 오버라이드 할 수 있다.
정사각형(Square)는 사각형(Rectangle)이다. (is -a rectangle)
상속을 이용해 정사각형 만들기
public class Rectangle {
private final int width;
private final int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public int area(){
return width * height;
}
}
public class Square extends Rectangle{
public Square(final int sideLength){
super(sideLength, sideLength);
}
public void print(){
System.out.println("나는 정사각형");
}
}
is -a 관계를 다형성과 연결해서 생각해보자.
다형성은 부모 클래스를 요청했을 때 하위 클래스를 대신사용하는 것으로도 생각할 수 있다. 이때 하위 클래스의 행위는 유지되겠지만 다형성을 사용하는 사용자가 하위 클래스의 행위를 이해하지 못할 수도 있다.
Rectangle rec = new Square(5);
rec.print(); // 사용할 수 없다. 하위 클래스 메소드(행위) print()이기 때문이다.
자바 컬렉션에서 다형성 사용하기
@Test
public void polymorphicList(){
List<Rectangle> rectangles = new ArrayList<>(3);
rectangles.add(new Rectangle(5, 1));
rectangles.add(new Rectangle(2, 10));
rectangles.add(new Square(9));
assertEquals(rectangles.get(0).area(), 5);
assertEquals(rectangles.get(1).area(), 20);
assertEquals(rectangles.get(2).area(), 81);
}
Square is -a Rectangle이기 때문에 위의 코드는 잘 동작한다.
다만, Square 클래스(자식)에 구체적으로 정의되어 있는 메서드는 Rectangle 클래스(부모)에서는 사용할 수 없다.
따라서 rectangles 리스트의 모든 사용자는 Square 클래스의 메서드를 사용할 수 없다.
728x90
반응형
'그 외 ... (정리해야함) > 질문과 답변' 카테고리의 다른 글
String 객체의 값을 변경할 수 있는가? (0) | 2019.05.02 |
---|---|
String은 메모리에 어떻게 저장되는가? (0) | 2019.05.02 |
메서드와 변수에 사용되는 static 키워드의 역할은 무엇인가? (0) | 2019.05.02 |
final 키워드는 객체 참조에 어떤 영향을 미치는가? (0) | 2019.05.02 |
자바에서 객체란 무엇인가? (0) | 2019.05.02 |