티스토리 뷰
추상화라는 개념은 무엇일까? 일반적으로 상속이라 하면
package Test;
class Bumo{
public void print() {
System.out.println("안녕하세요 부모입니다.");
}
}
class AA{
public void print() {
System.out.println("안녕하세요 자식입니다.");
}
}
public class 연습 {
public static void main(String[] args) {
AA a = new AA();
a.print();
}
}
이러한 형태다. 여기서 만약 부모는 틀만을 제공하고 실질적인 역할을 자식이 한다고 생각해보자.
그렇다면 부모 클래스에서 print() 함수 안에 내용을 채워 넣는 것 조차 필요없는 행위 일 것 이다.
그것을 해소시켜주는 것이 추상화의 개념이다.
package Test;
abstract class Bumo{
abstract void print();
}
class AA extends Bumo{
public void print() {
System.out.println("안녕하세요 자식입니다.");
}
}
public class 연습 {
public static void main(String[] args) {
AA a = new AA();
a.print();
}
}
이런식으로 말이다. abstract라는 것을 붙혀줌으로써 이것은 "추상화"라고 정의를 내려주게 된다.
부모 클래스에서는 메소드의 틀만을 잡아준다. 한번 분석해보면 void 즉 리턴값이 없다. print(); 매개변수가 없이 print() 변수를 만들라고 일컫는다.
자식은 부모의 추상화 메소드를 반드시 오버라이드해줘야 한다. 해주지 않게 되면 오류가 생긴다.
강사님이 말씀하시길 보통 회사에서는 팀장급들이 추상화로 틀을 잡아주고 그것을 상속받아 재정의하는 과정은 그 아래 부하직원들이 한다고 한다.
음... 더 쉽게 설명하자면 뭐가 좋을까..... 붕어빵 장사를 친구와 함께 한다. 나는 붕어빵을 틀을 만들어 친구에게 전달해준다. 친구는 그 붕어빵 안에 슈크림을 채울지 팥을 채울지 정해서 넣게 된다. 그렇다면 여기서 나는 붕어빵 안에 굳이 슈크림이나 팥을 채워서 줄 필요가 있을까? 불 필요하다는 것이다. 어차피 친구가 알아서 안에 무언가를 넣을텐데 그냥 나는 틀만 제공하고 친구에게 전달해주는 것이다. 이것이 즉 추상화 개념이다.
여기까지는 대충 이해가 괜찮게 될거다. 하지만 언제나 응용이 어려운법
package Test;
abstract class Bumo1{
abstract void print1();
}
abstract class Bumo2 extends Bumo1{
abstract void print2();
}
class AA extends Bumo2{
public void print1() {
System.out.println("안녕하세요1");
}
public void print2() {
System.out.println("안녕하세요2");
}
}
public class 연습 {
public static void main(String[] args) {
AA a = new AA();
a.print1();
a.print2();
}
}
추상화클래스 1 > 추상화 클래스 2 > 일반 클래스
이런 구조로 만들어보았는데 추클1에 print1메소드와 추클2에 print2메소드 두개가 마지막 일반 클래스에게 쌓이게 된다.
그렇다면 이 일반 클래스에서 쌓인 추상화 메소드를 전부 재정의를 필히 해주어야 한다.
그렇다면 ...?
package Test;
abstract class Bumo1{
abstract void print1();
}
abstract class Bumo2 extends Bumo1{
public void print1() {
System.out.println("안녕하세요1");
}
abstract void print2();
}
class AA extends Bumo2{
public void print2() {
System.out.println("안녕하세요2");
}
}
public class 연습 {
public static void main(String[] args) {
AA a = new AA();
a.print1();
a.print2();
}
}
이건 어떨까?
똑같이 추클 1 > 추클 2 > 일반 클래스인데 추클1의 메소드를 추클2에서 재정의를 이미 해주었다.
그렇다면 마지막 일반클래스에서는 추클2의 메소드만 재정의를 해주면 되는 것이다.
이렇듯 추상화클래스가 받아온 다른 추상화클래스의 메소드를 재정의해주는 것이 가능하다.
* 참고로 추상화클래스나 일반클래스는 다중 상속이 되지 않는다. 부모가 여러 자식을 만들순 있으나 하나의 자식이 여러 부모를 둘순 없다. 하지만 interface는 가능하다.
<복습 : 다시 기억하기>
- 오버로딩 : 오버로딩은 메소드명이 같아도 매개변수의 개수 매개변수의 자료형 종류 등에 따라서 구분될수있어 각자의 기능을 작동시킬수 있다.
- 오버라이딩 : 부모의 메소드를 자식의 메소드가 재정의하는 것 단, 메소드명이 같아야만 한다. 여기서 부모 메소드가 전혀 필요치 않다면 위에서 말한 추상화개념을 적용시키면 된다.
- 업캐스팅 : 자료형은 부모지만 객체는 자식인 경우 , 이 경우 자식의 메소드를 이용할수있다. 하지만 자식의 클래스변수는 사용할수 없다.
- 다운캐스팅 : 자료형은 부모지만 객체는 자식인 것을 다시 자료형을 자식으로 바꾸어주는 작업, 이렇게 될 경우 자식 본인의 클래스 변수까지 이용이 가능해진다.
++
call by value : 리턴을 해주지 않으면 값이 사라져버린다. 일반 int a = 0; 이런 경우
call by reference : 리턴을 해주지 않아도 값이 기록된다. int[] a = new int[3] 이런 경우 그냥 new가 붙어있으면 이것이 적용된다고 생각하면 편하다. 마치 내가 등산을 가서 산 꼭대기 돌에 내 이름을 새기면 다음에 산에 올라왔을때 그것이 기록에 남아져있는 것처럼 말이다.
++
this.?? : 메소드에서 클래스변수를 불러올수있는 것.
super.?? : 자식 클래스에서 부모클래스의 변수를 불러올수 있는 것.
'프로그래밍 언어 복습 > JAVA' 카테고리의 다른 글
#60 JAVA Arraylist를 통한 전화번호부 만들기 (0) | 2022.06.21 |
---|---|
#59 JAVA 접근제한자 굵짧 설명 (0) | 2022.06.21 |
#57 JAVA 업캐스팅과 다운캐스팅 (0) | 2022.06.20 |
#56 JAVA 스타그래프트 게임 (0) | 2022.06.11 |
#55 JAVA 조금 더 깔끔해진 숫자야구게임 클래스화 (0) | 2022.06.11 |