티스토리 뷰

추상화라는 개념은 무엇일까? 일반적으로 상속이라 하면

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.?? : 자식 클래스에서 부모클래스의 변수를 불러올수 있는 것.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
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
글 보관함