0622 정리
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | package class01; class Point{ int x; int y; void move(int x,int y) { this.x=x; this.y=y; System.out.println("위치변경완료!"); } Point(){ this(0,0); } Point(int x,int y){ this.x=x; this.y=y; } @Override public String toString() { return "("+this.x+","+this.y+")"; } } class ColorPoint extends Point{ String color; void move(String color,int x, int y) { this.color=color; // 색깔도 바꾸기위해서 super.move(x,y); } ColorPoint(){ this("검정",0,0); } ColorPoint(String color){ this(color,0,0); } ColorPoint(int x, int y){ this("검정",x,y); } ColorPoint(String color,int x, int y){ super(x,y); this.color=color; } void func() { } @Override public String toString() { return this.color+"("+this.x+","+this.y+")"; } } public class Test01 { public static void main(String[] args) { Point[] data = new Point[5]; data[0] = new Point(10,20); data[1] = new ColorPoint(); data[2] = new ColorPoint(10,20); data[3] = new ColorPoint("빨강"); data[4] = new ColorPoint("파랑",-1,-2); for(int i=0; i<data.length; i++) { System.out.println(data[i]); } | cs |
메인메소드를 살펴보자
객체배열을 만들어
0번은 Point
1~4번은 ColorPoint 객체를 생성했다
for문을 통해 생략되어있는 .toString을 오버라이딩한 메소드를 출력
data[i] 뒤에 " . " 을 찍어보면
Point에서 만들어진 .toString 이라고 나오는데
ColorPoint 에도 오버라이딩 해놓은 상태
그 이유는 배열을 만들때 Point [ ] 로 만들었기 때문인데
하지만 ColorPoint 차례가 되었을때 오류가 나오지 않았다
메서드를 호출하여 사용했을때
1. ** 자신의 영역을 먼저 확인
2. 이후 부모의 영역을 확인
이 현상을 " 동적 바인딩 " 이라고 말하고
"다형성"이 구현, 실현되었다고 한다
추상메소드
과거의 공통특성을 지닌 클래스들을 묶어서 그들의 부모클래스를 정의하고 싶다
" abstract "
객체생성 X앞으로의 클래스들이 어떻게 구성되어야 하는지의 부모역할을 한다
추상클래스를 만드는 방법
abstract class 클래스명
추상클래스는 객체화를 하지못하게 "강제" 한다
강제하게 되면 실수할 일을 줄여준다!!
추상클래스는 클래스들을 정의하기 위해서 사용될 것이다
abstract 를 추상클래스 안의 메소드 앞에 사용한다면
추상메소드라고 부르며 "오버라이딩을 강제"시킨다
추상메소드는 { } 바디를 사용하지 않는다
- 다형성 "동적 바인딩"의 특징때문인데
자식클래스에서 오버라이딩을 강제하기때문에
호출하였을때 호출한클래스의 메소드먼저 사용되기 때문
추상클래스(부모)의 추상메소드에 다다를일이 없다
그래서 바디가 없어도 문제가 없다! - 추상메소드를 사용한다면 해당클래스는
추상클래스 여야만 한다
추상클래스는
"생성자 정의" 가 가능하다
객체화 하지않지만 생성자 정의가 가능한 이유는
자식클래스가 해당 생성자를 사용할 수 있기때문이다
정리하자면
- 추상클래스는 클래스들을 정의하기 위해 만들어졌다
- 추상클래스는 객체화를 할 수 없게 "강제" 되어 있다
- 추상메소드는 바디를 적지 않는다
- "동적 바인딩"의 특징때문에 추상메소드에 다다르지 못하기 때문
- "동적 바인딩"의 특징때문에 추상메소드에 다다르지 못하기 때문
- 추상메소드는 자식클래스에게 "오버라이딩"을 "강제" 시킨다
- "강제" 한다면실수 할 일이 줄어든다!!
예시 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package class01; abstract class Shape{ int a; abstract void draw(); Shape(int a){ // 생성자 정의가능함! -> 자식 생성자에서 호출한다!!!! this.a=a; } } class Circle extends Shape{ int radius; Circle(int a, int radius){ super(a); this.radius=radius; } @Override void draw() { System.out.println("원 입니다"); } } public class Test02 { public static void main(String[] args) { Circle c = new Circle(1,2); } } | cs |
추상클래스 : Shape
ㅡ> 메인메소드에서 Shape의 객체생성이 "강제"불가능
추상메소드 : draw( )
ㅡ> 자식의 Circle 에서 draw ( ) 자식에게 오버라이딩을 "강제"했음
"강제" 라는 수식어가 들어간다면 개발자에게 도움이 많이 된다
부정적인 의미같지만 강제로 실행하도록 로직을 만들어 놓는다면"실수" 할 수 있는 부분을 막아줄 수 있기때문이다
'자바(JAVA)' 카테고리의 다른 글
(13) 컬렉션 프레임워크 (ArrayList) (0) | 2022.06.23 |
---|---|
(12) 인터페이스 (0) | 2022.06.22 |
(10) toString, equals의 오버라이딩 (0) | 2022.06.21 |
(9) 접근 제어자(캡슐), 상속 (0) | 2022.06.20 |
(8) 퀵정렬 (0) | 2022.06.19 |