본문 바로가기
JAVA/JAVA복습(멘토씨리즈 자바)

[JAVA복습] 11. 다형성과 타입 변환

by ssunooo 2024. 7. 22.

 

 

1. 핵심 정리

 

타입 변환

자바에서는 다음과 같이 두 가지의 대표적인 타입 변환이 있다

  • 자료형(타입) 변환
  • 클래스의 객체 타입 변환

※ 클래스의 타입변환은, 상속관계의 클래스들 간에서만 가능

 

클래스 자동 타입 변환

개발자가 직접 명시해주지 않아도 자동으로 타입 변환이 일어나는 것을 클래스 자동 타입 변환이라 부름

상속 관계에 있는 자식클래스의 객체를 부모 타입의 객체로 변환

 

클래스 강제 타입 변환

자식 객체가 부모 타입으로 자동 타입 변환을 한 후, 다시 자식 타입으로 변환하는 것을 강제 타입 변환이라 부름

개발자가 직접 명시해야만 타입 변환 가능

 

다형성

다형성은 객체 지향 프로그래밍의 대표적인 특징 중 하나로, 하나의 타입으로 다양한 객체를 사용할 수 있는 것을 의미

 

  • 자바는 배개변수의 자료형/개수/순서를 기반으로 메서드를 구별하므로 하나의 클래스 안에서
    같은 이름의 메서드를 여러 개 구현할 수 있으며,
    필요에 따라 메서드를 선택해 사용할 수 있음

 

  • 부모 클래스에게 상속받은 메서드를 재정의하여 자식 클래스용 메서드를 수현하고 자식 객체를 통해
    메서드를 호출할 땐 오버라이딩 된 메서드가 호출됨

 


 

2. 응용 문제

 

Q1. 다음 코드는 컴파일 에러가 발생합니다. 컴파일 에러가 발생하는 곳을 모두 찾아 수정해 보세요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package section11;
 
class Car {
}
class Bus extends Car {
}
class SchoolBus extends Bus {
}
 
class OpenCar extends Car {
}
class SportsCar extends OpenCar {
}
 
public class PRACTICE_11_01 {
    public static void main(String[] args) {
        Car c1=new SchoolBus();
        Bus b1=new Bus();
        SchoolBus sb=new Car();
        
        Car c2=new OpenCar();
        OpenCar oc=new SportsCar();
        Bus b3=new OpenCar();
        Bus b4=new SportsCar();
    }
}
cs

A1. 19번째줄  SchoolBus sb=new Car();는 자식클래스=생성자 부모클래스 이므로 성립되지 않는다.

      SchoolBus sb=new Car(); 로 바꿔 줘야한다.

      또한 23,24번째줄도 상속되어있지 않은 생성자를 생성했으니 성립되지않고,

      Bus b3=new Bus(); Bus b3=new SchoolBus(); 로 바꿔 줘야한다. b4도 마찬가지이다.

 

 


 

Q2. 다음 설명에 해당하는 용어는 무엇입니까?

  • 부모 클래스에게 상속받은 메서드를 재정의하여 자식 클래스용 메서드를 구현하고 자식 객체를 통해
    메서드를 호출 할 때는 부모의 메서드가 아니라 자식의 메서드가 호출한다.
  1. 오버라이딩
  2. 오버로딩
  3. 오버플로우

A2. 1

 


 

Q3. 다음과 같은 결과가 나오도록 아래 클래스를 구현해 주세요.

  • class Speaker
  • class RedSpeaker
  • class BlueSpeaker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package section11;
 
class Person {
    Speaker speaker;
    
    Person(Speaker speaker) {
        this.speaker=speaker;
    }
    
    void turnOn() {
        System.out.println(speaker.getName()+"이 켜졌습니다.");
    }
}
 
public class PRACTICE_11_03 {
    public static void main(String[] args) {
        Speaker s1=new RedSpeaker();
        Person p1=new Person(s1);
        p1.turnOn();
        
        Speaker s2=new BlueSpeaker();
        Person p2=new Person(s2);
        p2.turnOn();
    }
}
cs

A3.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package section11;
 
class Person {
    Speaker speaker;
    
    Person(Speaker speaker) {
        this.speaker=speaker;
    }
    
    void turnOn() {
        System.out.println(speaker.getName()+"가 켜졌습니다.");
    }
}
 
class Speaker {
    private String name;
    Speaker(String name) {
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}
 
class RedSpeaker extends Speaker {
    RedSpeaker() {
        super("빨간 스피커");
    }
}
 
class BlueSpeaker extends Speaker {
    BlueSpeaker() {
        super("파란 스피커");
    }
}
 
public class PRACTICE_11_03 {
    public static void main(String[] args) {
        Speaker s1=new RedSpeaker();
        Person p1=new Person(s1);
        p1.turnOn();
        
        Speaker s2=new BlueSpeaker();
        Person p2=new Person(s2);
        p2.turnOn();
    }
}
 
cs

 

 

 

2024.07.22