JAVA_다형성(polymorphism)

호근·2022년 12월 10일
0

java

목록 보기
20/35

다형성이란?

하나의 클래스가 여러가지의 얼굴을 갖게 하는것.

하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미한다.

다형성은 <부모클래스 타입의 참조변수>로 하위 클래스의 객체들을 참조할 수 있게 해준다.

이해를 위한 나만의 예제코드^^

나만 이해할수있는 작명센스

학부클래스
학부명에 대한 정보를 담고 있다.


	
	static class College {
		static String department;
		public College(String department) { // 인자를 받는 생성자
			this.department = department;
		}
		public College() { // 생성자
		}
	}

학부생 클래스는 학부클래스를 상속받는다.

학부생들 클래스에는 이름, 학년, 나이, 성별을 선언하고
해당변수를 초기화해주는 생성자,
매개변수를 받아 super클래스의 생성자에 접근하는 생성자를 선언해주었다.

	static class CollegeStudents extends College{
		String name;
		int grade;
		int age;
		String gender;
		
		
		public CollegeStudents(String name, int grade, int age, String gender) {
			this.name = name;
			this.grade = grade;
			this.age = age;
			this.gender = gender;
//			super.department = department;
			System.out.println("인자를 받아 this로 넘기는 CollegeStudents가 실행됨");

		}

		
		public CollegeStudents() {
			System.out.println("인자가 없는  CollegeStudents가 실행됨");
		}


		public CollegeStudents(String department) {
			super(department);
			System.out.println("인자를 받아 super로 넘기는  CollegeStudents가 실행됨");
		}
	}

메인 메서드

생성자들을 실험해보았다.

	public static void main(String[] args) {
		CollegeStudents stu = new CollegeStudents(); // CollegeStudents 는 College를 상속받는다.
		stu.department = "전자상거래학과";
        
		System.out.println(stu.department); // 전자상거래학과 출력
        
        
		College justClg = new CollegeStudents(); // College 타입을 받는다. 생성자는 CollegeStudents의 생성자가 실행된다.
		justClg.department = "우리연애학과";
        
        
		System.out.println(justClg.department);
		System.out.println(stu.department); // department가 static으로 제어되어 값이 동일하게 나온다.
		
		College superstu = new CollegeStudents("취업률 1위학과"); // 인자를 받아 super로 넘기는 CollegeStudents() 가 실행됨.
		System.out.println(superstu.department);
		superstu.
	}
}

마지막 College superstu = new CollegeStudents("취업률 1위학과");

부분이 가장 중요하다.

College 타입의 superstu를 선언하겠다는 의미인데,
superstu는 College 클래스의 멤버를 사용하겠다는 의미이다.

이후 new CollegeStudent("어쩌구"); 의 의미는
CollegeStudent 클래스의 생성자 중,
매개변수를 받는 CollegeStudent 생성자를 사용하겠다는 의미이다.


앞서 선언해두었던

해당 부분에 접근하겠다는 의미이다.

해당 생성자에 접근하게되면 super() 메서드는 매개변수를 가지고
본인이 바라보고있던 College 클래스의 생성자를 실행하여 매개변수를 넘겨준다.


참조변수의 타입변환

상/하위 참조변수는 상호간 형변환이 가능하다.
위로도, 아래로도 가능하다는 말이다.

자식클래스는 부모클래스를 상속하기 때문에 부모클래스의 멤버를 모두 가지고있다.

반면, 부모클래스는 자식클래스의 멤버를 모두 가지고 있지는 않다.

참조변수의 형변환은 사용할 수 있는 멤버의 수를 조절하는 것이라고 생각하자

동위는 불가능하다.

명칭과 변환방법은 다음과 같다.

하위 ▶ 상위 == 업캐스팅

- sub클래스의 객체주소를 super클래스의 타입으로 변환하는 것
- 업캐스팅은 묵시적 형변환이 가능하다.
- super클래스로 캐스팅된다는 것은 멤버갯수의 감소를 의미한다.

***주의**
업캐스팅한 레퍼런스는 객체 내 모든 멤버에 접근불가.
부모클래스의 멤버에만 접근가능하다.
단, sub클래스에서 오버라이딩 된 메서드는 그대로 실행된다.

상위 ▶ 하위 == 다운캐스팅

- 업캐스팅의 반대.
- 다운 캐스팅은 타입을 명시적으로 지정해주어야한다.

요약

sub클래스가 super클래스를 상속받을 때

다형성을 적용하면
super클래스의 데이터 타입을 참조하고, sub클래스의 인스턴스를 참조하여 변수를 생성하면 생성된 변수는 super클래스의 멤버만을 참조한다.

말은 즉슨, sub클래스의 멤버는 참조하지 않는다는 이야기다.
super클래스의 멤버만을 사용할 수 있게되면서
sub클래스의 불필요한 멤버는 사용하지 않을 수 있게 되었다.

이로써 편하고 효율적인 프로그래밍을 할 수 있게 된다.
매번 다른 메서드를 만들 필요없이 같은 메서드를 덮어쓰고나 다양하게 활용하자


profile
22.11.28 ~

0개의 댓글