코딩이란 무엇일까

Java/자바[12일차](2)-다형성(PolymoPhism) 본문

국비지원수업

Java/자바[12일차](2)-다형성(PolymoPhism)

둥구는 지굴다 2022. 11. 5. 19:27

다형성(PolymoPhism)이란?

다형성이란 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행 결과가 나오도록 하는 성질을 말합니다.

ex) 자동차의 타이어를 사용하는 방법은 동일.

하지만 어떠한 타이어를 사용하냐에 따라 주행성능이 달라질 수 있습니다.

자동 타입 변환

자동 타입 변환은 타입을 다른 타입으로 변환하는 행위를 뜻합니다.

		int a=3;
		double b;
		b=a;

위와 같이 a는 정수이지만 실수형 타입인 b에 자동 타입 변환이 되는 것처럼

클래스에서 또한 상속 관계에서 자동 타입이 발생합니다.

자동 타입 변환의 개념은 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급이 가능합니다.

예를 들면 사람이 생물의 특징과 기능을 상속받았다면 “사람은 생물이다.”라는 말이 성립됩니다.

예를 들어 Biology(생물)과 Person(사람)이라는 클래스가 있고 이 둘은 상속관계에 있다고 가정을 해보겠습니다.

Person의 객체를 생성하고 이것을 Biology변수에 대입하면 자동 타입 변환이 일어납니다.

"사람은 생물이다"라는 말이 성립이 되기 때문입니다.

 

Person p = new Person( );
Biology b =p; //Biology b = new Person( ); 또한 가능
System.out.println(b==p); //true

p와 b는 변수의 타입만 다를 뿐 동일한 Person객체를 참조하게 됩니다.

같은 객체를 잠 조하는지 확인을 해보기 위해서 == 연산자로 boolean값을 출력해 보았습니다.

결과는 true가 나오므로  p와 b는 같은 객체를 참조하고 잇는 것을 알 수 있습니다.

자식 클래스 타입에 부모 클래스 타입의 객체 생성

위의 코드를 보면 자식 클래스 타입 p2로 부모 클래스의 객체 생성은 오류가 납니다.

추가적으로 자식 클래스 타입인 p3에 부모 클래스 타입인 b를 대입하려

해도 자동 타입 변환이 안 되는 것을 확인할 수 있습니다.

위의 내용 정리

  1. 부모 클래스 타입 변수에 자식 객체 생성 가능 (자동 타입 변환 가능)
  2. 자식 클래스 타입으로 부모 객체 생성 불가(자동 타입 변환 불가)
  3. 부모 클래스 타입 변수에 자식 객체를 대입하면 자동 타입 변환 가능
  4. 자식 클래스 타입 변수에 부모 객체 대입하면 자동 타입 변환 불가

뭐 다 비슷한 말이겠지만 결국에는 가장 핵심은 자식 타입은 부모 타입으로 자동 타입 변환이 가능한 것입니다.

이렇게 위의 자동 타입 변환이 되었다면 부모 클래스에 선언된 필드와 메서드만 접근이 가능합니다.

비록 p변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로만 한정됩니다.

⚠️하지만 예외가 있는데 자식 클래스에서 메서드가 재정의 되었다면 자식 클래스의 메서드가 대신 호출됩니다.

위의 내용은 다형성과 관련되어 있기에 매우 중요한 성질입니다.

메서드 오버 라이딩

메서드 오버 라이딩이란 메서드의 재정의를 뜻합니다.

부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의 해주는 것입니다.

위의 Person 클래스와 Biology클래스에 print메서드를 추가해보겠습니다.

Biology(부모) 클래스

public class Biology {	
		public void print() {
			System.out.println("나는 부모");
		}
}

위에 클래스에 “나는 부모”를 출력하는 메서드를 만들어 줬습니다.

Person(자식) 클래스

public class Person extends Biology {

		@Override
		public void print() {
			System.out.println("나는 자식");
		}

Person클래스는 Biology클래스를 상속받아 부모 클래스의 메서를 재정의 하여

“나는 자식”을 출력하는 메서드로 재정의 해주었습니다.

메인 메서드

public static void main(String[] args) {
		Biology p=new Person();
		
		//p변수는 자식 객체를 가리키고 있지만 부모의 메서드에만 접근가능.
		//하지만 Perosn클래스에서 메서드를 오버라이딩 했기 때문에 자식 클래스의 메서드가 대신 호출
		p.print();
	}

위의 코드를 보시면 Biology p=new Person();

부모 타입의 변수 p를 Person의 객체로 생성했습니다.

즉, 자동 타입 변환이 이루어졌다는 말이죠

자 그럼 기존의 개념대로라면 p라는 변수는 부모의 메서드와 필드에만 접근이 가능합니다.

예상을 해보자면 p.print( )를 실행하면 부모 메서드에 접근을 예상하기에

"나는 부모"가 나올 것 같지만

여기서 중요한 부분이죠 저희는 Person클래스에서 print메서드를 재정의 해주었습니다.

오버 라이딩을 해준 것이죠

따라서 자식 클래스에서 부모 클래스의 메서드를 재정의 해주었다면

자식의 메서드를 호출(사용)할 수 있게 됩니다.

출력 결과

위의 출력 결과처럼 Person(자식) 클래스의 메서드인 "나는 자식"이 출력되는 것을 확인할 수 있습니다.

강제 타입 변환

강제 타입 변환은 부모 타입을 자식 타입으로 변환하는 것을 말합니다.

여기서 중요한 점은 모든 부모 타입을 자식 타입으로 강제 변환은 안됩니다.

자식 타입이 부모 타입으로 자동 타입 변환 후 에만 자식 타입으로 다시 강제 타입 변환을 할 수 있습니다.

여기서 중요한 점은 모든 부모 타입을 자식 타입으로 강제 변환은 안됩니다.

자식 타입이 부모 타입으로 자동 타입 변환 후 에만 자식 타입으로 다시 강제 타입 변환을 할 수 있습니다.

강제 타입 변환 형식

자식 타입 변수=(자식타입)부모타입;

 

자식 타입이 무보 타입으로 자동 타입으로 변환을 하면

부모에 선언된 필드와 메서드만 사용 가능한 불편한 상황이 발생하죠

따라서 자식 클래스에 선언된 필드와 메서드를 사용해야 할 일이 있다면

강제 타입 변환을 통해서

자식 타입으로 변환한 다음 자식의 필드와 메서드를 사용해주어야 합니다.

강제 타입 변환 예시

부모 클래스

public class Biology {	
	Parents p= new Parents();
		public void print() {
			System.out.println("나는 부모");
			p.age=10;
			System.out.println(p.age);
		}
		
	
}

자식 클래스

public class Person extends Biology {
	
		//자식에게만 있는 필드와 메서드
		String me;
		public void myinfo() {
			System.out.println(me);
		}
}

부모 클래스에게 상속받은 필드와 메서드 외에 추가적인 필드와 메서드는 자동 타입 변환이 이루어지면 사용 불가

메인 메서드

	public static void main(String[] args) {
	 Biology bio= new Person(); //자동 타입 변환
	
		//bio.me="나"  	// 오류 자식의 메서드와 필드이기 때문에
		//bio.myinfo(); 
		
		//강제 타입 변환
		Person pe=(Person)bio;
		pe.me="이제 쓸수 있어"; //자식의 메서드와 필드 사용 가능
		pe.myinfo();
} //출력 결과: 이제 쓸수 있어

첫 번째 줄에서 자동 타입 변환이 이루어져

자식 클래스인 Person에 있는 필드와 메서드를 사용하지 못하게 됩니다.

따라서 자식 클래스의 필드와 메서드를 사용하기 위해서 강제 타입 변환을 해준 것입니다.


이상으로 글 마치겠습니다.

글 읽어주셔서 감사합니다.

 

Comments