20220817 수업기록
08-17(수) 수업진도 상속수업 이어서.. 1. Class 형변환 -promotion -casting 2.polymorphism 다형성 3.instanceof 연산자 4. abstract Class 추상클래스 |
1.class 형변환
공통조건 | 상속되어있는 클래스끼리 사용 할 수 있다. |
promotion (자동형변환)
부모 클래스 변수 = 자식클래스타입;
1. 자식클래스를 부모클래스타입으로 변환 하는것
2. 변환 후 에는 부모 클래스 멤버만 접근 가능
3. 바로 위의 부모가 아니더라도 상속 계층의 상위클래스면 프로모션 가능
4. 다형성을 위해서 사용
public class Animal{} | ![]() |
public class Cat extends Animal{} | |
Animal animal = new Cat(); //프로모션발생 (Animal클래스멤버만 사용가능하고 Cat클래스멤버를 사용할수없음) |
casting (강제형변환)
자식 클래스 변수 = (자식클래스) 부모클래스타입;
1. 부모타입을 자식 타입으로 변환하는것
2. 조건 : 자식 타입을 부모타입 으로 프로모션한 후, 다시 자식타입으로 변환할 때 사용가능
3. casing이 필요한 경우 : 부모타입에 선언된 멤버 뿐만 아니라 자식타입에 선언된 멤버를 다시 사용해야 할 경우
public class Animal{} |
public class Cat extends Animal{} |
Cat cat = (Cat)animal; //캐스팅발생 (Cat class멤버를 다시 사용할 수 있다.) |
프로모션안한 Animal class의 인스턴스를 강제형변환 할 경우. | |
Cat cat = new Cat(); Animal animal2 = new Animal(); cat=(Cat)animal2 //error |
이유 : (animal2는 promotion실행한적이 없다) animal2 변수에는 Animal 클래스가 있지만 힙메모리에는 Cat class가 없다. (프로모션을 안했기 때문) 강제형변환으로 유실되는건 없지만 변수에 Cat class인스턴스가없어 error (런타임에러)가 뜬다. |
2.Polymorphism 다형성
1. source code 재사용 (재활용)
2. source code 수정 최소화
3. 자동형변환(promotion)과 override 모두 충족이 될 때, 부모class의 메소드를 실행하는 것이 아니라, Override된 자식 메 소드를 실행한다.
polymorphism 사용 방법
1. 부모 자식 클래스 만들고, method override시킴
2. 실제 코딩은 부모로 promotion시켜서 override된 method 위주로 코딩
기본적인 programming Spring engine application(이미만들어놓은 application) + Web application(개발자코딩) => polymorphism |
|
![]() Spring framework -> java class libraries |
실습 (method parameter에서 promotion하는 polymorphism)
public class Animal{
public void sound(){
System.out.println("동물이 웁니다");
}
}
public class Cat extends Animal{
@Override
public void sound(){
System.out.println("야옹");
}
}
public class Dog extends Animal{
@Override
public void sound(){
System.out.println("멍멍");
}
}
public class Lion extends Animal{
@Override
public void sound(){
System.out.println("으르렁");
}
}
public class AnimalEx{
public static void main(String[] args){
sound(new Animal());
sound(new Cat());
sound(new Dog());
sound(new Lion());
}
//메소드의 매개변수를 부모메소드로 입력한다
//매개값을 자식메소드로 한다면 아래와 같다
//Animal animal = new Cat(); //promotion발생
//매개값이 자식class의 인스턴스라면 자식class에서 overrride된 메소드가 호출된다.
public static void Sound(Animal animal){
animal.sound();
}
}
(결과) 동물이 웁니다 야옹 멍멍 으르렁 |
메소드의 포어파라미터(매개변수)를 부모메소드로 할 때,
메소드의 엑추얼파라미터(매개값)을 자식class의 인스턴스로 입력하고 실행하면
자식class의 Override된 메소드가 호출된다.
🤔왜그럴까 ?
힙메모리에 자식class의 메소드가 존재하기 때문이다.
매개값을 자식class의 인스턴스로 넣었을때 promotion이 발생되었으니 (Animal animal = new Cat();)
자식클래스를 부모클래스타입으로 자동형변환하여 사용은 부모클래스의 멤버만 사용하겠다고 선언한 것이지만.
힙메모리에는 자식class의 메소드가 존재하기 때문에! 자식method를 호출하는 것 이다.
실습2 (부모인스턴스에 배열을이용한 polymorphism) - 위의 Animal,Cat,Dog,Lion Class 재활용
public class AnimalEx{
public static void main(String[] args){
Animal[] animal = new Animal[3];
animal[0] = new Cat();
animal[1] = new Dog();
animal[2] = new Lion();
for(int i = 0; i<animal.length; i++) {
animal[i].sound();
}
}
}
(결과) 야옹 멍멍 으르렁 |
자식클래스의 인스턴스를 생성하지않고 부모클래스타입의 배열객체를 만들어 배열안에 자식클래스인스턴스를 넣어 프로모션시킨다. sound 메소드를 호출할때 배열마다 원소로 저장된 자식class의 메소드(오버라이되었기때문)를 호출할수있다.
3.instanceof 연산자
부모타입이면 모두 자식 타입으로 강제 타입 변환할수 있는것이 아니다.먼저 변수가 참조하는고있는 객체가 자식 타입인지 확인 후 강제 타입을 실행해야 한다. ClassCastException(런타임에러)를 예방하기위한 연산이 instanceof.
instanceof 사용 방법
1. A instance B => A : instance, B : class
2. 실행결과 : A의 힙메모리에 B객체인스턴스가 존재한다면 true를 return하고 없다면 false를 return한다.
public void method(Parent parent){
if(parent instanceof Child){ //parent 매개변수가 참조하는 객체가 Child인지 조사하라
Child child = (Child)parent; //true라면 casting을 실행하라
}
}
4.abstract Class 추상클래스
1. 실체 클래스들의 공통되는 필드와 메소드를 정의한 클래스
2. 추상클래스는 실체 클래스의 부모클래스 역활을 한다 (단독 객체가 아니라는 얘기)(추상클래스는 인스턴스생성불가)
3. class가 추상 클래스로 선언되면, 추상클래스를 직접 new를 사용하여 인스턴스 생성 불가
4. 추상클래스를 사용하려면, 추상클래스를 부모로 한 자식클래스를 인스턴스로 만들어 사용한다,.
5. 추상클래스는 인스턴스생성을 못하지만 반드시 내부에는 생성자가 있어야한다.
- 이유 : 자식 클래스를 통해 부모인 추상클래스를 힙메모리에 인스턴스로 생성후 추상클래스생성자를 호출해야하하기때문.
추상클래스선언
public abstract class 클래스 {
//필드
//생성자
//메소드
}
추상메소드
1. 추상메소드는 추상클래스내에서만 선언이 가능하다.
2. 추상메소드를 선언할 때는 메소드헤드부분만 선언한다.
3. 추상클래스를 상속받은 자식클래스는 반드시 추상메소드를 실제구현해야한다. (Override)
public abstract class Animal {
public abstract void sound(); //메소드 헤드부분만 작성
}
public class Dog extends Animal{
@Override
public void sound(){
System.out.println("멍멍");
} //실체클래스에서 메소드실제구현
}
추상클래스의 용도
문제점 : 실체클래스를 구현하는 설계자가 여러 사람일 경우, 실체클래스마다 필드와 메소드가 제각기 다른 이름을 가질수있다. |
해결 : 필드와 메소드의 이름을 선언한 추상클래스를 상속받아 통일된 이름을 사용한다. |
효과 : 실체클래스는 추가적인 필드와 메소드만 선언하면 된다. |
캡슐화, 상속, 다형성
캡슐화 | 상속 | 다형성 |
객체의 필드,메소드를 하나로 묶어 접근제한자를 사용하여 노출할데이터와 숨길데이터를 결정하여 객체를 손상시키지않게한다. |
부모객체의 멤버를 자식객체에게 상속시켜 반복된코드의 중복을 줄이고 자식객체는 부모에게상속받은 데이터를 재정의하거나 데이터를 추가하여 객체의 다형성을 구현할수있게한다. |
동일한 이름의 기능이 서로 다르게 작동하는 현상으로 다형성 사례로는 메소드오버라이딩, 오버로딩이 있다. |
접근제한자 공부기록 |
상속class 공부기록 | 다형성 공부기록 |