08_자바 프로그래밍 상속(override)와 다형성
안녕하세요 Mr_ChooC(coding)AI 입니다~
[설명 구조]
상속
1.
정의
2.
구조
3.
실습
오버라이딩
1.
정의
2.
구조
3.
실습
상속과 생성자
1.
Super
2.
this
제어자
1.
정의 및 종류
2.
실습
다형성
1.
업캐스팅
2.
동적바인딩
3.
다운캐스팅
4.
실습
안녕하세요~ 이번 포스트는 클래스와 객체를 더 잘 활용하기 위해서
상속과 오버라이딩에 대해서 알아볼 예정입니다. 역시 실습 코드는 github을
참조해 주시면 되겠습니다. 코딩에는 100문여 불여 1타라는 말이 있습니다. 꼭 실습코드를 직접 실행해 보시고 이해하시면서
넘어가시기를 부탁드리겠습니다.~@@@
Github: https://github.com/Chooyoungjun/javastudy/tree/main/07_override_polymorphism
상속
상속은 프로그램에서 뿐만 아니라 모든 곳에 적용되죠? 저도 부모님으로부터
유전자를 상속 받아서 이렇게 되었습니다. 현실에서의 상속은 이렇게 되는데 과연 자바에서는 어떻게 이루어지는지
살펴보겠습니다.
1. 정의
상속이란: 간단하게 말하면 부모클래스의 기능을 자식 클래스가 물려 받는 것입니다.
사용목적: 부모클래스에서 작성한 기능을 재사용 하기 위해서 입니다.
위의 Snapshot과 같이 부모 클래스인 Animal의 Breath()메서드를 Lion, Monkey, Rabbit이 상속 받도록 구성하여 Breath를 3번 정의 하지 않고 1번만 정의하여 문제를 해결 할 수 있습니다.
2. 구조
위의 Snapshot과 같이 클래스명이 child 클래스 명이라고 보시면 되겠습니다. 만약 자식을 Lion으로 하고 부모클래스를 Ainmal로 하면 자식클래스에서 Breath를 정의 하지 않아도 상속 받아 메서드를 사용 할 수 있게 됩니다.
3. 실습
이번
실습에서는 사람이라는 부모 클래스를 만들어서 학생과 선생이라는 자식클래스를 만드는 실습을 진행 하도록 하겠습니다.
위의 실습에서 보여주듯이 Student와 Teacher가 extends를 통해서 Person을 상속 받는 것을 확인 할 수 있습니다. 그리고 Student로 객체를 만들었는데 Person의 메서드를 사용하는 것을 알 수 있습니다. Teacher도 마찬가지로 메서드를 활용 할 수 있는 것을 확인 하실 수 있습니다.
4. 상속 시 주의 할 점
# 다중 상속 지원 X
Ex)
Extends를 person을 받았는데 Teacher를 받으려고 하니까 다중 상속을 하려는 경우여서 상속이 실행 되지 않습니다.
# 클래스 앞 final 키워드는 다른 클래스가 상속 불가
오버라이딩
1. 정의
오버라이딩: 자식클래스에서 부모클래스로부터 받아온 메서드를 재정의 하는 것입니다.
보통
부모로부터 메서드를 상속 받았지만 다르게 사용해야 할 경우에 사용한다고 생각하시면 되겠습니다.
사용목적: 자식에 맞는 기능으로 맞춰 메서드를 동작하기 위해서 사용 합니다.
2. 구조
구조는
부모클래스의 메서드 이름과 똑같이 자식 클래스에서 구현하면 됩니다. 그렇게 하면 부모클래스에서 받아온
메서드는 자식 클래스에서 오버라이딩 되어서 다른 형태로 사용 가능하게 됩니다.
3. 실습
학생중에
리더가 있는데 이 리더는 다른 학생들과 마찬가지로 안녕하세요 말할 필요 없이 다른 학생을 이끌어 선생님께 인사라는 말을 해야 합니다. 이러한 내용으로 실습을 진행하도록 하겠습니다.
위의 실습코드에서 Leader는 Students한테 상속받은 method say를 오버라이딩해서 “선생님 안녕하세요” 대신 “선생님께 인사!”를 출력하는 것을 알 수 있습니다. 이렇게 부모클래스에 있는 method의 이름으로 재정의 해주면 자동으로 오버라이딩이 되는 것을 알 수 있습니다.
상속과 생성자
지금까지는 자식클래스 외에 다른 클래스에서 생성자를 호출 하는 방법을 배워왔습니다. 그런데 자식 클래스는 부모 클래스의 생성자를 호출 할 수 없을까? 라는
의문이 생깁니다. 여기에 대해서 확인해 보도록 하겠습니다.
1. Super
super(): 부모클래스의 생성자 호출 방법입니다.
Super()특징 2가지: 무조건
자식 클래스의 생성자 첫 줄에서 실행됩니다. 작성하지 않을 시, 컴파일러가
자동 호출합니다.
this: this는 자식클래스에서 부모 클래스에서 불러온 변수도 사용하기 때문에 부모클래스의 변수나 메서드인지
혼돈 될 수 있다. 이런 것을 막기 위해서 this를 활용하여
지금 자식 메서드에 있는 변수나 메서드를 사용한다는 것을 확정 짓는 명령어입니다.
실습: 에러 확인 후 해결 방법 찾음으로써 super와 this에 대해서 이해 할 예정입니다.
[오류 발생 실습 코드]
위의 코드의 빨간색 네모 안에서 에러가 발생하는 것을 확인 할 수 있습니다. 먼저 자식 클래스에서 자동으로 super()를 실행 시켜 부모 클래스의 생성자를 실행 시키지만 에러가 발생 한다고 해석 할 수 있습니다.
여기에서
2가지 사실을 알 수가 있습니다.
첫
번째는 자식 클래스에서 매개변수 생성자를 만들면 기본생성자가 사라져서 실행이 안된다는 사실
두번째는
자식 클래스에서 부모클래스를 불러오는 super()가 실행 되지만 매개변수 생성자만 존재하여 자식클래스에서
super()가 자동으로 실행 되지 않는 다는 것 입니다.
그래서
첫번째 부분을 해결하는 실습코드를 만들어 보겠습니다.
빨간색
네모 부분처럼 기본 생성자를 실행 시키면 하기 자식 클래스에서 super()실행이 가능해 지기 떄문에
에러가 해결 됩니다.
두번째로
자식클래스에서 부모클래스의 매개변수 생성자를 호출하는 명령어를 실행 시켜 해결해 보도록 하겠습니다.
위의 코드와 같이 super(매개변수)를 실행 하면 매개변수 생성자를 불러올 수 있는 것을 알 수 있습니다. 이렇게 부모 클래스와 같이 변수를 가지고 있을 경우에는 this라는 코드를 활용하여 자시클래스의 변수 및 메서드를 사용하다고 명시를 해야지 에러 없이 자식클래스를 만들 수 있습니다.
다형성
위에서 배운 상속과 오버라이딩을 활용하여 다양한 자식클래스를 생성 할 수 있다는 것을 알게 되었습니다. 이제 부모 자식끼리 형변환이 일어나는 경우(upcasting,
downcasting)에 대해서 정리해서 어떠한 경우라도 적절한 자식 클래스를 만들 수 있도록 정리해 가도록 합시다.!
1. 업캐스팅
정의: 자식 클래스의 객체가 부모 클래스의 참조 변수로 형 변환 되는 것
[구조]
위의 Snapshot과 같이 참조 변수를 부모클래스로 정의 하고 메모리는 자식클래스로 할당을 하게 되면 자식클래스에 있는 변수들이 부모클래스의 형태로 형변화이 자동으로 일어 나게 됩니다. 이것을 동적 바인딩이라고 합니다.
Upcasting을 이해 하기 위해서 간단한 실습을 진행 하도록 하겠습니다. 일반
사람의 취미는 게임이지만 학생은 공부라고 메서드를 정의 하여 어떤 식으로 동적 바인딩이 일어나는지 확인하도록 하겠습니다.
위의 코드와 같이 사람은 취미를 게임하기로 하고 학생은 취미를 공부로 하였습니다. 그리고 학생에게는 추가적인 method를 만들었습니다.
위의 실습 코드에서 h1은 부모 클래스를 타입으로 받아서 만들어 졌습니다. 그런데 hobby()를 실행 했을 때 playgame이 나오지 않고 studying이 나오는 것을 확인 할 수 있습니다. 이렇게 upcasting이 된 것 입니다. 하지만 우리는 자식클래스만 가지고 있는 메서드 chool과 grade라는 변수를 사용 할 수가 없습니다. 이유는 타입에 없는 변수나 메서드까지 만들어 주지 않기 때문입니다.
2. 다운캐스팅
정의: upcasting 된 부모 클래스의 객체가 자식 클래스의 참조 변수로 형 변환 되는 것 입니다. 이렇게 downcasting된 객체는 기존 upcasting에서 사용 할 수 없었던 자식클래스의 변수와 메서드를 활용 가능하도록 해 줍니다.
[구조]
위의 Snapshot과 같이 업 캐스팅 된 부모 참조 변수를 명시적 형변환을 활용해서 downcasting을 할 수 있습니다.
주의할
점: 1. 업 캐스팅 된 변수만 가능, 2. 명시적 형 변환을
활용.
3. 실습
위에서
활용했던 코드를 활용하여 확인해 보도록 하겠습니다.
위의 upcasting 실습에서는 school과 grade를 활용하지 못하였습니다. 하지만 downcasting을 활용하여 참조변수를 만들었을 때는 활용이 가능 한 것을 확인 할 수 있습니다.
이렇게 이번 포스트 에서는 상속과 다형성 그리고 upcasting &
downcasting을 알아 보았습니다. 클래스와 객체를 더 잘 활용 할 수 있게 되었습니다.
앞으로도 좋은 내용 많이 다루도록 하겠습니다. 긴 글 읽어 주셔서 감사합니다.~
Comments
Post a Comment