Wanna be Brilliant Full-Stack Developer

Java 객체지향프로그래밍의 이해 다형성 본문

Some Memos/Java

Java 객체지향프로그래밍의 이해 다형성

Flashpacker 2023. 3. 2. 15:18


다형성이란 여러가지 형태가 존재한다는 뜻이다. 

이게 무슨뜻일까? 다양한 형태를 가진다?!

만약에 내 이름이 최주호인데 내 이름을 최주호라고 부를 수도 있고 IT 강사라도 부를 수 있고

프로그래머라고도 부를 수 있다. 여러가지 이름으로 나를 부를 수 있다.

다양한 형태를 가지는 것이다. 이것이 다형성이다.

 

홍길동이라는 애가 있는데 직업은 요리사이다. 그래서 요리사라는 클래스를 만들고 상속을 한다.

상속이 가능한 이유는 홍길동한테 홍길동이니? 라고 물어보면 네라고 할 수 있고

홍길동한테 요리사니라고 하면 네라고 할 수 있다.

다양한 형태의 이름을 가지는 것이다. 

이건 키워드를 적어서 Extends를 해서 상속을 한것이다.

 

이렇게하면 홍길동이라는 애를 메모리에 띄우고 싶으면 new를 하면 new 홍길동이라고 하면

메모리에는 heap공간에는 홍길동만 뜨는것이 아니라 요리사가 같이 뜬다.

 

그러면 내가 만약에 new 요리사()라고 하면 이때는 메모리에 요리사만 뜬다.

이떄 이런일을 할 수 있다. 어떤일인가?

= 를 하여 앞에다가 홍길동 h1 = new 홍길동() 라고 하면 앞에 타입이 홍길동 타입이니까.

그러면 홍길동타입이 되면 바라보는것이 메모리영역이 홍길동을 바라보게 되고

아니면 요리사 y1 = new 홍길동() 이렇게도 할 수 있다.  

왜냐하면 홍길동을 부를 수 있는 이름이 2가지기 떄문에 앞에 타입이 홍길동 타입이 되고

요리사 타입이 되도된다. 이렇게하면 메모리영역에서 바라보는것이 요리사이다. 

근데 요리사는 요리사 y2 = new 요리사 () 밖에 못한다. 

홍길동 타입으로는 앞에 적을 수 없다. 

왜냐하면 메모리에 new요리사 했는데 요리사밖에 안떴기 떄문이다. 

y2가 바라볼 수 있는 얘가 요리사밖에 없다. 

 

package ch05;

class 요리사 {
	String name = "요리사";
}

public class OOPEx03 {

	public static void main(String[] args) {
		
	}
}

이렇게하면 생성자를 통해서 값을 초기화해야하는거 아니에요? 라고 질문 할 수 있다.

근데 지금은 다형성에 대해 공부하고 있으니까 이런부분은 신경쓸 필요가 없다.

 

package ch05;

class 요리사 {
String name = "요리사";
}

class 홍길동 {
String name = "홍길동";
}

public class OOPEx03 {

public static void main(String[] args) {

}
}

이렇게 두개가 있을떄 홍길동한테 Extends해서 요리사를 상속한다. 

package ch05;

class 요리사 {
	String name = "요리사";
}

class 홍길동 extends 요리사{
	String name = "홍길동";
}

public class OOPEx03 {

	public static void main(String[] args) {
		
	}
}

그러면 이제 다향성이 발동되어서 홍길동에게 홍길동이기도 하고 요리사이기도 하다.

근데 요리사는 요리사이다. 이제 메모리에 띄어보자!

package ch05;

// 요리사 
class 요리사 {
	String name = "요리사";
}

// 홍길동 or 요리사
class 홍길동 extends 요리사{
	String name = "홍길동";
}

public class OOPEx03 {

	public static void main(String[] args) {
		홍길동 h1 = new 홍길동();
	}
}

이렇게하면 메모리에 무엇이 뜨는가? 

heap공간에 홍길동과 요리사가 같이 떠있다.

new 해서 두개가 같이 떳고 타입이 홍길동이니까 바라보는것도 홍길동이다.

이렇게 h1.name하면 무엇이 나올까?

내가 바라보는것이 홍길동이니까 이름이 홍길동이 나올것이다.

 

그러면 

package ch05;

// 요리사 
class 요리사 {
	String name = "요리사";
}

// 홍길동 or 요리사
class 홍길동 extends 요리사{
	String name = "홍길동";
}

public class OOPEx03 {

	public static void main(String[] args) {
		홍길동 h1 = new 홍길동(); // (홍길동, 요리사) 
		System.out.println(h1.name);
		
		요리사 y1 = new 홍길동(); // (홍길동, 요리사)
	}
}

메모리에 홍길동도 뜨고 요리사도 같이떴으니까 바라보는것만 요리사를 바라본다.

y1 주소는 요리사를 가리키고 있다. 

 

그렇다는것은 메모리에 new해서 띄우고나서도 앞에 타입을 두개로 가질 수 있다는 것이다.

이게 다형성이다.

new 홍길동을 하면 요리사이기도 하고 홍길동이기도 하다는것이다. 

이건 불가능하다. 왜냐하면 내가 지금 new요리사를 했으니까 메모리에 띈것은 요리사만 떴다.

요리사만 떴는데 홍길동을 바라볼 수 는 없다. 이것은 불가능하다.

이것은 다형성이다.

다형성을 기억해야지 되게 고급스러운 프로그래밍을 할 수 있다.