2. 오버로드,오버로딩,추상클래스,인터페이스

오버로드

아래는 다 다른 메소드이다.

1
2
3
4
5
6
7
8
void a (int a, int b)
..

void a (int a, float b)
...

void a (float a, int b)
...

아규먼트 , 파라미터

아규먼트는 int ,float 등 형을 의미
파라미터는 실제적인 데이터 10, 0.5 등을 의미.

식별자

클래스 이름, 변수이름, 메소드 이름을 식별자라 한다.
대소문자 가능 숫자 가능 하지만 앞에는 안되고 특수문자는 $ _ 만 사용가능.

생성자

기본으로 디폴트 생성자가 만들어지지만 생성자가 하나라도 정의되어 있으면 디폴트 생성자가 생성되지 않는다.

다형성

외부에서 사용할 땐 일관되게 사용하는것.
오버로딩, 오버라이딩을 통해 구현

this

this 키워드는 메소드 호출을 받는 객체를 의미한다.
현재 사용중인 객체 그 자체를 의미한다.
this() 는 클래스의 한 생성자에서 다른 생성자를 호출 할 때 사용할 수 있다

오버로딩

부모에있는 메소드와 시그니쳐가 동일(접근제어자 , 반환형, 메소드이름, 아규먼트)

생성자 관련 문제

상속관계에서 자식 클래스의 인스턴스를 생성하면 부모 혹은 자식 생성자중 어떤것이 먼저 호출될까?

1
2
3
4
5
6
7
8
9
10
부모 생성자
public Parent(){
syso("부모 호출됨");
}

자식 생성자
public Child(){

syso("자식 호출됨");
}

부모 생성자가 먼저 호출된다.
즉 자식 메소드의 생성자 안에(8행) super(); (기본생성자 호출)가 자동으로 삽입된것이다.

int형 매개변수가 존재하는 부모 생성자를 호출하려면 8행에 super(35); 를 넣어주면 된다.

캐스팅

형은 높은데에서 낮은곳으로 가면 명시적으로 알려줘야 하지만 , 인스턴스는높은곳(부모) 낮은곳(자식) 으로 가려면 명시를 해줘야 한다.
다운캐스팅의 예(Explicity Casting 명시적 캐스팅)

1
2
3
4
5
6
//방법 1
Person p = new Student();
Student s1 = (Student)p;

//방법 2
((Student)p).set();

업캐스팅의 예(Implicity Casting 암시적 캐스팅)

1
Person p2 = s1;

추상클래스

추상화

객체들이 가지고 있는 속성과 기능 중에 중요한 것들은 남기고 필요 없는 불필요한 것은 없애는것. 또는 공통된 것들을 그룹핑해서 한곳에다 모아놓는것.

추상클래스

new를 통해 객체를 생성하지는 못한다.
필드를 갖을 수 있고, 구현된 메소드를 갖을 수 있다.
추상 클래스를 상속하는 클래스는 반드시 추상 클래스의 추상 메소드를 구현해야 함
추상 클래스간의 상속에서는 추상클래스를 구현하지 않아도 됨
추상 클래스의 활용
여러 클래스들이 상당수 공통점을 가지고 있으나 부분적으로 그 처리 방식이 다를 경우 부모 클래스를 추상 클래스로 정의하여 자식 클래스들이 각각 해당 메소드를 구현

실습

부모클래스

Shape.java
1
2
3
4
5
6
7
8
9
10
11
abstract class Shape {
private String fillColor;
private String lineColor;

..

public abstract void draw();

public abstract int calcArea();

}

Shape 클래스를 상속

Rectangle.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Rectangle extends Shape {
private int x1;
private int y1;
private int x2;
private int y2;

@Override
public void draw() {
System.out.println("사각형을 그렸습니다.");
}

@Override
public int calcArea() {
return ((x1+x2)*(y1+y2));
}
}

Shape 클래스를 상속

Circle.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Circle extends Shape{
private int x1;
private int y1;
private int radius;

public Circle(int x1, int y1, int radius) {
this.x1 = x1;
this.y1 = y1;
this.radius = radius;
}

..

@Override
public void draw() {
System.out.println("원을 그렸습니다.");

}

@Override
public int calcArea() {
return (int)(Math.PI * radius * radius);
}
}

main 메소드

PaintApp.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package paint;

public class PaintApp {
public static void main(String[] args) {

drawShape( new Rectangle());
drawShape( new Circle(10, 20, 5));

}

private static void drawShape( Shape shape ) {
shape.draw();
}
}

인터페이스

객체를 사용할 수 있는 목록. 즉 메소드 목록이다.
UML 에서는 <> 라고 하고 그림.
기능의 명세이다. Drawable라는 인터페이스를 구현하여 draw 메소드를 오버라이딩하여 사용.
Drawable 인터페이스를 구현하면 그릴수 있다는 것을 암시.
서로 관계가 없는 물체들이 상호 작용을 하기 위해서 사용하는 장치나 시스템
클래스 구조상의 관계와 상관 없이 클래스들에 의해 구현되어질 수 있는 규약
인터페이스 안에서는 인터페이스 끼리 다중상속이 된다.
public interface Drivable extends A,B{…..}

실습

인터페이스 정의

Drawable.java
1
2
3
public interface Drawable {
public void draw(); //자동으로 abstract가 됨
}

Point클래스가 Drawable 인터페이스를 구현함

Paint.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Point implements Drawable{
private int x;
private int y;

public Point() {

}
public void show() {
System.out.println( "점[x=" + x + ",y=" + y +"]을 그렸습니다.");
}
...
public void draw() {
show();
}
}

ColorPoint가 Point클래스를 상속하여 Drawable를 구현한 효과를 갖음

ColorPoint.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package paint;

public class ColorPoint extends Point {
private String color;

public ColorPoint(int x, int y, String color) {
super(x, y);
this.color = color;
}

..

@Override
public void show() {
//완전
super.show();
System.out.println( "color " + color);

}
}

메인메소드

PaintApp.java
1
2
3
4
5
6
7
8
9
10
public class PaintApp {
public static void main(String[] args) {

draw(new ColorPoint(200,200,"yellow"));
}

private static void draw( Drawable drawable ) {//Drawable를 구현하고 있으면 draw를 해줄게
drawable.draw();
}
}
인터페이스 추상클래스 차이

인터페이스는
서로 관계가 없는 물체들이 상호 작용을 하기 위해서 사용하는 장치나 시스템
클래스 구조상의 관계와 상관 없이 클래스들에 의해 구현되어질 수 있는 규약
하나 또는 그 이상의 클래스들에서 똑같이 구현되어질 법한 메소드를 선언하는 경우

추상클래스는
객체들이 가지고 있는 속성과 기능 중에 중요한 것들은 남기고 필요 없는 불필요한 것은 없애는것. 또는 공통된 것들을 그룹핑해서 한곳에다 모아놓는것.

정리

일반클래스 : 모두 완결한 메소드 / 필드를 가질 수 있음 / 객체화 가능

추상클래스 : 완결한 메소드, 추상메소드 / 필드 가질 수 있음 / 객체화 불가

인터페이스 : 모든 추상 메소드 / 필드 가질 수 없음 / 객체화 불가

instanceof

1
2
3
4
5
6
7
8
9
10
11
// 객체가 Circle 클래스의 인스턴스 인가?
System.out.println( c instanceof Circle );

// 객체가 Drawable 인터페이스를 구현하였는가?
System.out.println( c instanceof Drawable );

// 객체가 Rectangle 클래스의 인스턴스 인가?
System.out.println( c instanceof Rectangle );

// 객체가 Shape 클래스의 인스턴스 인가?
System.out.println( c instanceof Shape );
Share