728x90

이 강의는 자바의 프로젝트를 어떻게 만드는지, 또한 빌드를 어떻게 하는지에 대한 강의를 진행하지 않는다.

그러나 자바의 기본적인, 그리고 자바에 필수적인 기능들도 분명 존재하고 이 블로그엔 그 작업에 필요한 포스팅도 함께 제공하고 있다.

그 정보를 확인하고 싶다면 여기를 참조하라. 양이 조금 되고 현재진행형으로 늘어나고 있으므로 페이지내의 찾기(ctrl+f 나 cmd+f)로 찾아보도록하자.


다형성이란 말 자체는 여러형이 될 수 있다는 것을 의미하는데 실제로 그냥 다형성이라고 말하면 이해하기 조금 힘든 구석이있다.

프로그래밍에서 쓰는 말들 대부분이 기존에 프로그래밍을 하는 사람을 대상으로 해서 그런거 같다.

사실 완전 새로운 내용은 아니다. 여러분은 이미 앞서서 다형성의 예제를 보았다.

그것의 명칭이 다형성인지 모를뿐이다. 예제를 보면 이해하기는 쉽다.


일단 총 3가지의 클래스에 대해서 생각해보자.


public class Shape {
private int x;
private int y;
private int width;
private int height;

public Shape(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}

public int getWidth() {
return width;
}

public void setWidth(int width) {
this.width = width;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}

public float getArea() {
return 0;
}
}


일단 모체가 되는 도형이라는 클래스이다.

이 클래스는 시작 좌표점 x,y와 가로,세로 길이인 width,height가 존재한다.

문제는 도형마다 넓이를 구하는 공식이 다르다는 것이다.

그래서 각각의 도형마다 클래스를 상속받아서 구현하기로 하였다.


public class Circle extends Shape {

public Circle(int x, int y, int width, int height) {
super(x, y, width, height);
}

public float getArea() {
return getWidth() / 2 * getHeight() / 2 * 3.14f;
}

}


이 클래스는 원 클래스이다. 원의 넓이는 파이*r^2이다.


public class Rectangle extends Shape {

public Rectangle(int x, int y, int width, int height) {
super(x, y, width, height);
}

public float getArea() {
return getWidth() * getHeight();
}
}


또한 이 클래스는 직사각형 클래스이다. 직사격형의 넓이는 가로*세로이다.


그러면 아래같은 Main클래스를 테스트 해볼 수 있다.


public class Main {

public static void main(String[] args) {
Rectangle r = new Rectangle(0, 0, 10, 20);
Circle c = new Circle(0, 0, 9, 9);
System.out.println(r.getArea());
System.out.println(c.getArea());
}

}


이렇게 쓰는것은 매우 일반적인 경우이다.

왜냐하면 4번 라인과 5번라인을 보면 좌변의 자료형과 우변의 자료형이 일치한다.

그러면 아래와 같은 코드는 어떨까?


public class Main {

public static void main(String[] args) {
Shape r = new Rectangle(0, 0, 10, 20);
Shape c = new Circle(0, 0, 9, 9);
System.out.println(r.getArea());
System.out.println(c.getArea());
}

}


이 코드는 좌변과 우변이 일치하지 않는다.

왜냐하면 좌변은 Shape이고 우변은 Circle,Rectangle이기 때문이다.


그러나 실행하면 별 문제없이 실행된다.

그 이유는 Circle은 Circle형이면서 또한 Shape형이기 때문이다. 즉 한가지의 형태가 아니라 다중형이라는 것이다.

이런것을 다형성이라고 하는 것이다. 이러한 문법으로 인하여 능동적인 코딩이 가능하다 예를들면 아래와 같은 경우이다.


import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Shape s;
if (sc.nextInt() % 2 == 0) {
s = new Rectangle(0, 0, 10, 20);
} else {
s = new Circle(0, 0, 9, 9);
}
System.out.println(s.getArea());
}

}


난 내가 받은 숫자가 짝수일때는 직사각형의, 홀수일떄는 원의 넓이를 구하려고한다.

이 경우 변수를 두개 사용하는 방법이 있지만 하나만 사용해도된다.

왜냐하면 Rectangle이나 Circle이나 둘다 Shape를 상속하였기 때문이다.

따라서 다형성에 의해서 Rectangle도 Shape이고 Circle도 Shape이니까 붙히는 것이 가능해 지는 것이다.

'Programming > Java' 카테고리의 다른 글

[Java-20]추상클래스(abstract class)  (0) 2017.11.05
[Java-19]타입형 변환(Type Casting)  (0) 2017.11.05
[Java-17]super와 Overriding(오버라이딩)  (0) 2017.10.24
[Java-16]상속(Inheritance)  (0) 2017.10.24
[Java-15]접근 제한자  (0) 2017.10.22

+ Recent posts